U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIENIQU5HRVMuY3VycmVudCBmb3IgY3VycmVudCB2ZXJzaW9uLgoKVmVyc2lvbiAxLjMuMjUgKEp1bmUgMTEsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTEvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGhhbmRsaW5nIG9mIGFub255bW91cy1lbnVtIHZhcmlhYmxlcy4KCjA2LzEwLzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBieQoJICAgIGNvcHktb2YtdmFsdWUuICBGaXggZm9yIGdsb2JhbCAiY29uc3QgY2hhciAqIiB2YXJpYWJsZXMuCgkgICAgRml4IHRlc3RjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcywgYXJyYXlzX2dsb2JhbC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3Igd2hlbiBhIGJhc2UgY2xhc3MgZGVmaW5lcyBhIHN5bWJvbCBhcyBhIG1lbWJlciB2YXJpYWJsZSBhbmQgYSBkZXJpdmVkIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgdGhlIHNhbWUgc3ltYm9sIGFzIGEgbWVtYmVyIG1ldGhvZC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIC0gd2hlbiBhIG1ldGhvZCBoYXMgcHJvdGVjdGVkIGFjY2VzcyAKICAgICAgICAgICAgaW4gYmFzZSBhbmQgcHVibGljIGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDY2MzYzIC0gRm9sbG93IGNvbnZlbnRpb24gb2YgcmVsZWFzZSB0YXJiYWxsIG5hbWUgbWF0Y2hpbmcgZGlyZWN0b3J5IG5hbWUuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCAjMTIxMTM1MyAtIHR5cGVzYWZlIGVudW1zIChhbmQgSmF2YSBwcm9wZXIgZW51bXMpIHdyYXBwZXJzIHdoZW4gZW51bSB2YWx1ZQogICAgICAgICAgICBpcyBuZWdhdGl2ZS4KCjA1LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGVybmlzZWQgYW5kIHRpZGllZCB1cCBXaW5kb3dzIG1hY3JvcyAtLT4gU1dJR0VYUE9SVCwgU1dJR1NURENBTEwuIFRoZXkgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAgICAgYnkgdXNlcnMgdmlhIC1EIGNvbXBpbGVyIGRpcmVjdGl2ZXMgaWYgbmVlZCBiZS4KCjA1LzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB2YXJpYWJsZXMgYXMgd2VsbCBhcyBtZXRob2RzIG5vdy4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0ICdwdWJsaWMnIG1vZGlmaWVyIHRoYXQgU1dJRyBnZW5lcmF0ZXMsICVjc21ldGhvZG1vZGlmaWVycyB3aWxsIGFsc28KICAgICAgICAgICAgcmVwbGFjZSB0aGUgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIHRoYXQgU1dJRyB0aGlua3MgaXMgYXBwcm9wcmlhdGUuIFRoaXMgZmVhdHVyZSBpcwogICAgICAgICAgICB1c2VmdWwgZm9yIHNvbWUgb2JzY3VyZSBjYXNlcyB3aGVyZSBTV0lHIG1pZ2h0IGdldCB0aGUgbW9kaWZpZXJzIGluY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSBhbmQgb3ZlcnJpZGluZyBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGNvbnN0cnVjdG9ycyB0byBzdGQ6OnBhaXIgd3JhcHBlcnMgKHN0ZF9wYWlyLmkpIGZvciBhbGwgbGFuZ3VhZ2VzLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBzdGQ6OnBhaXIgd3JhcHBlcnMgaW4gc3RkX3BhaXIuaQoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgQyMgJ25ldycgYW5kICdvdmVycmlkZScgbW9kaWZpZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYSBDKysgY2xhc3MgaW5oZXJpdHMgbWV0aG9kcwogICAgICAgICAgICB2aWEgYSBDKysgJ3VzaW5nJyBkZWNsYXJhdGlvbi4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHByZXZpb3VzbHkgYmVpbmcgaWdub3JlZCBpbiBjbGFzc2VzIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMKICAgICAgICAgICAgZnJvbSAndXNpbmcnIGRlY2xhcmF0aW9ucywgZWcgY2FsbHMgdG8gRGVyaXZlZDo6YmFyIGJlbG93IHdpbGwgY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvCiAgICAgICAgICAgIGEgdGFyZ2V0IGxhbmd1YWdlIGV4Y2VwdGlvbi9lcnJvciwgbGlrZSBpdCBhbHdheXMgaGFzIGRvbmUgZm9yIEJhc2U6OkJhci4KCiAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgIHZpcnR1YWwgYmFyKCkgdGhyb3cgKHN0ZDo6c3RyaW5nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKICAgICAgICAgICAgICB1c2luZyBCYXNlOjpiYXI7CiAgICAgICAgICAgIH07CgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGV0ZWN0aW5nIHZpcnR1YWwgbWV0aG9kcyBpbiAlZXh0ZW5kIGZvciB0aGUgLWZ2aXJ0dWFsIG9wdGlvbiBhbmQgQyMgb3ZlcnJpZGUgYW5kIG5ldwogICAgICAgICAgICBtZXRob2QgbW9kaWZpZXJzLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJ25ldycgbW9kaWZpZXIgaXMgbm93IGdlbmVyYXRlZCBvbiB0aGUgcHJveHkgbWV0aG9kIHdoZW4gYSBtZXRob2QgaW4gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGlzIG5vdCBwb2x5bW9ycGhpYyBhbmQgdGhlIHNhbWUgbWV0aG9kIGV4aXN0cyBpbiB0aGUgZGVyaXZlZCBjbGFzcyAoaWUgaXQgaGlkZXMKICAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MnIG5vbi12aXJ0dWFsIG1ldGhvZCkuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeGVzIHRvIGRldGVjdGlvbiBvZiBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzIC0gd2hlbiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIG1vcmUKICAgICAgICAgICAgdGhhbiAyIGNsYXNzZXMgZGVlcC4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcHMgbW92ZWQgZnJvbSBzdGRfc3RyaW5nLmkgdG8gc3RkX3dzdHJpbmcuaQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBjcmFzaCBpbiBEb2hTdHJzdHIsIGJ1ZyAjMTE5MDkyMQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gRml4IGZvciBtZXRob2RzIHdpdGggc2ltaWxhciBuYW1lcyB3aGVuIHNob3dpbmcgbGlzdCBvZiBuYW1lcyBvbiBlcnJvciAtIGJ1ZyAjMTE5MTgyOC4KICAgICAgICAgICAgUGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIGxvbmcgbG9uZyBvdmVybG9hZGluZyBmaXggLSBidWcgIzExOTE4MzUsIHBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxMTk2NzU1IHRvIHJlbW92ZSBkZWJ1ZyBmcm9tIHN3aWd0Y2w4LnN3Zy4KCjA1LzE5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgLWZ2aXJ0dWFsIG9wdGlvbl0gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgd2hlbiBhCiAgICAgICAgICAgIHZpcnR1YWwgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgd2FzIGEgdHlwZWRlZiBpbiBlaXRoZXIgdGhlIGJhc2Ugb3IgZGVyaXZlZCBjbGFzcy4gQWxzbyBlbnN1cmVzIHRoZQogICAgICAgICAgICBtZXRob2QgaXMgZWxpbWluYXRlZCB3aGVuIHVzaW5nIHRoZSAtZnZpcnR1YWwgb3B0aW9uLiBGb3IgZXhhbXBsZSwgRGVyaXZlZC5tZXRob2Qgbm93IGhhcyB0aGUgQyMKICAgICAgICAgICAgb3ZlcnJpZGUga2V5d29yZCBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50KiBJbnRlZ2VyUHRyOwoKICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEludGVnZXJQdHIgbWV0aG9kKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIGludCAqIG1ldGhvZCgpIGNvbnN0OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBbQyNdIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBiZWluZyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIHZpcnR1YWwgbWV0aG9kcyB3aGVuIGEgYmFzZSBjbGFzcwogICAgICAgICAgICBpcyBpZ25vcmVkIHdpdGggJWlnbm9yZS4KCjA1LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byByZW1vdmUgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZ3MgaW4gQyB3cmFwcGVycyB3aGVuIGNvbXBpbGluZyBDIGNvZGUgd2l0aCAnZ2NjIC1XYWxsIC1mc3RyaWN0LWFsaWFzaW5nJy4gUGF0Y2ggZnJvbQogICAgICAgICAgICBNaWNoYWVsIENhaGlsbC4gVGhpcyBtb2RpZmllcyBtYW55IG9mIHRoZSBjYXN0cyBzbGlnaHRseSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopJmphcmcxOwogICAgICAgICAgICB0bwogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikodm9pZCAqKSZqYXJnMTsKCjA1LzEyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgQyMgYXR0cmlidXRlcy4gQyMgYXR0cmlidXRlcyBjYW4gYmUgZ2VuZXJhdGVkOgogICAgICAgICAgICAxKSBPbiBhIEMvQysrIHR5cGUgYmFzaXMgYnkgc3BlY2lmeWluZyBhbiBpbmF0dHJpYnV0ZXMgYW5kL29yIG91dGF0dHJpYnV0ZXMgdHlwZW1hcCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgaW4gdGhlIGltdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMgKGZvciBDIyByZXR1cm4gdHlwZSBvciBDIyBwYXJhbWV0ZXIgdHlwZSBhdHRyaWJ1dGVzKS4KICAgICAgICAgICAgMikgT24gYSB3cmFwcGVkIG1ldGhvZCBvciB2YXJpYWJsZSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIGZlYXR1cmUgKCVmZWF0dXJlKS4KICAgICAgICAgICAgMykgT24gYSB3cmFwcGVkIHByb3h5IGNsYXNzIG9yIGVudW0gYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyB0eXBlbWFwLgoKICAgICAgICAgICAgRXhhbXBsZXMgYXJlIGluIHRoZSBDIyBkb2N1bWVudGF0aW9uIChDU2hhcnAuaHRtbCkuCgowNC8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgY29uZmlndXJlIG9wdGlvbiB0byB0dXJuIG9mZiB0aGUgZGVmYXVsdCBtYXhpbXVtIGNvbXBpbGVyIHdhcm5pbmcgYXMKICAgICAgICAgICAgdGhleSBjb3VsZG4ndCBiZSByZW1vdmVkIGV2ZW4gd2hlbiBvdmVycmlkaW5nIENGTEFHUyBhbmQgQ1hYRkxBR1Mgd2l0aCBjb25maWd1cmUKICAgICAgICAgICAgKC4vY29uZmlndXJlIENGTEFHUz0gQ1hYRkxBR1M9KS4gVG8gdHVybiB0aGUgbWF4aW11bSB3YXJuaW5ncyBvZmYsIHJ1bjogIAoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtbWF4aW11bS1jb21waWxlLXdhcm5pbmdzCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB3aGljaCByZXdvcmtzIHRoZSBKYXZhIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGl6ZS9kZXN0cnVjdG9yIHR5cGVtYXBzLAogICAgICAgICAgICBmb3IgZGlyZWN0b3JzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG92ZXJhbGwgSmF2YSB0eXBlbWFwcy4gQWRkZWQgdGhlIGRpcmVjdG9yX3Rha2UgYW5kIAogICAgICAgICAgICBkaXJlY3Rvcl9yZWxlYXNlIHR5cGVtYXBzIHRvIGVtdWxhdGUgb3RoZXIgbW9kdWxlcycgX19kaXNvd25fXyBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXhlZCBwcm9ibGVtcyBkdWUgdG8gdGhlIG92ZXIgZWFnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuIE9jY2FzaW9uYWxseSB0aGUKICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd291bGQgY29sbGVjdCBhIEMjIHByb3h5IGNsYXNzIGluc3RhbmNlIHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkCiAgICAgICAgICAgIGluIHVubWFuYWdlZCBjb2RlIGlmIHRoZSBvYmplY3Qgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBhIHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSB0aGlzIGNhdXNlZCBoYXZvYyBhcyB0aGUgQyMgcHJveHkgY2xhc3MgY2FsbHMgdGhlIEMrKyBkZXN0cnVjdG9yCiAgICAgICAgICAgIHdoZW4gaXQgaXMgY29sbGVjdGVkLiBQcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcyBub3cgdXNlIGEgSGFuZGxlUmVmLAogICAgICAgICAgICB3aGljaCBob2xkcyBhbiBJbnRQdHIsIGluc3RlYWQgb2YgYSBwbGFpbiBJbnRQdHIgdG8gbWFyc2hhbCB0aGUgQysrIHBvaW50ZXIgdG8gdW5tYW5hZ2VkCiAgICAgICAgICAgIGNvZGUuIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzCiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgICAgIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgc3dpZ0NQdHIgaXMgbm93IG9mIHR5cGUgSGFuZGxlUmVmCiAgICAgICAgICAgIGluc3RlYWQgb2YgSW50UHRyIGFuZCBjb25zZXF1ZW50bHkgdGhlIGdldENQdHIgbWV0aG9kIHJldHVybiB0eXBlIGhhcyBhbHNvIGNoYW5nZWQuIFRoZSBuZXQKICAgICAgICAgICAgZWZmZWN0IGlzIHRoYXQgYW55IGN1c3RvbSB3cml0dGVuIHR5cGVtYXBzIG1pZ2h0IGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gc3VpdGUuIEFmZmVjdGVkIHVzZXJzCiAgICAgICAgICAgIHNob3VsZCBub3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5ldyAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGltdHlwZSB0eXBlbWFwIGFzIHRoZQogICAgICAgICAgICBpbnB1dCB0eXBlIGlzIG5vdyBhIEhhbmRsZVJlZiBhbmQgdGhlIG91dHB1dCB0eXBlIGlzIHN0aWxsIGFuIEludFB0ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIGFzeW1tZXRyaWMgdHlwZSBtYXJzaGFsbGluZyBhZGRlZC4gU29tZXRpbWVzIHRoZSBvdXRwdXQgdHlwZSBuZWVkcyB0byBiZQogICAgICAgICAgICBkaWZmZXJlbnQgdG8gdGhlIGlucHV0IHR5cGUuIFN1cHBvcnQgZm9yIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YgYSBuZXcgb3B0aW9uYWwgJ291dCcKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgY3R5cGUsIGltdHlwZSBhbmQgY3N0eXBlIHR5cGVtYXBzLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIG5vdAogICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcCwgYXMgaGFzIGFsd2F5cyBwcmV2aW91c2x5IGJlZW4gdGhlIGNhc2UuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICB0aGVuIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIG91dHB1dCB0eXBlcyBhbmQgdGhlIHR5cGUgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSB0eXBlbWFwIGl0c2VsZiBpcyB1c2VkIGZvciB0aGUgaW5wdXQgdHlwZS4gQW4gb3V0cHV0IHR5cGUgaXMgYSByZXR1cm4gdmFsdWUgZnJvbQogICAgICAgICAgICBhIHdyYXBwZWQgbWV0aG9kIG9yIHdyYXBwZWQgY29uc3RhbnQgYW5kIGFuIGlucHV0IHR5cGUgaXMgYSBwYXJhbWV0ZXIgaW4gYSB3cmFwcGVkIG1ldGhvZC4KCiAgICAgICAgICAgIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBjaGFyICogY291bGQgYmUgbWFyc2hhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cywgCgogICAgICAgICAgICAgICV0eXBlbWFwKGltdHlwZSwgb3V0PSJJbnRQdHIiKSBjaGFyICogInN0cmluZyIKICAgICAgICAgICAgICBjaGFyICogZnVuY3Rpb24oY2hhciAqKTsKCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdHlwZSBpcyB0aHVzIEludFB0ciBhbmQgdGhlIGlucHV0IHR5cGUgaXMgc3RyaW5nLiBUaGUgcmVzdWx0aW5nIGludGVybWVkaWFyeSBDIyBjb2RlIGlzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgZnVuY3Rpb24oc3RyaW5nIGphcmcxKTsKCjA0LzIyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBnZW5lcmF0aW9uIG9mICJkZWZpbmUtbWV0aG9kIiBmb3IgbWV0aG9kcyBvZgoJICAgIGNsYXNzZXMgd2l0aCBhIGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgowNC8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBGb3Igd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbXVsdGlwbGUgdmFsdWVzICh1c2luZyBhcmdvdXQpLAoJICAgIFNXSUcgQ0hJQ0tFTiBub3cgcmV0dXJucyB0aGVtIGFzIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mIGFzCgkgICAgYSBsaXN0LiAgVGhleSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB1c2luZyAoY2FsbC13aXRoLXZhbHVlcykuCgowNC8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dCiAgICAgICAgICAgICsgQWRkZWQgYSB3aG9sZSBidW5jaCBvZiBuZXcgX3J1bm1lIHNjcmlwdHMgaW50byB0aGUgY2hpY2tlbiB0ZXN0CiAgICAgICAgICAgIHN1aXRlLiAgQWxzbyBmaXggc29tZSBidWdzIHRoZXNlIG5ldyBzY3JpcHRzIHR1cm5lZCB1cC4KCiAgICAgICAgICAgICsgQWRkZWQgb3B0aW1pemF0aW9uIHdoZW4gcmV0dXJuaW5nIGEgd3JhcHBlZCBwcm94eSBjbGFzcy4gIEJlZm9yZSwKICAgICAgICAgICAgYSBtaW5vciBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGludm9rZWQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIHJldHVybmVkLgoKCSAgICArIEFsbCB0aGUgY2hpY2tlbiBFeGFtcGxlcyBzaG91bGQgbm93IHJ1biBjb3JyZWN0bHkKCjA0LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdHlwZW1hcCBtYXRjaGluZyB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgaW4gcGFydGljdWxhcgogICAgICAgICAgICBzdGQ6OnN0cmluZywgc28gdGhhdCBzdGQ6OnN0cmluZyB2YXJpYWJsZXMgY2FuIGJlIGVhc2lseSBtYXJzaGFsbGVkIHdpdGgKICAgICAgICAgICAgYSBDIyBzdHJpbmcgcHJvcGVydHkgdXNpbmc6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfc3RyaW5nLmkiCiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqdmFyaWFibGVfbmFtZSB9OwogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWU7CgogICAgICAgICAgICAoUmVjYWxsIHRoYXQgYWxsIGNsYXNzIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwb2ludGVycykKCjA0LzA1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgQWRkZWQgRXhhbXBsZXMvY2hpY2tlbi9lZ2csIGFuIGV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgY2hpY2tlbgoJICAgICAgZXh0ZW5zaW9uIGxpYnJhcnkgaW4gdGhlIGZvcm0gb2YgYW4gZWdnLiAgQWxzbyB1cGRhdGVkIHRoZQoJICAgICAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGlmZmVyZW50IGxpbmtpbmcgb3B0aW9ucy4KCgkgICAgKyBjaGlja2VuIHRlc3Qtc3VpdGUgbm93IGhhcyBzdXBwb3J0IHRvIGNoZWNrIFNXSUcgd2l0aCB0aGUgLXByb3h5CgkgICAgICBhcmd1bWVudCBpZiB0aGVyZSBleGlzdHMgYSBfcHJveHlfcnVubWUuc3MgZmlsZS4KCgkgICAgKyBNb3JlIGZpeGVzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgLXByb3h5CgowMy8zMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBUdXJuZWQgb24gZXh0cmEgdGVtcGxhdGUgZmVhdHVyZXMgZm9yIGFsbCBsYW5ndWFnZXMgd2hpY2ggd2VyZQogICAgICAgICAgICBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIHRvIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgZW5hYmxlcyB0eXBlbWFwcyBkZWZpbmVkIHdpdGhpbiBhIHRlbXBsYXRlZCBjbGFzcyB0byBiZSB1c2VkIGFzCiAgICAgICAgICAgIGV4cGVjdGVkLiBSZXF1aXJlcyAldGVtcGxhdGUgb24gdGhlIHRlbXBsYXRlZCBjbGFzcywgJXRlbXBsYXRlKCkgd2lsbAogICAgICAgICAgICBhbHNvIHBpY2sgdXAgdGhlIHR5cGVtYXBzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgICBvcgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxUPiAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29faSkgRm9vPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgRm9vPGRvdWJsZT47CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgdGhlIHByb3BlciAnaW4nIHR5cGVtYXBzIHdoZXJldmVyIEZvbzxpbnQ+IGFuZCBGb288ZG91YmxlPgogICAgICAgICAgICBhcmUgdXNlZC4KCjAzLzMwLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFBhdGNoIGZyb20gSGFucyBPZXN0ZXJob2x0IGZvciBzdXBwb3J0aW5nIE16U2NoZW1lIDMweC4KCjAzLzI5LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgUmVhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiBjaGlja2VuICgxLjQwIHRvIDEuODkpIGJ5IHBhc3NpbmcgLW5vY29sbGVjdGlvbgoJICAgICAgYXJndW1lbnQgdG8gU1dJRwoJICAgICsgJWltcG9ydCBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggdGlueWNsb3MuICAoZGVjbGFyZSAodXNlcyAuLi4pKSB3aWxsIGJlCgkgICAgICBleHBvcnRlZCBjb3JyZWN0bHkuCgkgICAgKyBUaW55Q0xPUyBwcm94eSBjbGFzc2VzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgICBhbmQgY29uc3RydWN0b3JzLgoKMDMvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3Rvcm91dCB0eXBlbWFwcy4gSmF2YSBkaXJlY3RvcnMKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcHMgbGlrZSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIG5vdy4gVGhlIG5ldwogICAgICAgICAgICB0eXBlbWFwcyBwcm92aWRlIGZpeGVzIGZvciBtZXRob2RzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyByZXR1cm5lZAogICAgICAgICAgICBieSByZWZlcmVuY2UgKHRoaXMgY2Fubm90IGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0aHJlYWQgc2FmZSB0aG91Z2gpLgoKMDMvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRW51bSBjYXN0aW5nIGZpeGVzLiBWaXN1YWwgQysrIGRpZG4ndCBsaWtlIHRoZSBDIHR5cGUgY2FzdGluZyBTV0lHIHByb2R1Y2VkCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQysrIGVudW0gcmVmZXJlbmNlcywgYXMgcmVwb3J0ZWQgYnkgQWRtaXJlIEthbmRhd2FzdmlrYS4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBTRiAjMTEyNDQ5MC4gRml4IFBlcmwgbWFjcm8gY2xhc2hlcyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8ncyBTVEwgc3RyaW5nLAogICAgICAgICAgICBzbyBub3cgcHJvamVjdHMgY2FuICNpbmNsdWRlIDxzdHJpbmc+LgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXZhcmFyZ3Mgd2hpY2ggZ290IGJyb2tlbiB3aXRoIHRoZSByZWNlbnQgZGVmYXVsdCBhcmd1bWVudCBjaGFuZ2VzLgogICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBKYXZhIGFuZCBDIyBmb3IgdGhlIGZpcnN0IHRpbWUgbm93LgoKMDMvMTcvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICArIEZpeCBhIHdob2xlIGJ1bmNoIG9mIGJ1Z3MgaW4gdGhlIGNoaWNrZW4gbW9kdWxlLiAgVGhlIGVudGlyZQogICAgICAgICAgICAgIHRlc3Qgc3VpdGUgbm93IGNvbXBpbGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRlc3RzIHRoYXQgcmVxdWlyZQoJICAgICAgc3RkX3ZlY3Rvci5pLCBzdGRfZGVxdWUuaSwgYW5kIHNvIG9uLCB3aGljaCBjaGlja2VuIGRvZXMgbm90IGhhdmUgeWV0LgoKCSAgICArIEFkZCBzdXBwb3J0IGZvciAlZXhjZXB0aW9uIGFuZCAldHlwZW1hcChleGNlcHRpb25zKS4gIEV4Y2VwdGlvbnMgYXJlCgkgICAgICB0aHJvd24gd2l0aCBhIGNhbGwgdG8gKGFib3J0KSBhbmQgY2FuIGJlIGhhbmRsZWQgYnkgKGhhbmRsZS1leGNlcHRpb25zKQoKMDMvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3RvcnMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHR5cGVtYXBzCiAgICAgICAgICAgIGdpdmluZyB1c2VycyBmaW5lIGNvbnRyb2wgb3ZlciBtZW1vcnkgb3duZXJzaGlwIGFuZCBsaWZldGltZSBvZiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBEaXJlY3RvciBjbGFzc2VzIG5vIGxvbmdlciBsaXZlIGZvcmV2ZXIgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSBub3cgY29sbGVjdGFibGUKICAgICAgICAgICAgYnkgdGhlIEdDLgoKMDMvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZmluYWxpemVycyBnYXJiYWdlIGNvbGxlY3RlZCBvYmplY3RzLgoJICAgIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBzaG91bGQgYmUgbWFya2VkIHdpdGggJW5ld29iamVjdCBhbmQKCSAgICBpbnB1dCBhcmd1bWVudHMgd2hpY2ggY29uc3VtZSAob3IgdGFrZSBvd25lcnNoaXApIG9mIGEgcG9pbnRlciBzaG91bGQKCSAgICBiZSBtYXJrZWQgd2l0aCB0aGUgRElTT1dOIHR5cGVtYXAuCgoJICAgIEFsc28gYWRkIHN1cHBvcnQgZm9yIGNvcnJlY3RseSBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQKCSAgICB0byBhIGZ1bmN0aW9uLCBhbmQgcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgbnVtYmVyIGFyZSBwYXNzZWQuCgowMy8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgQWRkIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiB0byBjb25maWd1cmUuaW4sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgIHBhc3NpbmcgYWxsIHRoZSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsNSBldGMuLi4gdGhhdCBNYXR0aGlhcyBhZGRlZC4KCjAzLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIE1lbW9yeSBsZWFrIGZpeCBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBjbGFzc2VzL3N0cnVjdHMgYnkgdmFsdWUuCgowMy8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGZvciBQZXJsIGluY29ycmVjdGx5IHRha2luZyBtZW1vcnkgb3duZXJzaGlwIGZvciByZXR1cm4gdHlwZXMgdGhhdAogICAgICAgICAgICBhcmUgdHlwZWRlZnMgdG8gYSBzdHJ1Y3QvY2xhc3MgcG9pbnRlci4gUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFZhcmlvdXMgZXhjZXB0aW9uIGNoYW5nZXMgZm9yIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlc2Ugbm93IG1vcmUKICAgICAgICAgICAgYWNjdXJhdGVseSBtaXJyb3IgdGhlIHNhbWUgZXhjZXB0aW9ucyB0aGF0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QgdGhyb3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGFmdGVyIGFueSBvZiB0aGUgc3RkOjp2ZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFdoZW4gbnVsbCBpcyBwYXNzZWQgZm9yIGEgQysrIHJlZmVyZW5jZSBvciB2YWx1ZSBwYXJhbWV0ZXIsIHRoZSAKICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93biBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGluc3RlYWQKICAgICAgICAgICAgb2YgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiBhcyByZWNvbW1lbmRlZCBpbiB0aGUgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyB0dXJuIGEgQysrIGV4Y2VwdGlvbiBpbnRvIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICBub3QgYSBTeXN0ZW1FeGNlcHRpb24gbm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOdW1lcm91cyBjaGFuZ2VzIGluIEMjIGV4Y2VwdGlvbiBoYW5kbGluZyBoYXZlIGJlZW4gbWFkZSBvdmVyIHRoZSBwYXN0CiAgICAgICAgICAgIGZldyB3ZWVrcy4gQSBzdW1tYXJ5IGZvbGxvd3M6CgogICAgICAgICAgICBUaGUgd2F5IGluIHdoaWNoIEMrKyBleGNlcHRpb25zIGFyZSBtYXBwZWQgdG8gQyMgZXhjZXB0aW9ucyBpcyBxdWl0ZSBkaWZmZXJlbnQuCiAgICAgICAgICAgIFRoZSBjaGFuZ2UgaXMgdG8gZml4IEMjIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgQysrIGV4Y2VwdGlvbiBzdGFjayBpcyBjb3JyZWN0bHkKICAgICAgICAgICAgdW53b3VuZCBhcyBwcmV2aW91c2x5IEMrKyBleGNlcHRpb25zIHdlcmUgYmVpbmcgdGhyb3duIGFjcm9zcyB0aGUgQyBQSW52b2tlIGxheWVyCiAgICAgICAgICAgIGludG8gdGhlIG1hbmFnZWQgd29ybGQuCgogICAgICAgICAgICBOZXcgdHlwZW1hcCBhdHRyaWJ1dGVzIChjYW50aHJvdyBhbmQgZXhjb2RlKSBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBjb250cm9sIHRoZQogICAgICAgICAgICBtYXBwaW5nIG9mIEMrKyB0byBDIyBleGNlcHRpb25zLiBFc3NlbnRpYWxseSBhIGNhbGxiYWNrIGludG8gdGhlIHVubWFuYWdlZCB3b3JsZAogICAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHBlbmRpbmcgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHRvIHRocm93IGlzIHN0b3JlZCBpbiB0aHJlYWQgbG9jYWwKICAgICAgICAgICAgc3RvcmFnZSAoc28gdGhlIGFwcHJvYWNoIGlzIHRocmVhZC1zYWZlKS4gVGhlIHR5cGVtYXBzIGFyZSBleHBlY3RlZCB0byByZXR1cm4KICAgICAgICAgICAgZnJvbSB1bm1hbmFnZWQgY29kZSBhcyBzb29uIGFzIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBpcyBzZXQuIEFueSBwZW5kaW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgYXJlIGNoZWNrZWQgZm9yIGFuZCB0aHJvd24gb25jZSBtYW5hZ2VkIGNvZGUgc3RhcnRzIGV4ZWN1dGluZy4gVGhlcmUgc2hvdWxkCiAgICAgICAgICAgIGJlIG1pbmltYWwgaW1wYWN0IG9uIGV4ZWN1dGlvbiBzcGVlZCBkdXJpbmcgbm9ybWFsIGJlaGF2aW91ci4gRnVsbCBkZXRhaWxzIHdpbGwgYmUKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiBDU2hhcnAuaHRtbC4KCiAgICAgICAgICAgIFRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKCkgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQoKSBhbmQgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uKCkKICAgICAgICAgICAgZnVuY3Rpb25zLiBUaGUgb3JpZ2luYWwgbmFtZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgY2hhbmdlZCB0byBicmVhayBvbGQgY29kZSBhcwogICAgICAgICAgICB0aGUgb2xkIGFwcHJvYWNoIHdhcyBzb21ld2hhdCBmbGF3ZWQuIEFueSB1c2VyIGRlZmluZWQgZXhjZXB0aW9ucyB0aGF0IGZvbGxvdyB0aGUKICAgICAgICAgICAgc2FtZSBwYXR0ZXJuIGFzIHRoZSBvbGQgYXBwcm9hY2ggc2hvdWxkIGFsc28gYmUgZml4ZWQuCgogICAgICAgICAgICBOdW1lcm91cyBuZXcgLk5FVCBmcmFtZXdvcmsgZXhjZXB0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgZWFzeSB0aHJvd2luZyBmcm9tIAogICAgICAgICAgICB1bm1hbmFnZWQgY29kZS4gVGhlIGNvbXBsZXRlIGxpc3QgaXM6IAoKICAgICAgICAgICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgQXJpdGhtZXRpY0V4Y2VwdGlvbiwgRGl2aWRlQnlaZXJvRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLCBPdXRPZk1lbW9yeUV4Y2VwdGlvbiwgT3ZlcmZsb3dFeGNlcHRpb24sIAogICAgICAgICAgICAgIFN5c3RlbUV4Y2VwdGlvbiwgQXJndW1lbnRFeGNlcHRpb24sIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBhbmQKICAgICAgICAgICAgICBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMDUvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgRml4IHNldmVyYWwgbWVtb3J5IGxlYWtzIGFyb3VuZC4gRXZlbiB3aGVuIHdlIHN1cnZpdmUgIGtub3duaW5nCgkgICAgc3dpZyBpcyBhIG1lbW9yeSBsZWFrIGZhY3RvcnksIGl0IHdhcyBhIGxpdHRsZSBvdXQgb2YKCSAgICBjb250cm9sLiBUbyBydW4gc3RkX2NvbnRhaW5lcnMuaSBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUsCgkgICAgc3dpZyB3YXMgdXNpbmcgfjI2ME1CLCBub3cgaXQgdXNlcyAnb25seScgfjQwTUIsIHdoaWNoIGlzCgkgICAgdGhlIHNhbWUgYW1tb3VudCB0aGF0IGcrKyB1c2VzLCBzbywgaXMgbm90IHRoYXQgYmFkLgoJICAgIEluIHRoZSBwcm9jZXNzLCBJIGZvdW5kIGEgY291cGxlIG9mIGV4dHJhIERlbGV0ZXMsIHdoaWNoCgkgICAgaW4gc29tZSBjYXNlcyBjb3VsZCB0cmlnZ2VyIHNlZy4gZmF1bHRzIGFuZC9vcgoJICAgIERPSC9hc3NlcnRzLgoJICAgIAoJICAgIFtweXRob25dIEJldHRlciBzdXBwb3J0IGZvciBkaXJlY3RvcnMgKyBleGNlcHRpb24uIE1vcmUKCSAgICB2ZXJib3NlIGVycm9ycyBhbmQgYWRkZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxlci4KCgkgICAgW3B5dGhvbl0gRml4IG1lbW9yeSBsZWFrIGZvciB0aGUKCgkgICAgCSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gCgoJICAgIGNhc2UscmVwb3J0ZWQgYnkgQm8gUGVuZy4KCgkgICAgW3B5dGhvbl0gRml4IFN3aWdQeU9iamVjdCBjb21wYXJlIHByb2JsZW0gcmVwb3J0ZSBieQoJICAgIENhbWVyb24gUGF0cmljay4gCgoJICAgIFtweXRob25dIEZpeCBzZXZlcmFsIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSAKCSAgICBmb3IgZ251LWdjYywgSW50ZWwgYW5kIFZDNy4xICBjb21waWxlcnMuCgoKMDIvMjUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gdXNlIENTUyBhbmQgPGRpdj4gaW5zdGVhZCBvZiA8YmxvY2txdW90ZT4KCSAgICBJIHVzZWQgYSBzY3JpcHQgdG8gY29udmVydCB0aGUgZG9jcywgYW5kIGl0IHNldCBhbGwgdGhlIGJveCBjbGFzc2VzCgkgICAgdG8gYmUgImNvZGUiLiAgVGhlcmUgYXJlIGFjdHVhbGx5IDQgZGlmZmVyZW50IGNsYXNzZXMsCgkgICAgInNoZWxsIiwgImNvZGUiLCAidGFyZ2V0bGFuZyIsIGFuZCAiZGlhZ3JhbSIuICBXZSBuZWVkIHRvIGdvIHRocm91Z2gKCSAgICBhbmQgY29udmVydCB0aGUgZGl2cyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGNvbnRhaW4uCgowMi8yMy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkZWQgb3B0aW9uIC1ub3J0dGkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIG5hdGl2ZQoJICAgIEMrKyBSVFRJIHdpdGggZGlyZWN0b3JzIChkeW5hbWljX2Nhc3Q8PiBpcyBub3QgdXNlZCkuCgoJICAgIEFkZCBtb3JlIGNvZGUgZm9yIGRpcmVjdG9ycyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUuCgoJICAgIEV4dGVuZCB0aGUgdXNlIG9mIFNXSUdJTlRFUk4gd2hlbmV2ZXIgaXMgcG9zc2libGUuCgoJICAgIFJlbW92ZSB0ZW1wbGF0ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBWQzcuMS4KCgkgICAgUmVtb3ZlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IGdjYy9nKysuIEZpbmFsbHkgeW91IGNhbgoJICAgIGNvbXBpbGUgdXNpbmcKCgkgICAgICAgZysrIC1XIC1XYWxsIC1jIG15bW9kdWxlX3dyYXAuY3h4CgoJICAgIGFuZCBubyBzcHVyaW91cyBlcnJvcnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIKCSAgICBjb2RlLgoKMDIvMjMvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgQWRkZWQgLWV4dGVybmFsLXJ1bnRpbWUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZHVtcAoJICAgIG91dCBhbGwgdGhlIGNvZGUgbmVlZGVkIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHJ1bnRpbWUgc3lzdGVtLAoJICAgIGFuZCBpdCByZXBsYWNlcyBpbmNsdWRpbmcgdGhlIGZpbGVzIGRpcmVjdGx5LiAgVGhpcyBjaGFuZ2UgYWRkcwoJICAgIHR3byBuZXcgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIExhbmd1YWdlIGNsYXNzLCB3aGljaCBhcmUgdXNlZAoJICAgIHRvIGZpbmQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHJ1bnRpbWUgY29kZS4gIEkgYWxzbyB1cGRhdGVkCgkgICAgYWxsIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgcnVudGltZSB0byBpbXBsZW1lbnQgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KCjAyLzIyLzIwMDU6IG1tYXR1cyAKCSAgICBGaXggJXRlbXBsYXRlICsgcHJpdmF0ZSBlcnJvciBTRiMxMDk5OTc2LgoKMDIvMjEvMjAwNTogbW1hdHVzIAoKCSAgICBGaXggc3dpZ3J1bi5zd2cgd2FybmluZ3MgcmVwb3J0ZWQgd2hlbiB1c2luZyAiZ2NjIC1XIC1XYWxsIgoJICAgIChzdGF0aWMvaW5saW5lIG5vdCB1c2VkIGluIGZyb250IG9mIGEgZnVuY3Rpb24KCSAgICBkZWNsYXJhdGlvbiksIGFuZCBhZGQgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQKCSAgICB1bnVzZWQgd2FybmluZ3MgZWxzZXdoZXJlLgoKCSAgICBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzLgoKCSAgICBbUHl0aG9uXSBVc2UgbmV3IFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzIGluCgkgICAgU1dJR0lOVEVSTiBtZXRob2RzLgoKCSAgICBbUHl0aG9uXSBGaXggUHlPU19zbnByaW50ZiBmb3IgcHl0aG9uIHZlcnNpb25zIDwgMi4yIChTRiAjMTEwNDkxOSkuCgoJICAgIFtQeXRob25dIEZpeCBtYXAvbXVsdGltYXAgdG8gYWxsb3cgZW1wdHkgbWFwcyAocmVwb3J0ZWQgYnkKICAJICAgIFBoaWxpcHBlIEhldHJveSkuCgoJICAgIFtEb2NzXSBBZGQgc29tZSBkb2N1bWVudGF0aW9uIHRvIFB5dGhvbi5odG1sIGFuZAoJICAgIFNXSUdQbHVzLmh0bWwsIGluY2x1ZGluZyBmb3IgZXhhbXBsZSB0aGUgZmFjdCB0aGF0CgkgICAgJ2ZyaWVuZHMnIGFyZSBub3cgc3VwcG9ydGVkLgoKMDIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gUGF0Y2ggZnJvbSBPbGx5IEJldHRzLCBzbyB0aGF0IHdyYXBwZXJzIGNvbXBpbGUgd2l0aCBaZW5kIHRocmVhZCBzYWZldHkgZW5hYmxlZC4KCjAyLzE3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeCBpbiBzb21lIG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbW9kdWxlcyB3aGVuIHVzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGluIGNvbnN0cnVjdG9ycy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZSB3YXMgbm90IHRha2luZyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICAgICAgIEMrKyBvYmplY3QgbWVtb3J5IHdoZW4gYW55IG9mIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB1c2UgZGVmYXVsdCBhcmd1bWVudHMgd2FzIGNhbGxlZC4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxMTE1MDU1OiBGYWlsZWQgbWFrZSBpbnN0YWxsLiBQYXRjaCBmcm9tIFJvYiBTdG9uZS4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiAjMTEyMzQxNiBmcm9tIFBhdWwgTW9vcmUuIENvcnJlY3QgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFNUUklOR0FSUkFZCiAgICAgICAgICAgIHR5cGVtYXBzIGluIHZhcmlvdXMuaS4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIERpc2FibGVkIHR5cGVtYXAgc2VhcmNoIGNoYW5nZXMgZm9yIG5vdyAoc2VlIGVudHJ5IDE5LzEyLzIwMDQpLiBJdCBicmVha3MKICAgICAgICAgICAgb2xkIHR5cGVtYXBzLCBsZW5ndGhlbnMgdGhlIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDI1JSBhbmQgaW50cm9kdWNlcwogICAgICAgICAgICBpbmNvbnNpc3RlbmNpZXMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBzd2lnIC1oZWxwIGZvbGxvd3Mgb3RoZXIgc29mdHdhcmUgYnkgcHJpbnRpbmcgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgc3dpZyAtdmVyc2lvbiBhbHNvIGRpc3BsYXlzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIEJlaGF2aW91ciByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGZvciB0aGUgbGVzcyBjb21tb25seSB1c2VkIG9yZGVyaW5nIG9mICVpbmNsdWRlIGFuZCAjaW5jbHVkZSwgc28KICAgICAgICAgICAgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMuIEJ1ZyByZXBvcnRlZCBieSByZXBvcnRlZCBieSBNYXggQm93c2hlci4KICAgICAgICAgICAgICAlaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2luY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlfSAKCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gU1dJR19leGNlcHRpb24gbWFjcm8gd2lsbCBub3cgcmV0dXJuIGZyb20gdW5tYW5hZ2VkIGNvZGUgLyBuYXRpdmUgY29kZQogICAgICAgICAgICBhcyBzb29uIGFzIGl0IGlzIGNhbGxlZC4gRml4ZXMgcG9zc2libGUgSlZNIGNyYXNoZXMgYW5kIG90aGVyIGNvZGUgdW5leHBlY3RlZGx5CiAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLiBOb3RlIFNXSUdfZXhjZXB0aW9uIGlzIG9ubHkgb2NjYXNpb25hbGx5IHVzZWQgYnkgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgIHdyaXRlcnMsIGFuZCBpcyBiZXN0IGF2b2lkZWQgYnkgU1dJRyB1c2Vycy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gVHlwZW1hcHMgY2FuIG5vdyBiZSB0YXJnZXRlZCBhdCBnbG9iYWwgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZXMuIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIGZvciAKICAgICAgICAgICAgdGhlIHNldHRlcnMgd2VyZSBpZ25vcmVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBnbG9iYWxpbnQgIi4uLiIKICAgICAgICAgICAgICBpbnQgZ2xvYmFsaW50OwoKMDIvMTMvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkICV0eXBlY2hlY2sgZm9yIFNXSUdUWVBFLCBhZGQgJXR5cGVjaGVjayBmb3IgcHRyZGlmZl90LCBmaXgKCSAgICB0eXBlbWFwcyBmb3Igc2l6ZV90LgoKCSAgICBbUGlrZV0gTWVyZ2UgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgZm9yIGltcHJvdmVkIFBpa2UgY29uZmlndXJhdGlvbi4KCjAyLzEyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgY29uZmlndXJlIHN3aXRjaGVzIC0td2l0aG91dC10Y2wsIC0td2l0aG91dC1weXRob24gZXRjLiBhbGxvdyB0bwogICAgICAgICAgICBkaXNhYmxlIHRoZSBzZWFyY2ggZm9yIGluc3RhbGxlZCBsYW5ndWFnZXMuCgowMS8zMS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBBZGQgRG9oU29ydExpc3QgdG8gRE9ICgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtOgogICAgICAgICAgICAgICArIFNwZWVkLiBUeXBlIGxvYWRpbmcgaXMgbm93IE8obiBsb2cgbikgaW5zdGVhZCBvZiBPKE5eMiksIHdoaWNoCgkgICAgICAgICBmb3IgbGFyZ2UgbW9kdWxlcyBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgICAgICsgQSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gc3dpZ3J1bi5zd2cgbm8gbG9uZ2VyIG5lZWQgdGhlIAogICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9saXN0X2hhbmRsZSBwYXNzZWQgdG8gdGhlbS4gIFRoZSBvbmx5IG9uZSBsZWZ0IGlzIAoJCSBUeXBlUXVlcnkuICBUaGlzIGFsc28gbWFrZXMgcnVudGltZS5zd2cgYSBsb3Qgc21hbGxlci4KCSAgICAgICArIFNwbGl0IHVwIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBpbnRvIHR3byBzdHJ1Y3R1cmVzCgkgICAgICAgICAoc3dpZ190eXBlX2luZm8gYW5kIHN3aWdfY2FzdF9pbmZvKQoJICAgICAgICsgU3RvcmUgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8gcmF0aGVyIHRoYW4ganVzdCB0aGUgdHlwZQoJICAgICAgICAgbmFtZSBzdHJpbmcgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNhc3RzLiBGaXJzdCBvZmYsIHRoaXMgbWFrZXMKCSAgICAgICAgIHRoZSBndWlsZSBtb2R1bGUgYSBsaXR0bGUgZmFzdGVyLCBhbmQgc2Vjb25kLCB0aGUKCSAgICAgICAgIFNXSUdfVHlwZUNsaWVudERhdGEoKSBmdW5jdGlvbiBpcyBmYXN0ZXIgdG9vLiAKCSAgICAgICArIEFkZCB0aGUgaWRlYSBvZiBhIG1vZHVsZSBpbnRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZSwgYWxsIHRoZQoJICAgICAgICAgdHlwZXMgd2VyZSBzdG9yZWQgaW4gb25lIGh1Z2UgbGlua2VkIGxpc3QuIE5vdywgYW5vdGhlciBsZXZlbCBpcwoJICAgICAgICAgYWRkZWQsIGFuZCB0aGUgdHlwZSBzeXN0ZW0gc3RvcmVzIGEgbGlua2VkIGxpc3Qgb2YgbW9kdWxlcywgZWFjaAoJICAgICAgICAgb2Ygd2hpY2ggc3RvcmVzIGFuIGFycmF5IG9mIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KCSAgICAgICArIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIGhvdyB0aGUgcnVudGltZSB0eXBlIHN5c3RlbSBub3cgd29ya3MsCgkgICAgICAgICBwbGVhc2Ugc2VlIERvYy9NYW51YWwvdHlwZW1hcHMuaHRtbCBhbmQgRG9jL0RldmVsL3J1bnRpbWUudHh0CgkJIAoJICAgIC0gVXBkYXRlIGFsbCBsYW5ndWFnZSBtb2R1bGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgVGhlIGNoYW5nZXMKCSAgICAgIHRvIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlIGFyZSBtaW5vci4gIEFsbCBsYW5ndWFnZXMgYXJlIG5vdyBhYmxlIHRvCgkgICAgICB1c2UgcnVudGltZS5zd2cgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUKCSAgICAgIG9ubHkgcHl0aG9uIGFuZCBwZXJsIGRpZC4KCgkgICAgLSBbZ3VpbGUsIG16c2NoZW1lLCBvY2FtbCwgYW5kIHBocDRdICBUaGVzZSBsYW5ndWFnZXMgb3BlbmVkIHVwIHRoZQoJICAgICAgaW5pdCBmdW5jdGlvbiBpbnNpZGUgdGhlIC5jeHggY29kZSwgYW5kIGFueSBjb2RlIGluIHRoZSAuc3dnIGZpbGVzCgkgICAgICBpbiB0aGUgaW5pdCBzZWN0aW9uIHdhcyBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgd2FzIGEgcHJvYmxlbQoJICAgICAgZm9yIHN3aWdpbml0LnN3Zywgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBTV0lHX2luaXQKCSAgICAgIGZ1bmN0aW9uIGlzIG9wZW5lZC4gIFRodXMgSSBjaGFuZ2VkIHRoZXNlIGxhbmd1YWdlcyB0byBiZSBsaWtlCgkgICAgICBweXRob24gb3IgcGVybCwgd2hlcmUgdGhlIGluaXQgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIC5zd2cKCSAgICAgIGZpbGUuCgkgICAgICAKCSAgICAtIFtSdWJ5XSBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgaW5pdCBmdW5jdGlvbiB0byB0aGUgLnN3ZyBmaWxlLCBJCgkgICAgICBhZGRlZCBhIG5ldyBzZWN0aW9uIGluaXRiZWZvcmVmdW5jLCBhbmQgdGhlbiBhZGRlZAoJICAgICAgJWluc2VydChpbml0YmVmb3JlZnVuYykgInN3aWdpbml0LnN3ZyIKCgkgICAgLSBbTXpTY2hlbWVdIEZpeCBlbnVtcyBhbmQgZml4IEV4YW1wbGVzL01ha2VmaWxlLmluIHNvIHRoYXQgaWYKCSAgICAgIG11bHRpcGxlIC1JIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBJTkNMVURFUyB2YXJpYWJsZSwgZWFjaAoJICAgICAgZ2V0cyBhICsrY2NmLgoKCSAgICAtIFtHdWlsZSBHSF0gVXBkYXRlIEd1aWxlIEdIIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgU2VlCgkgICAgICBEb2MvTWFudWFsL0d1aWxlLmh0bWwgZm9yIGhvdyBzbW9icyBhcmUgbm93IHVzZWQuCgowMS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyB0eXBlbWFwIGNhbGxlZCAnY3Njb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwIGNhbGxlZCAnamF2YWNvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuIEFub3RoZXIgdHlwZW1hcCBuYW1lZCAnamF2YWNvbnN0cnVjdF9kaXJlY3RvcicKICAgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIGEgZGlyZWN0b3IgY2xhc3MuCgogICAgICAgICAgICBbQyMsIEphdmFdIElmIGEgQysrIGNsYXNzIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGEgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoaXMgc2VlbXMgaXMgdW5uZWNlc3NhcnkgYW5kIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgYW5kIHRoZXJlYnkgZ2l2aW5nIHRoZSB1c2VyIGFsbW9zdCBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIG5ldyB0eXBlbWFwcyBhYm92ZS4KCjE5LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbRGlzYWJsZWQsIHNlZSBlbnRyeSAwMi8xNS8yMDA0XQogICAgICAgICAgICAtIEZpeCB0eXBlbWFwIHNlYXJjaCwgbm93IHRoZSAib3V0IiB0eXBlbWFwIHNlYXJjaCBpcyBkb25lIGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICAgaW50ICpGb286OmZvbyhpbnQgYmFyKSAgIC0+ICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKkZvbzo6Zm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqCgogICAgICAgICAgICAgICB0aGVuLCBub3cgeW91IGNhbiBiZSBtb3JlIHNwZWNpZmljLCBhbmQgZGVmaW5lCgogICAgICAgICAgICAgIC8qIGFwcGx5IG9ubHkgZm9yICAnRm9vOjpmb28nIG1ldGhvZCAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogRm9vOjpmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgIC8qIGFwcGx5IGZvciBhbGwgJ2ZvbycgZnVuY3Rpb25zL21ldGhvZHMgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIGZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCAqZm9vKGludCAqYmFyKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoJICAKCjE1LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICAtIE1vcmUgZml4ZXMgZm9yIHRlbXBsYXRlcyBhbmQgdGVtcGxhdGUgZGVmYXVsdCBhcmdzLgogICAgICAgICAgICAgIFNlZSB0ZW1wbGF0ZV9kZWZhdWx0LmkgZm9yIHNjYXJ5IGNhc2VzIHRoYXQgbm93IGFyZSAKICAgICAgICAgICAgICBzdXBwb3J0ZWQsIGJlc2lkZXMgdGhlIGFscmVhZHkgdWdseSBTVEwvc3RkIGNhc2VzLgogICAgICAgICAgICAgIAogICAgICAgICAgICAtIENvc21ldGljcyBhbmQgbW9yZSB1c2Ugb2YgJ2NvbnN0JyB3aGVyZSBpdCB3YXMgaW1wbGljaXQuCiAgICAgICAgICAgIC0gT3RoZXIgZml4ZXMgZm9yIE9TUywgd2hpY2ggaXMgbm93IHdvcmtpbmcgYWdhaW4gd2l0aCAxLjMuMjUuCgkKVmVyc2lvbiAxLjMuMjQgKERlY2VtYmVyIDE0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIEZpeCBhIGJ1bmNoIG9mIGJ1Z3MgcmVsYXRpbmcgdG8gLXByb3h5IHN1cHBvcnQKCSAgICAgICsgbm9uLWNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBtZW1iZXIgY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIGFkZGVkIGEgLW5vdW5pdCBhcmd1bWVudCwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IHRoZSAoZGVjbGFyZSAodW5pdCAuLi4pKQoJICAgICAgKyBjb3JyZWN0bHkgaW5zdGFsbCBzd2lnY2xvc3ByZWZpeC5zY20KCSAgICAgICsgY29uc3RhbnRzIChlbnVtcywgZGVmaW5lcykgbm93IGNvcnJlY2x5IGV4cG9ydCB3aGVuIHVzaW5nIC1wcm94eQoKMTIvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uZmlndXJlIGZpeCBmb3Igd2hlbiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2Ygam5pX21kLmggaXMgZm91bmQKICAgICAgICAgICAgaW4gdGhlIEphdmEgaW5jbHVkZSBkaXJlY3RvcnkgKHdhcyBnZW5lcmF0aW5nIGxvdHMgb2Ygc2VkIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2VzKS4KCjEyLzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byBhcnJheXNfamF2YS5pIHNvIHRoYXQgb25lIGNhbiBhcHBseSB0aGUgYXJyYXkKICAgICAgICAgICAgdHlwZW1hcHMgdG8gZnVuY3Rpb25zIHRha2luZyBwb2ludGVycyBhcyBpbnB1dCwgZWcKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgICVhcHBseSBpbnRbXSB7aW50Kn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKmEpOwoKMTIvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIG1vZHMgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLiBOZXcgdHlwZW1hcHMKICAgICAgICAgICAgZGlyZWN0b3JkaXNjb25uZWN0IGFuZCBkaXJlY3RvcmRpc2Nvbm5lY3RfZGVyaXZlZCBmb3IgdGhlIAogICAgICAgICAgICBzd2lnRGlyZWN0b3JEaXNjb25uZWN0KCkgbWV0aG9kLiBBbHNvIGZpeCB0byBnZXQgdGhlIGphdmFwYWNrYWdlCiAgICAgICAgICAgIHR5cGVtYXAgd29ya2luZyBhZ2Fpbi4KCjEyLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gRmluaXNoaW5nIHRoZSBmaXhlcyBmb3IgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyArIHNwZWNpYWxpemF0aW9ucy4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gTm93IHdlIHVzZSB0aGUgbmV3IHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgaW4gdGhlIHN0ZC9TVEwgbGlicmFyeS4gVGhhdCBtZWFucyB0aGUgaW50ZXJuYWwKCSAgICAgIHN3aWcgZmlsZXMgYXJlIGdldHRpbmcgdWdsaWVyIHNpbmNlIHdlIG5vdyBzdXBwb3J0IHRoZQoJICAgICAgb3JpZ2luYWwgZGVjbGFyYXRpb25zOgoKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgX1RwID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJLi4uLgoJCX07CgkgICAgICAJICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleSA+LAoJICAgICAgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwID4gPiA+CiAgICAgICAgICAgICAgICBjbGFzcyBtYXAgewoJCS4uLi4KCQl9OwogCiAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIGNhbiB1c2UgdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXMKCgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgc3RkOjphbGxvY2F0b3I8aW50PiA+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIE15QWxsb2NhdG9yPGludD4gPjsKCiAgICAgICAgICAgICAgTm93IHdlIGFyZSBjbG9zZXIgdG8gdGhlIGNsZWFuaW5nL3Jld3JpdGluZyBvZiB0aGUKCSAgICAgIHB5dGhvbiBzdGQvU1RMIHN1cHBvcnQsIHN1Y2ggdGhhdCB3ZSByZWNvdmVyIHN1cHBvcnQgZm9yCgkgICAgICBNU1ZDKysgNi4wLCBhbmQgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKCSAgICAgIHRvby4KCgoxMi8wMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyBtZXRob2RzIHVzaW5nIGEgbWVtYmVyIGVudW0KICAgICAgICAgICAgYW5kIHR5cGVzYWZlL3Byb3BlciBlbnVtcyBlbmFibGVkLgoKMTIvMDEvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdHlwZW1hcHMgdG8gd29yayB3aXRoIHRlbXBsYXRlcyBhbmQgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncywgaWUKCgkgICAgICAgdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEIgPSBpbnQ+CiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgIH07CgoJICAgICAgICV0eXBlbWFwKGluKSBGb288aW50PiAqey4uLn0KCSAgICAgICAldHlwZW1hcChvdXQpIEZvbzxpbnQsaW50PiAqey4uLn0KCgkgICAgICAgRm9vPGludD4gKiBmb28oIEZvbzxpbnQ+ICpmMSwgRm9vPGludCxpbnQ+ICpmMik7CgoJICAgICAgbm93ICdmMScsICdmMicgYW5kIHRoZSByZXR1cm4gdmFsdWUgcmVzb2x2ZSB0aGUgcHJvdmlkZWQKCSAgICAgIHR5cGVtYXBzIHByb3Blcmx5LgoKCSAgICAgIFRoaXMgaXMgaGlnaGx5IG5lZWRlZCBmb3IgcHJvcGVyIFNUTCBzdXBwb3J0LCBzZWUgbmV3IAoJICAgICAgc3RkX2Jhc2ljX3N0cmluZy5pLCBzdGRfc3N0cmVhbS5pLCBldGMuCgoJICAgIC0gQWRkZWQgc3RkX3NzdHJlYW0uaSwgYW5kIGZpeCBzdGRfYmFzaWNfc3RyaW5nLmkgdG8gdXNlCgkgICAgICB0aGUgbmV3IHR5cGVtYXBzICsgdGVtcGxhdGUgZGVmLiBhcmcgbWVjaGFuaXNtLiBBbHNvLAoJICAgICAgYWRkZWQgdGhlIG5lZWRlZCBzdGRfYWxsb2MuaS4gTm93LCBhbGwgdGhlIGNvbnRhaW5lcnMKCSAgICAgIGNhbiBiZSBtb2RpZmllZCB0byBzdXBwb3J0IHN0ZDo6YWxsb2NhdG9yLCBsaWtlIGluOgoJICAgICAgCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJcHVibGljOgoJCS4uLi4KCQl9OwoJICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBpcyBvbmx5IGNvbXBsZXRlZCBieSBub3cgZm9yIGJhc2ljX3N0cmluZy4KCgkgICAgLSBGaXggZm9yIHNtYXJ0IHBvaW50ZXJzICsgbWVtYmVycyArIGV4dGVuc2lvbnM6CgoJICAgICAgJWV4dGVuZCBGb28gewoJICAgICAgICBpbnQgZXh0ZW5zaW9uKGludCBpLCBpbnQgaikgeyByZXR1cm4gaTsgfQoJCWludCBleHRlbnNpb24oKSB7IHJldHVybiAxOyB9CgkgICAgICB9CgoJICAgICAgJWlubGluZSAlewoKCSAgICAgIGNsYXNzIEZvbyB7CgkgICAgICBwdWJsaWM6CgkJaW50IHk7CgkJc3RhdGljIGNvbnN0IGludCB6OwoJICAgICAgfTsKICAKCSAgICAgIGNsYXNzIEJhciB7CgkgICAgICAgIEZvbyAqZjsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgQmFyKEZvbyAqZikgOiBmKGYpIHsgfQoJCUZvbyAqb3BlcmF0b3ItPigpIHsKCQkgIHJldHVybiBmOwoJCX0KCSAgICAgIH07CgoJICAgICAgbm93IHlvdSBjYW4gCgkgICAgIAoJICAgICAgZiA9IEZvbygpCgkgICAgICBmLnkgPSAzCgkgICAgICBhID0gZi56CgkgICAgICBmLT5leHRlbnNpb24oKQogCgkgICAgICBiID0gQmFyKGYpCgkgICAgICBiLnkgPSAzCgkgICAgICBhID0gYi56CgkgICAgICBiLT5leHRlbnNpb24oKQoKCSAgICAtIE90aGVyIHNtYWxsIGVycm9ycyBmaXhlcywgbW9zdGx5IHB5dGhvbi4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBidWcgZml4ZXMgc28gdGhhdCB0aGUgY29ycmVjdCBqYXZhIHR5cGVzCiAgICAgICAgICAgIGFuZCBjYW5vbmljYWxpemVkIHR5cGVzIGluIHRoZSBKTkkgY29kZSBhcmUgZW1pdHRlZC4gVXNlIG9mIHRoZQogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgbm93CiAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLWRpcmVjdG9yIHR5cGVtYXBzLiBUaGUgdHlwZXMgdXNlZCBmb3IgCiAgICAgICAgICAgIHR5cGVtYXAgbG9va3VwcyBhcmUgYWxzbyBjb3JyZWN0ZWQgaW4gYSBmZXcgcGxhY2VzLiBJZiB5b3UgCiAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHlvdXIgb3duIGRpcmVjdG9yIHR5cGVtYXBzLCBlbnN1cmUgdGhleSBhcmUgdXNpbmcgdGhlCiAgICAgICAgICAgIGNvcnJlY3QgQysrIHR5cGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25zdCBlbnVtIFNXSUdUWVBFICYgdHlwZW1hcHMgYWRkZWQuIFRoZXNlIHdyYXAgY29uc3QgZW51bSByZWZlcmVuY2VzCiAgICAgICAgICAgIGFzIGlmIHRoZXkgd2VyZSBwYXNzZWQgYnkgdmFsdWUuIENvbnN0IGVudW0gcmVmZXJlbmNlcyB0aHVzIHdvcmsgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIGNvbnN0IGRvdWJsZSAmLCAKICAgICAgICAgICAgY29uc3QgaW50ICYgZXRjLiBUeXBlbWFwcyBhZGRlZCBmb3IgSmF2YSwgQyMsIFJ1YnksIFRjbCwgUGVybCBhbmQgUGlrZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IHNwZWNpYWwgdmFyaWFibGU6ICQqamF2YWNsYXNzbmFtZSwgc2ltaWxhciB0byAkamF2YWNsYXNzbmFtZQogICAgICAgICAgICBhbmQgJCZqYXZhY2xhc3NuYW1lLiBUaGUgbmV3IG9uZSByZW1vdmVzIGEgcG9pbnRlciBmcm9tIHRoZSBDIHR5cGUgYmVmb3JlCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBPbmUgb3IgbW9yZSBvZiAkamF2YWNsYXNzbmFtZSwKICAgICAgICAgICAgJCZqYXZhY2xhc3NuYW1lIG9yICQqamF2YWNsYXNzbmFtZSBtYXkgbm93IGFwcGVhciBpbiBhIHR5cGVtYXAuIExpa2V3aXNlIGZvcgogICAgICAgICAgICBDIyB1c2luZyBjc2NsYXNzbmFtZSBpbnN0ZWFkIG9mIGphdmFjbGFzc25hbWUuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgbGFzdCB2ZXN0aWdlcyBvZiBlbnVtcyBiZWluZyBoYW5kbGVkIGFzIGludGVnZXJzIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW50ZXJuYWxzLiBUaGUgd3JhcHBlciBtZXRob2RzIHVzZSB0aGUgZW51bSB0eXBlIHJhdGhlciB0aGFuIGFuIGludAogICAgICAgICAgICBub3cuIFRoZSBuZXQgcmVzdWx0IGlzIGFkZGVkIHR5cGUgc2FmZXR5IGZvciBlbnVtcyB3aGVuIGhhbmRsZWQgYXMKICAgICAgICAgICAgcG9pbnRlcnMsIHJlZmVyZW5jZXMgZXRjLiBQcmV2aW91c2x5IGluIHNpdHVhdGlvbnMgc3VjaCBhcyBhIG1ldGhvZAogICAgICAgICAgICB0YWtpbmcgYSBwb2ludGVyIHRvIGFuIGVudW0sIGEgcG9pbnRlciB0byBhbiBpbnQgb3IgYSBwb2ludGVyIHRvIGFuCiAgICAgICAgICAgIGVudW0gb2Ygc29tZSBvdGhlciB0eXBlIGNvdWxkIGluYWR2ZXJ0YW50bHkgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QuCiAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGFzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBlbnVtIGlzIG5vIGxvbmdlciBiYXNlZCBvbgogICAgICAgICAgICBhbiBpbnQsIGJ1dCB0aGUgZW51bSB0eXBlIGluc3RlYWQuIEFub255bW91cyBlbnVtcyBhcmUgc3RpbGwgaGFuZGxlZAogICAgICAgICAgICBhcyBpbnRlZ2Vycy4KCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzIGluIGNvcnJlY3QgdXNhZ2Ugb2YgZW51bXMKICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBub3RpY2VhYmxlLiBUaGVyZSBpcyBubyBjaGFuZ2UgZm9yIGFueSBvZiB0aGUgbGFuZ3VhZ2VzCiAgICAgICAgICAgIHdoZXJlIGVudW1zIGFyZSBwYXNzZWQgYnkgdmFsdWUgLSBtb3N0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpbGwKICAgICAgICAgICAgc3RpbGwgYWNjZXB0IGFuIGludGVnZXIgZm9yIGFuIGVudW0gdmFsdWUgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICBsYW5ndWFnZXMgc3RpbGwgdXNlIGVpdGhlciB0eXBlc2FmZSBlbnVtcywgaW50ZWdlcnMgb3IgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIGNvbmZpZ3VyZXMuIEZvciBKYXZhIGFuZCBDIyB1c2VycyBhIGNoYW5nZQogICAgICAgICAgICBpbiB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgbmFtZSBoYXMgb2NjdXJyZWQgKGZvciBlbnVtIHBvaW50ZXJzLAogICAgICAgICAgICByZWZlcmVuY2VzIGV0YykuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyBvbmU9MSwgdHdvIH07CiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzKiBudW1iZXIoKTsKCiAgICAgICAgICAgIEluIEphdmEgYW5kIEMjIHRoaXMgbXVzdCBub3cgYmUgY29kZWQgYXMKCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9OdW1iZXJzIG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgcmF0aGVyIHRoYW4KCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzIwMDQ6IHdzZnVsdG9uL21tYXR1cwogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGRlcHJlY2F0ZWQgd2FybmluZyBmb3IgJW5hbWUgYW5kIHJlbW92ZSByZW1haW5pbmcgJW5hbWUKICAgICAgICAgICAgdXNhZ2UgaW4gdGhlIFNXSUcgbGlicmFyaWVzLgoKMTEvMjEvMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIHRoZSBQeVN3aWdPYmplY3QgdG8gYmUgdXNlZCBmb3IgY2FycnlpbmcKCSAgICAgIHRoZSBpbnN0YW5jZSBDL0MrKyBwb2ludGVycy4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YKCSAgICAgIHN0cmluZyBhbmQgUHlDT2JqZWN0cy4KCgkgICAgICBUaGUgbmV3IFB5U3dpZ09iamVjdCBpcyBldmVuIHNhZmVyIHRoYW4gUHlDT2JqZWN0LCBhbmQKCSAgICAgIG1vcmUgZnJpZW5kbHkgdGhhbiBwbGFpbiBzdHJpbmdzOgoKCSAgICAgIG5vdyB5b3UgY2FuIGRvCgoJICAgICAgICBwcmludCBhLnRoaXMKCQk8U3dpZyBPYmplY3QgYXQgXzAwNjkxNjA4X3BfQT4KCgkJcHJpbnQgc3RyKGEudGhpcykKCQlfMDA2OTE2MDhfcF9BCgoJCXByaW50IGxvbmcoYS50aGlzKQoJCTEzNTY4NjQwMAoKCQlwcmludCAiJXMgMHgleCIgJSAoYS50aGlzLCBhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQSAweDgxNjY5MDAKCgkgICAgICB0aGUgbGFzdCBvbmUgaXMgdmVyeSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlIEMvQysrCgkgICAgICBzaWRlLCBzaW5jZSBpcyB0aGUgcG9pbnRlciB2YWx1ZSB5b3Ugd2lsbCB1c3VhbGx5IGdldAoJICAgICAgZnJvbSB0aGUgZGVidWdnZXIuCgoJICAgICAgQWxzbywgaWYgeW91IGhhdmUgc29tZSBvbGQgY29kZSB0aGF0IHVzZXMgdGhlIHN0cmluZwoJICAgICAgcmVwcmVzZW50YXRpb24gIl8wMDY5MTYwOF9wX0EiLCB5b3UgY2FuIHVzZSBpdCBub3cgYWdhaW4KCSAgICAgIHVzaW5nICdzdHIocHRyKScsIG9yIGJ5IGNhbGxpbmcgJ3N0ciA9IFB5T2JqZWN0X1N0cihvYmopJwoJICAgICAgaW4gdGhlIEMvQysrIHNpZGUuCiAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG1haW5seSBmb3Igbm9zdGFsZ2ljIHN3aWcgdXNlcnMgdGhhdCBtaXNzCgkgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBidXQgYWxzbyBhbGxvd3MgdG8gc2F5IGFnYWluCgoJICAgICAgICBpZiBhLnRoaXMgPT0gYi50aGlzOgoJCSAgcmV0dXJuICJhIGlzIGIiCgoJICAgICAgYW5kIHdlbGwsIHNpbmNlIHRoZSBjaGFuZ2Ugd2VyZSByZWFsbHkgc2ltcGxlLCBtYXliZSBpbgoJICAgICAgdGhlIGZ1dHVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZG8KICAgCgkJbmV4dCA9IGEudGhpcyArIDEKCgkgICAgICBvciBhZGQgbmF0aXZlIHB5dGhvbiBpdGVyYXRpb24gb3ZlciBuYXRpdmUgQy9DKysgYXJyYXlzLAoJICAgICAgaWUsIG5vIG5lZWQgdG8gY3JlYXRlL2NvcHkgbmV3IHR1cGxlcyB3aGVuIHJldHVybmluZyBhbmQKCSAgICAgIGFycmF5IG9yIHZlY3Rvci4KCgkgICAgICBBbHNvLCBhIFB5U3dpZ1BhY2tlZCBvYmplY3Qgd2FzIGFkZGluZyB0byBjYXJyeSBhIG1lbWJlcgoJICAgICAgbWV0aG9kIHBvaW50ZXIsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGEgdGVtcG9yYWwgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTgyNzUzIGZyb20gRmFicmljZSBTYWx2YWlyZTogQWRkcyBkZXBlbmRlbmNpZXMgZ2VuZXJhdGlvbiBmb3IKICAgICAgICAgICAgY29uc3RydWN0aW5nIG1ha2VmaWxlcy4gTmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIC1NRiAtTUQgLU1NRCB0byB3b3JrCiAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgb3B0aW9ucyAtTSBhbmQgLU1NLiBUaGVzZSBvcHRpb25zIGFyZSBuYW1lZCB0aGUgc2FtZQogICAgICAgICAgICBhbmQgd29yayB0aGUgc2FtZSBhcyBpbiBnY2MuCgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlaWdub3JlLyVyZW5hbWUgY2hhbmdlcyBmb3IgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHRvIG1pcnJvcgogICAgICAgICAgICAlZmVhdHVyZSBiZWhhdmlvdXIuIFNlZSBwcmV2aW91cyBlbnRyeS4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgZmluZSB0dW5pbmcgd2hlbiB3cmFwcGluZyBtZXRob2RzIHdpdGgKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMuIEFueSAlZmVhdHVyZSB0YXJnZXRpbmcgYSBtZXRob2Qgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaWYgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUuIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUKICAgICAgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZSwgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG1hdGNoIHRoYXQgZXhhY3QKICAgICAgICAgICAgd3JhcHBlciBtZXRob2Qgb25seSBhbmQgbm90IHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwoKICAgICAgICAgICB3aWxsIGFwcGx5IHRoZSBmZWF0dXJlIHRvIGFsbCB0aHJlZSB3cmFwcGVyIG1ldGhvZHMsIHRoYXQgaXM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKCk7CgogICAgICAgICAgIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBvbmx5IGFwcGx5IHRvIHRoaXMgd3JhcHBlciBtZXRob2Q6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKCiAgICAgICAgICAgYW5kIG5vdCB0aGVzZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1ha2UgJWZlYXR1cmUgbW9yZSBwb3dlcmZ1bCB0byBlYXNlIHRoZSBtaWdyYXRpb24KICAgICAgICAgICB0byBuZXcgZGVmYXVsdCBhcmd1bWVudHMgd3JhcHBpbmcgYXBwcm9hY2guCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIElmIHlvdSBwcmV2aW91c2x5IGhhZCBhICVmZWF0dXJlIGFuZCBkaWRuJ3Qgc3BlY2lmeSB0aGUgZGVmYXVsdCBhcmd1bWVudHMsCiAgICAgICAgICAgeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhlbSBpbiBub3cgb3IgeW91IGNhbiBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91cgogICAgICAgICAgIGJ5IHVzaW5nICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKS4KCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcHMgZm9yIHN0ZDo6dmVjdG9yIGFkZGVkIGludG8gc3RkX3ZlY3Rvci5pLiBUaGUgcHJveHkgY2xhc3NlcwogICAgICAgICAgICBnZW5lcmF0ZWQgYXJlIG1vZGVsbGVkIG9uIHRoZSAuTkVUIEFycmF5TGlzdCBjbGFzcy4gVGhpcyBpc24ndCBxdWl0ZQogICAgICAgICAgICByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbiB5ZXQsIGJ1dCB3aWxsIHdvcmsgd2l0aCB2ZWN0b3JzIG9mIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBhbmQgc29tZSBjbGFzc2VzLgoKMTAvMy8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0dVSUxFXSBUaGUgLXNjbSBpbnRlcmZhY2UgaXMgbm93IHRoZSBkZWZhdWx0LiAgVGhlIG9sZCBHSCBpbnRlcmZhY2UgY2FuCgkgICAgc3RpbGwgYmUgZW5hYmxlZCBieSBwYXNzaW5nIC1naCB0byBTV0lHLgoKMTAvMi8yMDA0OiBtbWF0dXMKCgkgICAgLSBNb3JlIGZpeGVzIGZvciBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMuCgkgICAgICBBcyBhbiBleHRyYSBib251cywgd2UgZ2V0ICV0ZW1wbGF0ZSBzdXBwb3J0IGZvciBzdGF0aWMvbWVtYmVycyBjbGFzcwoJICAgICAgbWV0aG9kcywgaWUsIG5vdyB5b3UgY2FuIHNheToKCgkgICAgICAgIG5hbWVzcGFjZSBzcGFjZSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEJCQkgICAgCgkgICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CSAgICAKCSAgICAgICAgICAgc3RhdGljIHZvaWQgZm9vVChZIHkpIHsgfQoJICAgICAgICAgfTsJCgkJfQkJCSAgICAKCSAgICAgIAkgICAgICAJCQkgICAgCgkgICAgICAgIHN0cnVjdCBCCQkJICAgIAoJICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JCSAgICAKCSAgICAgICAgICB2b2lkIGJhclQoWSB5KSB7fSAKCSAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKCgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8ZG91YmxlPjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxpbnQ+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGNoYXI+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8ZG91YmxlPjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGludD47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxjaGFyPjsKCgkgICAgICBhbmQgY2FsbAoKCSAgICAgICAgQS5mb28oMSkKCQliID0gQigpCgkJYi5iYXIoMSkKCSAgICAgIAoJICAgICAgbm90ZSB0aGUgdGhlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgaW5zaWRlIHRoZSBjbGFzc2VzLAoJICAgICAgYW5kIGhlbmNlLCB0aGUgJXRlbXBsYXRlIG5hbWUgcmVmZXJzIHRvIHRoZSAnbWVtYmVyJwoJICAgICAgbWV0aG9kIG5hbWUsIG5vdCBhIGdsb2JhbCBuYW1lc3BhY2UgbmFtZS4KCjEwLzMxLzIwMDQ6IG1tYXR1cwoJICAgIC0gU29sdmUgbmFtZXNwYWNlICsgY2xhc3MgZGVjbGFyYXRpb25zLCBhcyBpbgoKCSAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyOwoJCSBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBzdHJ1Y3QgZm9vOjpCYXIgOiBGb28gewogICAgICAgICAgICAgICB9OwoKCSAgICAgICBzZWUgbmFtZXNwYWNlX2NsYXNzLmkgZm9yIG1vcmUgZXhhbXBsZXMuCgogICAgICAgICAgICAtIEZpeCAldGVtcGxhdGUgZGlyZWN0aXZlIHRvIHByb3Blcmx5IHVzZSBuYW1lc3BhY2VzLAogICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgY2FzZToKCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsKCQkgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CgkJICAgICAgIHN0cnVjdCBQdHIge307CiAgICAgICAgICAgICAgICAgICB9CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CQkgIAoJCSAgICAgICBzdHJ1Y3QgT2JqMSB7fTsKCQkgICAgICAgdHlwZWRlZiBQdHI8T2JqMT4gT2JqMV9wdHI7CiAgCQkgICAgICAgJXRlbXBsYXRlKE9iajFfcHRyKSBQdHI8T2JqMT47IAoJCSAgIH0JCQkJICAKCQkgICAJCQkJICAKCQkgICBuYW1lc3BhY2UgdHdvICAKCQkgICB7CgkJICAgICAgIHN0cnVjdCBPYmoyIHt9OwkKCQkgICAgICAgdHlwZWRlZiBvbmU6OlB0cjxPYmoyPiBPYmoyX3B0cjsKCQkgICAgICAgJXRlbXBsYXRlKE9iajJfcHRyKSBvbmU6OlB0cjxPYmoyPjsKCQkgICB9CgoJICAgICAgdGhpcyBpcyBkb25lIGJ5IHVzaW5nIHRoZSBuYW1lc3BhY2UgbmFtZSAnb25lJyB0byBjcmVhdGUKICAgICAgICAgICAgICBhIG5hbWVzcGFjZSBub2RlIHRvIGVtaXQgdGhlIHRlbXBsYXRlIGluc3RhbnRpYXRpb24sCiAgICAgICAgICAgICAganVzdCBhcyBiZWZvcmUsIGJ1dCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgcmVzb2x2ZWQKICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZSAoJ29uZScgb3IgJ3R3bycpLgogICAgICAgICAgICAgIFRoaXMgaXMgc2FtZSB3YXkgdGhhdCB0eXBlZGVmIHdvcmtzLiAKCgkgICAgICBUaGlzIHJlc29sdmUgdGhlIHNtYXJ0X3BvaW50ZXJfbmFtZXNwYWNlMi5pIGNhc2UsIGFuZCBhdAogICAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUsIHNldmVyYWwgb3RoZXIgb25lcyB3aGVyZSBiZWZvcmUgc3dpZyB3YXMKICAgICAgICAgICAgICBnZW5lcmF0aW5nIHRoZQoKCSAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIHRlbXBsYXRlICd4eCcgaW5zaWRlIG5hbWVzcGFjZSAneXknIgoJICAgICAgCgkgICAgICBlcnJvciBtZXNzYWdlLiBJbiBmYWN0LCB0aGF0IGVycm9yIGRvZXNuJ3QgZXhpc3QKCSAgICAgIGFueW1vcmUuIFlvdSBjYW4gb25seSBnZXQgYW4gZXJyb3IgaWYgeW91IHVzZSBhIGJhZAoJICAgICAgbmFtZXNwYWNlIG5hbWUgb3Igc28uCgoxMC8zMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtydWJ5XSBEaXJlY3RvcnMgZml4ZXM6CgkgICAgICAtIGVudW1zIGFuZCBzdGQ6OnN0cmluZ3MgYXJlIHdvcmtpbmcgbm93IChzZXZlcmFsCgkgICAgICAgIHJlcG9ydHMgaW4gYnVnIHRyYWNrIHN5c3RlbSkKCSAgICAgIC0gYWRkZWQgcGF0Y2ggMTAyNTg2MSBmb3IgZGlyZWN0b3IgKyBleGNlcHRpb25zCgkJCiAgICAgICAgICAgICAgKioqIEF0dGVudGlvbiAqKio6IHJ1Ynkgd2l0aCBkaXJlY3RvcnMgKyBwcm90ZWN0ZWQKICAgICAgICAgICAgICBtZW1iZXJzIHdvcmsgd2l0aCB2ZXJzaW9uIDEuNysuIE9sZGVyIHZlcnNpb25zIHNlZW1zIHRvCiAgICAgICAgICAgICAgaGF2ZSBhIGJyb2tlbiBzaWduYXR1cmUgZm9yJ3JiX3Byb3RlY3QnLgoJCQoJICAgICAgSWYgeW91IG5lZWQgdG8gdXNlIGFuIG9sZCB2ZXJzaW9uLCBsb29rIGF0CgoJICAgICAgaHR0cDovL2V4Y3J1Ynkuc291cmNlZm9yZ2UubmV0L2RvY3MvaHRtbC9ydWJ5X19oYWNrc184aHBwLXNvdXJjZS5odG1sCiAgCSAgICAgIGZvciB3b3JrYXJvdW5kcy4KCSAgICAgIAogICAgICAgICAgICAtIFtydWJ5XSBGaXggbWVtb3J5IGFsbG9jYXRpb24gcHJvYmxlbSBpbiB0eXBlbWFwIChidWcgMTAzNzI1OSkKCgkgICAgLSBbdGNsXSBGaXggKGVudW1zfGNvbnN0YW50cykgKyBuYW1lc3BhY2Ugb3B0aW9uIAoJICAgICAgICAgICAgKHJlcG9ydGVkIGJ5IGphc29uLm0uc3VycHJpc2VAaW50ZWwuY29tKS4KCiAgICAgICAgICAgIC0gW3BlcmxdIEFkZCBwYXRjaCA5NjIxNjggZm9yIG11bHRpcGxlIGluaGVyZXRhbmNlCgkgICAgCgkgICAgLSBGaXggJ2RlZmluZWQnIGFzIHZhcmlhYmxlIG5hbWUuCgoxMC8yOS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBnbG9iYWwgc2NvcGUgb3BlcmF0b3IgdXNlZCBmb3IgZnJpZW5kIG1ldGhvZHM6CgogICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgZnJpZW5kIHZvaWQgOjpnbG9iYWxzY29wZSgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjEwLzI4LzIwMDQ6bW1hdHVzCgkgICAgLSBBZGRlZCBtb2R1bGUgYW5kIHN3aWcgb3B0aW9uICJ0ZW1wbGF0ZXJlZHVjZSIgdG8gZm9yY2Ugc3dpZwoJICAgICAgdG8gcmVkdWNlIGFueSB0eXBlIG5lZWRlZCB3aXRoIHRlbXBsYXRlcywgaWUsIGluIHRoZXNlIGNhc2VzCgogICAgICAgICAgICAgICAgJW1vZHVsZSgidGVtcGxhdGVyZWR1Y2UiKSB0ZXN0CgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBBIHsgfTsKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnQ7CgkgICAgICAgICV0ZW1wbGF0ZShBX0ludCkgQTxJbnQ+ICA9PT4gICV0ZW1wbGF0ZShBX0ludCkgQTxpbnQ+CgogICAgICAgICAgICAgICAgdHlwZWRlZiBCKiBCcDsKCSAgICAgICAgJXRlbXBsYXRlKEFfQnApIEE8QnA+ICA9PT4gICV0ZW1wbGF0ZShBX0JwKSBBPEIqPgoKICAgICAgICAgICAgICBzd2lnIHJlZHVjZXMgdGhlIHR5cGVzIEludCBhbmQgQnAgdG8gdGhlaXIgcHJpbWl0aXZlcwogICAgICAgICAgICAgIGludCBhbmQgQiouIFRoaXMgaXMgY2xvc2VyIHRvIHRoZSB1c3VhbCBjb21waWxlcgogICAgICAgICAgICAgIHJlc29sdXRpb24gbWVjaGFuaXNtLCBhbmQgaXQgaXMgcmVhbGx5IG5lZWRlZCBzb21ldGltZXMKICAgICAgICAgICAgICB3aGVuIHlvdSBtaXggdGVtcGxhdGVzICsgdHlwZWRlZnMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgICAgRG9uJ3QgdXNlIGl0IGlmIHlvdSBkb24ndCBoYXZlIGFueSBwcm9ibGVtIGFscmVhZHksCgkgICAgICBzaW5jZSB0aGUgdHlwZSByZWR1Y3Rpb24gY2FuIGludGVyZmVyZSB3aXRoIHNvbWUKCSAgICAgIHVzZXIgdHlwZW1hcHMsIHNwZWNpYWxseSBpZiB5b3UgZGVmaW5lZCBzb21ldGhpbmcgbGlrZQoKCQkgICB0eXBlZGVmIGludCBJbnQ7CgkJICAgJXR5cGVtYXAoaW4pIEludCAuLi47CgogICAgICAgICAgICAgIGluIHRoaXMgY2FzZSwgd2hlbiB5b3UgdXNlIHRoZSAidGVtcGxhdGVyZWR1Y2UiIG9wdGlvbiwKCSAgICAgIHN3aWcgd2lsbCBpZ25vcmUgdGhlIHVzZXIgdHlwZW1hcCwgc2luY2UgdGhlICJ0eXBlZGVmIGludCBJbnQiCgkgICAgICB3aWxsIHRha2UgcHJlY2VkZW5jZSwgYW5kIHRoZSB1c3VhbCAiaW50IiB0eXBlbWFwIHdpbGwgYmUKCSAgICAgIGFwcGxpZWQuIAoKCSAgICAgIE5vdGUgdGhhdCB0aGUgcHJldmlvdXMgY2FzZSBpcyBub3QgY29tbW9uLCBhbmQgc2hvdWxkIGJlCgkgICAgICBhdm9pZGVkLCBpZSwgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSBhIHR5cGVkZWYgYW5kIGEKCSAgICAgIHR5cGVtYXAgYXQgdGhlIHNhbWUgdGltZSwgc3BlY2lhbGx5IGlmIHlvdSBhcmUgZ29pbmcgdG8KCSAgICAgIHVzZSB0ZW1wbGF0ZXMgKyBzcGVjaWFsaXphdGlvbnMuCgoJICAgIC0gRGlyZWN0b3JzOgoKCSAgICAgICAgdmlydHVhbCBkZXN0cnVjdG9yIGlzIGFsd2F5cyBlbWl0dGVkIG5vdywgdGhpcyBkb2Vzbid0CgkgICAgICAgIGNhdXNlIGFueSBoYXJtLCBhbmQgY291bGQgc29sdmUgc29tZSBuYXN0eSBhbmQKCSAgICAgICAgbXlzdGVyaW91cyBlcnJvcnMsIGxpa2UgdGhlIG9uZSBtZW50aW9uZWQgYnkgU2NvdHQuCgoJCWFsc28gdGhlIGRlc3RydWN0b3IgaXMgbm90IGluLWxpbmVkLCBzbywgdGhhdCBjYW4gc29sdmUKCQlzb21lIG90aGVyIG15c3RlcmlvdXMgZXJyb3JzIHdoZW4gbWl4aW5nIGRpcmVjdG9ycyArCgkJaW1wb3J0cyArIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyArIHNvbWUgc3BlY2lmaWMgY29tcGlsZXJzLgoJCQoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIHR5cGVtYXBzLmkgbGlicmFyeSBmaWxlIHdpdGggSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgYWRkZWQuCgoxMC8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXAgZml4ZXMgaW4gc3RkX3N0cmluZy5pIGZyb20gUnVzc2VsbCBLZWl0aC1NYWdlZS4KCjEwLzI1LzIwMDQ6IG1tYXR1cyAKCgkgICAgLSBVc2luZyArIG5hbWVzcGFjZSBpcyB3b3JraW5nIG5vdyAodXNpbmdfbmFtZXNwYWNlLmkpLgoKCSAgICAtIERlcml2ZWQgKyBuZXN0ZWQgY2xhc3NlcyBpcyB3b3JraW5nIG5vdwoJICAgICAgKGRlcml2ZXJfbmVzdGVkLmkpLCBidXQgb2YgY291cnNlLCB3ZSBhcmUgc3RpbGwgd2FpdGluZwoJICAgICAgZm9yIHRoZSBuZXN0ZWQgY2xhc3Mgc3VwcG9ydC4KCSAgICAKCSAgICAtIERpcmVjdG9yczoKCSAgICAgIC0gdW5uYW1lZCBwYXJhbWV0ZXJzIHN1cHBvcnQsCgoJICAgICAgLSBwcm90ZWN0ZWQgY29uc3RydWN0b3Igc3VwcG9ydCAoYXV0b21hdGljIGFuZCB3aXRoCiAgICAgICAgICAgICAgICBkaXJwcm90IG1vZGUpLAoKCSAgICAgIC0gZGV0ZWN0aW9uIG9mIHJlYWxseSBuZWVkZWQgcHJvdGVjdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgKG1lbWJlcnMgYW5kIGNvbnN0cnVjdG9ycykgbm93IGlzIGRvbmUgYXV0b21hdGljYWxseS4KICAgICAgICAgICAgICAgIEV2ZW4gaWYgeW91IGRvbid0IHVzZSB0aGUgJ2RpcnByb3QnIG1vZGUsIHN3aWcgd2lsbAogICAgICAgICAgICAgICAgd3JhcCB3aGF0IGlzIG1pbmltYWxseSBuZWVkZWQgKGFuZCBwcm90ZWN0ZWQpIGZvciB0aGUKICAgICAgICAgICAgICAgIGNvZGUgdG8gY29tcGlsZS4KCQkKCQl3aGF0IGlzIHB1YmxpYywgYXMgdXN1YWwsIGlzIGFsd2F5cyB3cmFwcGVkLCBhbmQgaWYKCQl5b3UgdXNlIHRoZSAnZGlycG9ydCcKCQkKCgkgICAgLSBGaW5hbCBmaXhlcyBmb3IgdGhlIE9TUyB0byBjb21waWxlIHdpdGggU1dJRyAxLjMuMjMgKG15CgkgICAgICB2ZXJ5IHZlcnkgdWdseSBDKysgKyB0ZW1wbGF0ZXMgKyBldmVyeXRoaW5nIG1vdW50ZXJzIHdyYXApLgoKMTAvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1kbGxpbXBvcnQuIFRoaXMgZW5hYmxlcyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgRExMIGZvciB0aGUgRGxsSW1wb3J0IGF0dHJpYnV0ZS4gTm9ybWFsbHkgdGhpcyBuYW1lCiAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIG1vZHVsZSBuYW1lLCBzbyBub3cgaXQgaXMgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhpczoKCiAgICAgICAgICAgICAgc3dpZyAtY3NoYXJwIC1kbGxpbXBvcnQgeHl6IGV4YW1wbGUuaQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBmb3IgYWxsIHRoZSB3cmFwcGVkIFBJbnZva2UgbWV0aG9kczoKCiAgICAgICAgICAgICAgW0RsbEltcG9ydCgieHl6IiwgRW50cnlQb2ludD0iLi4uIildCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gLi4uCgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZnJvbSBtYW55IGRpZmZlcmVudCBTV0lHIGludm9jYXRpb25zIGNhbiB0aHVzIGJlIGNvbXBpbGVkCiAgICAgICAgICAgIGludG8gb25lIERMTC4KCiAgICAgICAgICAgIEEgbmV3IHNwZWNpYWwgdmFyaWFibGUgJGRsbGltcG9ydCBjYW4gYWxzbyBiZSB1c2VkIGluIHR5cGVtYXBzLCBwcmFnbWFzLAogICAgICAgICAgICBmZWF0dXJlcyBldGMuIFRoaXMgd2lsbCBnZXQgdHJhbnNsYXRlZCBpbnRvIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgLWRsbGltcG9ydAogICAgICAgICAgICBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZSB0aGUgbW9kdWxlIG5hbWUuCgoxMC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzEwNDk0OTYgZnJvbSBTY290dCBNaWNoZWwgZml4ZXMgZGlyZWN0b3JzIG1ldGhvZHMgd2l0aCAKICAgICAgICAgICAgZW51bXMgd2hlbiB3cmFwcGVkIHdpdGggdHlwZXNhZmUgb3IgcHJvcGVyIEphdmEgZW51bXMuCgoxMC8yMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgaW4gZGlyZWN0b3IgY29uc3RydWN0b3JzIChQeXRob24sIFJ1YnksIE9jYW1sKS4KCjEwLzIxLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLWNwbHVzY2FzdCcgb3B0aW9uIHRvIGVuYWJsZSB0aGUgJ25ldycKCSAgICAgIEMrKyBjYXN0aW5nIG9wZXJhdG9ycywgc3VjaCBhcyAnc3RhdGljX2Nhc3QnLCBpbnNpZGUgdGhlCgkgICAgICB0eXBlbWFwcy4gQnkgZGVmYXVsdCBzd2lnIHVzZSB0aGUgb2xkIEMgY2FzdCBzdHlsZSwgZXZlbgoJICAgICAgd2hlbiBwYXJzaW5nIEMrKy4KCSAgICAgIAoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5ld192d20nIG9wdGlvbiB0byBlbmFibGUgdGhlIG5ldwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIgbW9kZS4gTm93IHRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAgdGhhdCB0aGUgdHlwZW1hcHMgYXJlIHJlYWxseSBzYWZlIGZvciBhbnkgZnV0dXJlCiAgICAgICAgICAgICAgc29sdXRpb24sIGJ1dCB5b3UgY2FuIHVzZSBpdCBpZiB5b3UgaGF2ZSBhIHZlcnkgc3RyYW5nZQogICAgICAgICAgICAgIGVycm9yIHdpdGggZGVmYXVsdCBjb3NudHJ1Y3RvcnMgbWlzc2luZyArICVhcHBseSArCiAgICAgICAgICAgICAgJXR5cGVtYXAsIGFuZCBpZiBldmVyeXRoaW5nIGVsc2UgZmFpbHMgKHNlZQogICAgICAgICAgICAgIHZhbHV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbHRlcm5hdGl2ZSBhbmQgY3VycmVudAogICAgICAgICAgICAgIHNvbHV0aW9ucykuIElmIHlvdSBhcmUgYSB1c2VyIHRoYXQgZG9uJ3Qga25vdyB3aGF0IGlzCiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgZG9uJ3QgZXZlbiB0cnkgaXQuCgoJICAgIC0gW1B5dGhvbl0gQWRkIHRoZSAnLW5vaCcgb3B0aW9uIHRvIGJlIHVzZWQgd2l0aCBkaXJlY3RvcnMKCSAgICAgIGFuZCB3aGVuIHlvdSBwcmVmZXIgdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUKCSAgICAgIGRpcmVjdG9yIGhlYWRlciBmaWxlLiBJZiBub3QgdXNlZCwgc3dpZyB3aWxsIHdvcmsgYXMKCSAgICAgIHVzdWFsIGdlbmVyYXRpbmcgYm90aCB0aGUgd3JhcC5jeHggYW5kIHdyYXAuaCBmaWxlcy4gSWYKCSAgICAgIHlvdSB1c2UgaXQsIHN3aWcgd2lsbCBvbmx5IGdlbmVyYXRlIHdyYXAuY3h4LgoKMTAvMjEvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gSWYgeW91IGRlZmluZSBTV0lHX1RZUEVfVEFCTEUgd2hlbiBjb21waWxpbmcgYSB3cmFwcGVyIGZpbGUsCgkgICAgICB0aGUgcnVudGltZSB0eXBlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gdHlwZSB0YWJsZSBuYW1lLgoJICAgICAgVXNpbmcgdGhpcywgeW91IGNhbiBzZXBlcmF0ZSBkaWZmZXJlbnQgbW9kdWxlcyB0byBzaGFyZSB0aGVpcgoJICAgICAgb3duIHR5cGUgc3lzdGVtcy4gIC1EU1dJR19UWVBFX1RBQkxFPU15dGFibGUKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfU1RBVElDX1JVTlRJTUUgdGhlbiB0aGUgdHlwZSBpbmZvcm1hdGlvbgoJICAgICAgd2lsbCBiZSBzdGF0aWMgdG8gdGhpcyB3cmFwcGVyLiAgTm90aGluZyB3aWxsIGJlIHNoYXJlZCB3aXRoIGFueQoJICAgICAgb3RoZXIgbW9kdWxlcwoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19MSU5LX1JVTlRJTUUsIHRoZW4gaW5zdGVhZCBvZiB1c2luZwoJICAgICAgdGhlIG5ldyB3YXkgb2Ygc2hhcmluZyB0eXBlIGluZm9ybWF0aW9uLCB0aGUgd3JhcHBlciB3aWxsIGV4cGVjdAoJICAgICAgdG8gYmUgbGlua2VkIGFnYWluc3QgdGhlIExpYi9saW5rcnVudGltZS5jIGZpbGUuICBBbnkgbW9kdWxlcyBjb21waWxlZAoJICAgICAgd2l0aCBTV0lHX0xJTktfUlVOVElNRSBhbmQgbGlua2VkIGFnYWluc3QgbGlua3J1bnRpbWUuYyB3aWxsIGFsbAoJICAgICAgc2hhcmUgdHlwZSBpbmZvcm1hdGlvbi4KCjEwLzIwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gSW5pdGlhbCBmaXggZm9yIHB5dGhvbi9pbXBvcnQgZXhhbXBsZS4gUGxlYXNlCgkgICAgICB1cGRhdGUgdGhlIE1ha2VmaWxlIChhdXRvY29uZiwgY29uZmlndXJlLCBldGMsIGV4cGVydCksCgkgICAgICBzaW5jZSBub3cgcHJvYmFibHkgaXMgb25seSB3b3JraW5nIHdpdGggZysrLCBpY2MgYW5kIGEKCSAgICAgIGZldyBvdGhlciBjb21waWxlcnMgdGhhdCBoYXZlIHRoZSAtc2hhcmVkIG9wdGlvbi4KCgkgICAgICBXZSBuZWVkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNoYXJlZCBsaWJyYXJpZXMgZm9yIHRoZQoJICAgICAgdmlydHVhbCBkZXN0cnVjdG9ycy4gT2xkIGFuZCB1c3VhbGx5IGZvcmdvdHRlbiBDKysKCSAgICAgIHJlcXVpcmVtZW50LgoJICAgICAgCgkgICAgICBTYW1lIGZpeCBuZWVkIHRvIGJlIHVzZWQgaW4gcGVybCwgSSB0aGluay4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gRml4IGdlbmVyYXRpb24gb2YgaGVhZGVyIGZpbGUgZm9yIGRpcmVjdG9ycywKICAgICAgICAgICAgICBub3cgZGlyZWN0b3JzLnN3ZyBpcyBhbHNvIGluY2x1ZGVkLCBzbywgaXQgY2FuIGJlIHJlYWxseQoJICAgICAgdXNlZCBmcm9tIEMrKywgYW5kIGl0IHNvbHZlcyBzb21lIHByb2JsZW0gd2l0aCBjb21waWxlcgoJICAgICAgdGhhdCByZXF1aXJlIHRoYXQsIGV2ZW4gd2l0aCB0aGUgc2ltcGxlIHN3aWcgaW5jbHVzaW9uLiAgCgogICAgICAgICAgICAtIFtQeXRob25dIFJlb3JkZXJpbmcgdGhlIG1ldGhvZHMgYW5kIG1vdmluZyBzb21lIGJvZGllcwogICAgICAgICAgICAgIG91dHNpZGUgdGhlIGNsYXNzIGRlY2xhcmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBkdWUgdG8KICAgICAgICAgICAgICBzb21lIGdjYy0yLjk2IGludGVybmFsIGNvbXBpbGVyIGVycm9ycy4gSXQgc2VlbXMgdGhlCiAgICAgICAgICAgICAgUFlUSE9OIGNsYXNzIGlzIGdldHRpbmcgdG9vIGxhcmdlIHRvIGJlZW4gZGVjbGFyZWQgYW5kCiAgICAgICAgICAgICAgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLgoKCSAgICAtIEFkZCB0aGUgLW9oIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG91dHB1dCBoZWFkZXIgZmlsZSBuYW1lCiAgICAgICAgICAgICAgaWYgbmVlZGVkOgoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAtb2ggdGVzdC5ISAoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBtYWlubHkgbmVlZGVkIHdoZW4gdXNpbmcgZGlyZWN0b3JzLCBhbmQgaWYgdGhlCiAgICAgICAgICAgICAgY3VycmVudCBkZWZhdWx0IGhlYWRlciBmaWxlIG5hbWUgaXMgbm90IGdvb2QgZm9yIHlvdSwKICAgICAgICAgICAgICB3aGljaCBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93OgkgICAgICAKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pICAgICAgICAgICAgID0+IHRlc3Rfd3JhcC5oCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgID0+IHRlc3QuaAoKCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIDEpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgZmVhdHVyZSBhZGRlZC4gVGhpcyBmZWF0dXJlIGFsbG93cyBvbmUKICAgICAgICAgICAgICB0byB1c2UgdGhlIGRlZmF1bHQgYXJndW1lbnQgY29kZSBnZW5lcmF0aW9uIHRoYXQgd2FzIHVzZWQgaW4KICAgICAgICAgICAgICBTV0lHLTEuMy4yMiBhbmQgZWFybGllciB2ZXJzaW9ucy4gSXQgcHJvZHVjZXMgbW9yZSBjb21wYWN0IHdyYXBwZXJzCiAgICAgICAgICAgICAgYXMgb25seSBvbmUgd3JhcHBlciBtZXRob2QgaXMgZ2VuZXJhdGVkIGZvciBhbnkgbWV0aG9kIHdpdGggZGVmYXVsdAogICAgICAgICAgICAgIGFyZ3VtZW50cy4gU28gdGhlIGFkdmFudGFnZSBpcyBpdCBnZW5lcmF0ZXMgbGVzcyBjb2RlIGJ1dCBoYXMgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgbGltaXRhdGlvbnMsIGxpa2UgaXQgaXQgZG9lcyBub3Qgd29yayB3aXRoIGFsbCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBjYW5ub3QgYmUgdGFrZW4gYWR2YW50YWdlIG9mIGluIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICAgIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpLiBJdCBpcyBpbXBsZW1lbnRlZCB2aWEgdGhlIHVzdWFsICVmZWF0dXJlIG1lY2hhbmlzbToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIik7CgogICAgICAgICAgICAyKSBLZXl3b3JkIGFyZ3VtZW50cyAoa3dhcmdzKSBhcmUgd29ya2luZyBhZ2FpbiBmb3IgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgaW4gdGhlIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgaXQsIGllLCBQeXRob24gYW5kIFJ1YnkuIFRoZSBuZXcgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudCB3cmFwcGluZyBhcHByb2FjaCB1c2luZyBvdmVybG9hZGVkIG1ldGhvZHMgY2Fubm90IHN1cHBvcnQga3dhcmdzCiAgICAgICAgICAgICAgIHNvIHRoZSBjb21wYWN0IGRlZmF1bHQgYXJndW1lbnQgZmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuCiAgICAgICAgICAgICAgIGt3YXJncyBhcmUgc3BlY2lmaWVkLCBieSAlZmVhdHVyZSgia3dhcmdzIikuCgogICAgICAgICAgICAzKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4gd3JhcHBpbmcKICAgICAgICAgICAgICAgQyAobm90IEMrKykgY29kZS4gVGhpcyBpcyB0byBzdXBwb3J0IHRoZSBiaXphcnJlIG5vdGlvbiBvZiBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBmb3IgQyBjb2RlLgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zIGluIG5hbWVzcGFjZXMgYWxzbyB3b3JraW5nIG5vdy4KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGluIG5hbWVzcGFjZXMgdG9vLgoKMTAvMTkvMjAwNDogbW1hdHVzCgoJICAgIC0gQWxsb3cgdG8gZGlzYWJsZSB0aGUgbmV3IFN3aWdWYWx1ZVdyYXBwZXIgbWVjaGFuaXNtLAoJICAgICAgaWYgeW91IGFkZCB0aGUgZm9sbG93aW5nIGxpbmUgaW4geW91ciBsYW5ndWFnZSBtYWluLgoKCQkgLyogVHVybiBvbiBzYWZlIHZhbHVlIHdyYXBwZXIgdXNlIG1vZGUgKi8KICAgICAgICAgICAgICAgICBTd2lnX3ZhbHVlX3dyYXBwZXJfbW9kZSgxKTsKCgkgICAgICAKCSAgICAgIE5vdyBpcyBvbmx5IGFjdGl2ZSBpbiBweXRob24uIEFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICBhcmUgdXNpbmcgdGhlIG9sZCByZXNvbHV0aW9uLCBidXQgdGhleSAgY2FuIGFsc28gdXNlIHRoZQoJICAgICAgInZhbHVld3JhcHBlciIvIm5vdmFsdWV3cmFwcGVyIiBmZWF0dXJlcyB0byBmaXggc29tZQoJICAgICAgb2YgdGhlIG9sZCBicm9rZW4gY2FzZXMuIE5vdGUsIGhvd2V2ZXIsICB0aGF0IG5vdCBhbGwgCgkgICAgICB0aGUgYnJva2VuIGNhc2VzIGNhbiBiZSBzb2x2ZWQgaW4gdGhhdCB3YXkuCgoJICAgICAgVGhlIG5ldyBtZWNoYW5pc20gc2VlbXMgdG8gYmUgd29ya2luZyBmaW5lIGluIHBlcmwsIHJ1YnkKCSAgICAgIGFuZCB0Y2wsIGJ1dCBmYWlsaW5nIGluIHNvbWUgdHlwZW1hcHMgaW4gamF2YS4KCgkgICAgICBIZW5jZSwgaXMgdXB0byB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0byB0ZXN0IGl0LCBhbmQKCSAgICAgIGRlY2lkZSB0byBlbmFibGUgaXQgb3Igbm90LgoKCSAgICAgIExvb2sgYXQgdGhlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgZXhhbXBsZXMuCgoJICAgIC0gRml4IG1vcmUgU3dpZ1ZhbHVlV3JhcHBlciBjYXNlcyB3aGVuIHRoZSBuZXcgbWVjaGFuaXNtCgkgICAgICBpcyBhY3RpdmUuIE5vdyBpdCBhbHNvIGNoZWNrIGZvciBsb2NhbCB0eXBlbWFwCgkgICAgICB2YXJpYWJsZXMsIHNlZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFuIGV4YW1wbGUgd2hlbgoJICAgICAgdGhpcyBpcyBuZWVkZWQuIEJ1dCBhZ2FpbiwgdGhpcyBleHRyYSBjaGVja2luZyB3aWxsIG9ubHkKCSAgICAgIGJlIGFjdGl2YXRlZCB3aGVuIHVzaW5nIHRoZSBuZXcgdmFsdWUgd3JhcHBlciBtb2RlLgoKCSAgICAtIFtQeXRob25dIEZpeCB2YXJpYWJsZSB3cmFwcGluZyBvZiBjbGFzc2VzIHdpdGggcHJpdmF0ZQoJICAgICAgYXNzaWduIG9wZXJhdG9ycy4gSXQgc2hvdWxkIGJlIGVhc3kgdG8gZml4IGluIGFsbCB0aGUgCgkgICAgICBvdGhlciBtb2R1bGVzLCBpbnN0ZWFkIG9mIGNoZWNraW5nCgoJICAgICAgICAgaWYgKCFHZXRhdHRyKG4sImltbXV0YWJsZSIpKSAuLi4KCQoJICAgICAgeW91IG5lZWQgdG8gdmVyaWZ5CgoJICAgICAgICAgaWYgKGlzX2Fzc2lnbmFibGUobikpIC4uLgoKCSAgICAgIExvb2sgYXQgdGhlIHByaXZhdGVfYXNzaWduLmkgZm9yIGFuIGV4YW1wbGUuCgoxMC8xOC8yMDA0OiBtbWF0dXMKCSAgICAtICVmZWF0dXJlcyAiZGlyZWN0b3IiLyJub2RpcmVjdG9yIiBub3cgd29yayBhcyBleHBlY3RlZC4KICAgICAgICAgICAgLSBHZW5lcmFsIGZpeGVzIGluICVmZWF0dXJlIHRvIHJlc29sdmUgZnVuY3Rpb24gZGVjbAoJICAgICAgcHJvcGVybHksCgkgICAgICAKCSAgICAgICAgJWZlYXR1cmUoImhlbGxvIikgZm9vKCk7CgkgICAgICAgIGNoYXIgZm9vKCkgLT4gIGYoKSAgICAvLyB3YXMgd29ya2luZwoJICAgICAgICBjaGFyICpmb28oKSAtPiBmKCkucCAgLy8gaXQgd2Fzbid0CiAKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgKyBzcGVjaWFsaXphdGlvbiArIGRlZmF1bHQgdGVtcGxhdGUgYXJncyBub3cgaXMKCSAgICAgIHdvcmtpbmcsIChkb24ndCBjb25mdXNlIHdpdGggdGVtcGxhdGUgKyBkZWZhdWx0IGFyZwoJICAgICAgdmFsdWVzLCB0aGF0IHdhcyBzb2x2ZWQgYmVmb3JlKSwgbm93IHRoaXMgdWdseSBjYXNlIGlzCgkgICAgICB3b3JraW5nOgoKCSAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEEgPSBBbGxvYzxUPiA+CgkJc3RydWN0IFZlY3RvcgoJCXsKCQkgICBWZWN0b3IoVCBhKXt9CgkJfTsJCSAgIAoKCQl0ZW1wbGF0ZSA8PgoJCXN0cnVjdCBWZWN0b3I8ZG91YmxlPgoJCXsKCQkgIFZlY3Rvcigpe30KCQkgIGludCBmb28oKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgICAgICB9OwoKCSAgICAgICAgJXRlbXBsYXRlKFZfYykgVmVjdG9yPGNoYXIsIEFsbG9jPGNoYXI+ID47CgkgICAgICAgICV0ZW1wbGF0ZShWX2kpIFZlY3RvcjxpbnQ+OyAgICAvLyBwaWNrcyBWZWN0b3I8aW50LEFsbG9jPGludD4gPgoJICAgICAgICAldGVtcGxhdGUoVl9kKSBWZWN0b3I8ZG91YmxlPjsgLy8gcGlja3MgdGhlIHNwZWNpYWxpemF0aW9uCgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG5lZWRlZCBmb3IgYXV0b21hdGljIFNUTCBzdXBwb3J0IChsYXRlciB3aWxsCiAgICAgICAgICAgICAgYmUpLgoKCSAgICAtIEZpeCB0aGUgdGVtcGxhdGUgKyB0eXBlZGVmIGVycm9ycyBpbiB0ZXN0LXN1aXRlLCB3aGljaAogICAgICAgICAgICAgIHByb2JhYmx5IHdpbGwgZml4IGFub3RoZXIgZ3JvdXAgb2Ygc3RyYW5nZSB0ZW1wbGF0ZSArCiAgICAgICAgICAgICAgbmFtZXNwYWNlcyArIHR5cGVkZWZzIGVycm9ycy4KCgkgICAgLSAld2FybmZpbHRlciBpcyB3b3JraW5nIGJldHRlciBub3csIHBhcnNlci55IHRyaWVzIHRvIHVzZQoJICAgICAgdGhlbSB3aGVuIG5lZWRlZC4KCgkgICAgLSAqKioqIE5ldyBkZWZhdWx0IHR5cGUgcmVzb2x1dGlvbiBtZXRob2QgKHN0eXBlLmMpICoqKioqIAoKCSAgICAgIEl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgbWl4ZWQgdHlwZXMsIHRoZW4gaXQgZ29lcwoJICAgICAgJ2JhY2t3YXJkJyBmaXJzdCBkZWxldGluZyB0aGUgcXVhbGlmaWVyLCB0aGVuIHRoZSBpbm5lcgoJICAgICAgdHlwZXMsIGZvciBleGFtcGxlOgogICAgCQkgCQkJCQkJCSAgCiAgICAJCSB0eXBlZGVmIEEgKkFwdHI7CQkJCSAgCiAgICAJCSBjb25zdCBBcHRyJjsJCQkJCQkKICAgIAkJIHIucShjb25zdCkuQXB0ciAgICAgICAtPiByLnEoY29uc3QpLnAuU1dJR1RZUEUJCQogICAgCQkgci5xKGNvbnN0KS5wLlNXSUdUWVBFIC0+IHIucC5TV0lHVFlQRQkJCQogICAgCQkgci5wLlNXSUdUWVBFICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBlbnVtIEhlbGxvIHt9OwkJCQkJCQogICAgCQkgY29uc3QgSGVsbG8mIGhpOwkJCQkJCiAgICAJCSByLnEoY29uc3QpLkhlbGxvICAgICAgICAgIC0+IHIucShjb25zdCkuZW51bSBTV0lHVFlQRQkKICAgIAkJIHIucShjb25zdCkuZW51bSBTV0lHVFlQRSAgLT4gci5lbnVtIFNXSUdUWVBFCQkKICAgIAkJIHIuZW51bSBTV0lHVFlQRSAgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGludCBhWzJdWzRdOwkJCQkJCQogICAgCQkgYSgyKS5hKDQpLmludCAgICAgICAgICAgLT4gYShBTlkpLmEoQU5ZKS5TV0lHVFlQRQkKICAgIAkJIGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUgIC0+IGEoQU5ZKS5hKCkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLmEoKS5TV0lHVFlQRSAgICAgLT4gYShBTlkpLnAuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLnAuU1dJR1RZUEUgICAgICAgLT4gYShBTlkpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5TV0lHVFlQRSAgICAgICAgIC0+IGEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKCkuU1dJR1RZUEUgICAgICAgICAgICAtPiBwLlNXSUdUWVBFCQkJCiAgICAJCSBwLlNXSUdUWVBFICAgICAgICAgICAgICAtPiBTV0lHVFlQRSAgICAgICAgICAgICAgICAgICAgCgoJICAgICAgYmVmb3JlIGl0IGFsd2F5cyBzdG9wcyBhZnRlciBmaW5kaW5nIHJlZi9wb2ludGVyL2VudW0vYXJyYXkvZXRjLgoJICAgICAgIAoJICAgICAgTm93LCB0aGVuLCB5b3UgY2FuIGRlZmluZSAodXNlIGFuZCBhcHBseSkgJ2hpZ2hlcicgdHlwZW1hcHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKG91dCkgY2hhciBGSVhTSVpFW0FOWV0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGVudW0gU1dJR1RZUEUmCgkgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRVtBTlldW0FOWV0KCSAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKCYpW0FOWV0KCSAgICAgICAKCSAgICAgIEl0IGlzIHBvc3NpYmxlIHdpdGggdGhpcyBjaGFuZ2UgdGhhdCBwcmV2aW91cyB0eXBlbWFwcwoJICAgICAgdGhhdCB3ZXJlIGRlZmluZWQgKGJ1dCBpZ25vcmVkKSwgbm93IHdpbGwgc3RhcnQgdG8gd29yay4KCgkgICAgICBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgY2hlY2sgZm9yIHRoZSAnJXR5cGVtYXAodmFyaW4pIFNXSUdUWVBFW10nLAoJICAgICAgYmVmb3JlIGl0IHdhcyB1c3VhbGx5IG5vdCBkZWZpbmVkIChidXQgY2hhcltdIHdhcyksCgkgICAgICBhbmQgdGhhdCBjYW4gcHJvZHVjZSBzb21lIGluY29uc2lzdGVuY2llcy4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgICBUaGlzIGNoYW5nZSB3YXMgbmVlZGVkIGZvciBTVEwsIHNpbmNlIHN0ZDo6dmVjdG9yPGVudW0gSGVsbG8+IAoJICAgICAgc3RkOjp2ZWN0b3I8QSo+LCBldGMsIHdpbGwgYWx3YXlzIGdlbmVyYXRlIG1ldGhvZHMgdGhhdAoJICAgICAgbWl4IGNvbnN0IHJlZmVyZW5jZXMgd2l0aCB0aGUgdmVjdG9yIHR5cGUuCgoJICAgICAgTm93IHRoYXQgaXMgd29ya2luZywgYWxsIHRoZSBzdGQ6OmNvbnRhaW5lcjxUKj4KCSAgICAgIHNwZWNpYWxpemF0aW9uIHdpbGwgbm90IGJlIG5lZWRlZCBhbnltb3JlLCB3ZWxsLCBpbgoJICAgICAgdGhlb3J5LiAKCgkgICAgICBJbiB0aGUgcHJhY3RpY2UsIGV2ZXJ5dGhpbiBpcyB3b3JraW5nIGFzIGJlZm9yZSB1bnRpbAoJICAgICAgdGhlIHByb3BlciBtaXhlZCB0eXBlcyBhcmUgZGVmaW5lZCBhbmQgdGhlIGxpYnJhcmllcwoJICAgICAgc2ltcGxpZmllZCB0byB1c2UgdGhlbS4KCgkgICAgLSBDaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIGV4dGVybiAiamF2YSIvImZvcnRyYW4iLyJldGMiLCAKCSAgICAgIG5vdyBzd2lnIHByb2R1Y2VzIGEgd2FybmluZywgYW5kIHVzZSBleHRlcm4gIkMiIGluc3RlYWQuCgkgICAgICBUaGUgd2FybmluZyBjYW4gYWxzbyBiZSBkaXNhYmxlIHdpdGggdGhlICItdyAzMTMiIGZsYWcuCgkgICAgICAoV0FSTl9QQVJTRV9VTkRFRklORURfRVhURVJOKS4KCgkgICAgLSBTd2lnVmFsdWVXcmFwcGVyIGlzIG5vdyBtb3JlIHNlbGVjdGl2ZSAobGFuZy5jeHgpLgoKICAgICAgICAgICAgW1BlcmwvVGNsXQoJICAgIC0gRml4IHNvbWUgdHlwZW1hcHMgKHBlcmwvdGNsKSB0byB3b3JrIHByb3Blcmx5IHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIuIFRoaXMgd2FzIG5vdCBhIHByb2JsZW0gd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlciwgYnV0IHdpdGggdGhlIHR5cGVtYXBzIHRoYXQgbm93IGFyZQoJICAgICAgc2FmZSB0byB1c2Ugd2l0aCAlYXBwbHkuCgoJICAgIFtQeXRob25dCgogICAgICAgICAgICAtIEZpeCAlY2FsbGJhY2svJXB5dGhvbmNhbGxiYWNrIHdvcmsgbm93IGFzIGJlZm9yZSBhZnRlcgoJICAgICAgdGhlIGRlZiBhcmdzIGNoYW5nZXMuIEFsc28sICVjYWxsYmFjayBub3cgaXMgYW4gYWxpYXMKCSAgICAgIGZvciAlcHl0aG9uY2FsbGJhY2ssIHNvLCB0aGV5IGRvIHRoZSBzYW1lLgoKCSAgICBbUHl0aG9uL1J1YnldCgkgICAgLSAlY2FsbGJhY2sgaXMgbW9yZSB1c2FibGUgYW5kIHVuaWZvcm06CgogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKSBmb28oKTsgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXNfY2IiKTsgICAgICAgIC8vIGZvciBib3RoLCBweXRob24vcnVieQogICAgICAgICAgICAgICAgICVjYWxsYmFjaygxKSBmb28oKTsgICAgICAgIC8vIG9ubHkgaW4gcHl0aG9uLgoKMTAvMTcvMjAwNDogYXJ0eQoJICAgIFtPQ0FNTF0KCSAgICAtIFR3ZWFrIHRvIGVudW0gdHlwaW5nIGZvciBzb3VuZG5lc3MgaW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlCgkgICAgICBtb2R1bGVzLgoJICAgIC0gZ2xvYmFsIGZ1bmN0aW9ucyBhcmUgbm93IHVuYW1iaWd1b3VzIGluIG11bHRpcGxlIGxvYWRlZCBtb2R1bGVzLgoJICAgIC0gRml4ZWQgdGVzdCBjYXNlIGNvZGUgdG8gYnVpbGQgbXVsdGltb2R1bGUgdGVzdCBjYXNlcyBjb3JyZWN0bHkuCgkgICAgLSBUaGVyZSBpcyBubyB3YXkgdG8gc2hhcmUgb3ZlcmxvYWQgcmVzb2x1dGlvbiBhY3Jvc3MgbW9kdWxlcwoJICAgICAgYmVjYXVzZSBvZiBzb3VuZG5lc3MgaXNzdWVzLiAgSWYgdGhlIHVzZXIgd2FudHMgdG8gY2FsbCBzb21lCgkgICAgICBmdW5jdGlvbiBmb28gZnJvbSBhbiBhcmJpdHJhcnkgbW9kdWxlIGJhciwgdGhleSB3aWxsIGhhdmUgdG8KCSAgICAgIHVzZSBCYXIuX2ZvbyB0byBjYWxsIGl0IGNvcnJlY3RseS4gIExhdGVyIEkgd2lsbCBmaXggdGhlIAoJICAgICAgY2FtbHA0IG1vZHVsZSB0byBkbyBzb21ldGhpbmcgY2xldmVyIGluIHRoaXMgY2FzZS4gIAogICAgICAgICAgICAtIFByb21pZGVkIHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9mIGNsYXNzIG1lY2hhbmlzbS4KCSAgICAtIFJlbW92ZWQgc3ltYm9sIGhhY2sgZm9yIG9jYW1sLTMuMDcgYW5kIGJlbG93IHdoaWNoIGlzIG5vdCBuZWVkZWQKCSAgICAgIGZvciBvY2FtbC0zLjA4IGFuZCBhYm92ZS4KCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ0hJQ0tFTl0KCSAgICAtIENvbXBsZXRseSBjaGFuZ2UgaG93IGNoaWNrZW4uY3h4IGhhbmRsZXMgQ0xPUyBhbmQgZ2VuZXJpYyBjb2RlLgoJICAgICAgY2hpY2tlbiBubyBsb25nZXIgZXhwb3J0cyAtY2xvcy5zY20gYW5kIC1nZW5lcmljLnNjbS4gIFRoZSBjbG9zCgkgICAgICBjb2RlIGlzIGV4cG9ydGVkIGRpcmVjdGx5IGludG8gdGhlIG1vZHVsZS5zY20gZmlsZSBpZiAtcHJveHkgaXMgcGFzc2VkLgoJICAgIC0gVGhlIGNvZGUgbm93IGFsd2F5cyBleHBvcnRzIGEgdW5pdC4gIFJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUgaXMgbm93CgkgICAgICBtYWpvcmx5IGJyb2tlbiwgYW5kIG5lZWRzIHRvIGJlIGZpeGVkLgoJICAgIC0gQ0xPUyBub3cgZ2VuZXJhdGVzIHZpcnR1YWwgc2xvdHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgc2ltaWxhciB0byBob3cKCSAgICAgIEdPT1BTIHN1cHBvcnQgd29ya3MgaW4gdGhlIGd1aWxlIG1vZHVsZS4KCSAgICAtIGNoaWNrZW4gbm8gbG9uZ2VyIHByZWZpeGVzIHN5bWJvbHMgYnkgdGhlIG1vZHVsZSBuYW1lLCBhbmQgbm8gbG9uZ2VyCgkgICAgICBmb3JjZXMgYWxsIG5hbWVzIHRvIGxvd2VyIGNhc2UuICBJdCBub3cgaGFzIC11c2VjbGFzc3ByZWZpeCBhbmQgLWNsb3NwcmVmaXgKCSAgICAgIHNpbWlsYXIgdG8gaG93IGd1aWxlIGhhbmRsZXMgR09PUFMgbmFtZXMuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgd29ya2luZyB3aXRoIG5ldyBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHdyYXBwaW5nIGFwcHJvYWNoLiBUaGUgbmV3IGFwcHJvYWNoIG5vIGxvbmdlciBmYWlscyB3aXRoIHRoZSBmb2xsb3dpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudCBwYXR0ZXJuIChwcmV2aW91c2x5IGZhaWxlZCB3aXRoIHNvbWUgcHJpbWl0aXZlIHR5cGVzLCBsaWtlIAogICAgICAgICAgICB1bnNpZ25lZCBwcmltaXRpdmUgdHlwZXMpOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgZm9vKGNvbnN0IFQmIHUgPSBUKCkpOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzx1bnNpZ25lZCBpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWxpZXMgb24gdGhlIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyBzdXBwb3J0IGp1c3QgYWRkZWQsIHNvIGFsbAogICAgICAgICAgICB0aGUgY29tYmluYXRpb25zIG9mIG92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlIHBhcmFtZXRlcnMgYW5kIG5vcm1hbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgb3ZlcmxvYWRpbmcgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMgd29ya3MuCgoxMC8xNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgbGFyZ2UgcmFuZ2Ugb2YgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHRoYXQgQysrCiAgICAgICAgICAgIHN1cHBvcnRzLgoKICAgICAgICAgICAgLSBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBvdmVybG9hZChUIHQsIGNvbnN0IFQgJnIpOwoKICAgICAgICAgICAgLSBGaXhlcyB3aGVyZSB0aGUgdGVtcGxhdGVkIHR5cGUgaXMgbm90IHVzZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIHh5eigpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCB4eXo8ZG91YmxlPigpOwoKICAgICAgICAgICAgLSBGaXhlcyBmb3Igb3ZlcmxvYWRpbmcgb2YgcGxhaW4gZnVuY3Rpb25zIGJ5IGEgdGVtcGxhdGVkIGZ1bmN0aW9uOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKCiAgICAgICAgICAgIC0gT3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGVkIHBhcmFtZXRlcnMgZml4ZWQ6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQgdCkge30KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiB2b2lkIGZvbyhUIHQsIFUgdSkge30KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPGRvdWJsZSwgZG91YmxlPjsKCiAgICAgICAgICAgIC0gQWxsIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgYWxzbyB3b3JraW5nIGluY2x1ZGluZyBzcGVjaWFsaXphdGlvbnMsIGVnOgoKICAgICAgICAgICAgICB2b2lkIGFiYyhkb3VibGUgZCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhYmMoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjPGRvdWJsZT4oZG91YmxlIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmMoaW50IHQpOwoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24gYnkgdXNpbmcgYyBsaW5raW5nLgogICAgICAgICAgICAgIEFsbCB0eXBlIHNoYXJpbmcgaGFwcGVucyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgICAgICArIFJlbW92ZSBTV0lHX05PSU1QT1JULCBTV0lHX1JVTlRJTUUsIGFuZCByZWxhdGVkIGRlZmluZXMuCiAgICAgICAgICAgICAgICArIERlcHJlY2lhdGUgLXJ1bnRpbWUsIC1ub3J1bnRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRlc3Qtc3VpdGUgY29tbW9uLm1rIHRvIGNvcnJlY3RseSBidWlsZCBtdWx0aWNwcHRlc3QKICAgICAgICAgICAgICAgICsgUmVtb3ZlIHJlZmVyZW5jZSB0byBwcmVjb21tb24uc3dnCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0aGUgZ3VpbGVfZ2ggaW50ZXJmYWNlIHRvIHNoYXJlIGRhdGEgYnkgYSBnbG9iYWwgdmFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgb2YgYyBsaW5rYWdlLgoKICAgICAgICAgICAgLSBSZW1vdmUgQWR2YW5jZWQuaHRtbCwgc2luY2UgZXZlcnl0aGluZyBpbiBpdCBpcyBub3cgb2Jzb2xldGUKCjEwLzA5LzIwMDQ6IG1tYXR1cwoJICAgIC0gU3BsaXQgdGhlIHB5dGhvbiBzdGQvU1RMIEMrKyBsaWJyYXJ5IGZpbGVzLCBub3cKCSAgICAgIGFsbCB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZGVmaW5pdGlvbnMgYXJlIHVuZGVyCgkgICAgICB0aGUgZGlyZWN0b3J5CgkgICAgICAKCQlMaWIvc3RkCgoJICAgICAgYW5kIGhlbmNlLCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgLSBBZGQgbW9yZSBkb2N1bWVudGF0aW9uIHRvIHRoZSBQeXRob24gU1RMLCBhbmQKCSAgICAgIGNsZWFuIHVubmVjZXNzYXJ5IGNvZGUuCgoJICAgIC0gQWRkIGluaXRpYWwgQzk5IGNvbXBsZXggc3VwcG9ydCwgYW5kIHNvbWUgZml4ZXMKCSAgICAgIGZvciBsb25nIGRvdWJsZS4KCjEwLzA4LzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHRoZSBTd2lnVmFsdWVXcmFwcGVyIGZvciBvcGFxdWUgdHlwZXMsIG5vdyBpdCBpcyAKCSAgICAgIGFwcGxpZWQgZm9yIG9wYXF1ZSB0ZW1wbGF0ZXMgYW5kIGNsYXNzZXMsIGZvciB3aGljaCB3ZQoJICAgICAgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBvciBub3QgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpZQoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQShpbnQpOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICBTdGlsbCwgaWYgeW91IGtub3cgdGhhdCB5b3UgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBhbmQgZm9yIHNvbWUgdmVyeSB2ZXJ5IHBhcnRpY3VsYXIgcmVhc29uCiAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFN3aWdWYWx1ZVdyYXBwZXIsIGFuZCB5b3UgZG9uJ3QKICAgICAgICAgICAgICB3YW50IG9yIGNhbid0IGV4cG9zZSB0aGUgY2xhc3MgdG8gc3dpZywgbm93IHlvdSBjYW4KICAgICAgICAgICAgICBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdmFsdWV3cmFwcGVyIikgQTsgICAgCiAgICAgICAgICAgICAgICAgY2xhc3MgQTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHRoZSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGJ1dCB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIHdyYXBwZXIsIHlvdQogICAgICAgICAgICAgIGNhbiBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoInZhbHVld3JhcHBlciIpIEE7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoKTsKCQkgICAuLi4uCiAgICAgICAgICAgICAgICAgfTsgICAKICAgICAgCgkgICAgLSBGaXggZm9yIGNoYXIgPiAxMjgsIGllCgogICAgICAgICAgICAgICAgY29uc3QgY2hhciB0aWxkZV9hID0gJ1wzNDEnOwoKICAgICAgICAgICAgLSBBZGQgcGF0Y2ggMTA0MTg1OCBmb3IgJGxleHR5cGUsIHdoaWNoIGNhcnJpZXMgdGhlIAogICAgICAgICAgICAgIGxpdGVyYWwgdHlwZSBvZiBhIHN5bWJvbC4gU2VlIGxleHR5cGUuaSBpbiB0aGUKICAgICAgICAgICAgICB0ZXN0LXN1aXRlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKCjEwLzA3LzIwMDQ6IHdzZnVsdG9uCgkgICAge1J1YnksIEphdmFdIEZpeCBkaXJlY3RvciArICdlbXB0eScgdGhyb3dzCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgQSgpIHRocm93KCk7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgICAgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgoKMTAvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtUQ0xdCiAgICAgICAgICAgIC0gRml4IGJ1ZyByZXBvcnRlZCBieSBXaWxsaWFtIEEuIEhvZmZtYW4gcHJvcGFnYXRpbmcgY2xpZW50ZGF0YQogICAgICAgICAgICBiZXR3ZWVuIG1vZHVsZXMuICBBZGRlZCBjbGllbnRkYXRhX3Byb3AubXVsdGljcHB0ZXN0IHRvIGNoZWNrIGZvcgogICAgICAgICAgICB0aGlzIGJ1Zy4gIFRoZSBmaXggaW52b2x2ZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgogICAgICAgICAgICAgICAgKyBTd2lnVHlwZV9jbGllbnRkYXRhX2NvbGxlY3QgZG9lcyBub3QgbmVlZCB0byBjaGVjawogICAgICAgICAgICAgICAgdHlwZXMgaW4gcl9yZXNvbHZlZCBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBwcm9wYWdhdGUgY2xpZW50ZGF0YQogICAgICAgICAgICAgICAgdG8gdHlwZWRlZmVkIGNsYXNzZXMsIGFuZCByX21hbmdsZWQgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHR5cGVkZWZzLgoKICAgICAgICAgICAgICAgICsgU1dJR19UeXBlUmVnaXN0ZXIgbm93IGNvcGllcyB0aGUgY2xpZW50ZGF0YSBmaWVsZCBjb3JyZWN0bHkKCiAgICAgICAgICAgICAgICArIE1vdmUgU1dJR19HdWlsZV9Qcm9wYWdhdGVDbGllbnREYXRhIGZ1bmN0aW9uIGZyb20gZ3VpbGUgbW9kdWxlCiAgICAgICAgICAgICAgICBpbnRvIGNvbW1vbi5zd2csIGJlY2F1c2Ugd2UgbmVlZCB0byBjYWxsIGl0IGZyb20gYm90aCBndWlsZSBhbmQgdGNsLgoKICAgICAgICAgICAgICAgICsgQWRkIGJhc2VfbmFtZXMgdG8gc3dpZ19jbGFzcyB0byBkZWxheSB0aGUgbG9va3VwIG9mIGJhc2VzLiAgU1dJRwogICAgICAgICAgICAgICAgbm93IGV4cG9ydHMgdGhlIGJhc2UgbmFtZXMgYW5kIG9ubHkgd2hlbiB0aGUgYmFzZSBzd2lnX2NsYXNzIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgaXMgU1dJR19UeXBlUXVlcnkobmFtZSktPmNsaWVudGRhdGEgbG9va2VkIHVwLgoKICAgICAgICAgICAgLSBjb252ZXJzaW9uX25zX3RlbXBsYXRlIHRlc3RzdWl0ZSB0ZXN0IHdhcyBmYWlsaW5nIGJlY2F1c2UKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzIG5vdCBjYWxjdWxhdGVkCiAgICAgICAgICAgIGNvcnJlY3RseSBmb3Igc3RydWN0cy4gIEZpeGVkLgoKMTAvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIHVzZWQgaW4gZGlyZWN0b3JzIC0gaW4gdmlydHVhbAogICAgICAgICAgICBtZXRob2RzIGFuZCBkaXJlY3RvciBjb25zdHJ1Y3RvcnMuCgoxMC8wNi8yMDA0OiBtbWF0dXMKCSAgICBGaXggdGhlIF9fY3BsdXNwbHVzIG1hY3JvLCBhbmQgYnVnIDEwNDExNzAuCgkgICAgTm93IGl0IGlzIHdvcmtpbmcgYXMgc3VwcG9zZWQsIGllLCB5b3UgY2FuIHNhZmVseSB1c2UKCgkgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKCSAgICAgIC4uLgoJICAgIAoJICAgIGFsbCBvdmVyIHN3aWcsIGluY2x1ZGluZyBpbnNpZGUgJWRlZmluZXMgYW5kICV7ICV9IGJvZGllcy4KCgkgICAgCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlIG9sZCB0cmljayBvZiB1c2luZwoKCSAgICAgICNpZiBfX2NwbHVzcGx1cwoKCSAgICBkb2Vzbid0IHdvcmsgYW55IG1vcmUuIFNvLCBpZiB5b3UgaGF2ZSB5b3VyIG93biB0eXBlbWFwcwoJICAgIHVzaW5nIHRoYXQgc3ludGF4LCB5b3Ugd2lsbCBuZWVkIHRvIG1pZ3JhdGUgdGhlbSB0byB1c2UKCSAgICAiI2lmZGVmIF9fY3BsdXNwbHVzIi4KCjEwLzA1LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlb3JnYW5pemUgaG93IHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHNoYXJlZAoJICAgIGJldHdlZW4gbW9kdWxlcy4gIEZvciBjaGlja2VuIGFuZCBtenNjaGVtZSwgSSByZW1vdmVkCgkgICAgdGhlIGFiaWxpdHkgdG8gdXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGlsZSBwZXJsLCB0Y2wsIHB5dGhvbiwgYW5kCgkgICAgcnVieSBkZWZhdWx0IHRvIHVzaW5nIHRoZSBuZXcgbWV0aG9kIGJ1dCBjYW4gZ28gYmFjayB0byB0aGUgb2xkCgkgICAgbWV0aG9kIGJ5IGRlY2xhcmluZyBTV0lHX0FMTE9XX1JVTlRJTUUuCgoJICAgIC0gbGluZSA1ODIgaW4gbXpzY2hlbWUuY3h4IHdhcyBnZW5lcmF0aW5nIGEgc2VnZmF1bHQgb24gCgkgICAgaW1wb3J0cy5tdWx0aWNwcHRlc3QsIHNvIEkgZml4ZWQgaXQuCgoxMC8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgJWV4dGVuZCBhbmQgb3ZlcmxvYWRlZCBzdGF0aWMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzLgoKMTAvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBbcHl0aG9uXSBGaXggZGlyZWN0b3IgKyBtZXRob2Qgd2l0aCAnZW1wdHknIHRocm93LCBpZQoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgkJICAgIAoJICAgICAgb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBhbHNvIGVhc3kgdG8gZml4LCBsb29rIGZvcgoJICAgICAgR2V0YXR0cihuLCJ0aHJvdyIpIGluIHB5dGhvbi5jeHguCgoJICAgIC0gRml4IGRpcmVjdG9yICsgZGVzdHJ1Y3RvciB3aXRoICdlbXB0eScgdGhyb3cKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgfTsKCgkgICAgLSBOb3cgU1dJR19GRUFUVVJFUyBwYXJzZSBhbGwgYW5kIHRoZSBzYW1lICBvcHRpb25zIHlvdQogICAgICAgICAgICAgIGNhbiBwYXNzIHRvIHN3aWcgaW4gdGhlIGNvbW1hbmQgbGluZS4KCSAgICAgIAoJICAgIC0gTmV3IGNvbW1hbmQgbGluZSBmbGFnOiAtZmVhdHVyZXMgPGxpc3Q+LCBhcyBpbgoKCSAgICAgICAgc3dpZyAtZmVhdHVyZXMgYXV0b2RvYz0zLGRpcmVjdG9yCgoJICAgICAgaWUsIGFueSBnbG9iYWwgZmVhdHVyZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKCSAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCB1c2VycwoJICAgICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCgoxMC8wNC8yMDA0OiBtbWF0dXMKCSAgICAtIFByb3Blcmx5IHF1YWxpZnkgdHlwZSBpbiBzeW50YXggYXMgJ2xvbmcoMiknIG9yICdGb28oKScsCgkgICAgICB0aGlzIHNvbHZlIG9sZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmdzLCBhbmQgcHJvYmFibHkKCSAgICAgIG90aGVyIHByb2JsZW1zIGFyb3VuZC4gSG93ZXZlciwgdGhlIGRlZmF1bHQgYXJnIHByb2JsZW0KCSAgICAgIHdhcyBhbHNvIGFscmVhZHkgc29sdmVkIGJ5IFdpbGxpYW0gKHNlZSBiZWxsb3cpLgoKCSAgICAtIEZpeCBmZWF0dXJlX3NldCBhbmQgZmVhdHVyZV9nZXQgbWV0aG9kcy4gQmVmb3JlCgkgICAgICB0aGV5IGxvb2sgZnJvbSBwYXJ0aWN1bGFyIHRvIGdlbmVyYWwgYW5kIGtlZXAgdGhlIGZpcnN0CgkgICAgICBmZWF0dXJlIGZvdW5kLiBUaGlzIGRpZG4ndCB3b3JrIHdlbGwgd2l0aCB0ZW1wbGF0ZXMuCgkgICAgICBOb3cgdGhlIG1ldGhvZHMgbG9vayBmcm9tIGdlbmVyYWwgdG8gcGFydGljdWxhciwgYW5kCgkgICAgICBvdmVycmlkZSBhbnkgZm91bmQgZmVhdHVyZS4KCiAgICAgICAgICAgIC0gUHJldmlvdXNseSBhIGZlYXR1cmUgY291bGQgbm90IGJlIGFwcGxpZWQgdG8gY29uc3RydWN0b3JzCiAgICAgICAgICAgICAgb3IgZGVzdHJ1Y3RvcnMgdGhhdCB3ZXJlbid0IGV4cGxpY2l0bHkgZGVjbGFyZWQgaW4gdGhlIGNsYXNzLgogICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSBGb28oKSAiLi4uIgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgfkZvbygpICIuLi4iCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAvLyBpbXBsaWNpdCBGb28oKSBhbmQgfkZvbygpCiAgICAgICAgICAgICAgICB9OwoKCSAgICAtIEZpeCBtaXNzaW5nIGZlYXR1cmVzIGZvciBkZWZhdWx0IGNvbnN0L2Rlc3QsIGJ5IHJlYWxseQoJICAgICAgJ2NyZWF0aW5nJyB0aGUgbWV0aG9kcyBhbmQgYXBwbHlpbmcgdGhlIGZlYXR1cmVzLgoKCSAgICAtIEZpeCByZXR1cm5fY29uc3RfdmFsdWUuaSBjYXNlIGJ5IGFkZGluZyBTd2lnVmFsdWVXcmFwcGVyPGNvbnN0IFQ+CgkgICAgICBzcGVjaWFsaXphdGlvbi4KCgkgICAgLSBGaXggJWV4dGVuZCArIG92ZXJsb2FkLCBpbmNsdWRpbmcgb3ZlcmxvYWRpbmcgYWN0dWFsCiAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcy4gCgoJICAgIC0gQWRkaW5nIG1vcmUgY2FzZXMgaW4gcmVsYXRlZCBmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZS4gIAoKMTAvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgd2F5IGRlZmF1bHQgYXJndW1lbnRzIGFyZSB3cmFwcGVkLiBQcmV2aW91c2x5IGEgc2luZ2xlCiAgICAgICAgICAgIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBlYWNoIG1ldGhvZCB0aGF0IGhhZCBkZWZhdWx0IGFyZ3VtZW50cy4gSWYKICAgICAgICAgICAgYSBtZXRob2QgaGFkIDUgYXJndW1lbnRzLCBzYXksIG9mIHdoaWNoIDEgaGFkIGEgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB0aGVuIHRoZSBjYWxsIHRvIHRoZSB3cmFwcGVkIG1ldGhvZCB3b3VsZCBwYXNzIDUgYXJndW1lbnRzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICB2YWx1ZSB3YXMgY29waWVkIGludG8gdGhlIHdyYXBwZXIgbWV0aG9kIGFuZCB1c2VkIGlmIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgcGFzc2VkIGp1c3QgNCBhcmd1bWVudHMuIEhvd2V2ZXIsIHRoaXMgd2FzIGZsYXdlZCBhcyB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudCBzb21ldGltZXMgZG9lcyBub3QgaGF2ZSBnbG9iYWwgYWNjZXNzLCBmb3IgZXhhbXBsZQogICAgICAgICAgICBTV0lHIHdvdWxkIGdlbmVyYXRlIGNvZGUgdGhhdCBjb3VsZG4ndCBjb21waWxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNsYXNzIFRyaWNreSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCA9IHByaXZhdGV2YWx1ZSk7CiAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgdmFsID0gVHJpY2t5OjpnZXREZWZhdWx0KCkpOwogICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGVudW0geyBwcml2YXRldmFsdWUgPSAyMDAgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBidWdzIGluIHJlc29sdmluZyBzeW1ib2xzIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgKHByb2JhYmx5IGZpeGFibGUgdGhvdWdoKToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBLbGFzcyBjb25zdHJ1Y3RvcmNhbGwoY29uc3QgS2xhc3MmIGsgPSBLbGFzcygpKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgYXBwcm9hY2ggYWxzbyBkb2VzIG5vdCB3b3JrIGZvciBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyAoQyMgYW5kIEphdmEpCiAgICAgICAgICAgIGFzIHRoZXNlIGxhbmd1YWdlcyBkbyBub3QgYWxsb3cgbWV0aG9kcyB0byBoYXZlIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgICAgICAgIEFsdGhvdWdoIEMjIGhhcyBhIG1lY2hhbmlzbSB0byBwYXNzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGV5CiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYXJlIG1vcmUgbGlrZSB2YXJhcmdzLgoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBzb2x2ZXMgdGhlIGFib3ZlIHByb2JsZW1zIGFuZCB3cmFwcyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZC4gU28gU1dJRyB3aWxsIG5vdyB0cmVhdAoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYXMgaWYgaXQgaGFkIHBhcnNlZDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICB2b2lkIGZvbygpOwoKICAgICAgICAgICAgVGhlIGNvZGUgZ2VuZXJhdGVkIGlzIHRoZW4gZXhhY3RseSB0aGUgc2FtZSBhcyBpZiBTV0lHIGhhZCBwYXJzZWQgdGhlIHR3bwogICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGNvdW50IHRoZSBhcmd1bWVudHMgcGFzc2VkIGFuZCBjYWxsCiAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QsIGp1c3QgbGlrZSBvdmVybG9hZGVkIG1ldGhvZHMuIEMjIGFuZCBKYXZhIGFyZSBub3cgYWJsZQogICAgICAgICAgICB0byBwcm9wZXJseSB3cmFwIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBieSBnZW5lcmF0aW5nIGV4dHJhIG1ldGhvZHMsCiAgICAgICAgICAgIGFnYWluIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQsIHNvIGZvcjoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHM9ImhlbGxvIiwgZG91YmxlIGQ9MTAuMCwgaW50IGk9MCk7CgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByb3h5IG1ldGhvZHMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkLCBpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMsIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcyk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggY29tZXMgd2l0aCBhIGNvdXBsZSBvZiBtaW5vciBrbm9jayBvbiBlZmZlY3RzLgoKICAgICAgICAgICAgMSkgU1dJRyBzdXBwb3J0IGZvciBkZWZhdWx0IGFyZ3VtZW50cyBmb3IgQyAobm90IEMrKykgY29kZSBubyBsb25nZXIgd29ya3MuCiAgICAgICAgICAgIFByZXZpb3VzbHkgeW91IGNvdWxkIGhhdmUgdGhpcyBpbnRlcmZhY2U6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlIHdyYXBwZWQgbWV0aG9kIGZyb20gYSBzY3JpcHRpbmcgbGFuZ3VhZ2UgYW5kIHBhc3Mgbm8gYXJndW1lbnRzCiAgICAgICAgICAgIHdoZXJldXBvbiB0aGUgZGVmYXVsdCBvZiAwIHdhcyB1c2VkLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBiZWhhdmlvdXIgZm9yIEMKICAgICAgICAgICAgY29kZSBieSB1c2luZyB0aGUgImRlZmF1bHQiIHR5cGVtYXA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGRlZmF1bHQpIGludCB2YWwgIiQxID0gMDsiOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKCiAgICAgICAgICAgIG9yIHlvdSBjb3VsZCBvZiBjb3Vyc2UgY29tcGlsZSB5b3VyIGNvZGUgYXMgQysrIGlmIHlvdSB3YW50IEMrKyBmZWF0dXJlcyA6KSA6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBBIGNvdXBsZSBvZiBTV0lHJ3MgbGlicmFyaWVzIHVzZWQgdGhpcyBDIGV4dGVuc2lvbiBhbmQgdGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkCiAgICAgICAgICAgIHRvIHVzZSB0aGUgImRlZmF1bHQiIHR5cGVtYXAuIFRoZSAiZGVmYXVsdCIgdHlwZW1hcCBpcyB0aHVzIHVuY2hhbmdlZCAoYW5kIHN0aWxsCiAgICAgICAgICAgIGlzIG5vdCBhbmQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBieSBDIyBhbmQgSmF2YSwgYW5kIGlzIGxpa2VseSB0byByZW1haW4gc28pLgoKCiAgICAgICAgICAgIDIpIEFsbCBmZWF0dXJlcyAoJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUgZXRjKSBubyBsb25nZXIgd29yayBhcyBpZiB0aGUgbWV0aG9kCiAgICAgICAgICAgIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaXMganVzdCBvbmUgbWV0aG9kLiBGb3IgZXhhbXBsZSwgcHJldmlvdXNseQoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwoKICAgICAgICAgICAgd291bGQgaGF2ZSBpZ25vcmVkIHRoZSBtZXRob2QgY29tcGxldGVseS4gTm93IGl0IHdpbGwgb25seSBpZ25vcmUgZm9vKGludCkgYnV0CiAgICAgICAgICAgIG5vdCB0aGUgZXh0cmEgZm9vKCkgbWV0aG9kLiBJbnN0ZWFkIHVzZToKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb287CgogICAgICAgICAgICB0byBpZ25vcmUgdGhlbSBhbGwuIG9yCgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKCiAgICAgICAgICAgIFRoaXMgb2YgY291cnNlIGFsbG93cyBvbmUgdG8gZmluZSB0dW5lIHRoZSB3cmFwcGluZywgZm9yIGV4YW1wbGUgb25lIGNvdWxkIHVzZToKCiAgICAgICAgICAgICAgJXJlbmFtZShmb29pbnQpIGZvbyhpbnQpOwogICAgICAgICAgICAgICVyZW5hbWUoZm9vZGVmYXVsdHMpIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGVtIGZyb20gYW55IGxhbmd1YWdlIGxpa2Ugc286CgogICAgICAgICAgICAgIGZvb2ludCgyMDApCiAgICAgICAgICAgICAgZm9vZGVmYXVsdHMoKQoKICAgICAgICAgICAgb3IgZm9yIGV4YW1wbGUgaWdub3JlIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZCwgc28gdGhlIGRlZmF1bHRzIGNhbm5vdCBiZSB1c2VkOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8yLzIwMDQ6IG1tYXR1cwoJICAgW1B5dGhvbl0KCSAgIC0gTW9yZSBjbGVhbmluZyB1cCBhbmQgdW5pZm9ybWF0aW9uIG9uIHRoZSBQeXRob24gTGliCgoJICAgLSBBZGRlZCBSb2JpbidzIGRvY3N0cmluZyBwYXRjaCwgcGx1cyBzb21lIGZpeGVzLCBwbHVzCgkgICAgIHNvbWUgZXh0ZW5zaW9ucywgc2VlIGF1dG9kb2MuaSBleGFtcGxlIGluIHRoZSB0ZXN0LXN1aXRlLAoJICAgICBhbmQgdHJ5IHVzaW5nICVmZWF0dXJlKCJhdXRvZG9jIiwiZXh0ZW5kZWQiKS4KCSAgICAKCSAgICAgVGhpcyBwYXRjaCBpcyBub3QgYSBjb21wbGV0ZSBzb2x1dGlvbiBmb3IgdGhlCgkgICAgIGRvY3VtZW50YXRpb24gcHJvYmxlbSwganVzdCBlbm91Z2ggdG8gaW5mb3JtIHB5dGhvbiBhYm91dAoJICAgICB0aGUgcGFyYW1ldGVyIGxpc3QuCgoJICAgICBUaGUgZXhwZWN0ZWQgc3dpZyBkb2N1bWVudGF0aW9uIHN1cHBvcnQgaXMgZmFyIGZhciBhd2F5IHlldC4KCSAgICAgCgoxMC8xLzIwMDQ6IG1tYXR1cwoJICAgLSBGaXggdGhlICVjYWxsYmFjayBmZWF0dXJlIChvbmx5IHVzZWQgaW4gcnVieSBhbmQgcHl0aG9uIGV4YW1wbGVzLAoJICAgICBieSBub3csIGJ1dCBpdCBzaG91bGQgYmUgZ2VuZXJpYyksIG5vdyBtZW1iZXIgY2FsbGJhY2tzCgkgICAgIGFyZSB3b3JraW5nIGFnYWluCgkgICAgIAoJICAgLSBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb25zIHBvaW50ZXJzIGxpa2UKCgkJIHN0ZDo6b3N0cmVhbSYgc3RkOjplbmRsKHN0ZDo6b3N0cmVhbSYpOwoKCSAgICAgaWUsIHRoZSBvbmVzIHRoYXQgcmV0dXJuIHJlZmVyZW5jZXMgb3IgZW51bXMuCgkgCgkgICBbUHl0aG9uXSBBZGQgdGhlICVweXRob25jYWxsYmFjayBkaXJlY3RpdmUsIHdoaWNoIGlzIAoJICAgYW4gaW1wcm92ZWQgdmVyc2lvbiBvZiAlY2FsbGJhY2ssIGllLAoKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIGZvbzsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcjsKCSAgICAgJXB5dGhvbmNhbGxiYWNrKDEpIEE6OmJhcm07CgoJICAgICBpbnQgZm9vKGludCBhKSB7CgkgICAgICAgICByZXR1cm4gYTsKCSAgICAgfQogIAoJICAgICBzdHJ1Y3QgQSAKCSAgICAgewoJICAgICAgIHN0YXRpYyBpbnQgYmFyKGludCBhKTsKCSAgICAgICBpbnQgYmFybShpbnQgYSk7CgoJICAgICB9OwoKICAgICAgICAgICAgIGludCBmb29iYXIoaW50IGEsIGludCAoKnBmKShpbnQgYSkpOwoKCSAgIGluIHB5dGhvbiB5b3UgY2FuIHVzZQoKICAgICAgICAgICAgIGZvbygyKQoJICAgICBmb29iYXIoMixmb28pCiAgICAgICAgICAgICBBLmJhcigyKQoJICAgICBmb29iYXIoMixBLmJhcikKICAgICAgICAgIAogICAgICAgICAgIGllLCBubyBhZGRpdGlvbmFsIHBvaW50ZXIgZWxlbWVudHMgYXJlIGNyZWF0ZWQsIGFuZAoJICAgdGhlIG9yaWdpbmFsICdmb28nIGFuZCAnQS5iYXInIGNhbiBiZSB1c2VkIGFzIHBhcmFtZXRlcnMuCgoJICAgSW4gdGhlIGNhc2Ugb2YgbWVtYmVyIGZ1Y250aW9uIGhvd2V2ZXIsIHN0aWxsIHlvdSBuZWVkCgkgICB0byB1c2UgdGhlIHNwZWNpYWwgdmFyaWFibGUgQ2xhc3M6OjxmbmNfbmFtZT5fY2JfcHRyLCBpZToKCiAJICAgICBmb29iYXJtKDMsIGEsIEEuYmFybV9jYl9wdHIpCgkgICAKCSAgIHdlIHdpbGwgdHJ5IHRvIGZpeCB0aGlzIHNpdHVhdGlvbiBhbHNvLCBidXQgbGF0ZXIuICAKCgkgICBbUHl0aG9uXSBBZGQgbW9yZSBlbGVtZW50cyBmcm9tIHRoZSBTVEwgbGlicmFyeSwgbm93CgkgICB5b3UgY2FuIHVzZQoKCSAgICAgaW1wb3J0IHN0ZAoJICAgICBzdGQuY291dCA8PCAiaGVsbG8gIiA8PCAxMjMgPDwgc3RkLmVuZGwKCgkgICBbUHl0aG9uXSBGaXggaW4vb3V0IHJldHVybiBtZWNoYW5pc20sIG5vdyBzd2lnIHdpbGwgYmVoYXZlCgkgICBhcyAxLjMuMjEgYnV0IHVzaW5nIGEgcHl0aG9uIGxpc3Qgd2hlbiBuZWVkZWQuIFRoZSBwcm9ibGVtCgkgICBpcyB0aGF0IHRoZSB0eXBlcyBzdGQ6OnBhaXIsc3RkOjp2ZWN0b3IsZXRjLCB1c2UgdHVwbGVzLAoJICAgYW5kIHRoZXkgaW50ZXJmZXIgd2l0aCB0aGUgcHJldmlvdXMgaW5vdXQgdHVwbGUgdHlwZS4KCgkgICBCeSB1c2luZyBsaXN0cyB3ZSBzb2x2ZSB0aGUgY29uZmxpY3RzLCBzd2lnIGFjdHMgYXMgYmVmb3JlLAoJICAgYnV0IHJldHVybnMgYSBsaXN0IHdoZW4gbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIgYXJlIHVzaW5nCgkgICB0aGUgT1VUIHR5cGVtYXAuIFNlZSB0aGUgbmV3IGlub3V0LmkgZXhhbXBsZSBpbiB0aGUKCSAgIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCQkgICAKICAgICAgICAgICBbUHl0aG9uXSBNdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgYmFkIGFyZ3VtZW50cywgbm93CgkgICB5b3UgYWx3YXlzIGdldCB0aGUgYXJndW1lbnQgbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4KCjA5LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2UgLQogICAgICAgICAgICAxKSBXYXJuaW5nIGVtaXR0ZWQgd2hlbiAtaW1wb3J0YWxsIGFuZCAtaW5jbHVkZWFsbCBpcyB1c2VkIHRvZ2V0aGVyLAogICAgICAgICAgICAgICB3aXRoIC1pbmNsdWRlYWxsIHRha2luZyBwcmVjZWRlbmNlLgogICAgICAgICAgICAyKSBFbnN1cmUgU1dJR0lNUE9SVEVEIGlzIGFsd2F5cyBkZWZpbmVkIHdoZW4gYSBmaWxlIGlzIGJlaW5nCiAgICAgICAgICAgICAgIGltcG9ydGVkIHdpdGggJWltcG9ydC4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIFNXSUdJTVBPUlQsCiAgICAgICAgICAgICAgIHdoaWNoIGdldHMgZGVmaW5lZCBpbiBhbGwgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZXMuCgowOS8yNi8yMDA0OiBtbWF0dXMKCgkgICAgLSBhZGQgJWZlYXR1cmUoImV4Y2VwdGlvbmNsYXNzIikgdG8gaWRlbnRpZnkgYSBjbGFzcyB1c2VkCgkgICAgICBhcyBleGNlcHRpb24uIEJlZm9yZSBzd2lnIGlkZW50aWZpZWQgYW5kIG1hcmtlZCBhIGNsYXNzCgkgICAgICB1c2luZyB0aGUgImNwbHVzOmV4Y2VwdGlvbmNsYXNzIiBhdHRyaWJ1dGUuIEhvd2V2ZXIsIHRoZQoJICAgICAgY2xhc3MgbmVlZGVkIHRvIGFwcGVhciBvbiBhbiB0aHJvdygpIHN0YXRlbWVudC4gIE5vdwoJICAgICAgc3dpZyBrZWVwcyB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLCBhcwoJICAgICAgYmVmb3JlLCBidXQgaXQgYWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gbWFyayBhIGNsYXNzIGJ5CgkgICAgICB1c2luZyB0aGUgJWZlYXR1cmUgZXhwbGljaXRseS4gKG1vc3RseSByZWxldmFudCBmb3IKCSAgICAgIHB5dGhvbiBhbmQgY2hpY2tlbikKCgkgICAgW1B5dGhvbl0KCgkgICAgLSBmaXggLW1vZGVybiBvcHRpb24gKyBleGNlcHRpb25zLCB3aGljaCBtaXggb2xkIGNsYXNzCgkgICAgICBzdHlsZSB3aXRoIHRoZSBuZXcgb25lLiBTbywgd2UgYWx3YXlzIG5lZWQgdG8gZW1pdAoJICAgICAgdGhlICJub25tb2Rlcm4iIHB5dGhvbiBjb2RlLgoKCSAgICAtIGFkZCB0aGUgInB5dGhvbjpub25keW5hbWljIiBmZWF0dXJlIGFuZCBpdHMgaGFuZGxlcgoKCSAgICAgIG5vdyBpZiB5b3UgaGF2ZQoJICAgICAgCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYygxKSBBOwoJICAgICAgCgkgICAgICBzdHJ1Y3QgQSB7CgkgICAgICAgaW50IGE7CgkgICAgICAgaW50IGI7CgkgICAgICB9OwoKCSAgICAgIHRoZW4sIGluIHRoZSBweXRob24gc2lkZQoJICAgICAgCgkgICAgICBhYSA9IEEoKQoJICAgICAgCgkgICAgICBhYS5hID0gMSAjIG9rCgkgICAgICBhYS5iID0gMiAjIG9rCgkgICAgICBhYS5jID0gMyAjIGVycm9yLCB0aGUgY2xhc3MgY2FuIG5vdCBiZSBleHRlbmRlZCBkeW5hbWljYWxseS4KCgkgICAgCgkgICAgU2luY2UgdGhpcyBpcyBhIGZlYXR1cmUsIHlvdSBjYW4gdXNlCgoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMoMSk7CgogICAgICAgICAgICBvciAKCgkgICAgICAlcHl0aG9uZHluYW1pYygwKTsgWyBOb3RlOiAlcHl0aG9uZHluYW1pYyBzaW5jZSBkZXByZWNhdGVkIF0KICAgCgkgICAgdG8gZm9yY2UgYWxsIHRoZSB3cmFwcGVkIGNsYXNzZXMgdG8gYmUgIm5vbmR5bmFtaWMiIG9uZXMuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiByZWd1bGFyIHB5dGhvbiwgaXMgdGhhdCBhbGwgdGhlIHdyYXBwZWQKCSAgICBjbGFzc2VzIGFyZSBkeW5hbWljcy4gU28sIGNhcmVmdWwgd2l0aCB5b3VyIHNwZWxsaW5nLgoKMDkvMTQvMjAwNDogbW1hdHVzIAoJICAgIC0gU3VwcG9ydCB0aGUgLUktIG9wdGlvbi4KCgkgICAgLSBEaWZmZXJlbnRpYXRlIGJldHdlZW4gJWluY2x1ZGUgPGZpbGU+IGFuZCAlaW5jbHVkZSAiZmlsZSIuCgkgICAgICBUaGlzIGZpeCBzZXZlcmFsIGNvcm5lciBjYXNlcy4KCgkgICAgCgkgICAgW1B5dGhvbl0gU2V2ZXJhbCBwYXRjaGVzOgoKCSAgICAtIE5vcm1hbGl6ZSB0aGUgTGliIGZpbGUgbmFtZXM6IAoJCSouc3dnIGludGVybmFsIGZpbGVzLCAKCQkqLmkgICB1c2VyIGZpbGVzLgoKCSAgICAtIEZpeCBDaGFyW0FOWV0gdHlwZW1hcHMsIHNvIHRoZXkgYWxzbyBkZWxldGUgYW55IGV4dHJhICdcMCcgY2hhcnMsCgkgICAgICBub3cgdGhleSBiZWhhdmUgYXMgYmVmb3JlICgxLjMuMjEpLiBTdGlsbCwgeW91IGNhbiB1c2UKCSAgICAgIHRoZSBTV0lHX1BSRVNFUlZFX0NBUlJBWV9TSVpFIG1hY3JvIGlmIHlvdSBuZWVkIHRvCgkgICAgICBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgc2l6ZSAoc2VlIHB5c3RyYmFzZS5zd2cpLgoKCSAgICAtIEFkZCB0aGUgQ2hhciBGSVhTSVpFW0FOWV0gdHlwZW1hcHMsIHRvIHByZXNlcnZlIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIEMgYXJyYXkgc2l6ZXMgKHNlZSBhYm92ZSkuIFRob3VnaCwgeW91IGNhbid0CiAgICAgICAgICAgICAgdXNlIHRoZW0geWV0IHNpbmNlICVhcHBseSBhbmQgYXJyYXlzIGFyZSBub3Qgd29ya2luZwogICAgICAgICAgICAgIHRvZ2V0aGVyLgoKICAgICAgICAgICAgLSBBZGQgcHlmcmFnbWVudHMuc3dnLCBub3cgdGhlIHVzZXIgY2FuIGFkZCBmcmFnbWVudHMKCSAgICAgIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9uZXMuCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIHdoaWNoIGZpeGVzIHNwdXJpb3VzIHByZXByb2Nlc3NvciBidWcgd2hpY2gKICAgICAgICAgICAgc2hvd3Mgb24gU29sYXJpcyBhbmQgZ2NjLCBlZzoKICAgICAgICAgICAgICAgIFdhcm5pbmcoMjAyKTogQ291bGQgbm90IGV2YWx1YXRlICchZGVmaW5lZChTV0lHSkFWQSkgJiYKICAgICAgICAgICAgICAgICEoZGVmaW5lZChTV0lHQ1NIQVJQKScKICAgICAgICAgICAgQWxzbyBmaXhlcyBhIGJ1ZyB3aGVyZSAnI2lmICJhIiA9PSAiYiIgPT0gMScgd291bGRuJ3QgaGF2ZSB3b3JrZWQgCgowOS8xMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZXN0b3JlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3Qtc3VpdGUuIFBhdGNoIGZyb20KICAgICAgICAgICAgQmlsbCBDbGFya2UuCgowOS8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbWlzc2luZyBydW50aW1lLmRzcCBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMgZm9yIHRoZQogICAgICAgICAgICBpbXBvcnQgZXhhbXBsZXMgdG8gd29yay4KCgpWZXJzaW9uIDEuMy4yMiAoU2VwdGVtYmVyIDQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBzd2lnLm00IG1hY3JvIGZvciB1c2Ugd2l0aCB0aGUgQXV0b2NvbmYvQXV0b21ha2UvTGlidG9vbCBoYXMKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGFuZCBpcyBubyBsb25nZXIgaW5zdGFsbGVkLiBQbGVhc2UgdXNlIHRoZSBuZXcgYW5kIGJldHRlcgogICAgICAgICAgICBtYWludGFpbmVkIHZlcnNpb24gZGVyaXZlZCBmcm9tIHN3aWcubTQgaW4gdGhlIEF1dG9jb25mIG1hY3JvIGFyY2hpdmUuCiAgICAgICAgICAgIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3BrZ19zd2lnLmh0bWwgYW5kCiAgICAgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcHl0aG9uX2RldmVsLmh0bWwuCgowOS8wMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCBwYXRjaCAjMTAxOTY2OSBmcm9tIENocmlzdG9waCBGbGFtbS4gQWRkcyBzdXBwb3J0CiAgICAgICAgICAgIGZvciAlZmVhdHVyZSgic2hhZG93IikgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdvcmtzIGluIFB5dGhvbi4gVGhpcwogICAgICAgICAgICBlbmFibGVzIG9uZSB0byBvdmVycmlkZSB0aGUgZ2VuZXJhdGVkIHNoYWRvdy9wcm94eSBtZXRob2RzLCBpbmNsdWRpbmcKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8qIExldCdzIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBjbGFzcyBTcXVhcmUgbW9yZSB2ZXJib3NlICovCgogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSBTcXVhcmUoZG91YmxlIHcpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHN1YiBuZXcgewogICAgICAgICAgICAgICAgICBteSAkcGtnID0gc2hpZnQ7CiAgICAgICAgICAgICAgICAgIG15ICRzZWxmID0gZXhhbXBsZWM6Om5ld19TcXVhcmUoQF8pOwogICAgICAgICAgICAgICAgICBwcmludCBTVERFUlIgIkNvbnN0cnVjdGVkIGFuIEB7W3JlZigkc2VsZildfVxuIjsKICAgICAgICAgICAgICAgICAgYmxlc3MgJHNlbGYsICRwa2cgaWYgZGVmaW5lZCgkc2VsZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgY2xhc3MgU3F1YXJlIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBTcXVhcmUoZG91YmxlIHcpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCjA4LzMxLzIwMDQ6IG1tYXR1cyAKCSAgICBbUHl0aG9uXSBJbmNvbXBhdGliaWxpdHkgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UgKGxsaWJAY29tcHV0ZXIub3JnKToKCSAgICAKCSAgICBJZiB5b3UgYXJlIHVzaW5nIFN1biBTdHVkaW8gOCAoYW5kIHBvc3NpYmx5IGVhcmxpZXIKCSAgICB2ZXJzaW9ucykgdG8gY29tcGlsZSB0aGUgb3V0cHV0IHByb2R1Y2VkIGJ5IHN3aWcKCSAgICAxLjMuMjJyYzEsIGFuZCB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgU1RMIHRlbXBsYXRlcyB0aGVuCgkgICAgeW91IG5lZWQgdG8gdXNlIGVpdGhlciAiLXJ1bnRpbWUiIG9yICItbm9ydW50aW1lIi4gIElmIHlvdQoJICAgIHVzZSBuZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBnZXQKCSAgICBjb21waWxlciBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gY29tcGlsZSB0aGUgd3JhcHBlciBmaWxlOwoJICAgIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbGlrZSB0aGlzOiBUaGUgbmFtZQoJICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJbLi4uXSBpcyB1bnVzYWJsZSBpbiBzdGF0aWMKCSAgICBzd2lncHk6OnRyYWl0c19hc3B0clsuLi5dICBJZiB5b3UgZ2V0IHRoaXMgZXJyb3IgbWVzc2FnZSwKCSAgICB5b3UgbmVlZCB0byByZWdlbmVyYXRlIHlvdXIgd3JhcHBlciBmaWxlIHVzaW5nICdzd2lnCgkgICAgLXJ1bnRpbWUnIG9yICdzd2lnIC1ub3J1bnRpbWUnLgoKCSAgICBZb3Ugc2hvdWxkbid0IGdldCB0aGlzIHByb2JsZW0gd2l0aCBTdW4gU3R1ZGlvIDkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCSAgICAKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgIzkzMjMzMyBmcm9tIElrZWdhbWkgVHN1dG9tdS4gRml4ZXMgbG9uZyBsb25nICpPVVRQVVQKICAgICAgICAgICAgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICM4NTczNDQgZnJvbSBBcnQgWWVya2VzLiBXb3JrYXJvdW5kIGZvciBhdXRvY29uZiBidWcgd2hlbgogICAgICAgICAgICBydW5uaW5nICdtYWtlIGluc3RhbGwnLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhcnQgb2YgcGF0Y2ggIzk4Mjc1MyBhcHBsaWVkLiBUaGlzIGltcGxlbWVudHMgYSAlcGVybGNvZGUgZGlyZWN0aXZlLgogICAgICAgICAgICBJdCBhbGxvd3Mgb25lIHRvIGFkZCBQZXJsIGNvZGUgdG8gdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gV29ya3MgdGhlIHNhbWUgCiAgICAgICAgICAgIGFzICVweXRob25jb2RlLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgdmlydHVhbCBtZXRob2RzIHdpdGggZXhjZXB0aW9uCiAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYXQgd2VyZSBub3Qgc2ltcGxlIHR5cGVzLiBQcmV2aW91c2x5IGNvZGUgd2FzIGdlbmVyYXRlZCB0aGF0CiAgICAgICAgICAgIGRpZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiB3YXMgYSBwb2ludGVyLgoKMDgvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwIGZpeCBmb3IgbWV0aG9kcyB0aGF0IHJldHVybiBjaGFyICouIFRoZSBDTFIgd291bGQgaW5jb3JyZWN0bHkKICAgICAgICAgICAgZGVsZXRlIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBjaGFyICouIEFsc28gYXBwbGllZCB0aGUgc2FtZSBjb3JyZWN0aW9uIHRvCiAgICAgICAgICAgIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzLgoKMDgvMjQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIC1mbWljcm9zb2Z0IGVycm9yL3dhcm5pbmcgbWVzc2FnZSBkaXNwbGF5OiAKICAgICAgICAgICAgLSBFbmQgb2YgZmlsZSAoRU9GKSB3YXJuaW5nIG1lc3NhZ2VzIG5vdCBkaXNwbGF5aW5nIGluIGNvcnJlY3QgZm9ybWF0CiAgICAgICAgICAgIC0gU29tZSBtZXNzYWdlcyBjb250YWluaW5nIGEgZmlsZSBwYXRoIHdlcmUgZGlzcGxheWluZyBhIGRvdWJsZSBiYWNrc2xhc2gKICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGJhY2tzbGFzaAoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjMTAxMTYwNCBzdWJtaXR0ZWQgYnkgQ2hhcmxlcyBTY2h3aWV0ZXJzLiBGaXggZm9yIDY0IGJpdCB0Y2wKICAgICAgICAgICAgaW50ZXJwcmV0ZXJzLgoKMDgvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBidWcgIzg3NTU4MyAtIGVudW0gZm9yd2FyZCBkZWNsYXJhdGlvbnMgcHJldmlvdXNseSBnYXZlIGEgc3ludGF4IGVycm9yLgoKMDgvMjMvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2UgdHlwZW1hcHMgImZmaXR5cGUiIGFuZCAibGlzcHR5cGUiIHRvIGRldGVybWluZSB0aGUgRkZJIHR5cGUKCSAgICBzcGVjaWZpZXJzIGZyb20gdGhlIEMgdHlwZS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUsIGZvciBpbnN0YW5jZSwgdG8gY29udHJvbAoJICAgIHdoZXRoZXIgYSBDICJjaGFyIiBhcmd1bWVudCB0YWtlcyBhIExpc3AgY2hhcmFjdGVyIG9yIGEgTGlzcCBpbnRlZ2VyIHZhbHVlLgoJICAgIFRoZSBkZWZhdWx0ICh0YWtpbmcgTGlzcCBjaGFyYWN0ZXJzKSBpcyBkb25lIGJ5IHRoZXNlIGJ1aWx0LWluIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiY2hhcmFjdGVyIjsKCSAgICBJZiBjaGFyIG1lYW5zIGFuIGludGVnZXIgaW5zdGVhZCwgdXNlIHRoZXNlIHR5cGVtYXBzOgoJICAgICAgJXR5cGVtYXAoZmZpdHlwZSkgY2hhciAiOmNoYXIiOyAldHlwZW1hcChsaXNwdHlwZSkgY2hhciAiaW50ZWdlciI7CgowOC8yMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcyBkaXNjdXNzZWQgaW4gYnVnICM3NzI0NTMsIHRoZSBTV0lHIGxpYnJhcnkgZGlyZWN0b3J5IGlzIG5vdyBpbnN0YWxsZWQKICAgICAgICAgICAgaW50byBhIGRpZmZlcmVudCBkZWZhdWx0IGRpcmVjdG9yeS4gVGhlIGxpYnJhcnkgdXNlZCB0byBiZSBpbnN0YWxsZWQgdG8KICAgICAgICAgICAgL3Vzci9sb2NhbC9saWIvc3dpZzEuMy4gSXQgaXMgbm93IGluIHRoZSBtb3JlIHVzdWFsIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudAogICAgICAgICAgICBkaXJlY3RvcnkgYW5kIEkgaGF2ZSBhZGRpdGlvbmFsbHkgdXNlZCBhIHZlcnNpb24gc3BlY2lmaWMgc3ViZGlyZWN0b3J5IGFzCiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHdpbGwgcmFyZWx5IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBTV0lHLiBUaGlzIHJlbGVhc2UKICAgICAgICAgICAgd2lsbCB0aHVzIHVzZSAvdXNyL2xvY2FsL3NoYXJlL3N3aWcvMS4zLjIyIGJ5IGRlZmF1bHQsIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB0YWlsb3JlZCBhcyBiZWZvcmUgdXNpbmcgJy4vY29uZmlndXJlIC0tc3dpZ2xpYmRpcicuCgowOC8xNy8yMDA0OiBta29lcHBlCgkgICAgW016U2NoZW1lXSBBZGQgc3VwcG9ydCB0byBjcmVhdGUgbmF0aXZlIE16U2NoZW1lIHN0cnVjdHVyZXMgZnJvbSBDIHN0cnVjdHVyZXMuCgkgICAgVG8gY29udmVydCBhIEMgc3RydWN0dXJlIHRvIGFuIE16U2NoZW1lIHN0cnVjdHVyZSwgdXNlIHRoZSBuZXcgcnVudGltZSBtYWNybwoJICAgIFNXSUdfTmV3U3RydWN0RnJvbVB0ciBpbiBhIHR5cGVtYXAuICBQYXRjaCBmcm9tIERtaXRyaXkgWmF2aW4uIAoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzgzNzcxNSBmcm9tIEJlbiBSZXNlciB0byBjb3JyZWN0bHkgZGV0ZWN0IFB5dGhvbiBsaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIG9uIDY0IGJpdCBzeXN0ZW1zLgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSBvZiBlYXJseSByZXR1cm4KICAgICAgICAgICAgZnJvbSB3cmFwcGVyIG1ldGhvZHMgdXNpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBwYXJhbWV0ZXJzLiBNb2RpZmllZAogICAgICAgICAgICBNYXJrIFRyYXVkdCBwYXRjaCAjOTUxNTY1LgoKMDgvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQnVnICM5NDM3ODMgd2l0aCBwYXRjaCBmaXhlcyBwaHAgY2hhciAqIG91dCB0eXBlbWFwIE5VTEwgdmFsdWVzLgoKMDgvMDMvMjAwNDogQWhtb24gRGFuY3kgIDxkYW5jeUBkYW5jeT4KCiAgICAgICAgICAgIFthbGxlZ3JvY2xdIEFkZGl0aW9uYWwgY2FzZSBtb2RlIGZpeGVzLiAgQWxzbywgbWFrZSBzdXJlCgkgICAgZm9yZWlnbiB0eXBlcyBhcmUgZXhwb3J0ZWQuCgowNy8yNC8yMDA0OiBta29lcHBlIAoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBTV0lHIG1vZHVsZXMgbm93IGV4Y2hhbmdlIHRoZWlyIHBvaW50ZXIgdHlwZQoJICAgIGluZm9ybWF0aW9uIHZpYSB0aGUgR3VpbGUgaW50ZXJwcmV0ZXIuICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGJ1aWxkIGEKCSAgICBydW50aW1lIGxpYnJhcnkgb3IgdG8gdXNlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGV0Yy4KCSAgICAKCSAgICBUaGUgbW9kdWxlIChTd2lnIHN3aWdydW4pIHdoaWNoIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBjaGFuZ2Ugb2YgMDUvMTcvMjAwNCBpcwoJICAgIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGJ1aWx0LiAgSWYgeW91IG5lZWQgaXQsIHJ1biBTV0lHIG9uIHRoZSBpbnRlcmZhY2UgZmlsZQoJICAgIHN3aWdydW4uaS4gCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEJ1ZyAjOTE3NjAxIE1hcHBpbmcgQysrIGJvb2wgZml4IGZyb20gTWFyayBUcmF1ZHQKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJQTSBmaXhlcyBmb3IgbGF0ZXN0IENWUyB2ZXJzaW9uIGluY2x1ZGluZyByZW1vdmFsIG9mIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyeS4KCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5MDg5NTUgZnJvbSBSb2JlcnQgSCBEZSBWcmllcy4KICAgICAgICAgICAgUlBNIGZpbGUgZ2VuZXJhdGlvbiBmaXggZm9yIEZlZG9yZSBDb3JlIDEgYW5kIFJlZGhhdCBBUzIuMS4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4NjQ2ODkgZnJvbSBSb2JpbiBEdW5uOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0cyB0d28gcHJvYmxlbXMgaW4gdGhlIFhNTCBvdXRwdXQgb2YgU1dJRzoKICAgICAgICAgICAgIAogICAgICAgICAgICAgIDEuIFRoZXJlIHdlcmUgb2Z0ZW4gZXh0cmEgJy8+XG4nIGluIHRoZSBvdXRwdXQuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgMi4gdmFsdWUgYXR0cmlidXRlcyB3ZXJlIG91dHB1dCB3aXRoICdcbicgaW4gdGhlbSBidXQKICAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG5vdCB0ZWNobmljYWxseSBsZWdhbCBtb3N0IChhbGw/KSBYTUwKICAgICAgICAgICAgICBwYXJzZXJzIHdpbGwgc3RyaXAgdGhlbSBvdXQuIFJlcGxhY2luZyB0aGUgJ1xuJyB3aXRoCiAgICAgICAgICAgICAgdGhlICcmIzEwOycgZW50aXR5IHJlZmVyZW5jZSBzb2x2ZXMgdGhpcyBhcyB0aGF0IGlzCiAgICAgICAgICAgICAgbGVnYWwgYW5kIFhNTCBwYXJzZXJzIHdpbGwgY29udmVydCBpdCB0byBhICdcbicgd2hlbgogICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHZhbHVlcyBiYWNrIGluLgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyBhZGRzIGEgbmV3IGdsb2JhbCBjb21tYW5kIGxpbmUgb3B0aW9uCiAgICAgICAgICAgICAgdGhhdCB3aWxsIGFsbG93IHRoZSBwYXJzZSB0cmVlIHRvIGJlIHdyaXR0ZW4gb3V0IGluIFhNTAogICAgICAgICAgICAgICphZnRlciogc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGUgaGFzIGJlZW4gcnVuLCBpbgogICAgICAgICAgICAgIG9yZGVyIHRvIGJlIGFibGUgdG8gZ2V0IGV4dHJhIGluZm8gdGhhdCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICBtb2R1bGUgcHV0cyBpbiB0aGUgdHJlZS4gSW4gdGhpcyB3YXkgdGhlIFhNTCBpcyBhCiAgICAgICAgICAgICAgcG9zdC1wcm9jZXNzZWQgdmVyc2lvbiBvZiB0aGUgdHJlZSByYXRoZXIgdGhhbiBhCiAgICAgICAgICAgICAgcHJlLXByb2Nlc3NlZCB2ZXJzaW9uLiAKIAogICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb24gaXMgLWR1bXBfeG1sIG9yIC14bWxvdXQgPGZpbGU+CgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgdG8gZml4IHR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMKICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBIVE1MIGRvY3VtZW50YXRpb24gKG1ha2VjaGFwLnB5KSBmaWxlIGdlbmVyYXRvciBtaXNzaW5nIGVuZCBvZiBsaW5lCiAgICAgICAgICAgIHBhdGNoICM5MDg5NTEgZnJvbSBSb2JlcnQgZGUgVnJpZXMuCgowNy8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgZGVwcmVjYXRlZCBydW50aW1lIGxpYnJhcnkgYnVpbGQgaGFzIGJlZW4gcmVtb3ZlZC4gVGhpcyBhbHNvIHJlbW92ZXMKICAgICAgICAgICAgdGhlIGRlcGVuZGVuY3kgb24gTGlidG9vbC4gTGlidG9vbCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gYnVpbGQgU1dJRy4KICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgLWxkZmxhZ3MgU1dJRyBjb21tYW5kbGluZSBvcHRpb24gaGFzIGFsc28gYmVlbiByZW1vdmVkLgoKICAgICAgICAgICAgVGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRlc3RjYXNlcyB0aGF0IHVzZWQgdGhlIHJ1bnRpbWUgbGlicmFyeSBoYXZlCiAgICAgICAgICAgIGJlZW4gdXBkYXRlZCB0byB1c2UgdGhlIHJlcGxhY2VtZW50IGFwcHJvYWNoIHRvIHVzaW5nIFNXSUcgYWNyb3NzIAogICAgICAgICAgICBtdWx0aXBsZSBtb2R1bGVzLCB0aGF0IGlzIHRoZXkgdXNlIHRoZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLCBzZWUgTW9kdWxlcy5odG1sLiBFZmZlY3RpdmVseSB0aGV5IGJ1aWxkIHRoZWlyIG93biBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcmllcyB1c2luZyAtcnVudGltZS4gVGhlIGV4YW1wbGVzIGFyZSBpbXBvcnQgYW5kIGltcG9ydF90ZW1wbGF0ZS4KICAgICAgICAgICAgVGhlIHRlc3QgY2FzZXMgYXJlIGluIHRoZSBpbXBvcnRzIGFuZCB0ZW1wbGF0ZV90eXBlZGVmX2ltcG9ydCBkaXJlY3Rvcmllcy4KCiAgICAgICAgICAgIEFueW9uZSB3aG8gd2FudHMgdGhlIG9yaWdpbmFsIHJ1bnRpbWUgbGlicmFyaWVzIGNhbiBlaXRoZXIgcnVuIHRoZSB0ZXN0LXN1aXRlCiAgICAgICAgICAgIG9yIGJ1aWxkIHRoZSBleGFtcGxlcyBhbmQgdXNlIHRoZSBhcHByb3ByaWF0ZSBzaGFyZWQgb2JqZWN0L0RMTCB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aXRoIHRoZSAtcnVudGltZSBjb21tYW5kbGluZSBvcHRpb24uIEZvciBleGFtcGxlIGxpYmltcG9ydHNfcnVudGltZS5zbwogICAgICAgICAgICAoUHl0aG9uIGNhbGxzIGl0IGxpYl9pbXBvcnRzX3J1bnRpbWUuc28pIGlzIGdlbmVyYXRlZCBhZnRlciBydW5uaW5nIHRoZSAKICAgICAgICAgICAgJ21ha2UgaW1wb3J0cy5tdWx0aWNwcHRlc3QnIHRlc3RjYXNlIGluIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlLzxsYW5nPgogICAgICAgICAgICBkaXJlY3RvcnkuIE9yIHVzZSBsaWJydW50aW1lLnNvIC8gcnVudGltZS5kbGwgYWZ0ZXIgYnVpbGRpbmcgdGhlIGltcG9ydAogICAgICAgICAgICBleGFtcGxlcyBpbiBFeGFtcGxlcy88bGFuZz4vaW1wb3J0LgoKMDcvMDcvMjAwNDogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBDb252ZXJ0IGNoYXJhY3RlciBhbmQgc3RyaW5nIGxpdGVyYWxzIGluIGNvbnN0YW50cyB0byAKCSAgICBDTCBzeW50YXguICBGaXggRkY6REVGLUZPUkVJR04tQ0FMTCBmb3IgbWl4ZWQtY2FzZSBDIGZ1bmN0aW9ucy4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZmVhdHVyZSBmb3IgSmF2YSBleGNlcHRpb25zIHdpdGggZm9ybWF0ICVqYXZhZXhjZXB0aW9uKGV4Y2VwdGlvbmNsYXNzZXMpLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgYSBzbGlnaHQgZW5oYW5jZW1lbnQgdG8gJWV4Y2VwdGlvbiBhbmQgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgCiAgICAgICAgICAgIGFkZGl0aW9uIG9mIHRoZSBleGNlcHRpb24gY2xhc3NlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGludG8gYSB0aHJvd3MgY2xhdXNlLgogICAgICAgICAgICBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgIGFkZGVkIHRvIHRoZSBhc3NvY2lhdGVkIHByb3h5IG1ldGhvZCdzIHRocm93cyBjbGF1c2UuIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycKICAgICAgICAgICAgYXJlIHNwZWNpZmllZCBsaWtlIHRoZSBleGNlcHRpb24gY2xhc3NlcyBpbiB0aGUgJ3Rocm93cycgYXR0cmlidXRlIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwcy4gVGhpcyBmZWF0dXJlIHNob3VsZCBiZSB1c2VkIGZvciBjb3JyZWN0bHkgaGFuZGxpbmcgY2hlY2tlZCBleGNlcHRpb25zCiAgICAgICAgICAgIHRocm93biBmcm9tIEpOSSBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFleGNlcHRpb24oImphdmEubGFuZy5FeGNlcHRpb24iKSB0aHJvd0V4Y2VwdGlvbiAlewogICAgICAgICAgICAgICAgLi4uIGNvbnZlcnQgYSBzdGQ6OmxvZ2ljX2Vycm9yIGludG8gYSBqYXZhLmxhbmcuRXhjZXB0aW9uIHVzaW5nIEpOSSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAgICAgICAgICAgICAgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHsKICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIkxvZ2ljIGVycm9yISIpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgYSBtZXRob2Qgd2l0aCBhIHRocm93cyBjbGF1c2UgaW4gdGhlIG1vZHVsZSBjbGFzczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRocm93RXhjZXB0aW9uKCkgdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24geyAuLi4gfQoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgJWNzY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFRoaXMgd29ya3MgdGhlIHNhbWUgd2F5IGFzICVqYXZhY29uc3R2YWx1ZS4gRm9yIEMjLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgICBpcyB0aGUgb25seSB3YXkgdGhhdCBvbmUgY2FuIGZpeCB3cmFwcGluZyBvZiBDL0MrKyBlbnVtcyB3aXRoIHByb3BlciBDIwogICAgICAgICAgICBlbnVtcyBpZiB0aGUgZW51bSBpdGVtJ3MgaW5pdGlhbGlzZXIgY2Fubm90IGNvbXBpbGUgYXMgQyMgY29kZS4gVGhpcyBpcwogICAgICAgICAgICBiZWNhdXNlIEphdmEgZW51bXMgY2FuIHVzZSBhIGNhbGwgaW50byBDIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgZW51bSBpdGVtLAogICAgICAgICAgICB3aGVyZWFzIGluIEMjLCB0aGUgZW51bSB2YWx1ZSBtdXN0IGJlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LiBUaGF0IGlzLAogICAgICAgICAgICB1c2luZyAlY3Njb25zdCgwKSBjYW5ub3QgYmUgdXNlZCBpbiBDIyB0byBpbml0aWFsaXNlIHRoZSBDIyBlbnVtIGl0ZW0gdmlhCiAgICAgICAgICAgIGEgUElOVk9LRSBjYWxsLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyAlamF2YWNvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBTb21ldGltZXMgdGhlIHVzZSBvZiAlamF2YWNvbnN0KDEpIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZQogICAgICAgICAgICB1bmRlciBKYXZhLiBJZiBhIGNvbXBpbGUgdGltZSBjb25zdGFudCBpcyByZXF1aXJlZCwgJWphdmFjb25zdCgwKSBpcyBub3QgYW4KICAgICAgICAgICAgb3B0aW9uLiBUaGUgJWphdmFjb25zdHZhbHVlIGRpcmVjdGl2ZSBhY2hpZXZlcyB0aGlzIGdvYWwgYW5kIHRoZSB2YWx1ZSBzcGVjaWZpZWQKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIGFzIEphdmEgY29kZSB0byBpbml0aWFsaXNlIHRoZSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMDAwKSBCSUc7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKCJuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoXCIyMDAwXCIpIikgTEFSR0U7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwKSBiYXI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXIgPSAxMDsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICNkZWZpbmUgQklHIDEwMDBMTAogICAgICAgICAgICAgICAgI2RlZmluZSBMQVJHRSAyMDAwVUxMCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7IEJBUiA9IDo6YmFyIH07CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEdlbmVyYXRlczoKCiAgICAgICAgICAgICAgcHVibGljIGludGVyZmFjZSBleGFtcGxlQ29uc3RhbnRzIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMDAwOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLm1hdGguQmlnSW50ZWdlciBMQVJHRSA9IG5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcigiMjAwMCIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgRm9vIEJBUiA9IG5ldyBGb28oIkJBUiIsIDEwKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHksIG5vbmUgb2YgQklHLCBMQVJHRSBvciBCQVIgd291bGQgaGF2ZSBwcm9kdWNlZCBjb21waWxlYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGVuaGFuY2VtZW50cy4gRmVhdHVyZXMgY2FuIG5vdyB0YWtlIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXR0cmlidXRlcwogICAgICAgICAgICBpbiBhZGRpdGlvbiB0byB0aGUgZmVhdHVyZSBuYW1lIGFuZCBmZWF0dXJlIHZhbHVlLiBUaGUgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgCiAgICAgICAgICAgIGFuZCBhcmUgbXVjaCB0aGUgc2FtZSBhcyB0aGUgdHlwZW1hcCBhdHRyaWJ1dGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgICAgICAgICBzcGVjaWZpZXMgdHdvIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIGF0dHJpYjEgYW5kIGF0dHJpYjI6CgogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZSAidmFsIjsKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCB2YWwsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZTsKCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgdGhlIHN5bnRheCB0aGF0IHRha2VzIHRoZSBmZWF0dXJlIHZhbHVlIHdpdGhpbiB0aGUKICAgICAgICAgICAgJWZlYXR1cmUoKSBicmFja2V0cy4gVGhlIHZhbHVlIHNwZWNpZmllZCBpcyBubyBsb25nZXIgcmVzdHJpY3RlZCB0byBiZWluZyBqdXN0CiAgICAgICAgICAgIGEgc3RyaW5nLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBhY2NlcHRhYmxlCiAgICAgICAgICAgIHN5bnRheDoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLDIwLjApOwogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQgaGF2ZSB0byBoYXZlIGJlZW46CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwiMjAuMCIpOwogICAgICAgICAgICBVc2VmdWwgZm9yIGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgJXNvbWVmZWF0dXJlKHZhbHVlKSAgICAgICVmZWF0dXJlKCJzb21lZmVhdHVyZSIsdmFsdWUpCiAgICAgICAgICAgIFRoZXNlIHdpbGwgbm93IHdvcmsgYWNjZXB0aW5nIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlcjoKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoIkZyZWQiKTsKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoNCk7CgowNi8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW4sIEd1aWxlXQogICAgICAgICAgICAgLSBDcmVhdGVkIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL3NjaGVtZXJ1bm1lIGRpcmVjdG9yeSwgd2hpY2ggaG9sZHMgYWxsIHRoZQoJICAgICAgIHJ1bm1lIHNjcmlwdHMgZm9yIGd1aWxlIGFuZCBjaGlja2VuIChhbmQgcG9zc2libHkgbXpzY2hlbWUuLi4pLiAgVGhlIGd1aWxlCgkgICAgICAgYW5kIGNoaWNrZW4gX3J1bm1lIGZpbGVzIHRoZW4gKGxvYWQgIi4uL3NjaGVtZXJ1bm1lL2Zvby5zY20iKS4KICAgICAgICAgICAgIC0gSW4gY2hpY2tlbiBtb2R1bGUsIGZpeCBhIGZldyBidWdzIGludmxvbHZpbmcgZHluYW1pYyBjYXN0cy4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIHRvIGZpeCB3cmFwcGluZyBvZiB0ZW1wbGF0ZWQgbWV0aG9kcy4gSVNPIGNvbXBsaWFudCBjb21waWxlcnMsIGxpa2UKICAgICAgICAgICAgQ29tZWF1IGFuZCBHQ0MtMy40LjAsIGRvbid0IGxpa2UgdGhlIHRlbXBsYXRlIHNwZWNpZmllciB0aGF0IFNXSUcgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRoZSBtZXRob2QuIFRoaXMgZml4IG1heSBicmVhayBzb21lIG5vbiBzdGFuZGFyZCBjb21wbGlhbnQgY29tcGlsZXJzLAogICAgICAgICAgICBmb3IgZXhhbXBsZSwgU3VuIHdvcmtzaG9wIGNvbXBpbGVycyBwcmlvciB0byB2ZXJzaW9uIDYuMi5wMi4gUGF0Y2ggc3VibWl0dGVkCiAgICAgICAgICAgIGJ5IEJpbGwgQ2xhcmtlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBVbmRvY3VtZW50ZWQgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUgcmVtb3ZlZC4KICAgICAgICAgICAgTmV3IHNwZWNpYWwgdmFyaWFibGUgJG1vZHVsZSBpcyByZXBsYWNlZCBieSB0aGUgbW9kdWxlIG5hbWUsIGFzIHNwZWNpZmllZAogICAgICAgICAgICBieSAlbW9kdWxlIG9yIC1tb2R1bGUgY29tbWFuZGxpbmUgb3B0aW9uLiAkaW1jbGFzc25hbWUgY2FuIGJlIGNyZWF0ZWQgZnJvbSAkbW9kdWxlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTYW1lIGFzIGZvciBKYXZhIGJlbG93LiBUaGUgbmV3IHR5cGVtYXBzIGFyZSBuYW1lZCBkaWZmZXJlbnRseSwgbmFtZWx5LAogICAgICAgICAgICBjc2JvZHkgYW5kIGNzYm9keV9kZXJpdmVkLiBUaGUgZGVwcmVjYXRlZCB0eXBlbWFwcyBhcmUgY3NnZXRjcHRyIGFuZAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUeXBlbWFwIGNoYW5nZXMgZm9yIHRoZSBKYXZhIHByb3h5IC8gdHlwZXdyYXBwZXIgYW5kIGVudW0gY2xhc3Nlcy4gQSBuZXcKICAgICAgICAgICAgdHlwZW1hcCBjYWxsZWQgamF2YWJvZHkgY29udGFpbnMgdGhlIGVzc2VudGlhbCBzdXBwb3J0IGNvZGUgZm9yIGdlbmVyYXRpb24gaW50byB0aGUgYm9keQogICAgICAgICAgICBvZiB0aGVzZSBjbGFzc2VzLiBUaGVyZSBpcyBhbHNvIGEgbmV3IGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcCB3aGljaCBpcyB1c2VkIGluc3RlYWQgZm9yCiAgICAgICAgICAgIHdyYXBwZWQgY2xhc3NlcyB0aGF0IGhhdmUgYSB3cmFwcGVkIGJhc2UgY2xhc3MuIFRoZSBjb2RlIGlzIGJhc2ljYWxseSwgdGhlIGdldENQdHIoKQogICAgICAgICAgICBtZXRob2QgYW5kIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzLiBUaGVzZSB1c2VkIHRvIGJlIGhhcmQgY29kZWQKICAgICAgICAgICAgd2l0aCBubyB3YXkgdG8gbW9kaWZ5IHRoZSBjb2RlLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoaXMgdHlwZW1hcCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgICAgdGhlIHVzZXIgdG8gdGFpbG9yIG5lYXJseSBldmVyeSBhc3BlY3Qgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBub3cgaXMgdGhlIGNvZGUgZm9yIGRpcmVjdG9yIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgYW5kIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyB0eXBlbWFwcyBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIHRoYXQgdGhlc2UgZ2VuZXJhdGVkIGNhbiBiZSBwdXQgaW4gdGhlIG1vcmUgZmxleGlibGUKICAgICAgICAgICAgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwgbWF5IGhlbHAgeW91IHVwZ3JhZGUgaWYgeW91IGhhdmUgdXNlZAogICAgICAgICAgICB0aGUgamF2YWdldGNwdHIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICAvKiBVdGlsaXR5IG1hY3JvIGZvciBtYW5pcHVsYXRpbmcgdGhlIEphdmEgYm9keSBjb2RlIG1ldGhvZCBhdHRyaWJ1dGVzICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIENUT1JfQVRUUklCLCBHRVRDUFRSX0FUVFJJQikKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5KSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN3aWdDTWVtT3duOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzd2lnQ01lbU93biA9IGNNZW1vcnlPd247CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keV9kZXJpdmVkKSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKCRtb2R1bGVKTkkuU1dJRyRqYXZhY2xhc3NuYW1lVXBjYXN0KGNQdHIpLCBjTWVtb3J5T3duKTsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFRoZSBkZWZhdWx0IGlzIHByb3RlY3RlZCBnZXRDUHRyLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoU1dJR1RZUEUsIHByb3RlY3RlZCwgcHJvdGVjdGVkKQoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19HRVRDUFRSKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHJvdGVjdGVkLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwdWJsaWMgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0JPRFlNRVRIT0RTKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHVibGljLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgbW9kaWZpZXIgdHlwZW1hcHMgYW5kIHByYWdtYXMgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBUaGV5IG11c3Qgbm93IGluY2x1ZGUgdGhlIGNsYXNzIHR5cGUuIFByZXZpb3VzbHkgJ2NsYXNzJyB3YXMgaGFyZCBjb2RlZC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBmbGV4aWJpbGl0eSBpbnRvIHdoYXQgdHlwZSBvZiBjbGFzcyBpcyBnZW5lcmF0ZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlIHRoZSBwcm94eSBjbGFzcyBjb3VsZCBiZSBhbiBpbnRlcmZhY2UgaW5zdGVhZCBvZiBhIGNsYXNzLgoKICAgICAgICAgICAgRm9yIEphdmEgdGhpcyBhZmZlY3RzIHRoZSBqYXZhY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBGb3IgQyMgdGhpcyBhZmZlY3RzIHRoZSBjc2NsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBVbmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBvZiB0aGVzZSB0eXBlbWFwcyBvciBwcmFnbWFzLCB5b3UKICAgICAgICAgICAgc2hvdWxkbid0IGJlIGFmZmVjdGVkLiBIb3dldmVyLCBpZiB5b3UgaGF2ZSwgdXBncmFkaW5nIGlzIGVhc3ksIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCIKCiAgICAgICAgICAgIG11c3Qgbm93IGJlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwgY2xhc3MiCgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHRoYXQgYXJlIHJlZmVyZW5jZXMuIFByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgT3JlbiBNaWxsZXIuIEFsc28gaW1wcm92ZXMgdGhlIGdlbmVyYXRlZCBleGNlcHRpb24gZGVjbGFyYXRpb25zIGluIHRoZQogICAgICAgICAgICBjYXRjaCBoYW5kbGVyIGZvciBwb2ludGVycyAtIGEgcG9pbnRlciBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8KICAgICAgICAgICAgYSBwb2ludGVyLiBBZGRlZCBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgJiwgU1dJR1RZUEUgKiBhbmQKICAgICAgICAgICAgU1dJR1RZUEVbQU5ZXSAoSmF2YSBhbmQgQyMpLgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIG1pbm9yIHR5cGVzYWZlIGVudW0gaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgc3RvcmluZyB0aGUgbmFtZSBvZgogICAgICAgICAgICB0aGUgZW51bSBpdGVtLiBUaGUgdG9TcmluZygpIC8gVG9TdHJpbmcoKSBtZXRob2RzIGFyZSBvdmVycmlkZGVuIHRvIHJldHVybiB0aGlzIG5hbWUuCgowNS8zMC8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICAtIFVwZGF0ZSBob3cgZXhhbXBsZXMgYW5kIHRoZSB0ZXN0IHN1aXRlIGFyZSBidWlsdC4KCSAgICAgLSBTeW1ib2wgbmFtZXMgYXJlIG5vIGxvbmdlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQoJICAgICAtIEFkZGVkIHVuaW9uX3J1bm1lLnNzLCB3aGljaCB3YXMgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBndWlsZSBtb2R1bGUKCjA1LzI2LzIwMDQ6IGxiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIENvbW1pdHRlZCBvbiBiZWhhbGYgb2YgTWFyY2VsbyAod2hvIHN0aWxsIGhhcyBwcm9ibGVtcyB3aXRoIAoJICAgIHRoZSBTb3VyY2VGb3JnZSBDVlMuKQoKCSAgICBBZGRlZCBQeXRob24gdHlwZW1hcHMgZm9yIEZJTEUqIHdpdGggKFB5dGhvbi1vbmx5KSB0ZXN0LgoKNS8yNC8yMDA0OiAgZGFuY3kKCgkqIEFsbGVncm8gQ0wgbW9kdWxlOiAgTm93IHVzaW5nIHNvbWUgbWFjcm9zIChkZWZpbmVkIGluCglMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2cpLCBzd2lnLWRlZmNvbnN0YW50IGFuZCBzd2lnLWRlZnVuLCBmb3IKCWRlZmluaW5nIGNvbnN0YW50cyBhbmQgZm9yZWlnbiBmdW5jdGlvbnMuICBUaGlzIG1ha2VzIHRoZQoJZ2VuZXJhdGVkIGZpbGUgYSBiaXQgbmVhdGVyLiAgICAKCglOb3cgc3RyaXBzIGEgbGF5ZXIgb2YgcGFyZW50aGVzaXMgZnJvbSBjb25zdGFudHMuCgoJVXNlcyAoKiA6dm9pZCkgaW5zdGVhZCBvZiA6Zm9yZWlnbi1hZGRyZXNzIG5vdy4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFVubmFtZWQgZW51bSBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3cgc3VwcG9ydGVkIGluIGFkZGl0aW9uCiAgICAgICAgICAgIHRvIHRoZSByZWNlbnRseSBhZGRlZCBzdXBwb3J0IGZvciB1bm5hbWVkIGVudW0gbWVtYmVyIHZhcmlhYmxlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMSwgZW51bTIgfSBNZW1iZXJJbnN0YW5jZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTMsIGVudW00IH0gR2xvYmFsSW5zdGFuY2U7CgogICAgICAgICAgICBUaGUgaW50IHR5cGVtYXBzIGFyZSB1c2VkIGZvciB3cmFwcGluZyB0aGUgZ2V0L3NldCBhY2Nlc3NvciBtZXRob2RzLgogICAgICAgICAgICBJZiB0aGUgc2l6ZW9mIGFuIGVudW0gaXMgbm90IHRoZSBzYW1lIHNpemUgYXMgYW4gaW50IHRoZW4gc2V0dGluZyB0aGUKICAgICAgICAgICAgdmFyaWFibGUgd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIGFzIHRoZSBjYXN0cyBjYW5ub3QgYmUgZWFzaWx5IGFuZCBwb3J0YWJseQogICAgICAgICAgICBnZW5lcmF0ZWQuIElmIHlvdSBuZWVkIHRvIHNvbHZlIHRoaXMgaGlnaGx5IG9ic2N1cmUgc2l0dWF0aW9uLCB3cml0ZQogICAgICAgICAgICB0aGUgYXNzaWdubWVudCB1c2luZyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlLgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDIyBlbnVtIHdyYXBwaW5nIG1vZHMuIFNpbWlsYXIgdG8gdGhlIEphdmEgbW9kdWxlLCBlbnVtcyBjYW4gYmUgd3JhcHBlZCB1c2luZwogICAgICAgICAgICBvbmUgb2YgMyBhcHByb2FjaGVzOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEMjIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWNzZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFtObyBpbXBsZW1lbnRhdGlvbiBkZWVtZWQgbmVjZXNzYXJ5IGZvciB0eXBlIHVuc2FmZSBlbnVtc10uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyBwcm9wZXIgQyMgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGVudW0gc3VwcG9ydCBhZGRlZC4gVGhlcmUgYXJlIG5vdyA0IHdheXMgaW4gd2hpY2ggZW51bXMgY2FuIGJlIHdyYXBwZWQ6CgogICAgICAgICAgICAxKSBQcm9wZXIgSmF2YSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgVHlwZSB1bnNhZmUgZW51bXMgKGNvbnN0YW50IGludGVnZXJzKSAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGV1bnNhZmUuc3dnIgogICAgICAgICAgICA0KSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWphdmFlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcHMgd2lsbCBoYW5kbGUgZW51bXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNwZWNpZmllZCBpbml0aWFsCiAgICAgICAgICAgIHZhbHVlcywgZm9yIGV4YW1wbGUgdGVuIGlzIHNwZWNpZmllZDoKCiAgICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyB6ZXJvLCB0ZW4oMTApIH07CgogICAgICAgICAgICBIb3dldmVyLCB0aGUgYW1vdW50IG9mIGdlbmVyYXRlZCBKYXZhIGNvZGUgY2FuIGJlIGN1dCBkb3duLCBieSBtb2RpZnlpbmcgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaWYgbm9uZSBvZiB0aGUgZW51bXMgaGF2ZSBpbml0aWFsIHZhbHVlcyAocHJvcGVyIEphdmEgZW51bXMgYW5kIHR5cGVzYWZlIGVudW1zIGFwcHJvYWNoKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHR5cGVzYWZlIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGJ1ZyB1c2luZyAlcmVuYW1lIG9uIGVudW0gaXRlbXMgYW5kIHdoZW4gdXNpbmcKICAgICAgICAgICAgJWphdmFjb25zdCgxKSAvICVjc2NvbnN0KDEpCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShPYmopIE9iamVjdDsKICAgICAgICAgICAgICAgIGVudW0gR3JhbW1hciB7IFN1YmplY3QsIE9iamVjdCB9OwoKMDQvMjgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBNaW5vciBmaXhlcyB3aGVuIHVzaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgCiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzLCBqYXZhYmFzZSwgY3NpbnRlcmZhY2VzIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgowNS8xOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSlZNIGxpbmsgZmFpbHVyZSBvbiBzb21lIHN5c3RlbXMgZml4ZWQgd2hlbiB1c2luZyBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIEFsc28gYWRkcyBkZWZhdWx0IHZlY3RvciBjb25zdHJ1Y3RvciBmb3IgdXNlIGZyb20gSmF2YS4KCjA1LzE3LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCgkgICAgW0d1aWxlXSBOZXcgcnVudGltZSBmdW5jdGlvbnMgU1dJR19Qb2ludGVyQWRkcmVzcywKCSAgICBTV0lHX1BvaW50ZXJUeXBlLCBTV0lHX0lzUG9pbnRlck9mVHlwZSwgU1dJR19Jc1BvaW50ZXIuCgoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB3cmFwIHNldmVyYWwgU1dJRyBydW50aW1lIGZ1bmN0aW9ucwoJICAgIGFuZCBleHBvcnQgdGhlbSBpbnRvIHRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikuICBUaGUKCSAgICBydW50aW1lIG1vZHVsZSBpcyBub3cgYnVpbHQgd2l0aCAibW9kdWxlIiBsaW5rYWdlLgoKCSAgICBbR3VpbGVdIEdPT1BTIHByb3h5IG9iamVjdHMgbm93IGFsc28gcHJpbnQgdGhlIHBvaW50ZXIKCSAgICBhZGRyZXNzIG9mIHRoZSBDIG9iamVjdC4KCjA1LzE0LzIwMDQ6IGx5bGUKICAgICAgICAgICAgQWRkZWQgS291J3MgcGF0Y2ggZm9yIHRoZSBSdWJ5ICVpbXBvcnQgZGlyZWN0aXZlIHNvIHRoYXQgbW9kdWxlcwogICAgICAgICAgICB3aXRoICJuZXN0ZWQiIG5hbWVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LiBDb25zaWRlciBhbiBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZSBmb28uaSB0aGF0IGhhcyB0aGlzICVtb2R1bGUgZGVjbGFyYXRpb24gYXQgaXRzIHRvcDoKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJtaXNjOjp0ZXh0Ojpmb28iCgogICAgICAgICAgICBOb3cgY29uc2lkZXIgYW5vdGhlciBpbnRlcmZhY2UgZmlsZSBzcGFtLmkgdGhhdCBpbXBvcnRzIGZvby5pOgoKICAgICAgICAgICAgICAgICVpbXBvcnQgZm9vLmkKICAgICAgICAgICAgCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBzcGFtX3dyYXAuYzoKCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjOjp0ZXh0Ojpmb28iKTsKCiAgICAgICAgICAgIFdpdGggdGhpcyBwYXRjaCwgaG93ZXZlciwgeW91J2xsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUKICAgICAgICAgICAgZm9yIHRoZSBjYWxsIHRvIHJiX3JlcXVpcmUoKSwgZS5nLgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2MvdGV4dC9mb28iKTsKCiAgICAgICAgICAgIFNlZSBTb3VyY2VGb3JnZSBCdWcgIzkyODI5OS4KCjA1LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZvciBlbWl0dGluZyBkaXJlY3RvcnMgd2hlbiAlZmVhdHVyZSgiZGlyZWN0b3IiKSBzcGVjaWZpZWQKICAgICAgICAgICAgZm9yIGEgY2xhc3Mgd2l0aCBubyB2aXJ0dWFsIG1ldGhvZHMsIGJ1dCBkb2VzIGhhdmUgYSB2aXJ0dWFsIGRlc3RydWN0b3IuCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBLZXZpbiBTbWl0aC4KCjA1LzA2LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgU1dJRyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVByZXR0eU5hbWUsIHdoaWNoIAoJICAgIHJldHVybnMgYW4gdW5tYW5nbGVkIHR5cGUgbmFtZSBmb3IgYSBzd2lnX3R5cGVfaW5mbwoJICAgIG9iamVjdC4gCgoJICAgIFtHdWlsZV06IFVzZSBpdCBmb3IgcHJpbnRpbmcgcG9pbnRlciBvYmplY3RzLgoKMDUvMDMvMjAwNDogIGRhbmN5IChBaG1vbiBEYW5jeSkKCgkqIExpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZzogIFVwZGF0ZWQgY29tbWVudHMgYWJvdXQgaWRlbnRpZmVyCgljb252ZXJzaW9uLiAgCgoJKiBTb3VyY2VzL01vZHVsZXMvYWxsZWdyb2NsLmN4eDogIFJlZ2lzdGVyIC9kZXYvbnVsbCBmb3IgImhlYWRlciIKCXRhcmdldC4gICBBbHNvLCBkaXNyZWdhcmQgImNvbnN0IiBxdWFsaWZpZXJzIGR1cmluZyB0eXBlCgljb252ZXJzaW9uLiAgCgoJCjA1LzAyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBGaXggYnVnIDc4MjQ2OC4KCSAgICBUbyBmaXggdGhpcyBidWcsIHRoZSBydW50aW1lIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLCBhbmQKCSAgICBwb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGEgQ19TV0lHX1BPSU5URVJfVFlQRS4KCgkgICAgQ2hpY2tlbiB2ZXJzaW9uID4gMS40MCBpcyBub3cgcmVxdWlyZWQhCgoJICAgICogVHlwZW1hcCBpbmNvbXBhdGliaWxpdHk6ICB0eXBlbWFwcyBubyBsb25nZXIgdXNlIGNoaWNrZW5fd29yZHMuCgkgICAgICBJZiBhIHR5cGVtYXAgbmVlZHMgc29tZSBzcGFjZSwgaXQgc2hvdWxkIGp1c3QgY2FsbCBDX2FsbG9jCgoJICAgICogYXJnb3V0IHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgdGhlIC8qIGlmIE9ORSAqLyBjb25zdHJ1Y3QgdG8KCSAgICAgIGJ1aWxkIGFuIG91dHB1dCBsaXN0LiAgQSBTV0lHX0FQUEVORF9WQUxVRSBtYWNybywgZXhhY3RseSBsaWtlCgkgICAgICBndWlsZSBhbmQgbXpzY2hlbWUgaXMgbm93IHVzZWQuCgowNC8yNS8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiB0aGUgZ2VuZXJhdGVkIEdPT1BTIGNvZGUsIGRvbid0IGNyZWF0ZSBtZXRob2RzCgkgICAgdGhhdCB3b3VsZCBub3Qgc3BlY2lhbGl6ZSBhbnkgYXJndW1lbnRzOyBzaW1wbHkgcmUtZXhwb3J0CgkgICAgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMuICAoVGhpcyBpcyBhIHBlcmZvcm1hbmNlCgkgICAgb3B0aW1pemF0aW9uIHdoaWNoIHJlZHVjZXMgbG9hZCB0aW1lIGFuZCBleGVjdXRpb24gdGltZS4pCgoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGZpeCB0aGUgInRvbyBtYW55IGluaXRpYWxpemVycyIgZXJyb3IKCSAgICB3aGljaCB3YXMgY2F1c2VkIGJ5IGFuIGluY29tcGF0aWJsZSBzd2lnX3R5cGVfaW5mbyBsYXlvdXQuCgoJICAgIFtHdWlsZV0gVGhlIHR5cGVtYXAgZm9yIEZJTEUgKiBpbiBwb3J0cy5pIG5vdyBhbHNvIGFjY2VwdHMKCSAgICBhIHJlZ3VsYXIgRklMRSAqIHBvaW50ZXIgb2JqZWN0LiAgQWxzbyBhIGJ1ZyB3aXRoIFNjaGVtZQoJICAgIGZpbGUgcG9ydHMgdGhhdCBhcmUgb3BlbiBmb3IgaW5wdXQgYW5kIG91dHB1dCBoYXMgYmVlbgoJICAgIGZpeGVkLiAKCjA0LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZSBlbnRyeSAwMy8yMS8yMDA0IHJldm9rZWQuIFRoZSBjaGFuZ2UgaW50cm9kdWNlZCBhbm90aGVyCiAgICAgICAgICAgIGluY29uc2lzdGVuY3kgKHJlZmVyZW5jZSB0eXBlbWFwcyBiZWluZ3MgdXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXIgdHlwZW1hcHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgYXMgd2VsbCBhcyBzdGF0aWMKICAgICAgICAgICAgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBmb3Igc29tZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGJ1dCBvbmx5IGZvciBDKysgYW5kIG5vdCBDKS4gVGhpcyB3b3VsZCBicmVhayB1c2VyJ3MgY3VycmVudAogICAgICAgICAgICB0eXBlbWFwcyBhbmQgaW50cm9kdWNlIGZ1cnRoZXIgaW5jb25zaXN0ZW5jaWVzLiBBbHRlcm5hdGl2ZQogICAgICAgICAgICBzb2x1dGlvbiByZXF1aXJlZCBhbmQgYmVpbmcgZGlzY3Vzc2VkLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBBZGRlZCB0aGUgLWRpcmVjdG9ycyBmbGFnLiBUaGlzIGVuYWJsZXMgdGhlIGRpcmVjdG9yCgkgICAgbW9kZSBmb3IgdGhlIGludGVyZmFjZSBhbmQgYWxsIHRoZSBjbGFzc2VzIHRoYXQKCSAgICBkb24ndCBzZXQgdGhlICJmZWF0dXJlOm5vZGlyZWN0b3IiIGV4cGxpY2l0bHkuCgoJICAgIFlvdSBjYW4gdXNlIHRoaXMgaW4geW91ciBtb2R1bGUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQoJICAgIGRpcmVjdG9yIGZlYXR1cmUgaW4gYWxsIHlvdXIgY2xhc3NlcywgYnV0IGl0IGlzIG1vc3QKCSAgICBpbnRlbmRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcywgbGlrZToKCgkgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCgkgICAgVGhlc2UgY29tbWFuZHMgd2lsbCBydW4gdGhlIGVudGlyZSB0ZXN0LXN1aXRlIHVzaW5nCgkgICAgZGlyZWN0b3JzLCBhbmQgbm90IG9ubHkgdGhlIHNwZWNpZmljICdkaXJlY3RvcnNfKicKCSAgICBjYXNlcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRpbWUgdG8gdGltZS4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3Igc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90LAoJICAgIGZvciBjb21waWxlciBhbmQgcHl0aG9uIHZlcnNpb25zIHRoYXQgc3VwcG9ydCB0aGVtLgoJICAgIAoJICAgIFdoZW4gbmVlZGVkLCB1c2UgCgoJICAgICAlaW5sY3VkZSBzdGRfc3RyaW5nLmkgICAgICAvLyAnY2hhcicgc3RyaW5ncwoJICAgICAlaW5sY3VkZSBzdGRfd3N0cmluZy5pICAgICAvLyAnd2NoYXJfdDsgc3RyaW5ncwoJICAgIAoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBGaXggdGhlIGRlZmF1bHQgYmVoYXZpb3VyIChzZWcuIGZhdWx0KSB3aGVuIGFuCgkgICAgaW5wbGFjZSBvcGVyYXRvciAoKz0sLT0sLi4uKSB3YXMgd3JhcHBlZCwgYXMgcmVwb3J0ZWQgYnkKCSAgICBMdWNyaXogKGx1Y3JpekBzaXRpbGFuZGlhLml0KSwgd2hlbiB0aGUgbW9zdCBjb21tb24KCSAgICBmb3JtIHdhcyB1c2VkOgoKICAgICAgICAgICAgICAgICAgIEEmICBBOjpvcGVyYXRvcis9KGludCBpKSB7IC4uLjsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgICAgICAgICAgIF5eXl4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KCSAgICAKCgkgICAgaWUsIGFuIG9iamVjdCBpcyByZXR1cm5lZCBhbmQgaXRzIGNvbnRhaW5zIHRoZSBzYW1lICd0aGlzJwoJICAgIHZhbHVlIHRoYW4gdGhlIGlucHV0IG9iamVjdCwgd2hpY2ggaXMgZGVsZXRlZCBhZnRlciB0aGUKCSAgICBvcGVyYXRpb24gImEgKz0gYiIsIGxlYXZpbmcgdGhlIHJlc3VsdCB3aXRoIG5vIHJlYWwKCSAgICBvYmplY3QsIGJ1dCBhIHNlZy4gZmF1bHQuCgoJICAgIFRvIGZpeCBpdCwgd2UgbmVlZGVkIHRvIGludHJvZHVjZSBhIG5ldyBmZWF0dXJlIGFuZCB1c2UgYW4KCSAgICBvbGQgb25lOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIpIEE6Om9wZXJhdG9yKz07CgkgICAgCgkgICAgaGVyZSwgInNlbGY6ZGlzb3duIiBkaXNhYmxlIHRoZSBvd25lcnNoaXAgb2YgdGhlICdzZWxmJwoJICAgIG9yIGlucHV0IG9iamVjdCwgYW5kIHRoZSAibmV3IiBmZWF0dXJlIHRyYW5zZmVycyB0aGUKCSAgICBvd25lcnNoaXAgdG8gdGhlIHJlc3VsdCBvYmplY3QuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUvc29sdXRpb24gY291bGQgYWxzbyBiZSB1c2VkIGluIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgdXNlIGdjIGFuZCBpbXBsZW1lbnQgdGhlIGlucGxhY2Ugb3BlcmF0b3JzLCBvciBvdGhlcgoJICAgIG9wZXJhdG9ycywgaW4gYSBzaW1pbGFyIHdheS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQeXRob24gTU9EVUxFICoqKgoKCSAgICBJZiB5b3UgYWxyZWFkeSBhcmUgdXNpbmcgdGhlIGlucGxhY2Ugb3BlcmF0b3JzIGluIHB5dGhvbiwKCSAgICBhbmQgeW91IGltcGxlbWVudGVkIHNvbWUga2luZCBvZiB3b3JrYXJvdW5kIHRvIHRoZSBwcm9ibGVtCgkgICAgZml4ZWQgaGVyZSwgaXQgaXMgcG9zc2libGUgeW91IGNvdWxkIGVuZCB3aXRoICdmcmVlJwoJICAgIG9iamVjdHMgdGhhdCBuZXZlciBnZXQgZGVsZXRlZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgYW5kCgkgICAgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBmaXgsIHVzZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIsIiIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciLCIiKSBBOjpvcGVyYXRvcis9OwoKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEMrKyBlbnVtcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgaW50ZWdlcnMsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IAogICAgICAgICAgICBDIyBlbnVtcy4gRm9yIEV4YW1wbGUsIGdpdmVuIEMrKzoKCiAgICAgICAgICAgICAgICBlbnVtIEFuRW51bSB7IGZvbywgYmFyIH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIEFuRW51bSBBbkVudW1lcmF0aW9uOwogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bWVyYXRpb24gZik7CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgZW51bSBBbkVudW0gewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtIGYpIHsuLi59CgogICAgICAgICAgICBOb3RlIHRoYXQgYSBnbG9iYWwgZW51bSBsaWtlIEFuRW51bSBhYm92ZSBpcyBnZW5lcmF0ZWQgaW50byBpdHMgb3duCiAgICAgICAgICAgIGZpbGUgY2FsbGVkIEFuRW51bS5jcy4gRW51bXMgZGVmaW5lZCB3aXRoaW4gYSBDKysgY2xhc3MgYXJlIGRlZmluZWQKICAgICAgICAgICAgd2l0aGluIHRoZSBDIyBwcm94eSBjbGFzcy4gU29tZSBvZiB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZyBDIyBwcm94eQogICAgICAgICAgICBjbGFzc2VzIGFsc28gd29yayBmb3IgZW51bXMuIEZvciBleGFtcGxlIGdsb2JhbCBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbXBvcnRzKSB0byBhZGQgaW4gZXh0cmEgdXNpbmcgc3RhdGVtZW50cy4KCiAgICAgICAgICAgIEdsb2JhbCBlbnVtcyBhbmQgY2xhc3MgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIHRvIG1ha2UgdGhlIGVudW0gcHJpdmF0ZSwgcHVibGljIGV0Yy4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGVudW0gdHlwZSAoZW51bSBiYXNlKQoKICAgICAgICAgICAgSWYgd2UgYWRkIHRoaXMgZm9yIHRoZSBhYm92ZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIEFuRW51bSAicHJvdGVjdGVkIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSBBbkVudW0gImxvbmciCgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZW51bSBBbkVudW0gOiBsb25nIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZW1wdHkgZW51bXMsIGxpa2UKICAgICAgICAgICAgICAgIGVudW0gRm9vIHt9OwoKMDMvMjEvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtOb3RlOiB0aGlzIGNoYW5nZSByZXZva2VkIG9uIDA0LzI1LzIwMDRdCgkgICAgW1B5dGhvbl0gTWFrZXMgdGhlIGZvbGxvd2luZyAndmFyJyBjYXNlcyBtb3JlIHVuaWZvcm06CgogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2E7CiAKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHNhOwogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgbm93IHRoZSB0aHJlZSB2YXJpYWJsZXMgKGdhLCBzYSwgbWEpIGNhbiBiZSBhc3NpZ25lZCBhczoKCgogICAgICAgICAgICAgICAgICBjdmFyLmdhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgQS5zYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIGEubWEgPSAiaGVsbG8iOwoKICAgICAgICAgICAgaWUsIG5vdyAnbWEnIHdpbGwgYWxzbyB1c2UgYSBzdGQ6OnN0cmluZyB0eXBlbWFwICdpbicgaWYKICAgICAgICAgICAgZGVmaW5lZCwgYmVmb3JlIGl0IHdhcyBvbmx5IGFjY2VwdGluZyBhICdwX3N0ZF9zdHJpbmcnCiAgICAgICAgICAgIHBvaW50ZXIuICBOb3RlLCBob3dldmVyLCB0aGF0ICdtYScgd2lsbCBub3QgdXNlIHRoZQogICAgICAgICAgICAndmFyaW4vdmFyb3V0JyB0eXBlbWFwcyAodGhhdCBwcm9iYWJseSBjb3VsZCBiZSBtb3JlCiAgICAgICAgICAgIG5hdHVyYWwpLCBidXQgaXQgd2lsbCBwaWNrIHVwIHRoZSAnaW4nIHR5cGVtYXAgZm9yIGNvbnN0CiAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiAod2hpY2ggaXMgZWFzaWVyKS4KCgkgICAgVGhlIGNoYW5nZXMgaW4gY3dyYXAuYyBhbmQgbGFuZy5jeHggd2lsbCBwcm9iYWJseSBmaXggdGhlCgkgICAgYmVoYXZpb3VyIGluIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBvdmVybG9hZCB0aGUKCSAgICBtZW1iZXJ2YXJIYW5kbGVyIG1ldGhvZCAidG9vIG11Y2giLgogCiAgICAgICAgICAgIAowMy8yMS8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBEaXNhYmxpbmcgdGhlIGRlZmF1bHQgaW5zdGFudGlhdGlvbnMgbGlrZToKCgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8aW50LGludD47CgogICAgICAgICAgICBmb3IgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIFNUTCBjb250YWluZXJzL2NsYXNzZXMuCgkgICAgVGhleSBhcmUgZXhwZW5zaXZlLCBzcGVjaWFsbHkgZm9yIHBhaXIgYW5kIG1hcCwgYW5kIHRoZQoJICAgIHByZXZpb3VzIGJlaGF2aW91ciBhbHNvIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHBlcmZvcm0KCSAgICBtYW51YWwgaW5zdGFudGlhdGlvbnMuIFN0aWxsLCBpZiB0aGUgc3BlZWQgZGlmZmVyZW5jZSBpcwoJICAgIG5vdCBpbXBvcnRhbnQsIGl0IGNhbiBiZSByZS1lbmFibGVkIGJ5IGRlZmluaW5nIHRoZSBtYWNybwoJICAgIFNXSUdfU1REX0RFRkFVTFRfSU5TVEFOVElBVElPTiAoc2VlIHN0ZF9jb21tb24uaSkuCgoJICAgIEFsc28sIG5vcm1hbGl6aW5nIHRoZSBJTlBVVC9PVVRQVVQvSU5PVVQgdHlwZW1hcHMuIE5vdwoJICAgIHRoZXkgdXNlIHRoZSBzYW1lIGNvbnZlcnNvcnMgdGhhbiB0aGUgcmVzdCBvZiB0aGUKCSAgICB0eXBlbWFwcywgYW5kIHlvdSBjYW4gdXNlIHRoZW0gZm9yIHN0ZDo6cGFpciwgc3RkOjpzdHJpbmcKCSAgICBhbmQgYWxsIHRoZSBvdGhlciBTVEwgdHlwZXMsIGxpa2UgaW46CgoJICAgICAgdm9pZCBwX2lub3V0ZChzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ICpJTk9VVCk7CgoJICAgIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBhbmQgaW1wbGljaXQuaSBmaWxlcyB3aXRoIG1hY3JvcyB0bwoJICAgIHRyYW5zZm9ybSBmdW5jdGlvbnMgcGFpcnMgbGlrZSAnc2V0X3gnLydnZXRfeCcgCgkgICAgKG9yICdUJiB4KCknLydjb25zdCBUJiB4KCkgY29uc3QnKSBpbnRvIGFuIGF0dHJpYnV0ZSwKCSAgICBhbmQgYWxsb3dpbmcgdGhlIHVzZSBvZiBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgaW4gdHlwZW1hcHMKCSAgICAoc2VlIHRoZSBmaWxlcyBmb3IgbW9yZSBkZXRhaWxzKS4KCjAzLzIxLzIwMDQ6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIG9mIGZ1bmN0aW9ucyB3aXRoCgkgICAgYW5vbnltb3VzIGFyZ3VtZW50cy4KCjAzLzE4LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIE1vcmUgZ2VuZXJhbCBzdGRfc3RyaW5nLmkgaW50ZXJmYWNlLgoJICAgIE5vdyB5b3UgY2FuIHdyYXAgaXQgdXNpbmcKCgkgICAgICAldGVtcGxhdGUoc3RyaW5nKSBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjsKCiAgICAgICAgICAgIGFuZCB1c2UgdGhlIHN0ZDo6c3RyaW5nIGFzIGEgYmFzZSBjbGFzczoKCgkgICAgICBzdHJ1Y3QgQSA6IHN0ZDo6c3RyaW5nIHsKICAgICAgICAgICAgICB9OwoKCSAgICBCdXQgbW9yZSBpbXBvcnRhbnQsIHN3aWcgd2lsbCByZWNvZ25pemUgCgkgICAgYm90aCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPiBhbmQgc3RkOjpzdHJpbmcgYXMKCSAgICB0aGUgc2FtZSB0eXBlLgoKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgUHJldmlvdXNseSBhZGRlZCwgYnV0IG5vdCBtZW50aW9uZWQgYmVmb3JlOgoKCSAgICAtIGZyaWVuZCBkZWNsYXJhdGlvbiBzdXBwb3J0LCBzd2lnIG5vdyBlbWl0cyBhIGdsb2JhbAoJICAgICAgZnVuY3Rpb24gaW4gdGhlIHNhbWUgY2xhc3Mgc2NvcGUuCgoJICAgIC0gcmVmL3VucmVmIGZlYXR1cmVzOiB0byBtaXggcmVmIGNvdW50aW5nIEMrKyBjbGFzc2VzCgkgICAgICBhbmQgbmF0aXZlIHNjcmlwdCByZWYgY291bnRpbmcgbWVjaGFuaXNtcyAobGlrZSBpbiBweXRob24pLgoJICAgIAoJICAgICAgVXNlIGl0IGxpa2U6CgogCSAgICAgICAgJWZlYXR1cmUoInJlZiIpICAgUkNPYmogIiR0aGlzLT5yZWYoKTsiCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgidW5yZWYiKSBSQ09iaiAiJHRoaXMtPnVucmVmKCk7IgoKCSAgICAgIEFuZCB0aGUgY2xhc3MgUkNPYmosIGFuZCBhbGwgdGhlIGRlcml2ZWQgb25lcywgd2lsbAoJICAgICAgcGVyZm9ybSB0aGUgcmlnaHQgcmVmL3VucmVmIGNhbGxzIHdoZW4gYSBuZXcgcG9pbnRlciAgCgkgICAgICBpcyByZXR1cm5lZCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBvciB3aGVuIHRoZSB0YXJnZXQKCSAgICAgIGxhbmd1YWdlIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgoJICAgICAgCgkgICAgICBTZWUgdGhlIHJlZmNvdW50LmkgZmlsZSBpbiB0aGUgdGVzdC1zdWl0ZSBmb3IgbW9yZQoJICAgICAgZGV0YWlscy4KCgkgICAgCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIFVzaW5nIHRoZSBuZXcgJWZyYWdtZW50IHN1cHBvcnQsIG1ham9yIHJld3JvdGUgCgkgICAgb2YgdGhlIHB5dGhvbiBzd2lnIGxpYnJhcnksIGluY2x1ZGluZzoKCgkgICAgLSBBbG1vc3QgYXV0b21hdGljIHRlbXBsYXRlL3R5cGVtYXAgaW5zdGFudGlhdGlvbiBmb3IKCSAgICAgIHRoZSBTVEwgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIG5vdyB5b3UgY2FuIHdyaXRlOgoKCQkgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgIGFuZCBhIHNwZWNpYWxpemVkIHZlY3Rvcl9pIGNsYXNzIGlzIGVtaXR0ZWQgd2l0aCBhbGwKCSAgICAgIHRoZSBuZWVkZWQgdHlwZW1hcHMuIE5vIG5lZWQgdG8gdXNlIHRoZSBvbGQKCSAgICAgICdzcGVjaWFsaXplX3ZlY3RvcicgbWFjcm9zLgoKCSAgICAgIE5vdGUgeW91IGNhbiBhbHNvIGRlZmluZQoKCSAgICAgICAgICAldGVtcGxhdGUobWF0cml4X2kpICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+OwoJICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfcGlpKSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LGludD4gPjsKCgkgICAgLSBUaGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKIAkgCiAgICAgICAgICAgCSAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICBkZWZpbmVzIHRoZSB2ZWN0b3IgdHlwZW1hcHMsIGJ1dCBubyBwcm94eSBjbGFzcy4gRm9yIGFsbCB0aGUKICAgICAgICAgICAgICBmdW5kYW1lbnRhbCB0eXBlcywgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gYXJlCiAgICAgICAgICAgICAgZGVmaW5lZCwgc28sIHlvdSBjYW4gc2F5CgoJICAgICAgJWluY2x1ZGUgc3RkX3ZlY3RvcgoKCSAgICAgIGludCBmdW5jKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGEpOwoJICAgICAgCgkgICAgICB3aGVyZSB0aGUgcHJvcGVyIHR5cGVtYXAgaXMgYXBwbGllZCB0byAnYScsIGJ1dCBubwoJICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcm94eSBpcyBnZW5lcmF0ZWQuCgkgICAgICAKCiAgICAgICAgICAgIC0gQWxsIHRoZSBTVEwgY29udGFpbmVycyBwcmVzZW50IGEgbW9yZSB1bmlmb3JtIGJlaGF2aW9yIGFuZAoJICAgICAgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIFRoZSBmb2xsb3dpbmcgYXJlIAoJICAgICAgbm93IHN1cHBvcnRlZDoKCgkJICBzdGQ6OnZlY3RvcjxUPgoJCSAgc3RkOjpsaXN0PFQ+CgkJICBzdGQ6OmRlcXVlPFQ+CgkJICBzdGQ6OnNldDxUPgoJCSAgc3RkOjptdWx0aXNldDxUPgoJCSAgc3RkOjptYXA8VD4KCQkgIHN0ZDo6bXVsdGltYXA8VD4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBub3QgYSBjb250YWluZXIsIGJ1dCBhbHNvIHN1cHBvcnRlZDoKCgkJICBzdGQ6OnBhaXI8VCxVPgoKICAgICAgICAgICAgICBhbHNvLCBtb3JlIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGZvciBhbGwgb2YgdGhlbSwKCSAgICAgIGluY2x1ZGluZyB2YXJpbiwgdmFyb3V0LCB0eXBlY2hlY2ssIGV0Yy4KCiAgICAgICAgICAgIC0gSW5pdGlhbCBhdHRlbXB0IHRvIGltcGxlbWVudCB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgICBjb25zaWRlcmluZyBhbGxvY2F0b3JzLCBpZToKCgkgICAgICAgICAgc3RkOjp2ZWN0b3I8VCxBPgkJCQoKCSAgICAgIGl0IGlzIHBhcnRpYWxseSB3b3JraW5nLCBidXQgaXQgaXMganVzdCBhIHdvcmthcm91bmQKCSAgICAgIHdoaWxlIHN3aWcgaW1wcm92ZXMgaXRzIHRlbXBsYXRlIHR5cGUgc3VwcG9ydC4KCSAgICAgIAoJICAgICAgCgkgICAgIFBsZWFzZSB0ZXN0IHdpdGggeW91ciBwYXJ0aWN1bGFyIHNldHVwLiBJdCBzZWVtcyB0byBiZQoJICAgICB3b3JraW5nIHdpdGggZysrIDMuMi4yLCBnKysgMi45NiwgSW50ZWwgaWNjIGFuZCBTR0kgQ0MKCSAgICAgY29tcGlsZXJzLCBwbHVzIHB5dGhvbiAxLjUuMiwgMi4wIGFuZCAyLjMsIGJ1dCBzaW5jZQoJICAgICB3ZSBhcmUgdXNpbmcgdGVtcGxhdGVzLCB0aGVyZSBpcyBhIGNoYW5jZSB5b3UgY2FuIGZpbmQKCSAgICAgc29tZSBwcm9ibGVtcyB3aGVuIHVzaW5nIHdpdGggYW4gb2xkIEMrKyBjb21waWxlci4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoKICAgICAgICAgICAgLSBBbGxvd2luZyB0aGUgZW1wdHkgJXRlbXBsYXRlIGRpcmVjdGl2ZSwgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIHRvIHByb2Nlc3MgdGhlIGNsYXNzICJ0eXBlZGVmInMgYW5kICJ0eXBlbWFwInMuIEJlZm9yZQoJICAgICAgb25seSB0aGUgaW50ZXJuYWwgInR5cGVkZWYicyB3ZXJlIHByb2Nlc3NlZC4KCiAgICAgICAgICAgICAgVGhpcyBtYWtlcyBwb3NzaWJsZSB0byBlbWl0IHRoZSBkZWZhdWx0IGluL291dAogICAgICAgICAgICAgIHR5cGVtYXBzIHdpdGhvdXQgdGhlIG5lZWQgb2Ygd3JhcHBpbmcgYW4gc3BlY2lhbGl6ZWQKICAgICAgICAgICAgICB2ZWN0b3IgaW5zdGFuY2UuCgoJICAgIC0gQWRkaW5nIHRoZSBwcmVwcm9jZXNzb3IgZXh0ZW5zaW9uICNAIHdoaWNoIG1hbmdsZXMgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIG1hY3JvIGFyZ3VtZW50LCBsaWtlIGluOgoKICAgICAgICAgICAgICAgICNkZWZpbmUgbWFjcm8oWCkgICNAWAogICAgICAgICAgICAgICAgbWFjcm8oaW50KSAgICAgICAgIC0+IGludAogICAgICAgICAgICAgICAgbWFjcm8oc3RkOjpzdHJpbmcpIC0+IHN0ZF9zX3Nfc3RyaW5nCiAgICAgICAgICAgICAgICAKCSAgICAtIEZyYWdtZW50cyBjYW4gbm93IGJlICJ0eXBlIHNwZWNpYWxpemVkIiwgYXMgdGhlIHR5cGVtYXBzLiBUaGUKCSAgICAgIHN5bnRheCBpcyBhcyBmb2xsb3dzCiAKICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIsImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIGEgdHlwZSBpbmRlcGVuZGVudCBmcmFnbWVudCAob2xkIHN5bnRheCkgKi8gfQogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiB7VHlwZX0sICJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiB0aGUgZnJhZ21lbnQgaXMgdHlwZSBkZXBlbmRlbnQgKi99CiAKICAgICAgICAgICAgICBOb3cgZnJhZ21lbnRzIGNhbiBhbHNvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlczogCgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAlZnJhZ21lbnQoImluY29kZSJ7QTxUPn0sImhlYWRlciIpIHsKCQkgICAgICAvKiAnaW5jb2RlJyBzcGVjaWFsaXplZCBmcmFnbWVudCAqLwoJCSAgIH0KIAoJCSAgICV0eXBlbWFwKGluLGZyYWdtZW50PSJpbmNvZGUie0E8VD59KSB7CgkJICAgICAgLyoKCQkgICAgICAgICBoZXJlIHdlIHVzZSB0aGUgJ3R5cGUgc3BlY2lhbGl6ZWQnIAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgImluY29kZSJ7QTxUPn0KICAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIH0KICAgICAgICAgICAgICAgIH07CgkJCSAgICAgCQoKMDMvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBidWcgd2hpY2ggbWVhbnQgdGhhdCBzb21lIHZpcnR1YWwgZnVuY3Rpb25zIG92ZXJyaWRkZW4gaW4KICAgICAgICAgICAgSmF2YSB3ZXJlIG5vdCBiZWluZyBjYWxsZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gQnVnIHJlcG9ydGVkIGFuZCBmaXhlZAogICAgICAgICAgICBieSBSb2JlcnQgZGUgVnJpZXMgYW5kIFNjb3R0IE1pY2hlbC4KCjAzLzAyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSB0eXBlIG9mIHN0cmluZyBhcmd1bWVudHMuCgowMi8yNC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1uYW1lc3BhY2UgPG5hbWU+LiBUaGlzIGFsbG93cyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICBhIEMjIG5hbWVzcGFjZSBpbnRvIHdoaWNoIGFsbCBDIyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQuCgowMi8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpIAoJICAgIFtNelNjaGVtZV0gVXNlIEZVTkNfTkFNRSByYXRoZXIgdGhhbiBhIGJvZ3VzIHR5cGVtYXAgdmFyaWFibGUgZm9yIHNpZ25hbGxpbmcKCSAgICBlcnJvcnMuICBDYWxsIHNjaGVtZV93cm9uZ190eXBlIHdpdGggYSB6ZXJvLWJhc2VkIGFyZ3VtZW50IG51bWJlci4gIAoJICAgIFJlcG9ydGVkIGJ5IE9uZHJlaiBQYWNvdnNreSwgU0YgIzkwMjYyMS4KCgkgICAgW0d1aWxlXSBEZWZpbmUgRlVOQ19OQU1FIGFsc28gaW4gdGhlIGRpc3BhdGNoIHdyYXBwZXIgZm9yIG92ZXJsb2FkZWQKCSAgICBmdW5jdGlvbnMuICBQYXRjaCBieSBKb2huIExlbnosIFNGICM4OTYyNTUuCgowMi8yMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IHRyeSB0byBpbnZva2UgYSBudWxsIGRlc3RydWN0b3IgZnVuY3Rpb24uCgowMi8yMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgc28gdGhhdCB0aGUgU1dJRyBzb3VyY2Ugd2lsbCBjb21waWxlIHVzaW5nIHRoZSBEaWdpdGFsIE1hcnMgQ29tcGlsZXIKICAgICAgICAgICAgKGZvcm1lcmx5IFN5bWFudGljIGNvbXBpbGVyKSBvbiBXaW5kb3dzLiBTdWJtaXR0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMDIvMTMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gTmV3IGNvbW1hbmQtbGluZSBhcmd1bWVudCAtbm9pbml0LiAgVXNlIGl0IGZvciBidWlsZGluZwoJICAgIHRoZSBydW50aW1lIGxpYnJhcnksIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbnMKCSAgICBzY2hlbWVfaW5pdGlhbGl6ZSBldGMuICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTE3NTQuCgoJICAgIFtNelNjaGVtZV0gRG9uJ3QgcHJvZHVjZSBpbnZhbGlkIEMgY29kZSB3aGVuIGludm9rZWQgd2l0aCB0aGUKCSAgICAtZGVjbGFyZW1vZHVsZSBvcHRpb24uICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTExMDguCgkgICAgCgkgICAgW0d1aWxlXSBCdWlsZCB0aGUgcnVudGltZSBsaWJyYXJ5IHdpdGggcGFzc2l2ZSBsaW5rYWdlLCB0byByZW5hbWUKCSAgICB0aGUgU1dJR19pbml0IGZ1bmN0aW9uIHVuaXF1ZWx5LgoKMDIvMTIvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggc3VibWl0dGVkIGJ5IEJpbGwgSG9mZm1hbiB3aGljaCBwcmV2ZW50cyBTV0lHIGZyb20gY3Jhc2hpbmcKICAgICAgICAgICAgd2hlbiBhIGZpbGUgZm9yIHRoZSB0eXBld3JhcHBlciBjbGFzcyBjYW5ub3QgYmUgb3BlbmVkLgoKMDIvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gT3ZlcmxvYWRpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAtIE1ldGhvZHMgd2hpY2ggYXJlIG92ZXJsb2FkZWQgaW4gY29uc3Qgb25seSBubyBsb25nZXIgZ2VuZXJhdGUgSmF2YQogICAgICAgICAgICAgICAgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUgLSB0aGUgZmlyc3QgbWV0aG9kIHBhcnNlZCBpcyB1c2VkIGFuZCBhCiAgICAgICAgICAgICAgICB3YXJuaW5nIGlzIGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIHNsaWdodGx5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hpY2ggYWx3YXlzIHVzZXMgdGhlIG5vbi1jb25zdCBtZXRob2QuCiAgICAgICAgICAgICAgLSBXYXJuaW5nIG1lc3NhZ2VzIDUwOSBhbmQgNTEyIHJlcGxhY2VkIGJ5IG5ldyB3YXJuaW5nIG51bWJlciA1MTYsIHdoaWNoIAogICAgICAgICAgICAgICAgaXMgbW9yZSByZWxldmFudCB0byB0aGVzZSBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyBhcyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICAgICAgbWV0aG9kcyBhcmVuJ3QgJ3NoYWRvd2VkJywgdGhleSBhcmUgaWdub3JlZC4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlcGxhY2UgdGhlICJrbm93bl9jbGFzc2VzIiBoYXNoIHRhYmxlIGJ5IGEgbm9kZQoJICAgIGF0dHJpYnV0ZS4gIE1ldGhvZHMgb2YgY2xhc3NlcyBpbiBDKysgbmFtZXNwYWNlcyBub3cgZ2V0CgkgICAgdGhlIHByb3BlciBzcGVjaWFsaXplciBpbiB0aGUgR09PUFMgZGVjbGFyYXRpb24uCgkgICAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBVbmlxdWlmeSB0aGUgYXJndW1lbnQgbmFtZXMgaW4gR09PUFMgc2hhZG93IG1ldGhvZAoJICAgIGRlY2xhcmF0aW9ucy4gIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjEvMjAwNDogc3Vuc2hpbmUgKEVyaWMgU3Vuc2hpbmUpCiAgICAgICAgICAgIFJldml2ZWQgdGhlIE5leHRTdGVwIHBvcnQgb2YgU1dJRy4KCiAgICAgICAgICAgIEZpeGVkIGZhdGFsIHByb2JsZW0gaW4gRG9oU3Ryc3RyKCkgY2F1c2VkIGJ5IGRpZmZlcmVuY2UgaW4gc3Ryc3RyKCkKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFkZSAlYXBwbHkgYmVjb21lIGVudGlyZWx5IGR5c2Z1bmN0aW9uYWwuICBPbgogICAgICAgICAgICBOZXh0U3RlcCwgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0ZXMgdG8gTlVMTDsgd2hlcmVhcywgb24gbW9kZXJuCiAgICAgICAgICAgIHBsYXRmb3JtcywgaXQgZXZhbHVhdGVzIHRvICJmb28iLiAgJWFwcGx5IHJlbGllcyBleHRlbnNpdmVseSB1cG9uCiAgICAgICAgICAgIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGluZyB0byBub24tTlVMTCwgdGhlcmVmb3JlIGl0IGZhaWxlZAogICAgICAgICAgICBjYXRhc3Ryb3BoaWNhbGx5IHdoZW4gZmFjZWQgd2l0aCBOZXh0U3RlcCdzIHN0cnN0cigpLgoKICAgICAgICAgICAgQWRkZWQgYGJvb2wnIGNoZWNrIHRvIGNvbmZpZ3VyZS5pbiBzaW5jZSBOZXh0U3RlcCdzIEMrKyBjb21waWxlcgogICAgICAgICAgICBkb2VzIG5vdCBzdXBwbHkgdGhpcyB0eXBlLiAgc3dpZy5oIG5vdyBmYWtlcyB1cCBgYm9vbCcgaWYgbmVlZGVkLgoKICAgICAgICAgICAgV29ya2VkIGFyb3VuZCBOZXh0U3RlcCBDKysgY29tcGlsZXIgYnVnIGluIHdoaWNoIEMrKyBjb2RlIGlzCiAgICAgICAgICAgIGRpc2FsbG93ZWQgaW5zaWRlIGV4dGVybiAiQyIgZnVuY3Rpb25zLiAgVGhpcyBwcm9ibGVtIGFmZmVjdGVkIGFsbAogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLCBzaW5jZSB0aGV5IHB1Ymxpc2ggaG9vayBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgRml4ZWQgYnkgY3JlYXRpbmcgYSBDKysgd3JhcHBlcjoKICAgICAgICAgICAgICAgIHN0YXRpYyBMYW5ndWFnZSAqbmV3X3N3aWdfZm9vKCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXdfc3dpZ19mb28oKTsgfQoKICAgICAgICAgICAgRW5zdXJlZCB0aGF0IFN3aWdfY29weV9zdHJpbmcoKSBpcyB1c2VkIGluIHBsYWNlIG9mIHN0cmR1cCgpIHNpbmNlCiAgICAgICAgICAgIE5leHRTdGVwIGRvZXMgbm90IHN1cHBseSBzdHJkdXAoKS4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBSdWJ5IGxpYnJhcnkgbmFtZSBhbmQgbG9jYXRpb24gaW4gY29uZmlndXJlLmluLgogICAgICAgICAgICBQcm9ibGVtIDE6IEFzc3VtZWQgdGhhdCBsaWJyYXJ5IGFsd2F5cyByZXNpZGVkIGluIFJ1YnkncyAiYXJjaGRpciIsCiAgICAgICAgICAgIHdoaWNoIHdhcyBjb3JyZWN0IGZvciBSdWJ5IDEuNi54LCBidXQgd2hpY2ggaXMgaW5jb3JyZWN0IGZvciBSdWJ5CiAgICAgICAgICAgIDEuOC54LCBpbiB3aGljaCBjYXNlIHRoZSBsaWJyYXJ5IG5vcm1hbGx5IHJlc2lkZXMgaW4gUnVieSdzCiAgICAgICAgICAgICJsaWJkaXIiLiAgUHJvYmxlbSAyOiBBc3N1bWVkIHRoYXQgdGhlIGxpYnJhcnkgY291bGQgYWx3YXlzIGJlCiAgICAgICAgICAgIGxpbmtlZCB2aWEgIi1sIitSVUJZX0lOU1RBTExfTkFNRSAod2hlcmUgUlVCWV9JTlNUQUxMX05BTUUKICAgICAgICAgICAgdHlwaWNhbGx5IGlzICJydWJ5IiksIGhvd2V2ZXIgdGhpcyBmYWlsZWQgZm9yIHBsYXRmb3Jtcywgc3VjaCBhcwogICAgICAgICAgICBOZXh0U3RlcCwgd2hpY2ggZG8gbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIEluIHRoaXMgY2FzZSwgdGhlCiAgICAgICAgICAgIHN0YXRpYyBsaWJyYXJ5IG5hbWUgaW4gMS44LnggaXMgbGlicnVieS1zdGF0aWMuYSwgdGh1cwogICAgICAgICAgICAtbHJ1Ynktc3RhdGljIGlzIHJlcXVpcmVkLiAgVGhlIG5ldyBsb2dpYyB3b3JrcyBjb3JyZWN0bHkgZm9yCiAgICAgICAgICAgIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBmb3IgMS42LnggYW5kIDEuOC54LgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFBlcmwgQ0ZMQUdTIGluIGNvbmZpZ3VyZS5pbiBmb3IgTmV4dFN0ZXAuCiAgICAgICAgICAgIERldGVjdGlvbiBjb2RlIGV4dHJhY3RlZCBDRkxBR1MgZnJvbSBQZXJsJ3MgJUNvbmZpZyBoYXNoIGJ1dAogICAgICAgICAgICBuZWdsZWN0ZWQgdG8gYWRkIGEgbmV3bGluZSB0byB0aGUgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdGhyb3VnaAogICAgICAgICAgICBgc2VkJy4gIE5leHRTdGVwJ3MgYW5jaWVudCBgc2VkJyBkaXNjYXJkcyBpbnB1dCB3aGljaCBpcyBub3QKICAgICAgICAgICAgdGVybWluYXRlZCB3aXRoIGEgbmV3bGluZSwgdGh1cyBQZXJsIENGTEFHUyBhbHdheXMgZXZhbHVhdGVkIHRvIHRoZQogICAgICAgICAgICBlbXB0eSBzdHJpbmcuCgowMS8xNi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGlkeSB1cCBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQgd2hlbgogICAgICAgICAgICBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSB3cmFwcGVkIHdpdGggdGhlIHRocm93cyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIHJlZHVuZGFudCBjb2RlIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3c7IAogICAgICAgICAgICAgICAgfQoKMDEvMTIvMjAwNDogd3NmdWx0b24gb24gYmVoYWxmIG9mIG1tYXR1cyAobWFyY2VsbyBtYXR1cykgCiAgICAgICAgICAgIGlmIGEgbWV0aG9kIHVzZXMgJWV4Y2VwdGlvbiBhbmQgdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgdXNlCiAgICAgICAgICAgIG9mIHRoZSB0aHJvd3MgdHlwZW1hcCwgdGhlIGNvZGUgaW4gYSB0aHJvd3MgdHlwZW1hcCB3aWxsIGJlCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnNpZGUgdGhlIHRyeSBib2R5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBtZXRob2QgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIEV4Y2VwdCAlewogICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgY2xhc3MgRXhjZXB0IHt9OwogICAgICAgICAgICAgIHZvaWQgbWV0aG9kKGludCBpKSB0aHJvdyAoRXhjZXB0KTsKCiAgICAgICAgICAgIFdpbGwgZ2VuZXJhdGU6CgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdCAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgQXMgY2FuIGJlIHNlZW4sIHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sgaXMgZm9yIHRoZSB0aHJvd3MgdHlwZW1hcHMuCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHJldmVyc2VkIHNvIHRoYXQgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jawogICAgICAgICAgICB3YXMgdGhlICVleGNlcHRpb24gY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICBpbXBvc3NpYmxlIHRvIGNhdGNoIEV4Y2VwdCBhcyB0aGUgY2F0Y2ggYWxsICguLi4pIHdvdWxkIGNhdGNoIHRoZQogICAgICAgICAgICBleGNlcHRpb24gaW5zdGVhZC4KClZlcnNpb24gMS4zLjIxIChKYW51YXJ5IDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjAxLzEwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgYm90aCB3YXJuaW5ncyBhbmQgZXJyb3JzIGNhbiBiZSBzZWxlY3RlZCBmb3IKICAgICAgICAgICAgaW50ZWdyYXRpb24gd2l0aCB5b3VyIGZhdm91cml0ZSBJREUvZWRpdG9yLiBFZGl0b3JzIGFuZCBJREVzIGNhbiB1c3VhbGx5CiAgICAgICAgICAgIHBhcnNlIGVycm9yIG1lc3NhZ2VzIGFuZCBpZiBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IHdpbGwgZWFzaWx5IHRha2UgeW91IAogICAgICAgICAgICBkaXJlY3RseSB0byB0aGUgc291cmNlIG9mIHRoZSBlcnJvci4gVGhlIHN0YW5kYXJkIGZvcm1hdCBpcyB1c2VkIGJ5IAogICAgICAgICAgICBkZWZhdWx0IGV4Y2VwdCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBNaWNyb3NvZnQgZm9ybWF0IGlzIHVzZWQgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1Gc3RhbmRhcmQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmk6NDogU3ludGF4IGVycm9yIGluIGlucHV0LgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZtaWNyb3NvZnQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmkoNCk6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NzE5MDkgXSBzaW1wbGUgbmFtZXNwYWNlIHByb2JsZW0uCiAgICAgICAgICAgIFRoaXMgd2FzIGEgcHJvYmxlbSB1c2luZyBhbm9ueW1vdXMgc3RydWN0dXJlcyBpbiBhIG5hbWVzcGFjZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0ICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKICAgICAgICAgICAgICAgICAgIH0gUzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBicm9rZW4gUGVybCBleGFtcGxlcy4KCjEyLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSBhbmQgQyNdIEZpeGVzIGZvciB3cmFwcGluZyBjb3ZhcmlhbnQgKHBvbHltb3JwaGljKSByZXR1cm4gdHlwZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFzZSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIEJhc2UqIGNvcHkoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBEZXJpdmVkKiBjb3B5KCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIERlcml2ZWQ6OmNvcHkgcHJveHkgbWV0aG9kIHJldHVybnMgQmFzZSBub3QgRGVyaXZlZC4gQSB3YXJuaW5nIGlzIGlzc3VlZAogICAgICAgICAgICBhYm91dCB0aGlzLiBQcmV2aW91c2x5IHRoZSBwb2ludGVyIHVzZWQgYnkgdGhlIHByb3h5IGNsYXNzIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICB0cmVhdGVkIGFzIGEgQmFzZSogaW5zdGVhZCBvZiBhIERlcml2ZWQqLgoKMTIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IFdpbmRvd3MgcGF0aHMgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHkgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICAgICAgICAgICBBbiBlcnJvciBwcmV2aW91c2x5IHdvdWxkIGhhdmUgYmVlbiBzaG93biBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgLj94YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKICAgICAgICAgICAgaW5zdGVhZCBvZjoKCiAgICAgICAgICAgICAgLlxleGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCgpWZXJzaW9uIDEuMy4yMCAoRGVjZW1iZXIgMTcsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTGFzdCBtaW51dGUgbW9kaWZpY2F0aW9ucy4gICBQZXJsNSBtb2R1bGUgbm93IGdlbmVyYXRlcyBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgICBieSBkZWZhdWx0IGxpa2UgYWxsIG9mIHRoZSBvdGhlciBtb2R1bGVzLiAgUEhQNCB3cmFwcGVycyBubyBsb25nZXIKICAgICAgICAgICAgaW5jbHVkZSAiY29uZmlnLmgiLiAKCjEyLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgV2Vha2VuZWQgd2FybmluZyBtZXNzYWdlIHJlbGF0ZWQgdG8gY29uc3RydWN0b3IgbmFtZXMgc28gdGhhdCBhbgogICAgICAgICAgICB1bnVzdWFsIG5lc3RlZC1jbGFzcyB3cmFwcGluZyB0ZWNobmlxdWUgd291bGQgd29yayBhZ2FpbiAoYXBwYXJlbnRseQogICAgICAgICAgICBpdCB3b3JrZWQgaW4gc29tZSBvbGRlciBTV0lHIHJlbGVhc2VzKS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQjsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQSB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NCIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6ICBUaGVyZSBpcyBzdGlsbCBzb21lIG9kZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTV0lHIHN5bWJvbAogICAgICAgICAgICB0YWJsZS90eXBlIHN5c3RlbSB0aGF0IHdpbGwgbmVlZCB0byBiZSBsb29rZWQgYXQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR3VzdGF2byBOaWVtZXllci4KCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3RlY3RlZCBjbGFzcyBtZXRob2RzIGFyZSB3cmFwcGVkIGFzIHByb3RlY3RlZCBKYXZhIG1ldGhvZHMgCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdGhlIGRpcnByb3QgZGlyZWN0b3IgZmVhdHVyZS4gVGhpcyBjYW4gYmUgY2hhbmdlZCB1c2luZwogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyB0byBzb21ldGhpbmcgZWxzZSBzaG91bGQgdGhlIG5lZWQgYXJpc2UsIGZvcgogICAgICAgICAgICBleGFtcGxlLCBwcml2YXRlIG9yIHBhY2thZ2UgYWNjZXNzLgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIChKYXZhKSBhbmQgJWNzbWV0aG9kbW9kaWZpZXJzIChDIykgb3BlcmF0ZSBzbGlnaHRseSAKICAgICAgICAgICAgZGlmZmVyZW50bHkuIFByZXZpb3VzbHkgdGhpcyBmZWF0dXJlIGhhZCB0byBiZSBwcmVzZW50IHRvIHNldCB0aGUgbWV0aG9kCiAgICAgICAgICAgIG1vZGlmaWVycy4gTm93IGl0IGlzIG9ubHkgdXNlZCBpZiBpdCBleGlzdHMgZm9yIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgInB1YmxpYyIgYXMgcHJldmlvdXMgaG93ZXZlciwgd2hlbiB3cmFwcGluZyBwcm90ZWN0ZWQKICAgICAgICAgICAgZGlyZWN0b3IgbWV0aG9kcyBpdCBpcyAicHJvdGVjdGVkIi4gVGhpcyBjaGFuZ2Ugd2lsbCBub3QgYWZmZWN0IGV4aXN0aW5nCiAgICAgICAgICAgIHVzZSBvZiB0aGUgJWphdmFtZXRob2Rtb2RpZmllcnMgb3IgJWNzbWV0aG9kbW9kaWZpZXJzLgoKMTIvMTEvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGlzIGZpeCBzb21lIHJlY3VycmluZyByZXBvcnRzIGFib3V0IGtleXdvcmRzIG5vdCBiZWVuCgkgICAgcHJvcGVybHkgaWRlbnRpZmllZCBhbmQgd2FybmVkLCBhbmQgaXQgc29sdmVzIHRoZSBwcm9ibGVtCgkgICAgb2YgaG93IHRvIGFkZCBhIHRlc3QgZmlsZSB0byB0aGUgdGVzdC1zdWl0ZSBzdWNoIHRoYXQgaXQKCSAgICBkb2Vzbid0IHVzZSBhbnkga2V5d29yZCBvZiBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMKCSAgICAoYW5kIGRvaW5nIGl0IHdpdGhvdXQgY29tcGlsaW5nIHRoZSB0ZXN0IGZvciBhbGwgdGhlCgkgICAgc3VwcG9ydGVkIGxhbmd1YWdlcywgdGhpbmcgdGhhdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLAoJICAgIGFuZCB3aXRob3V0IHJlcXVpcmluZyB5b3UgdG8ga25vdyBhbGwgdGhlIHN1cHBvcnRlZAoJICAgIGxhbmd1YWdlIGtleXdvcmRzLCB0aGluZyB0aGF0IGlzIGFsd2F5cyBpbXBvc3NpYmxlKS4KCgkgICAgU28gdGhlc2UgYXJlIHRoZSBjaGFuZ2VzIGdsb2JhbGx5IHNwZWFraW5nOgoKCSAgICAtIFVuaWZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIGtleXdvcmQgd2FybmluZ3MgdGhyb3VnaAoJICAgICAgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IGFsbCB0aGUgbGFuZ3VhZ2VzIGhhcyBub3cgYQoJICAgICAgc2VwYXJhdGUgZmlsZSB0aGF0IGRlZmluZXMgdGhlIGtleXdvcmRzIG9yIGJhZCBuYW1lczoKCgkJICBweXRob24vcHl0aG9ua3cuc3dnCgkJICBjaGlja2VuL2NoaWNrZW5rdy5zd2cKICAgICAgICAgICAgICAgICAgLi4uLgoKCSAgICAtIEFkZGVkIGtleXdvcmQgbGlzdCBmb3IgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzIHRoYXQgZGlkbid0CgkgICAgICBoYXZlIG9uZSAodXNpbmcgdGhlIG5ldyBzZXBhcmF0ZWQgZmlsZSkuCgkJICAgIAkgICAgCgkgICAgLSBBZGRlZCB0aGUgIkFsbCBrZXl3b3JkcyIgd2FybmluZyBzdXBwb3J0OiAtV2FsbGt3IG9wdGlvbi4KCiAgICAgICAgICAgICAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFsbCB0aGUga25vd24ga2V5d29yZHMKCSAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMsIGFuZCBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgICAgc3dpZyAtV2FsbGt3IC4uLi4KCSAgICAKCSAgICAgIFRoaXMgd2lsbCBoZWxwIHRvIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBhIHRlc3Qtc3VpdGUKCSAgICAgIGZpbGUgdGhhdCBjYW4gYmUgY29tcGlsZWQgaW4gYWxsIHRoZSBzd2lnIHN1cHBvcnRlZAoJICAgICAgbGFuZ3VhZ2VzLCBhbmQgaXQgd2lsbCBiZSBhbHNvIGhlbHBmdWwgZm9yIHVzZXJzIHdobwoJICAgICAgd2FudCB0byBjcmVhdGUgbXVsdGktbGFuZ3VhZ2UgbGlicmFyaWVzLgoJICAgIAoJICAgIEFuZCB0aGVzZSBhcmUgdGhlIGRldGFpbGVkIGNoYW5nZXMgKG1vc3RseSBmaWxlIGFkZGl0aW9uKToKCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBzb21lIHNvcnQgb2Yga2V5d29yZAoJICAgICAgd2FybmluZyBsaXN0LCBtb3ZlIGl0IHRvIGFuIGV4dGVybmFsIGxhbmd1YWdla3cuc3dnCgkgICAgICBmaWxlLCBpZToKCSAgICAKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBweXRob24uc3dnIC0+IHB5dGhvbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIGNoaWNrZW4uc3dnIC0+IGNoaWNrZW5rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSB0Y2w4LnN3ZyAtPiB0Y2xrdy5zd2cKIAogICAgICAgICAgICAgIGFuZCByZS1pbmNsdWRlIGxhbmd1YWdla3cuc3dnIGZyb20gbGFuZ3VhZ2Uuc3dnLgoJICAgIAoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZSB0aGF0IGRpZG4ndCBoYXZlIGEga2V5d29yZCBsaXN0LCBhbmQKCSAgICAgIGZvciB0aGUgb25lcyB0aGF0IEkgY291bGQgZmluZCBhIGxpc3QsIGFkZCB0aGUKCSAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGUsIGllOgoKICAgICAgICAgICAgICAgICBjc2hhcnAvY3NoYXJwa3cuc3dnCiAgICAgICAgICAgICAgICAgamF2YS9qYXZha3cuc3dnCiAgICAgICAgICAgICAgICAgcGhwNC9waHBrdy5zd2cKCQkgcGlrZS9waWtla3cuc3dnCSAKCQkgcnVieS9ydWJ5a3cuc3dnCgoKICAgICAgICAgICAgICBhbHNvIGFkZCBhIGxpbmUgaW4gbGFuZ3VhZ2Uuc3dnIHRvIGluY2x1ZGUKCSAgICAgIGxhbmd1YWdla3cuc3dnLCBidXQgbm93IGl0IGlzIGNvbW1lbnRlZCEhISwgbGlrZSBpbgoJICAgICAgamF2YS5zd2c6CgogICAgICAgICAgICAgICAgICAvKiBqYXZhIGtleXdvcmRzICovCiAgICAgICAgICAgICAgICAgIC8qIHBsZWFzZSB0ZXN0IGFuZCBhY3RpdmF0ZSAqLwogICAgICAgICAgICAgICAgICAvLyVpbmNsdWRlICJqYXZha3cuc3dnIgoKCSAgICAgIGllLCB0aGVyZSB3aWxsIGJlIG5vIGNoYW5nZSBpbiBob3cgc3dpZyBydW5zIG5vcm1hbGx5CgkgICAgICB1bnRpbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0ZXN0IGFuZCB1bmNvbW1lbnQgdGhhdAoJICAgICAgbGluZS4KCSAgICAgIAoJICAgICAgU28sIHBsZWFzZSBjaGVjayBlYWNoIGxhbmd1YWdla3cuc3dnIGZpbGUgKEkgbGVmdCB0aGUKCSAgICAgIGxpbmsgdG8gdGhlIGtleXdvcmQgbGlzdCBzb3VyY2UgZm9yIGNoZWNraW5nKSwgYW5kIGFmdGVyCgkgICAgICB0ZXN0aW5nLCB1bmNvbW1lbnQgdGhlICVpbmNsdWRlIGxpbmUuCgoJICAgIC0gQWRkZWQgdGhlIGZpbGUgYWxsa3cuc3dnLCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlCiAgICAgICAgICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZXMuCgoJICAgICAgRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBoYXMgbm8gbGFuZ3VhZ2Vrdy5zd2cgZmlsZSByaWdodAoJICAgICAgbm93LCBhbmQgaWYgdGhleSBuZWVkIG9uZSwgYWRkIHRoZSBmaWxlIGludG8gdGhlCgkgICAgICBsYW5ndWFnZSBkaXJlY3RvcnksIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgaW5jbHVkZQoJICAgICAgbGluZSBpbnRvIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIAoJICAgIC0gQWRkZWQgdGhlIC1XYWxsa3cgdGhhdCBpbmNsdWRlcyB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICBOb3RlIHRoYXQgdGhlIG9sZCAtbGFsbGt3LnN3ZyBvcHRpb24gY291bGRuJ3QgYmUgdXNlZAoJICAgICAgc2luY2UgaXQgaW5jbHVkZSB0aGUgZmlsZSBhZnRlciBpdCB3b3VsZCBiZSBuZWVkZWQuCgoKCSAgICBIb3BlZnVsbHksIHRoZSAtV2FsbGt3IG9wdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0CgkgICAgcnVsZXMgaW4gdGhlIHJlbGF0ZWQgdGVzdC1zdWl0ZSBNYWtlZmlsZXMsIHNvLCB3aGVuCgkgICAgY3JlYXRpbmcgYSBuZXcgdGVzdCwgb3IgYWRkaW5nIGEgbmV3IHN3aWcgbGlicmFyeSBmaWxlCgkgICAgKGxpa2UgX3N0ZF9kZXF1ZS5pKSwgc3dpZyB3aWxsIHdhcm4geW91IGlmIHlvdSBhcmUgdXNpbmcgYQoJICAgIGJhZCBuYW1lLCBjb25zaWRlcmluZyBhbGwgdGhlIGxhbmd1YWdlIHdoZXJlIGl0IG5lZWRzIHRvCgkgICAgcnVuLgoJICAgIAoJICAgIFJpZ2h0IG5vdyB5b3UgY2FuIHRlc3QgaXQgYnkgdXNpbmc6CgogICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9InN3aWcgLVdhbGxrdyIKCgkgICAgb3IgdXNpbmcgeW91ciBmYXZvcml0ZSB0YXJnZXQgbGFuZ3VhZ2UsIGl0IGRvZXNuJ3QgbWF0dGVyLgoKCSAgICBBbmQgeWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBleGFtcGxlcyB0aGF0IGFyZSB1c2luZwoJICAgIHJlc2VydmVkIGtleXdvcmRzLCBzcGVjaWFsbHkgZnJvbSBjc2hhcnAuCiAgICAgICAgICAKCSAgICAqKiogUmVtZW1iZXIgKioqKjogdGhlIG5ldyBrZXl3b3JkIHdhcm5pbmcgbGlzdHMgYXJlIG5vdAoJICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYW55IG9mIGxhbmd1YWdlIHRoYXQgYmVmb3JlIGRpZG4ndAoJICAgIGhhdmUgb25lLiBUbyBlbmFibGUgdGhlIGtleXdvcmQgd2FybmluZ3MgYXMgdGhlIGRlZmF1bHQKCSAgICBiZWhhdmlvciwgdGhlIGluY2x1c2lvbiBvZiB0aGUgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSBoYXMgdG8KCSAgICBiZSB1bmNvbW1lbnRlZCBhdCBlYWNoIGxhbmd1YWdlLnN3ZyBmaWxlLgoKCSAgICBTbywgYWxsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVycywgcGxlYXNlIGNoZWNrIHRoZQoJICAgIGtleXdvcmRzIGxpc3QuIAoKCSAgICBBbHNvLCB5b3UgY2FuIGFkZCBidWl0LWluIG5hbWVzLCBhbmQgbm90IG9ubHkga2V5d29yZHMsIGxpa2UKCSAgICAnVHJ1ZS9GYWxzZScgaW4gcHl0aG9uLiAgUmVtZW1iZXIgdGhhdCB5b3UgY2FuIGJlIG1vcmUKCSAgICBzcGVjaWZpYyBhbmQgcmVmZXIgb25seSB0byBtZW1iZXIgbmFtZXMsIGxpa2UgKjo6Y29uZmlndXJlCgkgICAgb3IgKjo6Y2dldCAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlIHRjbDgvdGNsOGt3LnN3ZyBmaWxlKSwKCSAgICBvciBvbmx5IGdsb2JhbCBuYW1lcywgbGlrZSA6OnJhbmdlIChzZWUgYW4gZXhhbXBsZSBpbiB0aGUKCSAgICBweXRob24vcHl0aG9ua3cuc3dnIGZpbGUuCgoJICAgIEp1c3QgdG8gYmUgY29uc2lzdGVudCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZXM6CgoJICAgIC0gVXNlIGNvZGUgMzE0IGZvciBrZXl3b3JkIGFuZC9vciBmYXRhbCBiYWQgbmFtZXMuCgkgICAgLSBVc2UgY29kZSAzMjEgZm9yIGJ1aXQtaW4gYW5kL29yIG5vdCBmYXRhbCBiYWQgbmFtZXMuCiAgICAgICAgICAgCiAgICAgICAgICAgIHNvLCB0aGV5IGNhbid0IGJlIGRpc2FibGVkL2VuYWJsZWQgaW5kZXBlbmRlbnRseSAoc2VlCgkgICAgcHl0aG9uL3B5aHRvbmt3LnN3ZyBmb3IgZXhhbXBsZXMpLgoKCSAgICAqKioqIEFuZCBkb24ndCBhZGQgYW55IG5ldyB0ZXN0IGZpbGUgd2l0aG91dCBjaGVja2luZyBpdAoJICAgIHdpdGggdGhlIC1XYWxsa3cgb3B0aW9uISEgKHRoYXQgaW5jbHVkZXMgbWUpICoqKioqLgoJICAKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTRiBidWcgIzg1NDYzNAogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhY2NlcHRpbmcgdGhlIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciAnLycgb24gCiAgICAgICAgICAgIFdpbmRvd3MgYW5kIHRoZSBNYWMgaW4gYWRkaXRpb24gdG8gdGhlIG5hdGl2ZSBvbmUgKCAnXCcgb24gCiAgICAgICAgICAgIFdpbmRvd3MpLiBUaGlzIGNhbiBiZSB1c2VkIGluICVpbXBvcnQsICVpbmNsdWRlIGFuZCBjb21tYW5kbGluZSAKICAgICAgICAgICAgb3B0aW9ucyB0YWtpbmcgYSBwYXRoLCBmb3IgZXhhbXBsZSAtSS4gT24gQ3lnd2luLCBib3RoIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIGFuZCBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgY2FuIG5vdyBiZSB1c2VkICh3YXMgJy8nIG9ubHkpLgogICAgICAgICAgICAKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKICAgICAgICAgICAgW3B5dGhvbl0gSW1wbGVtZW50aW5nIHRoZSBydW50aW1lICJyZXByb3RlY3RlZCIgZGlyZWN0b3IKCSAgICBtZW1iZXJzLCBpZiB5b3UgaGF2ZToKICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXIoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgaGVsbG8oKSB7IHJldHVybiBkb19oZWxsbygpOykKCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hpKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGVsbG8oKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4sIGF0IHRoZSBweXRob24gc2lkZQoKICAgICAgICAgICAgICAgIGltcG9ydCBteV9tb2R1bGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28obXlfbW9kdWxlLkJhcik6CiAgICAgICAgICAgICAgICAgIGRlZiBkb19oZWxsbyhzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgCgkgICAgICAgIGIgPSBCYXIoKSAjIFB1cmUgQysrIERpcmVjdG9yIGNsYXNzCiAgICAgICAgICAgICAgICBmID0gRm9vKCkgIyBDKysgRGlyZWN0b3IgKyBweXRob24gbWV0aG9kcwoKICAgICAgICAgICAgICAgIGIuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgQysrIEJhcjo6ZG9faGVsbG8oKQogICAgICAgICAgICAgICAgZi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBQeXRob24gRm9vOjpkb19oZWxsbygpCgogICAgICAgICAgICAgICAgYi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKIAogICAgICAgICAgICAgICAgYi5kb19oZWxsbygpICMgUnVudGltZUVycm9yLCBkb19oZWxsbygpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hlbGxvKCkgIyBPaywgc2luY2UgaXQgaXRzIHJlZGVmaW5lZCBpbiBweXRob24uCgogICAgICAgICAgICBIZXJlIEJhci5kb19oZWxsbyBpcyBhbHdheXMgcHJvdGVjdGVkLCBidXQgRm9vLmRvX2hlbGxvCiAgICAgICAgICAgIGlzICJwdWJsaWMiLCBiZWNhdXNlIGl0IGlzIHJlZGVmaW5lZCBpbiBweXRob24uIEJlZm9yZSwKCSAgICBhbGwgdGhlICdkb19oZWxsbycgbWV0aG9kcyB3ZXJlIHB1YmxpYy4KCgkgICAgVGhpcyBzZWVtcyB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIEMrKyBhbmQgcHl0aG9uCgkgICAgcGhpbG9zb3BoaWVzLCBpZSwgYWxsIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBrZWVwCgkgICAgcHJvdGVjdGVkIGF0IHRoZSB1c2VyIHNpZGUgKEMrKyB3YXkpIHVudGlsIHRoZXkgYXJlCgkgICAgcmVkZWZpbmVkIChweXRob24gd2F5LCB3ZXJlIGFsbCBkZWZpbmVkIG1ldGhvZHMgYXJlIGFsd2F5cwoJICAgIHB1YmxpYykuIEFuZCB0aGlzIGlzIG5vdCBvbmx5IGEgZ29vZCBjb21wcm9taXNlLCBpdCBhbHNvCgkgICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IDopLgoKCSAgICBOb3cgcnVieSBoYXMgbmF0aXZlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzLCBhbmQgcHl0aG9uCgkgICAgcHVyZSBydW50aW1lIHN1cHBvcnQuIEkgZ3Vlc3MgdGhlc2UgYXJlIHRoZSB0d28gcG9zc2libGUKCSAgICBleHRyZW1lIGNhc2VzLiBBbmQgaG9wZWZ1bGx5LCB0aGV5IGNvdWxkIGJlIHVzZWQgYXMKCSAgICB0ZW1wbGF0ZXMgdG8gbW9kaWZ5IHRoZSBvdGhlciBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0CgkgICAgZGlyZWN0b3JzLCBzbyB0aGV5IGNhbiAicmVwcm90ZWN0IiB0aGUgcHJvdGVjdGVkIGRpcmVjdG9yCgkgICAgbWVtYmVycyBhdCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHNpZGUuCgoJICAgIFRoaXMgZmluaXNoZWQgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBzdXBwb3J0IGZvciB0aGUgCgkgICAgcHl0aG9uIGxhbmd1YWdlLiBPY2FsbSB3aWxsIG5lZWQgdG8gYWRkIHRoZQoJICAgICJyZXByb3RlY3Rpb24iIGxhdGVyLgoKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGUgZm9sbG93aW5nIGNhc2UgKHJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbikgd2FzIGZpeGVkOgoKCSAgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKCSAgICAgIGNsYXNzIEZvbyB7IAoJICAgICAgcHVibGljOgoJICAgICAgICB2b2lkIHkoKTsKCgkgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgIGludCB4OwoJICAgICAgfTsKCgkgICBzd2lnIHdhcm5lZCB0aGF0IHRoZSBzeW1ib2wgJ3gnIHdhcyBhbHJlYWR5IGRlZmluZWQsIGFuZAogICAgICAgICAgIHRoZSByZW5hbWluZyBmYWlscy4gJ3gnIHdhcyBub3QgZW1pdHRlZCwgc2luY2UgaXQgaXMKICAgICAgICAgICBwcm90ZWN0ZWQsIGJ1dCBpdCB3YXMga2VwdCBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdG9vCiAgICAgICAgICAgbXVjaCBpbmZvcm1hdGlvbi4KCgkgICBOb3cgc3dpZyB3b3JrcyBmb3IgYWxsIHRoZSBjYXNlcyAocGxhaW4sIGRpcmVjdG9yIGFuZAoJICAgZGlycHJvdCkgYWdhaW4uIFRoaXMgd2FzIGZpeGVkIGJ5IGFsbG93aW5nIHRoZSBwYXJzZXIueSB0bwoJICAgZGVjaWRlIG11Y2ggY2xvc2VyIHdoYXQgdG8gZG8gd2l0aCAneCcuIEJlZm9yZSBhbGwgdGhlCgkgICBkaXNjYXJkaW5nIG9yIGdlbmVyYXRpb24gd2FzIHJlc29sdmVkIGF0IHRoZSBsYW5nLmN4eAoJICAgc3RhZ2UuIEFsc28gdGhlIGNoYW5nZXMgaW4gcGFyc2VyLnkgdG8gaW1wbGVtZW50IHRoZQoJICAgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUgYXJlIG5vdyBtdWNoIG1vcmUgZW5jYXBzdWxhdGVkLCBhbmQKCSAgIHRoZXkgZ2V0IGRpc2FibGVkIGlmIHRoZSBtb2RlIGlzIG5vdCBlbmFibGVkLiBCZWZvcmUgdGhlCgkgICBkZWFjdGl2YXRpb24gd2FzIGRvbmUgYXQgdGhlIGdlbmVyYXRpb24gc3RhZ2UgKGxhbmcuY3h4KS4KCgkgICBCeSB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRpcmVjdG9yIG1vZGUgaXMgZW5hYmxlZCwgYW5kCgkgICAlcmVuYW1lIGlzIGRvbmUsIHJldXNpbmcgYSBwcm90ZWN0ZWQgbWVtYmVyIG5hbWUsIHRoZXJlIGlzCgkgICBhIHBhdGhvbG9naWNhbCBjYXNlOgoKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAogICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEEgewoJICAgICBwdWJsaWM6CgkgICAgICAgdm9pZCB5KCk7CgoJICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgaW50IHg7ICAgICAgICAgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIGludCB4OyAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgdm9pZCB4KCk7IC8qIHdvcmtzICovCgkgICAgICAgdHlwZWRlZiB2b2lkIHgoKTsgLyogd29ya3MgKi8KCgkgICAgICAgdmlydHVhbCB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBhcyBpdCBzaG91bGQsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbzo6eCgpIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3IgKi8KCgkgICAgICAgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYnV0IHNvbWV0aW1lcyBpdCBzaG91bGRuJ3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgRm9vOjp4KCkgd2lsbCBub3QgYmUgZW1pdHRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgbm90IHZpcnR1YWwgKi8KCgkgICAgIH07CgoJICAgVGhlIGxhc3QgY2FzZSBpcyBub3QgYWx3YXlzIHJpZ2h0IGJlY2F1c2UgYXQgdGhlIHBhcnNlci5weQoJICAgc3RhZ2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2lkZSBpZiB0aGUgcHJvdGVjdGVkIG1lbWJlcgoJICAgRm9vOjp4KCkgY291bGQgb3Igbm90IGNvbmZsaWN0IHdpdGggdGhlIHJlbmFtZWQgRm9vOjp5KCksCgkgICBzaW5jZSBGb286OngoKSBjb3VsZCBiZSB2aXJ0dWFsIGJ5IGluaGVyaXRhbmNlLgoKCSAgIEkgZ3Vlc3MgdGhpcyBqdXN0IGFuIGludHJpbnNpYyBsaW1pdGF0aW9uLCBhbmQgbm8gbXVjaCBjYW4KCSAgIGJlIGRvbmUgYWJvdXQgaXQgd2l0aG91dCByZXNvcnRpbmcgaW50byBsYXJnZXIgY2hhbmdlcyB0bwoJICAgcG9zdHBvbmUsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlIG11bHRpcGx5IHN5bWJvbAoJICAgZGV0ZWN0aW9uIChsYW5nLmN4eCBzdGFnZSkuCgkgICAKCSAgIFNvLCBieSBub3csIGl0IGlzIGp1c3QgY29uc2lkZXJlZCBhIHdlbGwga25vd24gImZlYXR1cmUiIGluCgkgICB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUuIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBpdCBzZWVtcwoJICAgdG8gYmUgYSByYXJlIGNhc2UsIGFuZCBpdCBjYW4gYmUgYXZvaWRlZCBieSB0aGUgdXNlciBieQoJICAgaGlkaW5nICd4JyBiZWZvcmUgcmVuYW1pbmcgJ3knOgoKCSAgICAgJXJlbmFtZShfeCkgRm9vOjp4KCk7CgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CgkgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgdmlydHVhbCBtZXRob2QgZGV0ZWN0aW9ucyBub3cgcHJvcGVybHkKCSAgICB0cmVhdHMgdGhlIGZvbGxvd2luZyBjYXNlczoKCiAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsgdHlwZWRlZiBpbnQgSW50OyB9CgkgICAgIHN0cnVjdCBBIHt9OwoJICAgICB0eXBlZGVmIEEgQjsKCiAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgdmlydHVhbCB+Rm9vKCkge30KCiAgICAgICAgICAgICAgIHZpcnR1YWwgRm9vKiBjbG9uZXIoKSA9IDA7CgkgICAgICAgdmlydHVhbCBpbnQgZ2V0X3ZhbHVlKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgQSogZ2V0X2NsYXNzKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgdm9pZCBqdXN0X2RvX2l0KCkgPSAwOwoJICAgICB9OwoKICAgICAgICAgICAgIHN0cnVjdCBCYXIgOiBGb28KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgQmFyKiBjbG9uZXIoKTsKICAgICAgICAgICAgICAgZm9vOjpJbnQgZ2V0X3ZhbHVlKCk7CiAgICAgICAgICAgICAgIEIqIGdldF9jbGFzcygpOwogICAgICAgICAgICAgICB2b2lkIGp1c3RfZG9faXQoKTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgQWxsIHRoZSBGb28gYW5kIEJhciBtZXRob2RzIGFyZSB2aXJ0dWFsLiAgQSBuZXcgYXR0cmlidXRlCgkgICAgInZpcnR1YWw6dHlwZSIgcmVjb3JkIHRoZSBiYXNlIHBvbHltb3JwaGljIHR5cGUuIEluIHRoZQoJICAgIHByZXZpb3VzIGNhc2VzIHdlIGhhdmU6CgoJICAgICAgIHR5cGUgOiBCYXIgICAgICAgdmlydHVhbDp0eXBlIDogRm9vCgkgICAgICAgdHlwZSA6IGZvbzo6SW50ICB2aXJ0dWFsOnR5cGUgOiBpbnQKCSAgICAgICB0eXBlIDogQiAgICAgICAgIHZpcnR1YWw6dHlwZSA6IEEKCSAgICAgICB0eXBlIDogdm9pZCAgICAgIHZpcnR1YWw6dHlwZSA6IHZvaWQKCiAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBpbiBsYW5ndWFnZXMgKGphdmErZGlyZWN0b3JzKQoJICAgIHRoYXQgY291bGQgaGF2ZSBwcm9ibGVtcyByZWRlZmluaW5nIEJhciogQmFyOjpjbG9uZXIoKS4KCgkgICAgSWYgeW91IG5ldmVyIGhhZCBjb2RlIGxpa2UgdGhlIGFib3ZlLCB5b3Ugd2lsbCBzZWUgbm8KCSAgICBlZmZlY3RzLiBCdXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIGxpa2UgdGhhdCwgeW91CgkgICAgd2lsbCBzZWUgc29tZSBlZmZlY3RzIHNpbmNlIHNvbWUgbWV0aG9kcyB0aGF0CgkgICAgYmVmb3JlIHdlcmUgbm90IHByb3Blcmx5IHRyZWF0ZWQgYXMgdmlydHVhbCwKCSAgICB3aWxsIHN0YXJ0IHRvIGFjdCBsaWtlIHRoYXQuIFRoaXMgY291bGQgZW5sYXJnZQoJICAgIHlvdXIgZGlyZWN0b3IgY2xhc3Nlcy4KCSAgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IChkaXJwcm90KQoJICAgIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgCgkgICAgSXQgY2FuIGJlIGVuYWJsZSBieSB1c2luZyAnLWRpcnByb3QnIG9yIGJ5IGFkZGluZwoJICAgIHRoZSBvcHRpb24gdG8gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbiwgbGlrZToKCiAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIixkaXJwcm90PSIxIikgbXlfbW9kdWxlCgoJICAgIFRoaXMgbW9kdWxlIG9wdGlvbiB3YXMgYWRkZWQgdG8gcHJvcGVybHkgY29tcGlsZSB0aGUKCSAgICBkaXJlY3Rvcl9wcm90ZWN0ZWQuaSBhbmQgZGlyZWN0b3JfbmVzdGVkLmkgZXhhbXBsZXMuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uWzIuMiwyLjNdIAoJICAgIGFuZCBydWJ5WzEuNi43XSwgYm90aCBhdCBjb21waWxhdGlvbiBhbmQgcnVudGltZSwgYW5kIAoJICAgIGphdmFbajJzZGsxLjQuMV8wMV0sIGJ1dCBvbmx5IGF0IGNvbXBpbGF0aW9uIChteSBqYXZhCgkgICAgaW5zdGFsbGF0aW9uIGRvZXNuJ3QgcnVuIGFueSBvZiB0aGUgZGlyZWN0b3IgZXhhbXBsZXMsCgkgICAgb2xkcyBub3IgbmV3cykuCgoJICAgIFBsZWFzZSB0ZXN0IGZvciBvY2FtbCBhbmQgamF2YS4KCSAgICAKCSAgICBUaGUgZXJyb3JzIHJlcG9ydGVkIGJ5IFdpbGxpYW0gYW5kIFNjb3R0IHdlcmUgZml4ZWQsCgkgICAgZXhjZXB0IGZvciBhIHdhcm5pbmcgYWJvdXQgIFNXSUdfSmF2YVRocm93RXhlY3B0aW9uKCkKCSAgICBtdWx0aXBseSBkZWZpbmVkLiBJIGNhbid0IHJlcHJvZHVjZSB0aGlzIGVycm9yIHdpdGggbXkKCSAgICBleGFtcGxlcy4gV2Ugd2lsbCB3YWl0IGZvciBTY290dCB0byBzZW5kIHVzIGEgbWluaW1hbAoJICAgIGNhc2UuCgoKMTIvMDcvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgaGFzIGJlZW4KCSAgICBjb21wbGV0bHkgbW92ZWQgb3V0IGZyb20gcHl0aG9uLmN4eCwgYW5kIG5vdwoJICAgIHJlc2lkZXMgaW4gdGhlIGNvbW1vbiBsYW5nLmN4eCwgZW1pdC5jeHggYW5kCgkgICAgYWxsb2NhdGUuY3h4IGZpbGVzLiAKCgkgICAgVGhpcyBtZWFucyBpdCBzaG91bGQgd29yayBmb3IgYWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IGN1cnJlbnRseSBzdXBwb3J0IGRpcmVjdG9ycywgaWUsIHB5dGhvbiwgamF2YSwgb2NhbG0KCSAgICBhbmQgcnVieS4KCgkgICAgVGhlIGNoYW5nZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob24gKGNvbXBpbGF0aW9uK3J1bnRpbWUpCgkgICAgYW5kIGphdmEgKGp1c3QgY29tcGlsYXRpb24pLgoJICAgIAoJICAgIFBsZWFzZSBhZGQgcnVudGltZSB0ZXN0cyBmb3IgdGhlIG1pc3NpbmcgbGFuZ3VhZ2VzIAoJICAgIGFuZCB0ZXN0IGl0LgoKCSAgICBUaGUgJy1ub2RpcnByb3QnIG9wdGlvbiB3YXMgbW92ZWQgdG8gdGhlIHByaW5jaXBhbCBtYWluLAoJICAgIGFuZCBjYW4gYmUgdXNlZCBmcm9tIGFsbCB0aGUgbGFuZ3VhZ2VzLgoKMTIvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBhbmQgaW1wcm92ZWQgZXJyb3IgY2hlY2tpbmcgb2YgU1RSSU5HX09VVCB0eXBlbWFwcyBpbiAKICAgICAgICAgICAgdmFyaW91cy5pLgoKMTIvMDQvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICAtIE5vdyB0aGUgdmlydHVhbCBtZW1iZXJzIHdpdGggbm8gZXhwbGljaXQgZGVjbGFyYXRvcgoJICAgIGFyZSBwcm9wZXJseSBpZGVudGlmaWVkOgoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgewogICAgICAgICAgICAgICAgICBpbnQgZigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgSGVyZSwgQjo6ZigpIGlzIHZpcnR1YWwsIGFuZCB0aGUgZGlyZWN0b3IgYW5kIHRoZQoJICAgIHZpcnR1YWwgZWxpbWluYXRpb24gbWVjaGFuaXNtIG5vdyByZWNvZ25pemUgdGhhdC4KCiAgICAgICAgICAgIC0gW0MjXSBUaGlzIGZpeCBhbHNvIGZpeGVzIHRoZSBwcm9ibGVtIHdoZXJlICdvdmVycmlkZScgd2FzIG5vdCBiZWluZyAKICAgICAgICAgICAgdXNlZCBvbiBhbnkgb3ZlcnJpZGRlbiB2aXJ0dWFsIG1ldGhvZCwgc28gZm9yIHN0cnVjdCBCIGFib3ZlLCAKICAgICAgICAgICAgdGhpcyBDIyBjb2RlIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgQiA6IEEgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBmKCkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCSAgICAtIEluaXRpYWwgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIHZpcnR1YWwgbWV0aG9kcy4gVGhleSBhcmUgbm93CgkgICAgcHJvcGVybHkgZW1pdHRlZCB3aGVuIHVzaW5nIHdpdGggZGlyZWN0b3IgKHB5dGhvbiBvbmx5IGJ5CgkgICAgbm93KS4KCSAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7ICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQXsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZjIoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIFRoaXMgY2FuIGJlIGRpc3NhYmxlZCBieSB1c2luZyB0aGUgJy1ub2RpcnByb3QnIG9wdGlvbi4KCgkgICAgLSBUaGUgZmVhdHVyZSAnbm9kaXJlY3RvcicgaXMgd29ya2luZyBub3cgYXQgdGhlIHRvcCBsZXZlbCwKCSAgICBzbywgaXQgbXVzdCB3b3JrIGZvciBhbGwgdGhlIGxhbmd1YWdlczoKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOwogICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSBBOjpmMjsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMigpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAoJICAgIGluIHRoaXMgY2FzZSwgb25seSAnZjEnIGlzIGV4cG9ydGVkIHRvIHRoZSBkaXJlY3RvciBjbGFzcy4KCSAgICAKCSAgICAtIEFkZGVkIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IFRZUEUmIGFyZ3VtZW50cyAocHl0aG9uKS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBJTk9VVCBhbmQgT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIHdoZW4gdGhlIEpOSSB0eXBlIAogICAgICAgICAgICBpcyBiaWdnZXIgdGhhbiB0aGUgQyB0eXBlLiBGb3IgZXhhbXBsZSwgdW5zaWduZWQgbG9uZyAoMzJiaXRzIG9uIG1vc3Qgc3lzdGVtcykKICAgICAgICAgICAgaXMgbWFwcGVkIHRvIGpsb25nICg2NGJpdHMpLiBSZXR1cm5lZCB2YWx1ZSB3YXMgaW5jb3JyZWN0LiBCdWcgcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEJyaWFuIEhhd2xleS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEJldHRlciBmaXggZm9yIGVudHJ5IGRhdGVkIDA1LzExLzIwMDMuIEZpeGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgdHlwZW1hcHM6CgogICAgICAgICAgICBKYXZhOiBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgogICAgICAgICAgICBDIzogY3NiYXNlLCBjc2ludGVyZmFjZXMsIGNzaW1wb3J0cywgY3NjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgY3NmaW5hbGl6ZSwgY3NnZXRjcHRyICYgY3Njb2RlLgoKICAgICAgICAgICAgSXQgYWxzbyBmaXhlcyBidWcgaW4gdXNpbmcgYXJyYXlzIG9mIEMgc3RydWN0cyB3aXRoIGFycmF5c19qYXZhLmkgCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIFNjb3R0IE1pY2hlbC4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEZpeGVkIFsgODUyMTE5IF0gcmVjdXJzaXZlIGluaGVyaXRhbmNlIGluIG91dHB1dCAucG0sIHBlcmw1LgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIERvd2xpbmcuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIFsgNzU1MzgyIF0gY2FsbGluZyBmdW5jKGNvbnN0IHZlY3RvcjxUPiYgcCkgZXZhbHVhdGVzIHBbMF0gaW4gaW50ZXJwLgogICAgICAgICAgICBUaGUgVGNsIHR5cGUgY2hlY2tlciB3YXMgaW1wcm9wZXJseSBoYW5kbGluZyB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoZW4KICAgICAgICAgICAgdHlwZSB2aW9sYXRpb25zIHdlcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxhdml1IFBvcHAtTm93YWsuCgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA1NDUwNTggXSBjb25maWd1cmUncyAtLXdpdGgtdGNsaW5jbCBoYXMgbm8gZWZmZWN0CgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgNzY2NDA5IF0gbWlzc2luZyBzeW1ib2wgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gZHVyaW5nIG1vZHVsZSBsb2FkCiAgICAgICAgICAgIFNXSUdzIGludGVybmFsIGZ1bmN0aW9ucyBhcmUgYWxsIHN0YXRpYyBhcyB0aGVyZSBpcyBubyBuZWVkIGZvciBkaWZmZXJlbnQgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB0byBzaGFyZSBhbnkgY29kZSBhdCBydW50aW1lLgoKMTEvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDg0ODMzNSBdIERpcmVjdG9yczogI2luY2x1ZGUgd3JhcHBlciAuaCBmaWxlIC0gd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIGFkZGluZyBhIGRpcmVjdG9yeSB0byB0aGUgZ2VuZXJhdGVkICNpbmNsdWRlICJmb29fd3JhcC5oIiBzdGF0ZW1lbnQKICAgICAgICAgICAgaW4gc29tZSBzaXR1YXRpb25zLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDg0OTA2NCBdIEpBVkEgOiBBY2Nlc3MgbW9kaWZpZXIgZm9yIGRlcml2ZWQgY2xhc3Mgd3JvbmcuCiAgICAgICAgICAgIFRoZSBkZWxldGUoKSBtZXRob2QgaXMgYWx3YXlzIHB1YmxpYyBub3cuIEl0IHVzZWQgdG8gYmUgcHJvdGVjdGVkIHdoZW5ldmVyIGEgCiAgICAgICAgICAgIGRlc3RydWN0b3Igd2FzIG5vbiBwdWJsaWMuIEFuIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHJ1bnRpbWUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW5zdGVhZCBvZiBtYWtpbmcgZGVsZXRlKCkgcHJvdGVjdGVkIG5vdy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBBZGRlZCBzdXBwb3J0IGZvciBDKysgcG9pbnRlcnMgdG8gbWVtYmVycy4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NTAxNTEgXSBQWVZFUlNJT04gd2l0aCBweXRob24yLjMgaW4gY29uZmlndXJlIG9mIFNXSUcgMS4zLjE5IChNYXliZSkuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICBbIDg1MDY2NiBdICNpbmNsdWRlIGV4dHJhIGxpbmUgYWRkZWQuICAKICAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHNvbWUgcHJvYmxlbXMgd2l0aCBnZXR0aW5nIGNvcnJlY3QgbGluZSBudW1iZXJzIG9uCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2VzLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhbm90aGVyIG9uZSBvZiBNYXJjZWxvJ3MgZXZpbCB0ZW1wbGF0ZSBidWdzIChpbmZpbml0ZQogICAgICAgICAgICByZWN1cnNpb24pLiBbIDg0OTUwNCBdIHRlbXBsYXRlIGFuZCB0eXBlZGVmIC0+IGluZi4gcmVjdXJzaW9uLgoKMTEvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzOgoKCSAgICAgICAgIGludCAqeCA9ICZzb21lYXJyYXlbMF07CgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzU2NTUyIF0gbWlzc2luZyBkZWZhdWx0IGFyZ3VtZW50IGNsYXNzIHNjb3BlIHdpdGggInwiLgogICAgICAgICAgICBUaGlzIGlzIHJlYWxseSBvbmx5IGEgYmFuZC1haWQgZml4IGZvciB1c2Ugb2YgY2xhc3MtZW51bXMgaW4KICAgICAgICAgICAgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGVudW0gRmxhZyB7IGZsYWcxID0gMHgxLCBmbGFnMiA9IDB4MiB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgeCA9IGZsYWcxIHwgZmxhZzIpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZTogdGhlcmUgYXJlIHN0aWxsIHNvbWUgKG1vcmUgc3VidGxlKSBjYXNlcyB0aGF0IGFyZSBicm9rZW4sCiAgICAgICAgICAgIGJ1dCBoYXJkIHRvIGZpeCBkdWUgdG8gYW4gaXNzdWUgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uIFdpbGwKICAgICAgICAgICAgYWRkcmVzcyBsYXRlci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRG1pdHJ5IE1pcm9ub3YuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDg0MDg3OCBdIHN1cHBvcnQgZm9yICVpbmxpbmUgeyAuLi4gfSAoUEFUQ0gpLgogICAgICAgICAgICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAlaW5saW5lICV7IC4uLiAlfSBpcyB0aGF0IHRoZQogICAgICAgICAgICBlbmNsb3NlZCB0ZXh0IGlzIHByb2Nlc3NlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICAgVGhpcwogICAgICAgICAgICBhbGxvd3Mgc3BlY2lhbCBtYWNyb3MgYW5kIG90aGVyIHByb2Nlc3NpbmcgdG8gYmUgdXNlZCBpbiAKICAgICAgICAgICAgY29uanVuY3Rpb24gd2l0aCAlaW5saW5lLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MzY5MDMgXSBDKysgaW5jb25zaXN0ZW5jeSAod2l0aCB2b2lkIGFyZ3VtZW50cykuCiAgICAgICAgICAgIFNXSUcgd2FzIGhhdmluZyBkaWZmaWN1bHR5IHdpdGggZigpIHZzIGYodm9pZCkgaW4gQysrIHByb2dyYW1zLgogICAgICAgICAgICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYodm9pZCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKCk7ICAgIC8vIE5vdCBtYXRjaGVkIHRvIGYodm9pZCkgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgIH07IAoKICAgICAgICAgICAgVGhlIHBhcnNlciBub3cgbm9ybWFsaXplcyBhbGwgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtIGYodm9pZCkgCiAgICAgICAgICAgIGluIEMrKyBjbGFzc2VzIHRvIGYoKS4gIFRoaXMgc2hvdWxkIGZpeCBhIHZhcmlldHkgb2Ygc3VidGxlIAogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlLCBvcHRpbWl6YXRpb25zLCBvdmVybG9hZGluZywgZXRjLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhcnRobyBCaG93bWljay4KIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSW5jb3Jwb3JhdGVkIFsgODQxMDc0IF0gYmV0dGVyIGNyb2FraW5nIChQQVRDSCkuICBUaGlzIGZpeGVzIHNvbWUgcHJvYmxlbXMKICAgICAgICAgICAgd2l0aCBzdHJpbmdzIGFuZCBwcm92aWRlcyBzb21lIG5ldyBlcnJvciBmdW5jdGlvbnMuIAogICAgICAgICAgICBDb250cmlidXRlZCBieSBTYWx2YWRvciBGYW5kaW5vIEdhcmNpYS4KICAgICAgICAgICAgCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE4MzUgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggY2FzdDogdHh0ID0gKGNoYXIgKikidHh0IiBzeW50YXggRXJyb3IuCiAgICAgICAgICAgIFRoZSBwYXJzZXIgc2hvdWxkIG5vdyBhY2NlcHQgdGhpbmdzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqcyA9IChjaGFyICopICJIZWxsbyIpOwoKICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBDbGF1ZGl1cyBTY2hub3JyLgoKMTEvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBwcm9ibGVtIHdpdGggY3Jvc3MgbW9kdWxlIGxpbmtpbmcuICBQcmV2aW91c2x5IG1vZHVsZXMgcmVmZXJyZWQKICAgICAgICAgICAgdG8gYmFzZSBjbGFzc2VzIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUuICAgTm93LCB0aGUgbW9kdWxlIGxvb2tzIHVwIGJhc2UKICAgICAgICAgICAgY2xhc3NlcyB0aHJvdWdoIHRoZSB0eXBlIHN5c3RlbSBpdHNlbGYtLS1hdm9pZGluZyB0aGUgbmVlZCB0byBsaW5rIHRvIGEgZ2xvYmFsCiAgICAgICAgICAgIGxpa2UgYmVmb3JlLiAgQ2F2ZWF0OiAgbW9kdWxlcyB3aXRoIGJhc2UgY2xhc3NlcyBtdXN0IGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgbW9kdWxlcyB3aXRoIGRlcml2ZWQgY2xhc3Nlcy4KIAoxMS8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHVzZSAoKSB0byByZXByZXNlbnQgbnVsbCBwb2ludGVycywKCSAgICBhcyBpdCBpcyBkb25lIGluIC1naCBtb2RlLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIEFkZCBhIGdlbmVyYXRlZCBzY3JpcHQgInByZWluc3Qtc3dpZyIsIHdoaWNoIGNhbiBiZSB1c2VkCgkgICAgdG8gaW52b2tlIFNXSUcgYmVmb3JlIGl0IGhhcyBiZWVuIGluc3RhbGxlZC4gIEl0IGFycmFuZ2VzCgkgICAgdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMgZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUKCSAgICB1c2VkLiAKCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2FsbCBTV0lHX0d1aWxlX0luaXQuCgkgICAgQWRkIGEgU1dJR19jb250cmFjdF9hc3NlcnQgbWFjcm8uCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBVcGRhdGUgdGhlIGNvbmZpZ3VyZSBjaGVjayBmb3IgdGhlIGR5bmV4dCBvYmplY3QgdG8gd29yawoJICAgIHdpdGggTXpTY2hlbWUgMjA1LgoKMTEvMjAvMjAwMzogbW1hdHVzCgkgICAgRml4ZWQgdGhlIGluY2x1ZGUvaW1wb3J0IGVycm9yIHJlcG9ydGVkIGJ5IEtlcmltIEJvcmNoYWV2LAoJICAgIHdoZXJlIHR3byBmaWxlcyB3aXRoIG5hbWVzIGxpa2UKCgkgICAgJ2RpcjEvaGVsbG8uaScKCSAgICAnZGlyMi9oZWxsby5pJwoJICAgIAoJICAgIGNhbiBub3QgYmUgaW5jbHVkZSBhdCB0aGUgc2FtZSB0aW1lLiBTd2lnIHdhcyBpbmNsdWRpbmcKCSAgICBqdXN0IHRoZSBmaXJzdCBvbmUsIGFzc3VtaW5nIHRoZSBzZWNvbmQgb25lIHdhcyBub3QgYQoJICAgIGRpZmZlcmVudCBvbmUsIHNpbmNlIGl0IHdhcyBjaGVja2luZy9rZWVwaW5nIGp1c3QgdGhlCgkgICAgYmFzZW5hbWUgJ2hlbGxvLmknLgoKMTEvMTkvMjAwMzogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBTV0lHIHJ1bnRpbWUgbGlicmFyeSBzdXBwb3J0LiAKICAgICAgICAgICAgICAtICBUaGUgLWMgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIC1ub3J1bnRpbWUKICAgICAgICAgICAgICAtICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbjogLXJ1bnRpbWUuICBXaGVuIHN1cHBsaWVkLCB0aGlzCiAgICAgICAgICAgICAgICAgaW5zZXJ0cyB0aGUgc3ltYm9sIFNXSUdfR0xPQkFMIGludG8gdGhlIHdyYXBwZXIgY29kZS4gIFRoaXMsCiAgICAgICAgICAgICAgICAgaW4gdHVybiwgbWFrZXMgYWxsIG9mIHRoZSBydW50aW1lIHN1cHBvcnQgZnVuY3Rpb25zIGdsb2JhbGx5CiAgICAgICAgICAgICAgICAgdmlzaWJsZS4KICAgICAgICAgICAgICAgLSBOZXcgbGlicmFyeSBmaWxlOiBzd2lncnVuLmkuICAgVXNlZCB0byBjcmVhdGUgbW9kdWxlcwogICAgICAgICAgICAgICAgIGZvciBydW50aW1lIGxpYnJhcnkgKGlmIG5lZWRlZCkuCiAgICAKMTEvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgICdtYWtlIHNyY3JwbScgcnBtYnVpbGQgZml4IC0gcGF0Y2ggZnJvbSBKb2UgQ29vcGVyCgoxMS8xOC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBDaGFuZ2UgbWVhbmluZyBvZiBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1ndWlsZSB0bwoJICAgIHRoZSBuYW1lIG9mIHRoZSBHdWlsZSBleGVjdXRhYmxlLiAgVGhlIG5ldyBvcHRpb24gLS13aXRoLWd1aWxlLXByZWZpeCAKCSAgICBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0cmVlIHdoZXJlIEd1aWxlIGlzCgkgICAgaW5zdGFsbGVkLiAgKEhvd2V2ZXIsIHVzdWFsbHkgaXQgc3VmZmljZXMgdG8gdXNlIHRoZQoJICAgIHNpbmdsZSBvcHRpb24gLS13aXRoLWd1aWxlLWNvbmZpZy4pICAKCSAgICBXaGVuIHJ1bm5pbmcgdGhlIHJ1biB0ZXN0cyB0ZXN0LXN1aXRlLCBtYWtlIHN1cmUgdG8gdXNlIHRoZQoJICAgIHZlcnNpb24gb2YgR3VpbGUgdGhhdCBTV0lHIHdhcyBjb25maWd1cmVkIGZvci4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEltcHJvdmVtZW50cyB0byBvYmplY3Qtb3duZXJzaGlwIG1hbmFnZW1lbnQgaW4gCgkgICAgIi1zY20iIG1vZGUuICAoVGhleSBkbyBub3QgYXBwbHkgdG8gdGhlIGRlZmF1bHQgIi1naCIgbW9kZS4pCgkgICAgKiBSZW5hbWVkIHRoZSBzbW9iIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IGNhbgoJICAgICAgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgZnJvbSAiY29sbGVjdGVkIHN3aWciIHRvICJjb2xsZWN0YWJsZQoJICAgICAgc3dpZyIsIHdoaWNoIGlzIG1vcmUgcHJlY2lzZS4gIAoJICAgICogRXhwb3J0IHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9ucyBhZ2Fpbi4gIEl0IGlzIG5vdwogCSAgICAgIGFsbG93ZWQgdG8gZXhwbGljaXRseSBjYWxsIGRlc3RydWN0b3JzLCBldmVuIGZvcgoJICAgICAgZ2FyYmFnZS1jb2xsZWN0ZWQgcG9pbnRlciBvYmplY3RzLiAgQSBwb2ludGVyIG9iamVjdAoJICAgICAgdGhhdCBoYXMgYmVlbiBwYXNzZWQgdG8gYSBkZXN0cnVjdG9yIGlzIG1hcmtlZCBpbiBhCgkgICAgICBzcGVjaWFsIHdheSB1c2luZyBhIG5ldyBzbW9iIHR5cGUsICJkZXN0cm95ZWQgc3dpZyIuCgkgICAgICAoVGhpcyBoZWxwcyBhdm9pZCBuYXN0eSBtZW1vcnkgYnVncywgd2hlcmUgcmVmZXJlbmNlcyB0bwoJICAgICAgZGVhZCBDIG9iamVjdHMgYXJlIHN0aWxsIGhlbGQgaW4gU2NoZW1lLiBNb3Jlb3ZlciwgdGhlCgkgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIG5vdCB0cnkgdG8gZnJlZSBhIGRlc3Ryb3llZAoJICAgICAgb2JqZWN0IG9uY2UgbW9yZS4pCgkgICAgKiBEZXN0cnVjdG9yLWxpa2UgZnVuY3Rpb25zIGNhbiBhbHNvIG1hcmsgdGhlaXIgYXJndW1lbnRzIAoJICAgICAgYXMgZGVzdHJveWVkIGJ5IGFwcGx5aW5nIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpERVNUUk9ZRUQuCgkgICAgICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJEZXN0cm95ZWQuKQoJICAgICogRnVuY3Rpb25zIHRoYXQgImNvbnN1bWUiIHRoZWlyIG9iamVjdHMgKG9yIHRoYXQgIm93biIKCSAgICAgIHRoZW0gYWZ0ZXIgdGhlIGNhbGwpIGNhbiBtYXJrIHRoZWlyIGFyZ3VtZW50cyBhcwoJICAgICAgbm90IGdhcmJhZ2UgY29sbGVjdGFibGUuICBUaGlzIGNhbiBiZSBkb25lIGJ5IGFwcGx5aW5nCgkgICAgICB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqQ09OU1VNRUQuICAoSXQgY2FsbHMgdGhlIGZ1bmN0aW9uCgkgICAgICBTV0lHX0d1aWxlX01hcmtQb2ludGVyTm9uY29sbGVjdGFibGUuKQoJICAgICogVGhlIG1hY3JvIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQgZnJvbSBsaWJyYXJ5CgkgICAgICBwb2ludGVyLWluLW91dC5pIGNyZWF0ZXMgYWRkaXRpb25hbCB0eXBlbWFwcyAKCSAgICAgIFBUUlRZUEUgKklOUFVUX0NPTlNVTUVELCBQVFJUWVBFICpJTlBVVF9ERVNUUk9ZRUQuCgkgICAgICBUaGV5IG1hcmsgdGhlIHBhc3NlZCBwb2ludGVyIG9iamVjdCBsaWtld2lzZS4KCSAgICAgIFRoZSB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVCBjcmVhdGVzIGEgZ2FyYmFnZS1jb2xsZWN0YWJsZQoJICAgICAgcG9pbnRlciBvYmplY3QsIGxpa2UgJW5ld29iamVjdCBkb2VzIGZvciBhIHJldHVybmVkIAoJICAgICAgcG9pbnRlci4gIFVzZSB0aGUgbmV3IHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUX05PTkNPTExFQ1RBQkxFCgkgICAgICB0byBjcmVhdGUgYSBwb2ludGVyIG9iamVjdCB0aGF0IHdpbGwgbm90IGJlIGdhcmJhZ2UgY29sbGVjdGVkLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSGFuZGxlICRpbnB1dCBpbiAiZnJlZWFyZyIgdHlwZW1hcHMuCgkgICAgTmV2ZXIgcXVhbGlmeSBHT09QUyBzbG90IG5hbWVzIHdpdGggdGhlIGNsYXNzIG5hbWUuIAoJICAgIEhhbmRsZSBvcHRpb25hbCBhcmd1bWVudHMgcHJvcGVybHkgaW4gdGhlIEdPT1BTIG1ldGhvZHMuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgZm9yIGluc3RhbGxhdGlvbiB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIEF1dG9tYWtlLTEuOC4KICAgICAgICAgICAgbWtpbnN0YWxsZGlycyB3YXMgYmVpbmcgdXNlZCBieSBhIG5vbi1BdXRvbWFrZSBtYWtlZmlsZS4gCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgaXMgYmVpbmcgcGhhc2VkIG91dCBhbmQgc28gd2FzIG5vdCBiZWluZwogICAgICAgICAgICBjcmVhdGVkIGJ5IEF1dG9tYWtlLiBpbnN0YWxsLXNoIHVzZWQgaW5zdGVhZC4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgaW1wcm92ZW1lbnRzLCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcyBzaW5jZSAKICAgICAgICAgICAgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiAlZmVhdHVyZSgic2hhZG93IikgaXMgdXNlZCB0byBhZGQgY29kZSB0byBzaGFkb3cKICAgICAgICAgICAgY2xhc3NlcywgdGhlIHNwZWNpYWwgdmFyaWFibGUgJGFjdGlvbiBleHBhbmRzIHRvIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICB1bmRlcmx5aW5nIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkIG5vcm1hbGx5LgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuIGdlbmVyYXRpbmcgcHJveHkgY2xhc3MgY29kZSwgU1dJRyBlbWl0cyBhIGZldwogICAgICAgICAgICBkZWZhdWx0IG1ldGhvZHMgZm9yIF9fcmVwcl9fKCkgYW5kIG90aGVyIFB5dGhvbiBzcGVjaWFsCiAgICAgICAgICAgIG1ldGhvZHMuICBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIGVtaXR0ZWQgYWZ0ZXIgYWxsIG9mIHRoZQogICAgICAgICAgICBjb250ZW50cyBvZiBhIGNsYXNzLiBIb3dldmVyLCB0aGlzIG1ha2VzIGl0IGhhcmQgdG8gb3ZlcnJpZGUKICAgICAgICAgICAgdGhlIG1ldGhvZHMgdXNpbmcgJXB5dGhvbmNvZGUgYW5kIHNvbWUgb3RoZXIgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICAgIGFsbG93IGNvZGUgdG8gYmUgaW5zZXJ0ZWQgaW50byBhIGNsYXNzLiAgVGhlc2Ugc3BlY2lhbCBtZXRob2RzCiAgICAgICAgICAgIGFyZSBub3cgZW1pdHRlZCBpbnRvIHRoZSBjb2RlICpiZWZvcmUqIGFsbCBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEVyaWMgSm9uZXMuCiAKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBQcmVwcm9jZXNzb3IgZW5oYW5jZW1lbnQuICAgRm9yIGluY2x1ZGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAlaW5jbHVkZSAiZm9vL2Jhci5pIgoKICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSAiZm9vIiBpcyBub3cgYWRkZWQgdG8gdGhlIHNlYXJjaCBwYXRoIHdoaWxlIAogICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBjb250ZW50cyBvZiBiYXIuaS4gIFRodXMsIGlmIGJhci5pIGluY2x1ZGVzIG90aGVyCiAgICAgICAgICAgIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSwgdGhleSB3aWxsIGJlIGZvdW5kLiBQcmV2aW91c2x5LAogICAgICAgICAgICB5b3Ugd291bGQgaGF2ZSB0byBhZGQgYWRkaXRpb25hbCBkaXJlY3RvcmllcyB1c2luZyAtSSB0byBtYWtlIHRoaXMKICAgICAgICAgICAgd29yayBjb3JyZWN0bHkuICBOb3RlOiB0aGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gYmVoYXZlIGluCiAgICAgICAgICAgIGFuIGlkZW50aWNhbCBtYW5uZXIgb24gbWFueSAobW9zdD8gYWxsPykgc3lzdGVtcy4KICAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEtlcmltIEJvcmNoYWV2LgoKMTEvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBDb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgb24gTWFjIE9TWCAxMC4zLnggKFBhbnRoZXIpLgogICAgICAgICAgICBUZXN0ZWQgd2l0aCBQeXRob24sIFRjbCwgUGVybCwgYW5kIFJ1YnktLS1hbGwgb2Ygd2hpY2ggc2VlbSB0byB3b3JrLgoKMTEvMDgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCB0aGUgdHlwZW1hcHMgaW4gdmFyaW91cy5pIHdoaWNoIHdlcmUgbW9zdGx5IGJyb2tlbi4KICAgICAgICAgICAgY2hhciAqKlNUUklOR19JTiBhbmQgY2hhciAqKlNUUklOR19SRVQgdHlwZW1hcHMgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgU1RSSU5HX0FSUkFZLiBmbG9hdCAqRkxPQVRfQVJSQVlfUkVUVVJOIHR5cGVtYXAgcmVtb3ZlZC4KCjExLzA4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gVGNsIG1vZHVsZSBub3cgZW1pdHMgYSBzYWZlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBieQogICAgICAgICAgICBkZWZhdWx0LiAgSXQgY2FuIGJlIHJlbW92ZWQgYnkgcnVubmluZyAnc3dpZyAtbm9zYWZlJy4KCjExLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE9ubHkgdXNlIHRoZSBTQ01fIEFQSSB3aGVuIHRoZSBmdW5jdGlvbgoJICAgIGBzY21fc2xvdF9leGlzdHNfcCcgZXhpc3RzIChuZWVkZWQgZm9yIEdPT1BTIHN1cHBvcnQpLiAgCgkgICAgVGhpcyBmdW5jdGlvbiB3YXMgcmVuYW1lZCBkdXJpbmcgdGhlIEd1aWxlIDEuNSBzZXJpZXMKCSAgICBmcm9tIGBzY21fc2xvdHNfZXhpc3RzX3AnLgoJICAgIFJlcG9ydCB0aGUgcmlnaHQgcnVudGltZSBsaWJyYXJ5IHdoZW4gaW52b2tlZCB3aXRoCgkgICAgLXNjbSAtbGRmbGFncy4KCjExLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRml4ICM3ODIwNTIuICBUaGUgLS13aXRoLWNoaWNrZW5jZmcgY29uZmlndXJlCgkgICAgb3B0aW9uIChhbmQgb3RoZXJzKSB3ZXJlIG5vdCBhY2NlcHRlZC4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE1lcmdlIG5ldyBzZXQgb2YgR09PUFMgY2hhbmdlcyBieSBKb2huIExlbnouCgkgICAgR09PUFMgb2JqZWN0cyBhcmUgbm93IG1hbmlwdWxhdGVkIGRpcmVjdGx5IGJ5IHRoZSBDIGNvZGUuCgkgICAgU29tZSBmaXhlcyB0byB0eXBlbWFwLUdPT1BTIGludGVyYWN0aW9uLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVtb3ZlIHRoZSBmaWxlIGFyZ3VtZW50IHRvIC1zY21zdHViIGFuZCAtZ29vcHMuCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IGFsd2F5cyBjYWxsZWQgTU9EVUxFLnNjbSBvcgoJICAgIE1PRFVMRS1wcmltaXRpdmUuc2NtLCB3aGVyZSBNT0RVTEUgaXMgdGhlIG1vZHVsZSBuYW1lIGFuZCAKCSAgICAicHJpbWl0aXZlIiBjYW4gYmUgY2hhbmdlZCBieSB0aGUgLXByaW1zdWZmaXggb3B0aW9uLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieQoJICAgIHRoZSAtb3V0ZGlyIG9wdGlvbiwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgoJICAgIChQYXRjaCBieSBKb2huIExlbnosIHNsaWdodGx5IG1vZGlmaWVkLikKCgkgICAgKioqIElOQ09NUEFUSUJJTElUWSBbR3VpbGVdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFVuaWZ5IHRoZSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuICBUaGUgc3RhbmRhcmQKCSAgICBmdW5jdGlvbnMgYXJlOgoJICAgICAqIFNXSUdfTmV3UG9pbnRlck9iaiAoUE9JTlRFUiwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIENyZWF0ZSBhbiBzY3JpcHRpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHR5cGVkCgkJICAgcG9pbnRlci4gRkxBR1MgYXJlIGxhbmd1YWdlIHNwZWNpZmljLgoJICAgICAqIFNXSUdfQ29udmVydFB0ciAoSU5QVVQsIFJFU1VMVCwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICBzdG9yZSBpdCBpbiB0aGUgcGxhY2UgUkVTVUxULiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggCgkJICAgb2NjdXJzLCByZXR1cm4gbm9uemVyby4KCSAgICAgKiBTV0lHX011c3RHZXRQdHIgKElOUFVULCBUWVBFLCBBUkdOVU0sIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgcmV0dXJuIGl0LiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggb2NjdXJzLCB0aHJvdyBhbgoJCSAgIGV4Y2VwdGlvbi4gIElmIEFSR05VTSA+IDAsIHJlcG9ydCBpdCBhcyB0aGUgCgkJICAgYXJndW1lbnQgbnVtYmVyIHRoYXQgaGFzIHRoZSB0eXBlIG1pc21hdGNoLgogICAgICAgICAgICBbR3VpbGVdOiAgICBObyBjaGFuZ2VzLgoJICAgIFtNelNjaGVtZV06IE5vIGNoYW5nZXMuCgkgICAgW1BlcmxdOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmouCgkJICAgICAgICBUaGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIGlzIGtlcHQuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IG5vdAoJCQlzdXBwb3J0ZWQuCgkgICAgW1B5dGhvbl06ICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1J1YnldOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1RjbF06ICAgICAgUmVtb3ZlIHRoZSAiaW50ZXJwIiBhcmd1bWVudCBvZgoJCSAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaiwgU1dJR19Db252ZXJ0UHRyLAoJCSAgICAgICAgU1dJR19Db252ZXJ0UGFja2VkLCBhbmQgU1dJR19Db252ZXJ0UHRyRnJvbVN0cmluZy4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgCgkJCW5vdCBzdXBwb3J0ZWQuCgkgICAgTm8gY2hhbmdlcyB0byBQaWtlIGJlY2F1c2UgaXRzIHBvaW50ZXIgY29udmVyc2lvbiBjb2RlIGRpZAoJICAgIG5vdCBsb29rIGNvbXBsZXRlLiAgTm8gY2hhbmdlcyB0byBQSFA0LCBiZWNhdXNlIEkgZGlkIG5vdAoJICAgIHVuZGVyc3RhbmQgaXRzIHJ1bnRpbWUgY29kZS4gIE5vIGNoYW5nZXMgdG8gQ2hpY2tlbgoJICAgIGJlY2F1c2UgbWFqb3IgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgc29vbiBhbnl3YXkuICBObwoJICAgIGNoYW5nZXMgdG8gSmF2YSwgT0NhbWwsIEMjIGJlY2F1c2UgdGhleSBkbyBub3Qgc2VlbSB0bwoJICAgIGhhdmUgYSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuCgogICAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZIFtUY2xdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtQZXJsNSwgUEhQNCwgUGlrZSwgUHl0aG9uLCBSdWJ5LCBUY2xdOiBVc2UgdGhlCgkgICAgcHJlcHJvY2Vzc29yIHRvIHJlbmFtZSBleHRlcm5hbCBmdW5jdGlvbnMgb2YgdGhlIFNXSUcKCSAgICBydW50aW1lIEFQSSB0byBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uCgkgICAgU1dJR188bGFuZ3VhZ2U+XzxmdW5jdGlvbj4uICBUaGlzIHNob3VsZCBhbGxvdyBsaW5raW5nCgkgICAgbW9yZSB0aGFuIG9uZSBpbnRlcnByZXRlciBpbnRvIGEgcHJvZ3JhbS4KCjEwLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCBzaW5jZSBpbnRyb2R1Y2luZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGQ6OnN0cmluZyBkZWxlZ2F0ZXMuCiAgICAgICAgICAgIFRoZSBmaXggb3ZlcmNvbWVzIGxpbmtlciBlcnJvcnMgd2hlbiB1c2luZyBtb3JlIHRoYW4gb25lIFNXSUcgbW9kdWxlLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEFuZHJlYXMgU2No9nJrLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODIzMzAyIF0gSW5jciBUY2wgc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgQWxleGV5IER5YWNoZW5rby4KICAgICAgICAgICAgTm90ZTogbmVlZHMgZG9jdW1lbnRhdGlvbi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMyNSBdIG5ldyBQeXRob24gTW9kdWxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzLgogICAgICAgICAgICBSb2JpbiBEdW5uIHdyaXRlczoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgYSBudW1iZXIgb2YgY2hhbmdlcyB0byB0aGUgU1dJRyBweXRob24gbW9kdWxlLgoKICAgICAgICAgICAgMS4gQWRkIC1hcHBseSBvcHRpb24sIGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQgY29kZQogICAgICAgICAgICBvdXRwdXQgdG8gdXNlIHRoZSBmb28oKmFyZ3MsICoqa3cpIGNhbGxpbmcgc3ludGF4CiAgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgYXBwbHkoKS4gSWYgdGhlIC1hcHBseSBvcHRpb24gaXMKICAgICAgICAgICAgZ2l2ZW4gdGhlbiBjb2RlIGlzIGdlbmVyYXRlZCBhcyBiZWZvcmUuIFRoaXMgaXMgdmVyeQogICAgICAgICAgICBzaW1pbGFyIHRvIFBhdGNoICM3MzcyODEgYnV0IHRoZSBuZXcgLW1vZGVybiBvcHRpb24KICAgICAgICAgICAgbWFrZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoYXQgcGF0Y2ggdW5uZWNlc3Nhcnkgc28gaXQKICAgICAgICAgICAgaXMgbm90IGluY2x1ZGVkIGhlcmUuCgkgICAgCiAgICAgICAgICAgIDIuIEFkZCAtbmV3X3JlcHIgb3B0aW9uLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG15IFBhdGNoCiAgICAgICAgICAgICM3OTcwMDIgd2hpY2ggSSB3aWxsIG1hcmsgYXMgY2xvc2VkIHNpbmNlIGl0IGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBuZWVkZWQuIFdoZW4gdGhpcyBuZXcgb3B0aW9uIGlzIHVzZWQgdGhlbiB0aGUKICAgICAgICAgICAgX19yZXByX18gbWV0aG9kcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgd2lsbCBiZSBtb3JlIGluZm9ybWF0aXZlIGFuZCBnaXZlIGRldGFpbHMgYWJvdXQgdGhlCiAgICAgICAgICAgIHB5dGhvbiBjbGFzcyBhbmQgdGhlIEMrKyBjbGFzcy4KCSAgICAKICAgICAgICAgICAgMy4gQWRkICVmZWF0dXJlKCJhZGR0b2Z1bmMiKS4gSXQgYWxsb3dzIHlvdSB0byBpbnNlcnQKICAgICAgICAgICAgb25lIG9yIG1vcmUgbGluZXMgb2YgY29kZSBpbnNpZGUgdGhlIHNoYWRvdyBtZXRob2Qgb3IKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBpcyBhbHJlYWR5IGdlbmVyYXRlZCwgaW5zdGVhZCBvZgogICAgICAgICAgICByZXBsYWNpbmcgdGhlIHdob2xlIHRoaW5nIGxpa2UgJWZlYXR1cmUoInNoYWRvdyIpIGRvZXMuCiAgICAgICAgICAgIEZvciBfX2luaXRfXyBpdCBnb2VzIGF0IHRoZSBlbmQsIGZvciBfX2RlbF9fIGl0IGdvZXMKICAgICAgICAgICAgYXQgdGhlIGJlZ2luaW5nIGFuZCBmb3IgYWxsIG90aGVycyB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgICAgaXMgZXhwYW5kZWQgb3V0IHRvIGJlIGxpa2UKCSAgICAKICAgICAgICAgICAgZGVmIEJhcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICB2YWwgPSBfbW9kdWxlLkZvb19CYXIoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdmFsCgkgICAgCiAgICAgICAgICAgIGFuZCB0aGUgImFkZHRvZnVuYyIgY29kZSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0aGUKICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IHVzZWQgZm9yIGEKICAgICAgICAgICAgcGFydGljdWxhciBtZXRob2Qgb3IgZnVuY3Rpb24gdGhlbiB0aGUgc2hvcnRlciBjb2RlIGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBqdXN0IGxpa2UgYmVmb3JlLgoJICAgIAogICAgICAgICAgICA0LiBBIGxpdHRsZSBiaXQgb2YgcmVmYWN0b3JpbmcgdG8gbWFrZSBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgYWRkdG9mdW5jIGEgbGl0dGxlIGVhc2llci4KCSAgICAKICAgICAgICAgICAgNS4gQWRkZWQgYSAtbW9kZXJuIGNvbW1hbmQtbGluZSBmbGFnIHRoYXQgd2lsbCBjYXVzZQogICAgICAgICAgICBTV0lHIHRvIG9taXQgdGhlIGNydWZ0IGluIHRoZSBwcm94eSBtb2R1bGVzIHRoYXQgYWxsb3dzCiAgICAgICAgICAgIGl0IHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4yLiBUaGUKICAgICAgICAgICAgcmVzdWx0IGlzIGEgc2ltcGxlciwgY2xlYW5lciBhbmQgZmFzdGVyIHB5dGhvbiBwcm94eQogICAgICAgICAgICBtb2R1bGUsIGJ1dCBvbmUgdGhhdCByZXF1aXJlcyBQeXRob24gMi4yIG9yIGdyZWF0ZXIuIAoKMTAvMzEvMjAwMzogYmVhemxleSAKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxOSBdIFhNTCBtb2R1bGUgdHdlYWtzLgogICAgICAgICAgICBUaGlzIGFkZHMgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAteG1sbGl0ZSB0aGF0IAogICAgICAgICAgICBncmVhdGx5IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBlbWl0dGVkIFhNTCBjb2RlIGJ5CiAgICAgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgZmllbGRzIG1vc3RseSB1c2VkIGluIFNXSUcncwogICAgICAgICAgICBpbnRlcm5hbCBwcm9jZXNzaW5nLiAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxNyBdIEFkZHMgRG9oU3BsaXRMaW5lcyBmdW5jdGlvbi4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4Mjc5MDcgXSBhcmdvdXQgb2JqZWN0cyBub3QgYmVpbmcgd3JhcHBlZCBwcm9wZXJseSAoUEFUSCkuCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoJICAgICAKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNjk5NiBdIHBlcmwgdHlwZSBjaGVja2luZyBpZ25vcmVzIHBlcmwgc3ViY2xhc3Nlcy4KICAgICAgICAgICAgVGhpcyBlbmhhbmNlbWVudCBtYWtlcyBpdCBzbyB3cmFwcGVkIGNsYXNzZXMgYW5kIHN0cnVjdHMgY2FuCiAgICAgICAgICAgIGJlIHN1YmNsYXNzZWQgaW4gUGVybCBhbmQgdXNlZCBub3JtYWxseS4gCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoKMTAvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW50UHRyIG1hcnNoYWxsZWQgd2l0aCBhIHZvaWQqIGluc3RlYWQgb2YgaW50IGluIEMgZnVuY3Rpb24gCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gVGhlIGNhc3RzIHRodXMgbG9vayBtb3JlIGNvbnZlbnRpb25hbCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgLy8gb2xkCiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeChpbnQgamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKihTaGFwZSAqKikmamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbmV3CiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeCh2b2lkICogamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKFNoYXBlICopamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCjEwLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIGEgY2xhc3MgaGFzIG92ZXJsb2FkZWQgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCB4KTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXIoaW50IHgsIGludCB5KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgYW5kIHRoZSBjbGFzcyBpcyB1c2VkIGFzIGEgc21hcnQgcG9pbnRlcjoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29QdHIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgU1dJRyB3b3VsZCB0cnkgdG8gZXhwb3NlIHRoZSBzdGF0aWMgbWVtYmVyIEZvbzo6YmFyCiAgICAgICAgICAgIHRocm91Z2ggRm9vUHRyLS0tcmVzdWx0aW5nIGJvZ3VzIHdyYXBwZXIgY29kZSBhbmQgYSBjb21waWxlcgogICAgICAgICAgICBlcnJvci4KCiAgICAgICAgICAgIER1ZSB0byB0aGUgd2F5IGluIHdoaWNoIG92ZXJsb2FkaW5nIGlzIGhhbmRsZWQsIGl0IGlzCiAgICAgICAgICAgIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gZWxpbWluYXRlIHRoZSBzdGF0aWMgbWV0aG9kIGluCiAgICAgICAgICAgIHRoaXMgY2FzZS4gIFRoZXJlZm9yZSwgaXQgaXMgc3RpbGwgZXhwb3NlZC4gIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSBub3cgY29tcGlsZXMgYW5kIHdvcmtzLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZSwgTXpTY2hlbWUsIENoaWNrZW5dOiBSZW1vdmUgc3ltYm9sIGNsYXNoZXMgYmV0d2VlbgoJICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBieSByZW5hbWluZyBhbGwgZXh0ZXJuIGNvbW1vbi5zd2cKCSAgICBmdW5jdGlvbnMgd2l0aCB0aGUgcHJlcHJvY2Vzc29yLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgYmFzaWMgR09PUFMgc3VwcG9ydCwgY29udHJpYnV0ZWQgYnkgSm9obiBMZW56LgoJICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KCSAgICAKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTmV3IG9wdGlvbiwgLW9ubHktc2V0dGVycywgd2hpY2ggZGlzYWJsZXMKCSAgICB0cmFkaXRpb25hbCBnZXR0ZXIgYW5kIHNldHRlciBwcm9jZWR1cmVzIGZvciBzdHJ1Y3R1cmUgc2xvdHMuCgoxMC8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBydW4gdGVzdCBmb3IgcmVmZXJlbmNlX2dsb2JhbF92YXJzIGJ5IEpvaG4gTGVuei4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUGFydGlhbCBzb2x1dGlvbiB0byBbIDc5MjE4MCBdIEMrKyBzbWFydC1wb2ludGVyL25hbWVzcGFjZSBtaXh1cCByZXZpc2l0ZWQuCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIGlzIG5vdCBlYXN5IHRvIGZpeCAoYXQgbGVhc3QgaXQgZG9lc24ndCBzZWVtIHNvKSwgYnV0IGlzCiAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIGluc3RhbnRpYXRpb24gb2YgcXVhbGlmaWVkIHRlbXBsYXRlcyBpbnNpZGUgb2Ygb3RoZXIKICAgICAgICAgICAgbmFtZXNwYWNlcy4gICBTV0lHIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UgcmF0aGVyCiAgICAgICAgICAgIHRoYW4gZ2VuZXJhdGluZyBicm9rZW4gd3JhcHBlcnMuCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODAwMDEyIF0gRU5URVIgbWFjcm8gZnJvbSBDT1JFL3Njb3BlLmggY2xhc2hlcyB3aXRoIGxpYmMgc2VhcmNoLmguCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMTUxOCBdIENhc3RpbmcgaW50cyB0byBkb3VibGVzICh3LyBzb2x1dGlvbj8pCiAgICAgICAgICAgIEFkZHJlc3NlcyBhIHByb2JsZW0gd2l0aCBvdmVybG9hZGluZyBpbiB0aGUgUGVybCBtb2R1bGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBEYWxsZXkuCgowOS8yOC8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlIHdpdGggLXNjbSBvcHRpb25dIEZpeCB0eXBvIGluIGdlbmVyYXRlZCBjb2RlIGZvcgoJICAgIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzLiAgUmVwb3J0ZWQgYnkgSm9obiBMZW56LgoKMDkvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMjUyOCBdIGV4dGVybnMgbm90IGNvcnJlY3Qgd2hlbiB0aHJvdyBpcyBpbiBzaWduYXR1cmUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgogICAgICAgICAgICAKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNXSUcgd2FzIGdlbmVyYXRpbmcgYSBudW1iZXIgb2Ygc3ltYm9scyB0aGF0IGRpZG4ndCBjb21wbHkgd2l0aCAKICAgICAgICAgICAgdGhlIElTTyBDL0MrKyBzdGFuZGFyZCwgaW4gcGFydGljdWxhciBJU08vSUVDIDE0ODgyOjE5OTgoRSkgMTcuNC4zLjEuMgogICAgICAgICAgICB3aGVyZSBkb3VibGUgdW5kZXJzY29yZXMgYXJlIGZvcmJpZGRlbiBhcyB3ZWxsIGFzIHN5bWJvbHMgc3RhcnRpbmcgd2l0aAogICAgICAgICAgICBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGFuIHVwcGVyIGNhc2UgbGV0dGVyLiBNb3N0IG9mIHRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiByb290ZWQgb3V0LiBTZWUgbmV3IHNlY3Rpb24gYWRkZWQgdG8gaW50ZXJuYWxzLmh0bWwgZGV2ZWxvcG1lbnQKICAgICAgICAgICAgbWFudWFsICdTeW1ib2wgTmFtaW5nIEd1aWRlbGluZXMgZm9yIEdlbmVyYXRlZCBDL0MrKyBDb2RlJy4KCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaXJlY3RvciB0eXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgaW52ICAgICA9PiBkaXJlY3RvcmluCiAgICAgICAgICAgIG91dHYgICAgPT4gZGlyZWN0b3JvdXQKICAgICAgICAgICAgYXJnb3V0diA9PiBkaXJlY3RvcmFyZ291dAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8xOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciBjb25zdHJ1Y3RvcnMgbm93IGRlZmF1bHQgdG8gX19kaXNvd24gPSAwLCAKCSAgICB3aGljaCBpcyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgYW5kIGZpeGVzIHRoZSBkaXJlY3Rvcl9maW5hbGl6ZXIgCgkgICAgdGVzdCBjYXNlIHVuZGVyIHB5dGhvbi4KCjA5LzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIC0gVHlwZW1hcHMgYWRkZWQgZm9yIHN0ZDo6c3RyaW5nIGFuZCBjb25zdCBzdGQ6OnN0cmluZyAmLgogICAgICAgICAgICAgICAgIC0gTmV3IGRlbGVnYXRlIGZvciBjcmVhdGluZyBhIEMjIHN0cmluZyBnaXZlbiBhIGNoYXIgKi4gSXQKICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNhbGxpbmcgU1dJR19jc2hhcnBfc3RyaW5nX2NhbGxiYWNrIGFzIHNob3duCiAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RkOjpzdHJpbmcgJ291dCcgdHlwZW1hcC4gVXNlZnVsIGlmIHRoZSByZXR1cm4gdHlwZSBpcwogICAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIGEgQyMgc3RyaW5nIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSAKICAgICAgICAgICAgICAgICAgIGZvciBjbGVhbmluZyB1cCBtZW1vcnkgYXMgdGhlIEMjIGdhcmJhZ2UgY29sbGVjdG9yIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlIG1lbW9yeSBjcmVhdGVkIGluIEMvQysrIGFuZCB0aGVuIHJldHVybmVkIGFzIGEgQyMgc3RyaW5nLgogICAgICAgICAgICAgICAgIC0gVGhlIGV4Y2VwdGlvbiBkZWxlZ2F0ZXMgaGF2ZSBtb3ZlZCBpbnRvIGFuIGlubmVyIGNsYXNzIGluIHRoZQogICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIGNsYXNzLCB0aGVyZWJ5IGZyZWVpbmcgdXAgdGhlIHN0YXRpYyBjb25zdHJ1Y3Rvci4KCjA5LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKEludGVybmFscykKICAgICAgICAgICAgTWFqb3IgcmVmYWN0b3Jpbmcgb2YgaXRlcmF0aW9uIG92ZXIgbGlzdHMgYW5kIGhhc2hlcy4gIFRoZQogICAgICAgICAgICBET0ggbGlicmFyeSBub3cgdXNlcyBpdGVyYXRvcnMuICBUaGV5IHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIExpc3QgKmwgPSAoc29tZSBsaXN0KTsKCiAgICAgICAgICAgICAgICBJdGVyYXRvciBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gY29udGFpbnMgdGhlIGFjdHVhbCBsaXN0IGl0ZW0uCiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGlzIE5VTEwgYXQgZW5kIG9mIGxpc3QKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIYXNoICpoID0gKHNvbWUgaGFzaCk7CiAgICAgICAgICAgICAgICBJdGVyYXRvciBqOwogICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QoaCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBqLml0ZW0gY29udGFpbnMgaGFzaCB0YWJsZSBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gai5rZXkgIGNvbnRhaW5zIGhhc2ggdGFibGUga2V5CiAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBqLml0ZW0gYW5kIGoua2V5IGFyZSBOVUxMIGF0IGVuZAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIFRoZSBvbGQgaXRlcmF0aW9uIGZ1bmN0aW9ucyBGaXJzdGl0ZW0oKSwgTmV4dGl0ZW0oKSwgRmlyc3RrZXkoKSwKICAgICAgICAgICAgYW5kIE5leHRrZXkoKSBhcmUgZ29uZS4gIAoKICAgICAgICAgICAgVGhlIG5ldyBpdGVyYXRvcnMgYXJlIHNpbXBsZXIsIHJlc3VsdCBpbiBiZXR0ZXIgbWVtb3J5IHVzZSwKICAgICAgICAgICAgYW5kIG1heSBiZSBmYXN0ZXIuICBBbHNvLCB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBwcm9ibGVtcwogICAgICAgICAgICBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSBsaXN0L2hhc2ggaW4gbXVsdGlwbGUgcGxhY2VzIGF0CiAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBmaW5lOgoKICAgICAgICAgICAgICAgICBJdGVyYXRvciBpLGo7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChsKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIChUaGlzIG5ldmVyIHdvcmtlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucykuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4gIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayAKICAgICAgICAgICAgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucyB0byBTV0lHIChvciBnaXZlIHRoZW0gZnVydGhlciBlbmNvdXJhZ2VtZW50CiAgICAgICAgICAgIHRvIGpvaW4gdGhlIFNXSUcgQ1ZTLXRyZWUgOi0pLgoKMDkvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IG1lbW9yeSBsZWFrcyBpbiB0aGUgImxpc3QtdmVjdG9yLmkiIHR5cGVtYXBzLgoKMDkvMDkvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBVc2UgQ19ta19ib29sIHJhdGhlciB0aGFuIENfbWtib29sLiAgVGhpcyBmaXhlcwoJICAgIHRoZSB3cmFwcGluZyBvZiBib29sZWFuIHZhbHVlcyBmb3IgQ2hpY2tlbiAxLjEwIGFuZCBuZXdlci4KCSAgICBSZXBvcnRlZCBieSBEYXZlIDxodW5kb0B5YWhvby5jb20+IC8gRmVsaXggV2lua2VsbWFubgoJICAgIDxmZWxpeEBwcm94aW1hLW10LmRlPi4KCjA5LzA1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3JzIGltcGxlbWVudGVkIGZvciBKYXZhLiBJbiBzdW1tYXJ5IHRoaXMgaXMgYSBiaWcgbmV3IGZlYXR1cmUgCiAgICAgICAgICAgIHdoaWNoIHN1cHBvcnRzIHVwY2FsbHMgZnJvbSBDKysgdG8gSmF2YS4gQ29kZSBpcyBnZW5lcmF0ZWQgdG8gc3VwcG9ydCBDKysgCiAgICAgICAgICAgIGNhbGxiYWNrcyB0byBjYWxsIGludG8gSmF2YSBhbmQgdHJ1ZSBwb2x5bW9ycGhpYyBiZWhhdmlvdXIgZm9yIEphdmEgY2xhc3NlcyAKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIEMrKyBjbGFzc2VzLiBTZWUgamF2YS5odG1sIGZvciBkZXRhaWxzLiBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgoKMDkvMDUvMjAwMzogVGlnZXIKICAgICAgICAgICAgQ3JlYXRlZCBjb250cmFjdCBleGFtcGxlIGRpcmVjdG9yeSBhdCAvU1dJRy9FeGFtcGxlcy9jb250cmFjdAogICAgICAgICAgICBBZGRlZCBzaW1wbGUgY29udHJhY3QgZXhhbXBsZXMgKHNpbXBsZV9jICYgc2ltcGxlX2N4eCkKICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgbW9kdWxlJ3Mgb3V0cHV0IGZvcm1hdAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRlc3Qtc3VpdGUgYnVpbGQgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAtIE11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIHdvcmtpbmcgZm9yIHRoZSB0ZXN0IHN1aXRlLCBzbyBpdCBpcyBub3cKICAgICAgICAgICAgICBwb3NzaWJsZSB0byBydW4gY29uZmlndXJlIGluIG11bHRpcGxlIHN1YmRpcmVjdG9yaWVzIGFuZCBydW4gdGhlIHRlc3QKICAgICAgICAgICAgICBzdWl0ZSBpbiBlYWNoIG9mIHRoZXNlIHN1YiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSAnbWFrZSBkaXN0Y2xlYW4nIGZpeGVkIHNvIGl0IGRvZXNuJ3QgYm9tYiBvdXQgb24gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeQogICAgICAgICAgICAgIHdoZW4gdXNpbmcgbXVsdGlwbGUgc3ViZGlyZXRvcnkgYnVpbGRzLiBSZXF1aXJlZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQ6CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BlcmwgLT4gRXhhbXBsZXMvR0lGUGxvdC9QZXJsNQogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QaHAgIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGhwNAogICAgICAgICAgICAgIFRoZXNlIG5ldyBkaXJlY3RvcmllcyB1c2VkIHRvIGJlIHN5bWJvbGljIGxpbmtzIHRvIHRoZSBvbGQgZGlyZWN0b3J5LgogICAgICAgICAgICAgIEFsc28gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvUGVybCBzeW1ib2xpYyBsaW5rIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICAgICAgIC0gUnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgb3RoZXIgdGhhbiBmcm9tIHRoZSByb290IGRpcmVjdG9yeSwgc2F5CiAgICAgICAgICAgICAgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9weXRob24gd2lsbCBub3cgZGlzcGxheSBhbGwgdGhlIGNvZGUgYmVpbmcKICAgICAgICAgICAgICBleGVjdXRlZC4KICAgICAgICAgICAgLSBUaGUgZm9sbG93aW5nIDMgQyMgY29tcGlsZXJzIGFyZSBkZXRlY3RlZCBkdXJpbmcgY29uZmlndXJlIGFuZCB3b3JrIHdpdGggCiAgICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGU6IE1vbm8sIFBvcnRhYmxlLk5FVCBhbmQgTWljcm9zb2Z0LgoKMDkvMDEvMjAwMzogVGlnZXIKICAgICAgICAgICAgQWRkZWQgaW5oZXJpdGFuY2Ugc3VwcG9ydCBmb3IgZGVzaWduIGJ5IGNvbnRyYWN0IGZlYXR1cmUuCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk0OTE0IF0gV3JvbmcgdHlwZXMgaW4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIFNXSUcgd2FzIG5vdCBoYW5kbGluZyBhcmd1bWVudHMgY29ycmVjdGx5IGluIHRlbXBsYXRlIAogICAgICAgICAgICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vPFQgKj4gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIFQgKmJsYWgoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0ludCkgRm9vPGludCAqPjsKCiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MsIHRoZSByZXR1cm4gdHlwZSBvZiBibGFoIHdhcyBzZXQgdG8KICAgICAgICAgICAgJ2ludCAqKicsIGJ1dCBpdCBzaG91bGQgcmVhbGx5IGJlICdpbnQgKicuICBUaGlzIGhhcyBiZWVuCiAgICAgICAgICAgIGZpeGVkLCBidXQgaXQgd2lsbCBhZmZlY3QgYWxsIHByaW9yIHVzZXMgb2YgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbi4KIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg2Mzk0IF0gUGF0Y2ggZm9yIGdlbmVyYXRlZCBwZXJsIGNvZGUgZG9lcyBub3QgY29tcGlsZSB1bmRlciBSZWRIYXQ5LgogICAgICAgICAgICBSZXBvcnRlZCBieSBTY290dCBGaW5uZXJhbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE1NzkgXSAodW5zaWduZWQpIGxvbmcgbG9uZyBoYW5kbGVkIGluY29ycmVjdGx5IChUY2wpLgogICAgICAgICAgICBUaGlzIHdhcyBhbiBlcnJvciBpbiB0aGUgVGNsIHR5cGVtYXBzLmkgZmlsZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEtqZWxsIFdvb2RpbmcuCiAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzMgXSBubyB3YXkgdG8gcmVuYW1lIGNsYXNzZXMgY29taW5nIGZyb20gQyBzdHJ1Y3R1cmVzLgogICAgICAgICAgICBUaGlzIHByb2JsZW0gcmVsYXRlcyB0byByZW5hbWluZyBvZiBhbm9ueW1vdXMgc3RydWN0dXJlcyB3aXRoIGEKICAgICAgICAgICAgdHlwZWRlZi4gIEZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCiAgICAgICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTc2IF0gLWhlbHAgc2VlbXMgdG8gaW1wbHkgdGhhdCBvbmx5IHRjbC1zcGVjaWZpYyBvcHRpb25zIGV4aXN0LgogICAgICAgICAgICBBZGRlZCBhIGNvbW1lbnQgdG8gYWxlcnQgdXNlciB0byBvdGhlciBvcHRpb25zLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTgyMDUgXSBTZWdmYXVsdCBpbiBTV0lHX0NvbnZlcnRQdHIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFByYWJodSBSYW1hY2hhbmRyYW4uCgowOC8zMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNb2RpZmllZCB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgaW4gcHl0aG9uL3N0ZF9jb21wbGV4LmkgdG8gdXNlIHRoZSAKCSAgICBuZXctc3R5bGUgbWFjcm8gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB3aGljaCBlbGltaW5hdGVkIHNvbWUKCSAgICByZWR1bmRhbnQgY29kZS4gIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlc2UgdHlwZW1hcHMgYXMgd2VsbCwgYWx0aG91Z2gKCSAgICBtb3JlIHRlc3RpbmcgaXMgbmVlZGVkLgoKMDgvMjkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ29tcGxldGVkIGluaXRpYWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYWJzdHJhY3QgY2xhc3NlcyB3aXRoIGRpcmVjdG9ycy4KCSAgICBDb25zdHJ1Y3RvciB3cmFwcGVycyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWJzdHJhY3QgY2xhc3NlcyB0aGF0IGhhdmUKCSAgICBkaXJlY3RvcnMsIGFuZCBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yIGNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGV0aGVyIHRoZSBwcm94eSBjbGFzcyBoYXMgYmVlbiBzdWJjbGFzc2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgTm8gY2hlY2tzIGFyZSBtYWRlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gZW5zdXJlIHRoYXQgYWxsIHB1cmUgdmlydHVhbAoJICAgIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBJbnN0ZWFkLCBjYWxscyB0bwoJICAgIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyB3aWxsIHRocm93IFNXSUdfRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTgoJICAgIGV4Y2VwdGlvbnMgaW4gQysrLgoKCSAgICBJbnRlZ3JhdGVkIFByYWJodSBSYW1hY2hhbmRyYW4ncyB0eXBlbWFwIHBhdGNoZXMsIHdoaWNoIHByb3ZpZGUgZGlyZWN0b3IKCSAgICB0eXBlbWFwIHN1cHBvcnQgZm9yIGVudW1zIGFuZCBzdGQ6OnNpemVfdCwgYW5kIGZpeCBhIGNvdXBsZSBidWdzIGluIHRoZSAKCSAgICBkaXJlY3RvciBzdGQ6OnZlY3Rvcjw+IHR5cGVtYXBzLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wbGVtZW50ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciB0aHJvd2luZyBDIyBleGNlcHRpb25zIGZyb20gQy9DKysgY29kZS4KICAgICAgICAgICAgQSBmZXcgZGVsZWdhdGUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGNhbGxpbmcgd2hpY2ggdGhlbiB0aHJvdyB0aGUgQyMKICAgICAgICAgICAgZXhjZXB0aW9uLiBVc2UgdGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24gZnVuY3Rpb24gZnJvbSBDL0MrKyB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIG9yIGNzaGFycGhlYWQuc3dnIGZvciBhbGwgYXZhaWxhYmxlIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oU1dJR19DU2hhcnBFeGNlcHRpb24sICJleGNlcHRpb24gZGVzY3JpcHRpb24iKTsKCiAgICAgICAgICAgIFRoZSAndGhyb3dzJyB0eXBlbWFwcyBhcmUgYWxzbyBub3cgaW1wbGVtZW50ZWQsIHNvIGNvZGUgaXMgYXV0b21hdGljYWxseSAKICAgICAgICAgICAgZ2VuZXJhdGVkIHRvIGNvbnZlcnQgYW55IEMrKyBleGNlcHRpb24gaW50byBhIEMjIFN5c3RlbS5FeGNlcHRpb24gd2hlbiB0aGUgQysrIAogICAgICAgICAgICBtZXRob2QgZGVjbGFyZXMgYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gc3VjaCBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhCYXIpOwoKICAgICAgICAgICAgQWxzbyBhbnkgcGFyYW1ldGVycyB0aGF0IGFyZSByZWZlcmVuY2VzIHRvIGEgQysrIGNsYXNzIG9yIGEgY2xhc3MgcGFzc2VkIGJ5IHZhbHVlCiAgICAgICAgICAgIGFuZCBhcmUgcGFzc2VkIGFzIGEgQyMgbnVsbCB3aWxsIG5vdyB0aHJvdyBhIEMjIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggdG8gbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBhbGwgcGludm9rZSBtZXRob2RzIHNvIHRoYXQgdGhleQogICAgICAgICAgICBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgYnkgZGVmYXVsdCBpbiB0aGUgQyMgJ3N0YXRpYyBleHRlcm4nIGRlY2xhcmF0aW9ucyAKICAgICAgICAgICAgKF9fc3RkY2FsbCBpcyB1c2VkIG9uIFdpbmRvd3MpLgoKMDgvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZXdvcmtlZCBzdGQ6OnN0cmluZyB0eXBlbWFwcy4gRml4ZXMgYSBudW1iZXIgb2Ygc3RyaW5nIGluIHN0ZCBuYW1lc3BhY2UgCiAgICAgICAgICAgIHByb2JsZW1zLiBGb3IgZXhhbXBsZSAldGVtcGxhdGUgdmVjdG9yPHN0cmluZz4uIFRoZSB0ZW1wbGF0ZWQgY2xhc3MnIGdldCBtZXRob2QgCiAgICAgICAgICAgIHdhc24ndCByZXR1cm5pbmcgYSBKYXZhIFN0cmluZywgYnV0IGEgU1dJR1RZUEVfcF9zdHJpbmcuIFJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFphY2ggQmF1bS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1MjIgXSAxLjMuMTkgc2VnZmF1bHQgaW4gU3dpZ1R5cGVfYWRkX3BvaW50ZXIvRG9oSW5zZXJ0aXRlbS4KICAgICAgICAgICAgUmVsYXRlZCB0byBwcm9ibGVtIHdpdGggdW5uYW1lZCBjbGFzcyBoYW5kbGluZyBpbiBQZXJsIG1vZHVsZS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1NjMgXSBNaXNzaW5nIGluZGljYXRpb24gb2Ygb3B0aW9uYWwgYXJndW1lbnRzLgogICAgICAgICAgICBUY2wgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODc0MzIgXSBsb25nIHBhcmFtIGhhbmRsZWQgYXMgaW50LiAgVGNsIG1vZHVsZQogICAgICAgICAgICBub3cgdXNlcyBUY2xfR2V0TG9uZ0Zyb21PYmogdG8gY29udmVydCBpbnRlZ2VyIHZhbHVlcy4KCjA4LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU5ODkgXSBudW1lcmljIHRlbXBsYXRlIHBhcmFtZXRlcnMuICAgVGhlcmUgd2VyZQogICAgICAgICAgICBzb21lIGVycm9ycyBpbiB0ZW1wbGF0ZSBleHBhbnNpb24gcmVsYXRlZCB0byB0aGUgdXNlIG9mCiAgICAgICAgICAgIGFycmF5cyB3aGVyZSB0aGUgYXJyYXkgZGltZW5zaW9uIHdhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KICAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUmVwb3J0ZWQgYnkgQnJ5YW4gR3JlZW4uCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIGRpcmVjdG9yIHR5cGVtYXAgKG91dHYpIGZvciByZXR1cm4gYnkgdmFsdWUgYW5kIGNsZWFuZWQgdXAgdXAgYSBmZXcgCgkgICAgb2YgdGhlIGNvbW1lbnRlZCBkaXJlY3RvciB0eXBlbWFwcy4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gZm9yIGRpcmVjdG9yIGNsYXNzZXMgdG8gaWdub3JlIHByaXZhdGUKCSAgICBjb25zdHJ1Y3RvcnMuICBQcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBhbHNvIGlnbm9yZWQgZm9yIG5vdywgcGVuZGluZwoJICAgIGEgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gb2Ygd3JhcHBpbmcgY2xhc3NlcyB0aGF0IG9ubHkgZGVmaW5lIHByb3RlY3RlZAoJICAgIGNvbnN0cnVjdG9ycy4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1vdXRkaXIgPGRpcj4gdG8gc3BlY2lmeSB3aGVyZSB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhcmdldCBsYW5ndWFnZXMgbGlrZSBQeXRob24sCiAgICAgICAgICAgIEphdmEgZXRjIHdoaWNoIGdlbmVyYXRlIHByb3h5IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsYW5ndWFnZS4KICAgICAgICAgICAgVGhpcyBvcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhlIEMvQysrIHdyYXBwZXIgZmlsZS4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBPbiBXaW5kb3dzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKG90aGVyIHRoYW4gdGhlIF93cmFwLmMgb3IgX3dyYXAuY3h4IGZpbGVzKQogICAgICAgICAgICB3ZXJlIHNvbWV0aW1lcyBpbmNvcnJlY3RseSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzCiAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIHVzZWQgdGhlIFVuaXggcGF0aCBzZXBhcmF0b3IuIFRoZSBXaW5kb3dzIHBhdGggc2VwYXJhdG9yIAogICAgICAgICAgICBzaG91bGQgbm93IGJlIHVzZWQuIEJ1ZyByZXBvcnRlZCBieSBSb2JlcnQgRGF2aWVzLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhcnJheSB2YXJpYWJsZSBzZXQgdHlwZW1hcCB0byBQZXJsIG1vZHVsZS4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU2NzcgXSBBcnJheSBpbml0IGNhdXNlcyBjb2RlZ2VuIGJ1Zy4uCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc5MDYyIF0gQ2xhc3MiXG4iOjpmb28gbm90IHN1cHBvcnRlZC4gIFNXSUcKICAgICAgICAgICAgc2hvdWxkIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHdoaXRlc3BhY2UgaW4gYmV0d2VlbiAKICAgICAgICAgICAgbmFtZXNwYWNlIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZSAiQSA6OiBGb28gOjogQmFyIi4KICAgICAgICAgICAgCjA3LzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgcGFyYW1ldGVycyB3aGljaCBhcmUgY2xhc3NlcyB0aGF0IGFyZSBwYXNzZWQgYnkgdmFsdWUgYW5kIGhhdmUgCiAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZS4gQSBjb3B5IGNvbnN0cnVjdG9yIGZvciBTd2lnVmFsdWVXcmFwcGVyIGlzIHJlcXVpcmVkIAogICAgICAgICAgICAoU0YgIzc4MDA1NikuIEFsc28gZml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4gVGhlc2UgbW9kcwogICAgICAgICAgICBhbHNvIGZpeCBTRiAjNzgwMDU0LgoKMDcvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBydW4tdGltZSBlcnJvciBtZXNzYWdlIGZvciBwb2ludGVycyBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBab29rby4KCjA3LzEwLzIwMDM6IGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgW0FsbW9zdCBhbGwgbGFuZ3VhZ2VzXSBXcmFwcGVycyBmb3Igc3RkOjpwYWlyIGFkZGVkLgoJICAgIFR5cGVtYXBzIGZvciBQeXRob24sIFJ1YnksIEd1aWxlIGFuZCBNelNjaGVtZS4KCjA3LzAxLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gSGFuZGxlIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgYXJnb3V0IHR5cGVtYXAKCSAgICBwZXIgZnVuY3Rpb24uCgowNi8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBTRiAjNjcwOTQ5IHJlcXVlc3QuIFRoZSBkZXN0cnVjdG9yIHdyYXBwZXIgZnVuY3Rpb24gbmFtZSBpcyBub3cgCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZS4gIEEgbmV3IGF0dHJpYnV0ZSBjYWxsZWQgbWV0aG9kbmFtZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFkZXN0cnVjdC9qYXZhZGVzdHJ1Y3RfZGVyaXZlZCAoSmF2YSkgb3IgY3NkZXN0cnVjdC9jc2Rlc3RydWN0X2Rlcml2ZWQgKEMjKQogICAgICAgICAgICB0eXBlbWFwcyBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lLiBGb3IgZXhhbXBsZSBpbiBKYXZhIHRoZSBkZXN0cnVjdG9yIGlzIAogICAgICAgICAgICB3cmFwcGVkIGJ5IGRlZmF1bHQgd2l0aCB0aGUgZGVsZXRlIG1ldGhvZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZGVzdHJ1Y3QsIG1ldGhvZG5hbWU9ImRlbGV0ZSIpIFNXSUdUWVBFIHsuLi59CgowNi8yNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgdGhyb3dzIGF0dHJpYnV0ZSBmb3IgYWRkaW5nIGV4Y2VwdGlvbiBjbGFzc2VzIHRvIHRoZSB0aHJvd3MKICAgICAgICAgICAgY2xhdXNlIGFsc28gbm93IHdvcmtzIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlbWFwczogCiAgICAgICAgICAgIG5ld2ZyZWUKICAgICAgICAgICAgamF2YWluLCBqYXZhb3V0IChKYXZhKQogICAgICAgICAgICBjc2luLCBjc291dCAoQyMpCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlICdBbkV4Y2VwdGlvbicgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGhyb3dzIGNsYXVzZSBpbiB0aGUKICAgICAgICAgICAgcHJveHkgZnVuY3Rpb246CgogICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0LCB0aHJvd3M9IkFuRXhjZXB0aW9uIikgaW50IHsKICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWx1ZT0kam5pY2FsbDsKICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZT09MCkgdGhyb3cgbmV3IEFuRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgICAgICAgIH0KCjA2LzI1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIHR5cGVtYXAgbWFyc2hhbGxpbmcgY2hlY2tzIGZvciBudWxsIHBvaW50ZXJzIHdoZW4KCSAgICB3YWxraW5nIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbnN0ZWFkIG9mIHJlbHlpbmcgc29sZXkgb24gdGhlIHBhcmFtZXRlcgoJICAgIGNvdW50LiAgQ3VyZXMgYSBzZWdmYXVsdCB0aGF0IG9jY3VyZWQgZm9yIG11bHRpcGxlIGFyZ3VtZW50IGludiB0eXBlbWFwcy4KCSAgICBTb21lb25lIHdpdGggbW9yZSBTd2lnIGV4cGVyaWVuY2Ugc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIGNvZGUuCgowNi8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIERvbid0IGVtaXQgY2FsbHMgdG8gIkNfY2hlY2tfZm9yX2ludGVycnVwdCIsCgkgICAgd2hpY2ggbWF5IHJlc3VsdCBpbiBhbiBlbmRsZXNzIGxvb3AuICBQYXRjaCBieSBmZWxpeEBwcm94aW1hLW10LmRlLgoKMDYvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRmluYWxpemVycyBub3cgdXNlIGRlc3RydWN0b3Igc3ludGF4IGFzIHRoZSBvdmVycmlkZSB3aGljaCB3YXMgdXNlZCBpbiAKICAgICAgICAgICAgdGhlIEZpbmFsaXplIG1ldGhvZCBpcyBub3QgaW4gdGhlIEVDTUEgc3RhbmRhcmRzLCBzcG90dGVkIGJ5IHRoZSBNUyBjb21waWxlci4KCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEEgbnVtYmVyIG9mIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcmVtb3ZlIHRoZSBKYXZhIG5hbWluZyAKICAgICAgICAgICAgdGhhdCB3YXMgdXNlZCBpbiB0aGUgQyMgbW9kdWxlLgogICAgICAgICAgICAKICAgICAgICAgICAgVHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGpuaSAgICAgICAgICAgICAgICAgICAgICAgICAtPiBjdHlwZQogICAgICAgICAgICBqdHlwZSAgICAgICAgICAgICAgICAgICAgICAgLT4gaW10eXBlCiAgICAgICAgICAgIGpzdHlwZSAgICAgICAgICAgICAgICAgICAgICAtPiBjc3R5cGUKICAgICAgICAgICAgamF2YWluICAgICAgICAgICAgICAgICAgICAgIC0+IGNzaW4KICAgICAgICAgICAgamF2YW91dCAgICAgICAgICAgICAgICAgICAgIC0+IGNzb3V0CiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzICAgICAgICAgICAgICAtPiBjc2ludGVyZmFjZXMKICAgICAgICAgICAgamF2YWJhc2UgICAgICAgICAgICAgICAgICAgIC0+IGNzYmFzZQogICAgICAgICAgICBqYXZhY2xhc3Ntb2RpZmllcnMgICAgICAgICAgLT4gY3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqYXZhY29kZSAgICAgICAgICAgICAgICAgICAgLT4gY3Njb2RlCiAgICAgICAgICAgIGphdmFpbXBvcnRzICAgICAgICAgICAgICAgICAtPiBjc2ltcG9ydHMKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIC0+IGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMKICAgICAgICAgICAgamF2YWdldGNwdHIgICAgICAgICAgICAgICAgIC0+IGNzZ2V0Y3B0cgogICAgICAgICAgICBqYXZhZmluYWxpemUgICAgICAgICAgICAgICAgLT4gY3NmaW5hbGl6ZQoKICAgICAgICAgICAgRmVhdHVyZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGphdmFjb25zdCAgICAgICAgICAgICAgICAgICAtPiBjc2NvbnN0CiAgICAgICAgICAgIGphdmFtZXRob2Rtb2RpZmllcnMgICAgICAgICAtPiBjc21ldGhvZG1vZGlmaWVycwoKICAgICAgICAgICAgUHJhZ21hIGNoYW5nZXM6CiAgICAgICAgICAgIHByYWdtYShqYXZhKSAgICAgICAgICAgICAgICAtPiBwcmFnbWEoY3NoYXJwKQogICAgICAgICAgICBqbmljbGFzc2Jhc2UgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycyAgICAgIC0+IGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2NvZGUgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnRzICAgICAgICAgICAgIC0+IGltY2xhc3NpbXBvcnRzCiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlcyAgICAgICAgICAtPiBpbWNsYXNzaW50ZXJmYWNlcwoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lICAgICAgICAgICAgICAtPiAkY3NjbGFzc25hbWUKICAgICAgICAgICAgJGphdmFpbnB1dCAgICAgICAgICAgICAgICAgIC0+ICRjc2lucHV0CiAgICAgICAgICAgICRqbmljYWxsICAgICAgICAgICAgICAgICAgICAtPiAkaW1jYWxsCgogICAgICAgICAgICBUaGlzIHdpbGwgYnJlYWsgU1dJRyBpbnRlcmZhY2UgZmlsZXMgdGhhdCB1c2UgdGhlc2UgdHlwZW1hcHMsIGZlYXR1cmVzCiAgICAgICAgICAgIGFuZCBwcmFnbWFzLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSBvciB1c2UgbWFjcm9zIGZvciBiYWNrd2FyZHMKICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBBcHBsaWVkIE16U2NoZW1lIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5CgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LgoKICAgICAgICAgICAgLSBVcGRhdGVkIG16c2NoZW1lIHRvIHVzZSBTV0lHJ3MgY29tbW9uIHJ1bnRpbWUgdHlwZQogICAgICAgICAgICAgIHN5c3RlbSBmcm9tIGNvbW1vbi5zd2cuIAoKCSAgICAtIFRoZSBMaWIvbXpzY2hlbWUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIHRoZSBsYW5ndWFnZSBtb2R1bGVzOgogICAgICAgICAgICAgIG16c2NoZW1lLmkgd2FzIG1vdmVkIHRvIG16c2NoZW1lLnN3ZywgbXpzY2hlbWUuc3dnIGFuZAogICAgICAgICAgICAgIG16c2NoZW1lZGVjLnN3ZyBoYXZlIGJlZW4gcmVtb3ZlZCwgbXpydW4uc3dnICh3aGljaAogICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBydW50aW1lIGNvZGUpIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgLSBUaGUgc3dpZ19wcm94eSBzdHJ1Y3R1cmUgd2FzIHJlbmFtZWQgdG8gc3dpZ19tel9wcm94eS4KICAgICAgICAgICAgICBzd2lnX216X3Byb3h5IG5vdyBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbwogICAgICAgICAgICAgIHN0cnVjdHVyZS4gIAoKCSAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZAogICAgICAgICAgICAgIFNXSUdUWVBFICYuCgoJICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGJ5IGNhbGxpbmcgc2NoZW1lX2FkZF9maW5hbGl6ZXIoKSBoYXMKICAgICAgICAgICAgICBiZWVuIGFkZGVkLgoKCSAgICAqKiogTkVXIEZFQVRVUkUgW016U2NoZW1lXSAqKioKCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXBzOiBqYXZhZGVzdHJ1Y3QgYW5kIGphdmFkZXN0cnVjdF9kZXJpdmVkCiAgICAgICAgICAgIGZvciB0aGUgQysrIGRlc3RydWN0b3Igd3JhcHBlci4gVGhlIGphdmFkZXN0cnVjdCB2ZXJzaW9uIGdldHMgdXNlZCBieQogICAgICAgICAgICBjbGFzc2VzIGF0IHRoZSB0b3Agb2YgYW4gaW5oZXJpdGFuY2UgY2hhaW4gYW5kIHRoZSBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCAKICAgICAgICAgICAgdmVyc2lvbiBnZXRzIHVzZWQgYnkgb3RoZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFtDI10gY2lsZGlzcG9zZSBhbmQgY2lsZGlzcG9zZW92ZXJyaWRlIHR5cGVtYXBzIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgIGNzZGVzdHJ1Y3QgYW5kIGNzZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwcy4gVGhlIGRlbGV0ZSgpCiAgICAgICAgICAgIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdHMgZnVuY3Rpb25hbGl0eSBwdXQgaW50byB0aGVzZQogICAgICAgICAgICB0eXBlbWFwcyBkZXNpZ25lZCBmb3IgdGhlIERpc3Bvc2UoKSBtZXRob2QuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwcyBjc2ludGVyZmFjZXMgYW5kIGNzaW50ZXJmYWNlc19kZXJpdmVkIHJlcGxhY2UKICAgICAgICAgICAgdGhlIGphdmFpbnRlcmZhY2VzIHR5cGVtYXAuIEFsc28gZml4ZXMgdGhlIHBlY3VsaWFyaXR5IG9mIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGNoYWluIGluZGl2aWR1YWxseSBkZXJpdmluZyBmcm9tIHRoZSBJRGlzcG9zYWJsZSAKICAgICAgICAgICAgaW50ZXJmYWNlLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcCBjc2ZpbmFsaXplIGZvciBmaW5hbGl6ZXJzLiBDKysgZGVzdHJ1Y3RvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgICAgICAgYnkgZ2FyYmFnZSBjb2xsZWN0b3IgZHVyaW5nIGZpbmFsaXphdGlvbi4gUHJvYmxlbSByZXBvcnRlZCBieSAKICAgICAgICAgICAgQW5kcmVhcyBTY2j2cmsuCgowNi8xMC8yMDAzOiBUaWdlcgoJICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgZm9yIGVycm9yIG1lc3NhZ2Ugb3V0cHV0LgogICAgICAgICAgICBDb250cmFjdCBjb2RlIGNhbiBub3cgcHJpbnQgb3V0IHNpbXBsZSBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIHRvIHByZXBhcmUgZm9yIGluaGVyaXRhbmNlCiAgICAgICAgICAgIAowNi8wMy8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlXSBBcHBsaWVkIEd1aWxlIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5IAoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4gCgoJICAgIC0gU1dJRyBjdXJyZW50bHkgdXNlcyBHdWlsZSdzIGdoXyBBUEksIHdoaWNoIGlzIG1hcmtlZCBhcwoJICAgICAgZGVwcmVjYXRlZCBpbiBHdWlsZSAxLjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBHdWlsZQoJICAgICAgMS45LiAgVGhpcyBjaGFuZ2UgaW50cm9kdWNlcyBhIGNvbW1hbmQtbGluZSBmbGFnICItc2NtIgoJICAgICAgd2hpY2ggY2F1c2VzIFNXSUcgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgdGhhdCB1c2UgR3VpbGUncwoJICAgICAgU0NNIEFQSSBpbnN0ZWFkOyB0aGlzIHJlcXVpcmVzIEd1aWxlID49IDEuNi4KCSAgICAKCSAgICAtIFRoZSBMaWIvZ3VpbGUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIGxhbmd1YWdlIG1vZHVsZXM6IGd1aWxlZGVjLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZS5zd2cgaGF2ZSBiZWVuIG1vdmVkIGludG8gZ3VpbGVfZ2hfcnVuLnN3ZywKICAgICAgICAgICAgICBndWlsZS5pIGhhcyBiZWVuIG1vdmVkIHRvIGd1aWxlX2doLnN3ZywgZ3VpbGVfc2NtLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZV9zY21fcnVuLnN3ZyB3aGljaCBjb250YWluIHRoZSBTQ00gQVBJIHN0dWZmCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkCgoJICAgIC0gZ2hpbnRlcmZhY2UuaSwgd2hpY2ggY29udGFpbnMgdGhlIGRlZmluZXMgZnJvbSB0aGUgZ2hfCiAgICAgICAgICAgICAgZnVuY3Rpb25zIHRvIHRoZSBzY21fZnVuY3Rpb25zIGhhcyBiZWVuIGFkZGVkCgoJICAgIC0gVGhlIEFQSSBmb3IgZGVhbGluZyB3aXRoIHBvaW50ZXIgb2JqZWN0cyBpcyBub3cKCSAgICAgIFNXSUdfQ29udmVydFB0ciwgU1dJR19NdXN0R2V0UHRyLCBTV0lHX05ld1BvaW50ZXJPYmouCgogICAgICAgICAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZCBTV0lHVFlQRSAmCgogICAgICAgICAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSBbR3VpbGVdICoqKgoJICAgIAkKMDYvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpbWVuc2lvbmxlc3MgYXJyYXlzIHN1Y2ggYXMgCgogICAgICAgICAgICAgICAgaW50IGZvb1tdID0gezEsIDJ9OwogICAgICAgICAgICAgICAgZXh0ZXJuIGludCBiYXJbXTsKCiAgICAgICAgICAgIHByb2R1Y2UgYSB3YXJuaW5nIHRoYXQgdGhlIHZhcmlhYmxlIGlzIHJlYWQtb25seS4gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UsIHRoaXMgdXNlZCB0byBjYXVzZSBjb21waWxlIGVycm9ycyBvciBnZW5lcmF0ZSBhIHNldHRlciB0aGF0CiAgICAgICAgICAgIGdlbmVyYXRlZCBhIHJ1bnRpbWUgZXJyb3IuIEEgc2V0dGVyIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICAgICAgICAgICBiZWNhdXNlIHRoZSBhcnJheSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IFNXSUcuIEEgdmFyaW4sIGdsb2JhbGluIAogICAgICAgICAgICBvciBtZW1iZXJpbiB0eXBlbWFwIChkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBsYW5ndWFnZSkgbXVzdCBiZSB3cml0dGVuIAogICAgICAgICAgICBieSB0aGUgdXNlci4KCjA1LzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lbWVudCB0byBkZWZhdWx0IHR5cGVtYXAgbWF0Y2hpbmcgYW5kIGFycmF5cy4gIFdoZW4gYW4KICAgICAgICAgICAgYXJyYXkgaXMgZGVjbGFyZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vWzRdOwoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcCBub3cgcmVzb2x2ZXMgdG8gCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtBTlldCgogICAgICAgICAgICBJZiBubyBtYXRjaCBpcyBmb3VuZCBmb3IgdGhhdCwgaXQgdGhlbiByZXNvbHZlcyB0bwoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQoKICAgICAgICAgICAgSWYgbm8gYXJyYXkgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24sCiAgICAgICAgICAgIHRoZSBTV0lHVFlQRSBbXSBpcyB1c2VkIHJpZ2h0IGF3YXkuIAoKICAgICAgICAgICAgTm90ZTogVGhpcyBjaGFuZ2UgaGFzIGJlZW4gbWFkZSB0byByZXNvbHZlIHByb2JsZW1zIHJlbGF0ZWQgdG8KICAgICAgICAgICAgYXJyYXlzIHdpdGggYW5kIHdpdGhvdXQgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBzb21ldGltZXMgU1dJRwogICAgICAgICAgICB3YXMgZ2VuZXJhdGluZyBzZXR0ZXIgZnVuY3Rpb25zIGZvciBhcnJheSB2YXJpYWJsZXMgd2l0aCBubyBkaW1lbnNpb25zCiAgICAgICAgICAgIChhbiBlcnJvcikuIExpa2V3aXNlLCBTV0lHIHNvbWV0aW1lcyBtYWRlIGFycmF5cyB3aXRoIGRpbWVuc2lvbnMKICAgICAgICAgICAgcmVhZC1vbmx5IChhbHNvIGFuIGVycm9yKS4gIFRoaXMgZml4ZXMgdGhlIGFycmF5c19nbG9iYWwgdGVzdAogICAgICAgICAgICBwcm9ibGVtLgogICAgICAgICAgICAgICAgICAgICAgICAKMDUvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdHlwZSBoYW5kbGluZyBidWcgd2l0aCByZWZlcmVuY2VzIGFuZCBwb2ludGVycy4KICAgICAgICAgICAgSWYgeW91IGhhZCBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgICAgICAgRm9vICpmdW5jMSgpOwogICAgICAgICAgICAgICAgICB2b2lkIGZ1bmMyKEJhciAmeCk7CgogICAgICAgICAgICBUaGVuIGZ1bmMyKCkgd291bGRuJ3QgYWNjZXB0IG9iamVjdHMgcmV0dXJuZWQgYnkgZnVuYzEoKQogICAgICAgICAgICBiZWNhdXNlIG9mIGEgdHlwZSBlcnJvci4gICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaWFuIFlhbmcuCgowNS8yMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgdG8gc29tZSBvZiB0aGUgVmlzdWFsIEMrKyBleGFtcGxlIHByb2plY3QgZmlsZXMgd2hpY2ggd291bGQgbm90IAogICAgICAgICAgICB3b3JrIHdpdGggc3BhY2VzIGluIHRoZSBwYXRocyBoZWxkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCB0byAKICAgICAgICAgICAgcG9pbnQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSdzIGxpYnJhcnkgLyBpbmNsdWRlIGRpcmVjdG9yeS4KICAgICAgICAgICAgU0YgYnVnICM3NDA3NjkKCjA1LzIxLzIwMDM6ICBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1jb250cmFjdHMgb3B0aW9uLgogICAgICAgICAgICBGaXJzdCB0cnkgb2YgdGhlIGlkZWEgb2YgIldyYXAgYnkgQ29udHJhY3QiOiAKICAgICAgICAgICAgYnVpbGQgdXAgcmVhbGlhYmxlIGNyb3NzLWxhbmd1YWdlIG1vZHVsZSBieSB3cmFwcGluZyB3aXRoIFNXSUcuCiAgICAgICAgICAgIEltcGxlbWVudGVkIGJhc2ljIGFzc2VydGlvbgogICAgICAgICAgICAocHJlYXNzZXJ0aW9uICYgcG9zdGFzc2VydGlvbiAmIGludmFyaWFudCkKICAgICAgICAgICAgZm9yIHNpbXBsZSBDL0MrKyBmdW5jdGlvbnMuCiAgICAgICAgICAgIAogICAgICAgICAgICBDdXJyZW50IGZvcm1hdCBvZiBjb250cmFjdHMgYXJlOgogICAgICAgICAgICAlY29udHJhY3QgY2xhc3NfbmFtZSA6OiBmdW5jX25hbWUgKHBhcmFzLi4uKSB7CiAgICAgICAgICAgIHJlcXVpcmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHJzOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGVuc3VyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBpbnZhcmlhbnQ6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoJICAgIAkKMDUvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIHR3ZWFrcy4gVGhlcmUgd2VyZSBhIGZldyBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgd2hpY2ggd2VyZQogICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIE1ha2VmaWxlIGZvciBwYXNzaW5nIG9uIHRoZSBjb21tYW5kbGluZSB3aGVuIGNvbXBpbGluZy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5vdyBhbGwgZGVmaW5lZCBpbiBzd2lnY29uZmlnLmguIEF1dG9jb25mIGRvZXNuJ3Qgbm9ybWFsbHkgCiAgICAgICAgICAgIGFsbG93IGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyB0byBiZSBkZWZpbmVkIGluIHRoaXMgY29uZmlnIGhlYWRlciBmaWxlLCAKICAgICAgICAgICAgYnV0IGFuIGF1dG9jb25mIGFyY2hpdmUgbWFjcm8gZW5hYmxlcyB0aGlzLiBUaGlzIG1hY3JvIGFsb25nIHdpdGggZnV0dXJlIAogICAgICAgICAgICBhdXRvY29uZiBtYWNyb3MgYXJlIGdvaW5nIHRvIGJlIHB1dCBpbiB0aGUgVG9vbHMvY29uZmlnIGRpcmVjdG9yeS4KCiAgICAgICAgICAgICdzd2lnIC12ZXJzaW9uJyBub3cgcmVwb3J0cyB0aGUgdGFyZ2V0IGJ1aWxkIHBsYXRmb3JtLgoKMDUvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gRml4IHRvIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6CgogICAgICAgICAgICBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgoKICAgICAgICAgICAgVGhlc2UgYXJlIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nL2dlbmVyYXRpbmcgcHJveHkgY2xhc3Nlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgd291bGQgdXNlIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCBub3QgdGhlIAogICAgICAgICAgICBDKysgdHlwZSwgd2hpY2ggd2FzIGluY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB0eXBlbWFwcy4gCgogICAgICAgICAgICBJbiBtb3N0IGNpcmN1bXN0YW5jZXMgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIHRoZSBDKysgY2xhc3MgbmFtZS90eXBlIAogICAgICAgICAgICBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIGNsYXNzZXMgaW4gbmFtZXNwYWNlLCB0ZW1wbGF0ZWQgY2xhc3NlcyBldGMuIHNvCiAgICAgICAgICAgIHRoaXMgc2hvdWxkbid0IGFmZmVjdCBtb3N0IGNhc2VzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgYW5kIEMjIE1PRFVMRVMgKioqCgowNS8wOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmlzdWFsIEMrKyBQcm9qZWN0IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgICBjYW4gYmUgYnVpbHQgb24gV2luZG93cyAoZm9yIFRjbCwgUGVybCwgUHl0aG9uIGFuZCBSdWJ5KS4KCjA1LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHJldHVybiBieSB2YWx1ZSwgY29uc3QsIGFuZCBwcml2YXRlIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgQigpOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgQihjb25zdCBCJik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBCIHJldHVybkIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByb2JsZW0gYW5kIHBhdGNoIHN1Z2dlc3Rpb24gcmVwb3J0ZWQgYnkgQmlsbCBIb2ZmbWFuLgoKMDQvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gU2luZ2xlIGF1dG9jb25mIGludm9jYXRpb24gLSBhdXRvY29uZiBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5IGhhcyBnb25lLgoKICAgICAgICAgICAgLSBMaWJ0b29sIGJvb3RzdHJhcHBlZCB3aGVuIHJ1bm5pbmcgYXV0b2dlbi5zaC4gVGhpcyByZXF1aXJlcyBhbnlvbmUKICAgICAgICAgICAgICB1c2luZyB0aGUgY3ZzIHZlcnNpb24gb2YgU1dJRyB0byBoYXZlIGxpYnRvb2wgaW5zdGFsbGVkIG9uIHRoZWlyCiAgICAgICAgICAgICAgbWFjaGluZS4gU3VnZ2VzdCB2ZXJzaW9uIDEuNC4yIG9yIGhpZ2hlciwgcHJlZmVyYWJseSB0aGUgbGF0ZXN0IC0gMS41LgoKICAgICAgICAgICAgLSBBdXRvbWFrZSBpcyBub3cgdXNlZCB0byBidWlsZCB0aGUgcnVudGltZSBsaWJyYXJpZXMgaW4gY29uanVuY3Rpb24gCiAgICAgICAgICAgICAgd2l0aCBsaWJ0b29sLgoKICAgICAgICAgICAgLSBSdW50aW1lIGxpYnJhcmllcyBhcmUgbm93IHN1Y2Nlc3NmdWxseSBidWlsdCBhcyBETExzIG9uIEN5Z3dpbi4KCiAgICAgICAgICAgIC0gU2tpcHBpbmcgbGFuZ3VhZ2VzIGlzIG5vIGxvbmdlciBqdXN0IGRldGVybWluZWQgaW4gdGhlIHRvcCBsZXZlbCAKICAgICAgICAgICAgICBtYWtlZmlsZSBidXQgaW4gY29uZmlndXJlLmluLiBUaGlzIGluZm8gaXMgdXNlZCBmb3IgYnVpbGRpbmcKICAgICAgICAgICAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYW5kIGZvciBydW5uaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgIC0gVGhlc2UgY2hhbmdlcyBoYXZlIGZpeGVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yeSBidWlsZHMsIHRoYXQgaXMKICAgICAgICAgICAgICBidWlsZGluZyBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuIAogICAgICAgICAgICAgIEluc3RhbGxhdGlvbiBmcm9tIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGFsc28gd29ya2luZy4gQW4gaW5pdGlhbAogICAgICAgICAgICAgIGNvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpcyBubyBsb25nZXIgbmVlZGVkIGFzIGRlc2NyaWJlZAogICAgICAgICAgICAgIGluIDA0LzAyLzIwMDMgZW50cnkuIEEgJ21ha2UgZGlzdGNsZWFuJyB3aWxsIGJlIG5lZWRlZCBiZWZvcmUgYnVpbGRpbmcKICAgICAgICAgICAgICBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlmIHRoZSBhdXRvdG9vbHMgCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIHJ1biBmcm9tIHRoaXMgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50LCBidXQgCiAgICAgICAgICAgICAgYXV0b2NvbmYgd2lsbCB0ZWxsIHlvdSB0aGlzLiBOb3RlIHRoYXQgJ21ha2UgY2hlY2snIG9ubHkgd29ya3MgZnJvbSAKICAgICAgICAgICAgICB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCB0aGUgbW9tZW50LgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDcyMzQ3MSBdIFdyYXBwZXJfcHJpbnQoKSBmYWlscyB3aXRoIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIGNvbnN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgaGFuZGxpbmcgCiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBDSEFOR0VTIDA4LzExLzIwMDIuICAgUHJldmlvdXNseSwgU1dJRyBtZXJlbHkKICAgICAgICAgICAgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUgd2FzIGFuIGluaXRpYWxpemVyIGluIHRoZSBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgTm93LCBTV0lHIGFkZGl0aW9uYWxseSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgIGlzIGNvbnN0LgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEga2luZCBvZiBsaW1pdGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLAogICAgICAgICAgICBhY3RpdmF0ZWQgdXNpbmcgdGhlIC1taW5oZXJpdCBjb21tYW5kLWxpbmUgb3B0aW9uLiBJJ3ZlIGFsc28gdXBkYXRlZAogICAgICAgICAgICB0aGUgIkMrKyBJbmhlcml0YW5jZSIgc2VjdGlvbiBvZiB0aGUgUnVieSBkb2N1bWVudGF0aW9uIHRvIGRpc2N1c3MKICAgICAgICAgICAgaG93IHRoaXMgd29ya3MsIGFuZCBpdHMgbGltaXRhdGlvbnMuIEFsc28gYWxzbyBtb2RpZmllZCB0aGUgbWluaGVyaXQuaQogICAgICAgICAgICB0ZXN0IGNhc2UgdG8gcnVuIGFnYWluc3QgdGhpcy4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgLWdsb2JhbG1vZHVsZSBjb21tYW5kLWxpbmUgb3B0aW9uIGZvciB0aGUgUnVieQogICAgICAgICAgICBtb2R1bGUsIGZvciB3cmFwcGluZyBzdHVmZiBpbnRvIHRoZSBnbG9iYWwgbW9kdWxlIChLZXJuZWwpIGluc3RlYWQKICAgICAgICAgICAgb2YgYSBuZXN0ZWQgbW9kdWxlLiBVcGRhdGVkIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCgowNC8yMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBzeW1uYW1lIGVycm9yIGluIGRpcmVjdG9yIGNhbGxzIHRvIFB5dGhvbiBtZXRob2RzCgkgICAgdGhhdCBleHRlbmQgQysrIG9wZXJhdG9ycy4KCgkgICAgU3RvcHBlZCBkaXJlY3RvciBkZXN0cnVjdG9yIHdyYXBwZXJzIGZyb20gY2FsbGluZyBfX3NldF91cCwKCSAgICB3aGljaCB3YXMgbGVhdmluZyB0aGUgZGlyZWN0b3IgZmxhZyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCgowNC8yMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBuYW1lc3BhY2UgcmVzb2x1dGlvbiBhbmQgbmVzdGVkIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFsZnJlZCBMb3JiZXIgKGFuZCBNYXJjZWxvIE1hdHVzKS4KCjA0LzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBQYXRjaCBmb3IgSmF2YSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0byBydW4gb24gTWFjIE9TIFguCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gSW5jb3Jwb3JhdGVkIE5vYnUgTmFrYWRhJ3MgcGF0Y2hlcyBmb3Igc3VwcG9ydGluZyB0aGUgUnVieQogICAgICAgICAgICAxLjggYWxsb2NhdGlvbiBmcmFtZXdvcmsuCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVwbGFjZWQgYWxsIHVzZXMgb2YgdGhlIGRlcHJlY2F0ZWQgU1RSMkNTVFIoKSBtYWNybyB3aXRoIHRoZQogICAgICAgICAgICBzYWZlciBTdHJpbmdWYWx1ZVB0cigpIG1hY3JvLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHJ1YnktdGFsazo2NzA1OQogICAgICAgICAgICBhbmQgZm9sbG93LXVwcyB0byB0aGF0IHBvc3QuCgowNC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwcmVwcm9jZXNzb3IgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgICNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkgCiAgICAgICAgICAgICAgICBpbnQgZihpbnQgbWluKTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNlYmFzdGllbiBSZWNpby4KCjA0LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgYSBydW50aW1lIGNoZWNrIHRvIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmkgbGlicmFyeSB0byBjaGVjayAKICAgICAgICAgICAgdGhhdCB0aGUgSmF2YSBhcnJheSBwYXNzZWQgaW4gaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgQyBhcnJheSBhbmQgdGhyb3cgYW4gCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiBub3QuCgogICAgICAgICAgICBBbHNvIGZpeCB0byB1c2UgZGVsZXRlIGluc3RlYWQgb2YgZnJlZSBmb3IgYXJyYXlzIGNyZWF0ZWQgdXNpbmcgbmV3LgoKMDQvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJlbW92ZSBHQ0MzIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlOgoKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBjaGFuZ2luZyBzZWFyY2ggb3JkZXIgZm9yIHN5c3RlbSBkaXJlY3RvcnkgIi91c3IvaW5jbHVkZSIKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBhIG5vbi1zeXN0ZW0gZGlyZWN0b3J5IAoKICAgICAgICAgICAgU2VlIFNGIHBhdGNoICM3MTU1MzEgc3VibWl0dGVkIGJ5IEdlcmFsZCBXaWxsaWFtcwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wcm92ZWQgd3JhcHBpbmcgb2YgZW51bXMgYW5kIGNvbnN0YW50cy4gVGhlc2Ugd2VyZSBwcmV2aW91c2x5CiAgICAgICAgICAgIHdyYXBwZWQgYXMgQyMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGNvbnN0YW50cy4gRWl0aGVyIHRoZXNlIGFyZSB3cmFwcGVkCiAgICAgICAgICAgIGFzIHJlYWRvbmx5IChydW50aW1lKSBjb25zdGFudHMgb3IgY29tcGlsZSB0aW1lIGNvbnN0YW50cywgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgIHRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSAoVGhlIGRpcmVjdGl2ZSBpcyBsaWtlbHkgdG8gY2hhbmdlIG5hbWUgc29vbikuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHdyYXBwaW5nOgogICAgICAgICAgICAgICVqYXZhY29uc3QoMCk7CiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMjIKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIFhZWjsKICAgICAgICAgICAgICAjZGVmaW5lIFhZWiAzMwogICAgICAgICAgICBpcyBub3c6CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpbnQgQUJDID0gZXhhbXBsZVBJTlZPS0UuZ2V0X0FCQygpOwogICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgWFlaID0gMzM7CgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEdsb2JhbCBjb25zdGFudHMgYW5kIGVudW1zIGFyZSBwdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZSBjYWxsZWQKICAgICAgICAgICAgeHh4Q29uc3RhbnRzLCB3aGVyZSB4eHggaXMgdGhlIG1vZHVsZSBuYW1lLiBUaGlzIGlzIGFuIGltcHJvdmVtZW50IGFzIAogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBkZXJpdmUgKGltcGxlbWVudCkgYSBKYXZhIGNsYXNzIGZyb20gdGhlIHh4eENvbnN0YW50cwogICAgICAgICAgICBpbnRlcmZhY2UgdG8gaW1wcm92ZSB0aGUgc3ludGF4OyBuYW1lbHkgd2hlbiB3cmFwcGluZzoKICAgICAgICAgICAgICBlbnVtIHtPTkU9MSwgVFdPLCBUSFJFRX07CiAgICAgICAgICAgIGFjY2Vzc2luZyB0aGVzZSBmcm9tIGEgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgeHh4Q29uc3RhbnRzIGlzIG5lYXRlcjoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gT05FOwogICAgICAgICAgICB0aGFuIHRoZSBwcmV2aW91czoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0geHh4Lk9ORTsKCiAgICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBEYXZlIERyaWJpbi4KCjA0LzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBpbXByb3ZlbWVudHMgZm9yIG11bHRpcGxlIGJ1aWxkcy4gVGhpcyBhbGxvd3Mgb25lIHRvIGJ1aWxkCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUgYW5kIHJ1bnRpbWUgbGlicmFyaWVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zL2NvbXBpbGVycyAKICAgICAgICAgICAgZXRjIGJ5IHJ1bm5pbmcgY29uZmlndXJlIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gVGhpcyBpc24ndCAxMDAlIGp1c3QgCiAgICAgICAgICAgIHlldCBhbmQgd29uJ3QgYmUgdW50aWwgbGlidG9vbCBpcyBiZXR0ZXIgY29uZmlndXJlZC4uLiBhICdjb25maWd1cmUnIGFuZCAKICAgICAgICAgICAgJ21ha2UgZGlzdGNsZWFuJyBuZWVkcyB0byBiZSBydW4gaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGJlZm9yZSBpdCBhbGwgd29ya3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICQgLi9jb25maWd1cmUKICAgICAgICAgICAgICAkIG1ha2UgZGlzdGNsZWFuCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcxOyBjZCBjb25maWcxOyAuLi9jb25maWd1cmUgQ0M9Z2NjIENYWD1nKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcyOyBjZCBjb25maWcyOyAuLi9jb25maWd1cmUgQ0M9Y2MgQ1hYPWMrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGJlIGltcHJvdmVkLiBBICdtYWtlIGNoZWNrJyBkb2VzIG5vdCB3b3JrIHlldCBlaXRoZXIuIAoKMDQvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuCiAgICAgICAgICAgIFRoaXMgc2hvd2VkIHVwIHdoZW4gdHJ5aW5nIHRvIHVzZSBzdGRfdmVjdG9yLmkgd2l0aCB2ZWN0b3JzCiAgICAgICAgICAgIG9mIHBvaW50ZXJzLgoKMDMvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgcGFyYWxsZWwgbWFrZSBidWlsZHMgb2YgU1dJRywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBtYWtlIC1qIDQKICAgICAgICAgICAgQnVpbGQgZmFpbHVyZSByZXBvcnRlZCBieSBCaWxsIENsYXJrZS4KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVsZWFzZWQgMS4zLjE5LgoKCgpWZXJzaW9uIDEuMy4xOSAoTWFyY2ggMjgsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBWYXJpZXR5IG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgMS4zLjE4IHJlbGVhc2UgaW5jbHVkaW5nOgoKICAgICAgICAgICAgICAgIC0gU2VnbWVudGF0aW9uIGZhdWx0IHdpdGggJWV4dGVuZCBkaXJlY3RpdmUuCiAgICAgICAgICAgICAgICAtIFR5cGVtYXAgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gRXhwcmVzc2lvbiBldmFsdWF0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gTGFyZ2UgbWVtb3J5IGxlYWsgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uCgpWZXJzaW9uIDEuMy4xOCAoTWFyY2ggMjMsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzIxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdHdvIHByb2JsZW1zIHdpdGggdGhlICVleHRlbmQgZGlyZWN0aXZlLCBvdmVybG9hZGluZywgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlIGV4cGFuc2lvbi4gIFNlZSB0aGUgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZCcgYW5kCiAgICAgICAgICAgICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWRfMicgdGVzdHMgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZSBmb3IKICAgICAgICAgICAgZGV0YWlscy4KCjAzLzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEFkZGVkIHNvbWUgdHlwZW1hcHMgYXMgc3VnZ2VzdGVkIGJ5IEFuZHJlYXMgU2Nob2VyayBmb3IgaGFuZGxpbmcKICAgICAgICAgICAgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgb3IgYnkgcmVmZXJlbmNlLiBUaGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcHV0IGluIHR5cGVtYXBzLmkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgQysrIHNjb3BpbmcgYnVnIHJlbGF0ZWQgdG8gY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IEZvbzo6YmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSwgU1dJRyBqdXN0IHRvc3NlZCBvdXQgdGhlIEZvbzo6YmFyKCkgZGVjbGFyYXRpb24uIE5vdywKICAgICAgICAgICAgdGhlIGRlY2xhcmF0aW9uIGlzIHdyYXBwZWQgcHJvdmlkZWQgdGhhdCB0aGUgcHJlZml4IGlzIGV4YWN0bHkgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgdGhlIGN1cnJlbnQgc2NvcGUgKGluY2x1ZGluZyBhbnkgZW5jbG9zaW5nIG5hbWVzcGFjZXMpLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcnVjZSBMb3dlcnkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDY5NjUxNiBdIEVuYWJsaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nIGZvciBkYXRhIG1lbWJlciBhY2Nlc3MuCiAgICAgICAgICAgIEluIHNvbWUgY29tcGlsZXJzLCBhdHRyaWJ1dGUgYWNjZXNzIGNhbiBnZW5lcmF0ZSBleGNlcHRpb25zLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBvcmRpbmFyaWx5IGFzc3VtZXMgdGhhdCBubyBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLiAgVG8gZGlzYWJsZSB0aGlzLAogICAgICAgICAgICB1c2UgdGhlICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKSBGb286Ong7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeDsgICAgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFlha292IE1hcmtvdml0Y2guIAogCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFBhdGNoLiBbIDcwMTg2MCBdIEltcHJvdmUgUGVyZm9ybWFuY2UgKHB5dGhvbiBwcm94aWVzKS4KICAgICAgICAgICAgR2l2ZXMgYSBwZXJmb3JtYW5jZSBib29zdCB0byBwcm94eSBjbGFzcyBjb2RlIGFuZCB0aGUgbWFuYWdlbWVudCBvZiB0aGUKICAgICAgICAgICAgLnRoaXMgYW5kIC50aGlzb3duIGF0dHJpYnV0ZXMuICBDb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgowMy8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBBZGRlZCBtaXNzaW5nIHZhcmFyZyBzdXBwb3J0LgoKMDMvMTgvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgUmVtb3ZlZCBjb2RlIHJlbGF0ZWQgdG8gdGFnZ2luZyBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIGRpcmVjdG9ycy4KCSAgICBUaGUgY29uY2VwdCBvZiBoYXZpbmcgZGlyZWN0b3JzIGZvciBzb21lIGJ1dCBub3QgYWxsIHZpcnR1YWwgbWV0aG9kcwoJICAgIG9mIGEgY2xhc3MgaXMgZGVlcGx5IGZsYXdlZC4gIFRoZSAlZmVhdHVyZSgibm9kaXJlY3RvciIpIHRhZyBpcyBhbHNvCgkgICAgZ29uZS4gIAoJICAgIAoJICAgIERpcmVjdG9ycyBhcmUgb2ZmIGJ5IGRlZmF1bHQuICBUbyBlbmFibGUgdGhlbSBmb3IgYSBjbGFzcywgaXNzdWUKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBjbGFzc25hbWU7IHdoaWNoIHdpbGwgY3JlYXRlIGRpcmVjdG9yIG1ldGhvZHMKCSAgICBmb3IgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MuCgowMy8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBwYXNzaW5nIGFyZ3VtZW50cyBvZiB0eXBlIGZ1bmN0aW9uLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCB4KGludCwgaW50KSk7CgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCB4KTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucywgdGhpcyB3b3VsZCBwcm9kdWNlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLiAgTm93LAogICAgICAgICAgICBTV0lHIG1lcmVseSBhZGRzIGFuIGV4dHJhIHBvaW50ZXIsIG1ha2luZyB0aGVzZSBkZWNsYXJhdGlvbnMgdGhlIHNhbWUKICAgICAgICAgICAgYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCAoKngpKGludCwgaW50KSk7CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90ICp4KTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdhcnRoIEJ1c2hlbGwuCgowMy8xNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCB0aGUgcmV0dXJuIHN0YXRlbWVudCBmb3IgZGlyZWN0b3IgYmFzZSBjbGFzcyBjYWxscyB0aGF0IGhhdmUgbm8KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLgoKMDMvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb25zdCBzbWFydC1wb2ludGVyIHdyYXBwaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgb25seSAieCIgYW5kICJiYXIiIGFyZSB2aXNpYmxlIGZyb20gQmxhaCAoc2luY2UgYXBwbGljYXRpb24KICAgICAgICAgICAgb2Ygc3BhbSB2aW9sYXRlcyBjb25zdG5lc3MpLiAgTW9yZW92ZXIsIGFjY2VzcyB0byAieCIgaXMgcmVhZC1vbmx5LgogICAgICAgICAgIAowMy8xNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDbGVhbmVkIHVwIHR3byBzaWduZWQgdmVyc3VzIHVuc2lnbmVkIGNvbXBhcmlzb25zIGluIHB5dGhvbi9zdGRfdmVjdG9yLmkuCgkgICAgCjAzLzE1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEdsb2JhbCB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGdldCBhbmQgc2V0IG1ldGhvZHMuCiAgICAgICAgICAgIE1lbWJlciB2YXJpYWJsZSB3cmFwcGluZyBidWcgZml4ZXMsIGZvciBleGFtcGxlIHdyYXBwaW5nIHBvaW50ZXJzIHdvcmsgbm93LgogICAgICAgICAgICBUeXBlbWFwcyBhcmUgdXNlZCBmb3IgYWxsIHZhcmlhYmxlIHdyYXBwaW5nIHRvIGdlbmVyYXRlIHRoZSBwcm9wZXJ0eSBjb2RlLgoKMDMvMTMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIHZpcnR1YWwgbWV0aG9kIHVucm9sbGluZyBmb3IgZGlyZWN0b3JzLiAKCSAgICBUaGUgb3JkZXIgb2YgdW5yb2xsaW5nIGlzIG5vdyBmcm9tIGJhc2UgdG8gZGVyaXZlZCwgdG8gZW5zdXJlCgkgICAgdGhhdCB0aGUgbW9zdCBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGlyZWN0b3IgbWV0aG9kIGlzCgkgICAgZm91bmQuCgoJICAgIERpcmVjdG9yIG1ldGhvZHMgZm9yIHB1cmUgdmlydHVhbCBtZXRob2RzIG5vdyB0aHJvdwoJICAgIERJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04gaWYgX3VwIGlzIHNldC4KCjAzLzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIFBvbHltb3JwaGlzbSBmaXg6IHZpcnR1YWwgZnVuY3Rpb25zIG5vdyB1c2UgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIEMjIHByb3h5IGNsYXNzLCB2aXJ0dWFsIG9yIG92ZXJyaWRlLgogICAgICAgICAgICBTb21lICd1c2luZyBTeXN0ZW07JyBzdGF0ZW1lbnQgZml4ZXMgbmVlZGVkIGJ5IHRoZSBNb25vIGNvbXBpbGVyLgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBvZiBTd2lnVmFsdWVXcmFwcGVyPD4gdG8KICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3NlcyB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJ1Y2UgTG93ZXJ5LgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBUaGUgJGRlc2NyaXB0b3IodHlwZSkgdmFyaWFibGUgaXMgbm93IGV4cGFuZGVkIGluIGNvZGUgc3VwcGxpZWQgdG8KICAgICAgICAgICAgJWV4dGVuZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluIGtpbmRzIG9mIGFkdmFuY2VkIHdyYXBwaW5nIAogICAgICAgICAgICAoZXNwZWNpYWxseSBjb250YWluZXIgY2xhc3NlcykuCgowMy8xMS8yMDAzOiBsdWlnaQogICAgICAgICAgICBTdXBwb3J0IGZvciBzdGQ6Om1hcC4KICAgICAgICAgICAgKGEpIEludGVncmF0aW9uIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlIChhIGxhIHN0ZDo6dmVjdG9yKSBmb3IKICAgICAgICAgICAgICAgIFB5dGhvbiwgUnVieSwgTXpTY2hlbWUsIGFuZCBHdWlsZTsKICAgICAgICAgICAgKGIpIFNpbXBsZSB3cmFwcGVyIGZvciBvdGhlciBsYW5ndWFnZXMKCjAzLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgU1dJRwogICAgICAgICAgICB3YXNuJ3QgcGFyc2luZyBjZXJ0YWluIG9jdGFsIGNvZGVzIGNvcnJlY3RseS4KCjAzLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHN1YnRsZSBwcmVwcm9jZXNzb3IgcHJvYmxlbXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2ViYXN0aWVuIFJlY2lvLgoKICAgICAgICAgICAgKGEpIEVtcHR5IHByZXByb2Nlc3NvciB2YWx1ZXMgbm8gbG9uZ2VyIGdlbmVyYXRlICJiYWQgY29uc3RhbnQKICAgICAgICAgICAgdmFsdWUiIGVycm9ycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08KICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08gQkFSCgogICAgICAgICAgICAoYikgTWFjcm8gbmFtZXMgY2FuIG5vdyBzcGFuIG11bHRpcGxlIGxpbmVzICh0ZWNobmljYWxseSB2YWxpZCwKICAgICAgICAgICAgYWx0aG91Z2ggcXVlc3Rpb25hYmxlIHByYWN0aWNlKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBBX0xPTkdfTUFDUk9fXAogICAgICAgICAgICAgICAgICBOQU1FIDQyCgogICAgICAgICAgICAoYykgV2hpdGVzcGFjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYmVmb3JlIGNlcnRhaW4gbWFjcm8gdmFsdWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIkhlbGxvIgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEJBUlwKICAgICAgICAgICAgICAgICAgIkhlbGxvIgogCjAzLzA3LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVtYXBzCiAgICAgICAgICAgIGluIHRoZSBMaWIvcnVieS90eXBlbWFwcy5pIGxpYnJhcnkgZmlsZS4KCjAzLzA3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9jYWxsYmFjayB0byBkZW1vc3RyYXRlIGhvdyBkaXJlY3RvcnMgY2FuCgkgICAgYmUgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzIGluIFB5dGhvbgoJICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9leHRlbmQgdG8gZGVtb25zdHJhdGUgdmlydHVhbCBtZXRob2QKCSAgICBjYWxscyBmcm9tIEMrKyB0byBQeXRob24gKHJlYWxseSB0aGUgc2FtZSBhcyB0aGUgY2FsbGJhY2sKCSAgICBleGFtcGxlLCBqdXN0IGEgZGlmZmVyZW50IGNvbnRleHQpLgoJICAgIEFkZGVkIGZvdXIgdGVzdHMgZm9yIHZlcnkgYmFzaWMgZGlyZWN0b3IgZnVuY3Rpb25hbGl0eS4gIFRoZXNlCgkgICAgaGF2ZSBydW50aW1lIHRlc3RzIHVuZGVyIHB5dGhvbi4KCSAgICBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW1pdHMgI2RlZmluZSBTV0lHX0RJUkVDVE9SUyBuZWFyIHRoZQoJICAgIHRvcCBvZiB0aGUgb3V0cHV0IGZpbGUgaWYgZGlyZWN0b3JzIGFyZSBlbmFibGVkLiAgVGhpcyBpcyB1c2VmdWwKCSAgICBmb3IgZGlzYWJsaW5nIHBhcnRzIG9mIHRlc3RzIGluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkb24ndAoJICAgIHN1cHBvcnQgZGlyZWN0b3JzLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBzZWN0aW9uIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgb24gY3Jvc3MgbGFuZ3VhZ2UKCSAgICBwb2x5bW9ycGhpc20gKGRpcmVjdG9ycykuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBUaGUgc2hvcnQtbGl2ZWQgIi1mZGlyZWN0b3JzIiBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFRvIGVuYWJsZSBkaXJlY3RvcnMsIGluc3RlYWQgdXNlIHRoZSBleHRlbmRlZCAlbW9kdWxlIAoJICAgIGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgoKCSAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiKSBtb2R1bGVuYW1lCgowMy8wNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIGxvbmcgbG9uZyB0eXBlbWFwcyBoYXZlIGJlZW4gcmV3cml0dGVuIHNvIHRoYXQgdGhleSBjYW4gYmUgbW9yZQogICAgICAgICAgICBlYXNpbHkgdXNlZCB3aXRoIG5vbiBJU08gY29tcGlsZXJzLCBsaWtlIFZpc3VhbCBDKysuIEZvciBleGFtcGxlCiAgICAgICAgICAgIGlmIHlvdSBhcmUgd3JhcHBpbmcgdGhlIFdpbmRvd3MgNjQgYml0IHR5cGUgX19pbnQ2NCB0aGUgbG9uZyBsb25nCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5OgoKICAgICAgICAgICAgICAgICVhcHBseSBsb25nIGxvbmcgeyBfX2ludDY0IH07CiAgICAgICAgICAgICAgICBfX2ludDY0IHZhbHVlMShfX2ludDY0IHgpOwoKICAgICAgICAgICAgX19pbnQ2NCB3aWxsIG5vdyBhcHBlYXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgbG9uZyBsb25nLgogICAgICAgICAgICAKMDMvMDYvMjAwMzogYmVhemxleQogICAgICAgICAgICAqKiogREVWRUxPUEVSIENIQU5HRSAqKioKICAgICAgICAgICAgU3dpZyBtb2R1bGUgbXV0YXRpb24gaGFzIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIFdoZW4gYSBsYW5ndWFnZQogICAgICAgICAgICBjbGFzcyBtZXRob2Qgd2FudHMgdG8gc2F2ZSBub2RlIGF0dHJpYnV0ZXMsIGl0IG5vdyB1c2VzIG9uZSBvZiB0aGUKICAgICAgICAgICAgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpCiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgpCgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlc2UgZnVuY3Rpb25zIGlzIGEgbmFtZXNwYWNlIGluIHdoaWNoCiAgICAgICAgICAgIHNhdmVkIGF0dHJpYnV0ZXMgYXJlIHBsYWNlZC4gIEZvciBleGFtcGxlLHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICAgTm9kZSAqbjsKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCJjRGVjbGFyYXRpb24iLG4sInR5cGUiLCJwYXJtcyIsIm5hbWUiLE5JTCk7CgogICAgICAgICAgICBzYXZlcyB0aGUgYXR0cmlidXRlcyBhcyAiY0RlY2xhcmF0aW9uOnR5cGUiLCAiY0RlY2xhcmF0aW9uOnBhcm1zIiwKICAgICAgICAgICAgYW5kIHNvIGZvcnRoLiAgIElmIG5lY2Vzc2FyeSwgYSBsYW5ndWFnZSBtb2R1bGUgY2FuIHJlZmVyIHRvCiAgICAgICAgICAgIG9sZCB2YWx1ZXMgYnkgdXNpbmcgdGhpcyBzcGVjaWFsIG5hbWVzcGFjZSBxdWFsaWZpZXIuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBhIHNwZWNpYWwgYXR0cmlidXRlICJ2aWV3IiBjb250YWlucyB0aGUgbmFtZQogICAgICAgICAgICBvZiB0aGUgbGFzdCBuYW1lc3BhY2UgdXNlZCB0byBzYXZlIGF0dHJpYnV0ZXMuICBJbiB0aGUgYWJvdmUgCiAgICAgICAgICAgIGV4YW1wbGUsICJ2aWV3IiB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAiY0RlY2xhcmF0aW9uIi4gICBUaGUgdmFsdWUKICAgICAgICAgICAgb2YgImNEZWNsYXJhdGlvbjp2aWV3IiB3b3VsZCBoYXZlIHRoZSBwcmV2aW91cyB2aWV3IGFuZCBzbyBmb3J0aC4KCiAgICAgICAgICAgIFN3aWdfcmVzdG9yZShuKSByZXN0b3JlcyBhIG5vZGUgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbGFzdAogICAgICAgICAgICBTd2lnX3JlcXVpcmUoKSBvciBTd2lnX3NhdmUoKSBjYWxsLgoKICAgICAgICAgICAgTm90ZTogIFRoaXMgY2hhbmdlIG1ha2VzIGl0IGVhc2llciBmb3IgbGFuZ3VhZ2UgbW9kdWxlcyB0byByZWZlcgogICAgICAgICAgICB0byBvbGQgdmFsdWVzIG9mIGF0dHJpYnV0ZXMuICAKCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNZXJnZWQgdGhlIGNyb3NzLWxhbmd1YWdlIHBvbHltb3JwaGlzbSBwYXRjaC4gIFdoZW4gZW5hYmxlZCwgQysrIAoJICAgICJwcm94eSIgY2xhc3NlcyAoY2FsbGVkIGRpcmVjdG9ycykgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzcGVjaWZpZWQgCgkgICAgQysrIGNsYXNzLiAgRGlyZWN0b3JzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiwgc2ltaWxhciAKCSAgICB0byB0aGUgd2F5IHRoZSB1c3VhbCBwcm94eSAoc2hhZG93KSBjbGFzc2VzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gCgkgICAgUHl0aG9uIHRvIEMrKy4gIFRvZ2V0aGVyLCB0aGVzZSB0d28gdHlwZXMgb2YgcHJveGllcyBhbGxvdyBDKysgCgkgICAgY2xhc3NlcyB0aGF0IGFyZSBleHRlbmRlZCBpbiBQeXRob24gdG8gYmVoYXZlIGp1c3QgbGlrZSBvcmRpbmFyeSAKCSAgICBDKysgY2xhc3NlcyBhbmQgYmUgdXNlZCBpbiBDKysgbGlrZSBuYXRpdmUgb2JqZWN0cy4gIAoJICAgIAoJICAgIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCB2ZXJ5IGV4cGVyaW1lbnRhbCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICBUbyBlbmFibGUgZGlyZWN0b3Igc3VwcG9ydCwgc3BlY2lmeSAnLWZkaXJlY3RvcnMnIG9uIHRoZSBTV0lHIGNvbW1hbmQKCSAgICBsaW5lIG9yIGluIHRoZSBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW4gdGhlIGludGVyZmFjZQoJICAgIGZpbGUsIGFkZCAlZmVhdHVyZSgiZGlyZWN0b3IiKSB0byBnZW5lcmF0ZSBkaXJlY3RvcnMgZm9yIGFsbCBjbGFzc2VzCgkgICAgdGhhdCBoYXZlIHZpcnR1YWwgbWV0aG9kcy4gIAoJICAgIAoJICAgIFNlZSBodHRwOi8vc3RtLmxibC5nb3YvfnRtMi9zd2lnL1Byb3h5RG9jLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KCSAgICAKCjAzLzAzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzbWFsbCBnbGl0Y2ggaW4gdHlwZW1hcCBsb2NhbCB2YXJpYWJsZSByZXBsYWNlbWVudC4gIElmIHlvdSBoYWQKICAgICAgICAgICAgYSB0eXBlbWFwIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgKCQxX3R5cGUgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gLi4uOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIG5vIG9jY3VycmVuY2Ugb2YgIiQxX3R5cGUiIGFwcGVhcmVkIGluIHRoZSBib2R5LCB0aGVuIHRoZSBsb2NhbAogICAgICAgICAgICB2YXJpYWJsZSB0eXBlIHdvdWxkbid0IGJlIHN1YnN0aXR1dGVkLgoKMDMvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IHZlcnNpb24gb2YgdGhlIENTaGFycCBtb2R1bGUgd2hpY2ggaXMgdHlwZW1hcCBiYXNlZC4KICAgICAgICAgICAgSXQgYWxzbyB1c2VzIEVDTUEgQyMgYW5kIG5vIGxvbmdlciB1c2VzIE1pY3Jvc29mdCBWaXN1YWwgQysrLk5FVCAKICAgICAgICAgICAgZ2x1ZS4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE5laWwgQ2F3c2UuCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUzNTQ4IF0gZXJyb3IgcGFyc2luZyBjYXN0aW5nIG9wZXJhdG9yIGRlZmluaXRpb24uCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgY2FzdGluZyBvcGVyYXRvcnMgZGVjbGFyZWQgb3V0c2lkZSBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbmxpbmUgQTo6b3BlcmF0b3IgY2hhciAqKCkgeyAuLi4gfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcnRpbiBDYXNhZG8uCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFub255bW91cyBiaXQtZmllbGRzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICAgaW50IHggOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50IHkgOiA4OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbm9ueW1vdXMgYml0LWZpZWxkcyBhcmUgaWdub3JlZCBieSBTV0lHLiAgIFByb2JsZW0KICAgICAgICAgICAgcmVwb3J0ZWQgYnkgRnJhbnogSPZwZmluZ2VyLgoKMDIvMjYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgdHlwZW1hcHMgaW4gdGhlIEV4YW1wbGVzL2phdmEvdHlwZW1hcCBleGFtcGxlIGFuZCBhbHNvIAogICAgICAgICAgICBmaXhlcyBzdWJ0bGUgYnVnIHdoZW4gdXNpbmcgdGhlIFN0cmluZ0J1ZmZlciB0eXBlbWFwcyBtb3JlIHRoYW4gb25jZS4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDIxMTIgXSBDb25zdGFudHMgY2hhciBidWcuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1MzM3IF0gUGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBub3QgZW50aXJlbHkgd29ya2luZy4KICAgICAgICAgICAgVGhlcmUgd2FzIGEgc3VidGxlIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgbmFtaW5nIGFuZCBvcmRlcmluZyBvZgogICAgICAgICAgICB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cy4gIE1hdGNoaW5nIHdvcmtlZCBva2F5LAogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIHRlbXBsYXRlcyB3ZXJlbid0IGV4cGFuZGVkIGNvcnJlY3RseS4KCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHBhcnNpbmcgKGFuZCBnZW5lcmF0aW5nIGNvZGUpIGZvciAKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBhcnJheXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgZm9vKGludCAoJngpWzEwXSk7CiAgCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUzNDcgXSBDb21waWxhdGlvbiB3YXJuaW5nIGZyb20gbGlicHkuYy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGFuaWVsIEwuIFJhbGwuCiAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdmlydHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgY2hlY2tpbmcgYW5kIHR5cGVkZWYuCgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICppbnRwdHI7CgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAqZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnRwdHIgZm9vKCkgeyB9OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cmVhdGluZyB0aGVzZSBkZWNsYXJhdGlvbnMgYXMgZGlmZmVyZW50IGV2ZW4gdGhvdWdoCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lICh2aWEgdHlwZWRlZikuCgowMi8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgcmFuZ2UgY2hlY2tpbmcgZm9yIHRoZSBOVU0yVVNIUlQgbWFjcm8sIHBlciBbIDY3NTM1MyBdLgoKMDIvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdGhlIGNvZGUgdGhhdCBkZXRlcm1pbmVkIGlmIGEgY2xhc3MgaXMgYWJzdHJhY3QKICAgICAgICAgICAgYW5kIGNhbiBiZSBpbnN0YW50aWF0ZWQuICAgIElmIHlvdSBoYWQgY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiB2aXJ0dWFsIEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDIDogdmlydHVhbCBBIHsgCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAvKiBOb3RlIG9yZGVyIG9mIGJhc2UgY2xhc3NlcyAqLwkKICAgICAgICAgICAgICAgICAgc3RydWN0IEQgOiBCLCBDIHsgfTsgICAgLyogT2sgKi8KICAgICAgICAgICAgICAgICAgc3RydWN0IEUgOiBDLCBCIHsgfTsgICAgLyogQnJva2VuICovCgogICAgICAgICAgICB0aGVuIFNXSUcgZGV0ZXJtaW5lZCB0aGF0IGl0IGNvdWxkIGluc3RhbnRpYXRlIEQoKSwgYnV0IG5vdCBFKCkuCiAgICAgICAgICAgIFRoaXMgaW5jb25zaXN0ZW5jeSBhcm9zZSBmcm9tIHRoZSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIAogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdG8gbG9jYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlydHVhbAogICAgICAgICAgICBtZXRob2RzLiAgIFRoaXMgcHJvYmxlbSBzaG91bGQgbm93IGJlIGZpeGVkLS0tU1dJRyB3aWxsIGF0dGVtcHQKICAgICAgICAgICAgdG8gbG9jYXRlIGFueSB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgbWV0aG9kIGJ5CiAgICAgICAgICAgIHRyYXZlcnNpbmcgb3ZlciB0aGUgZW50aXJlIGhpZXJhcmNoeS4KCjAyLzIyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB1c2luZyBlbnVtIHR5cGVtYXBzLiBUaGUgSmF2YSBmaW5hbCBzdGF0aWMgdmFyaWFibGUgdHlwZQogICAgICAgICAgICBjYW4gYmUgc2V0IHVzaW5nIHRoZSBqc3R5cGUgdHlwZW1hcCwgZW5hYmxpbmcgZW51bXMgdG8gYmUgbWFwcGVkIHRvIAogICAgICAgICAgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnQuIEJ1ZyByZXBvcnRlZCBieSBIZWluZXIgUGV0aXRoLgoKMDIvMjEvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCBDU2hhcnAgKEMjKSBtb2R1bGUgcHJvdG90eXBlCiAgICAgICAgICAgIGkuZS4gY3NoYXJwLmN4eCAmIGNzaGFycC5oIGF0IFNvdXJjZS9Nb2R1bGVzLy4KICAgICAgICAgICAgVGhleSBhcmUgZm9yIHRlc3QgdXNhZ2Ugb25seSBub3cgYW5kIG5lZWQgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgYWxzbyBuZWVkIHRvIGJlIG1vZGlmaWVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgIAowMi8yMC8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIHdpdGggLWZ2aXJ0dWFsLgogICAgICAgICAgICBTaW1pbGFyIGFzIGJlYXpsZXkncyBtb2RpZmljYXRpb24gdG9kYXkuCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGdjYy1zdHlsZSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgCiAgICAgICAgICAgIFBhdGNoIFsgNjIzMjU4IF0gR0NDLXN0eWxlIHZhcmFyZyBtYWNybyBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2UgTWFzb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IGNsYXNzZXMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhpbnQgeCkgPSAwOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhJbnRlZ2VyIHgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgZ2V0dGluZyBjb25mdXNlZCBhYm91dCB0aGUgbGF0dGVyIG1ldGhvZC0tLW1ha2luZyBCYXIKICAgICAgICAgICAgYWJzdHJhY3QuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlamF2YWNvbnN0KGZsYWcpIGNhbiBhbHNvIGJlIHVzZWQgb24gZW51bXMgYXMgd2VsbCBhcyBjb25zdGFudHMuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRydWUgSmF2YSBjb21waWxlciBjb25zdGFudHMgc28gdGhhdCB0aGV5IGNhbiBiZSAKICAgICAgICAgICAgdXNlZCBpbiBKYXZhIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gSGVpbmVyIFBldGl0aCBmb3IgcGF0Y2hlcy4KCjAyLzE5LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgTW9kaWZpZWQgLWZjb21wYWN0IGZlYXR1cmUgdG8gZGVhbCB3aXRoIFBQIGxpbmVzCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg5MDQwIF0gTWlzc2luZyByZXR1cm4gdmFsdWUgaW4gc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2JlcnQgSC4gZGUgVnJpZXMuCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgZmV3IGV2aWwgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHRlbXBsYXRlcywgbmFtZXNwYWNlcywgYW5kIHRoZQogICAgICAgICAgICAlZXh0ZW5kIGRpcmVjdGl2ZS4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoKMDIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtSdWJ5XSBJbXByb3ZlZCBzdXBwb3J0IGZvciBWaXN1YWwgQysrIGFuZCBvdGhlciBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuIAogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgIi9FWFBPUlQ6SW5pdF88bW9kdWxlPiIsIHdoZXJlIDxtb2R1bGU+IGlzIHRoZQogICAgICAgICAgICBzd2lnIG1vZHVsZSBuYW1lIHdoZW4gbGlua2luZyB1c2luZyB0aGVzZSBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuCgowMi8xNS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1mdmlydHVhbCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyByZWRpZmluZWQgdmlydHVhbCBmdW5jdGlvbiBpbiBjaGlsZHJlbiBjbGFzc2VzLgoKICAgICAgICAgICAgTW9kaWZpZWQgLWNvbXBhY3Qgb3B0aW9uIHRvIC1mY29tcGFjdCBvcHRpb24KCiAgICAgICAgICAgIEFkZGVkIC1zbWFsbCBvcHRpb24uCiAgICAgICAgICAgIC1zbWFsbCA9IC1mdmlydHVhbCAtZmNvbXBhY3QKICAgICAgICAgICAgQW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBmdXR1cmUgZmVhdHVyZSBvcHRpb25zLAogICAgICAgICAgICB3aGljaCBhcmUgdXNlZCB0byByZWR1Y2Ugd3JhcHBlciBmaWxlIHN6aWUuCgogICAgICAgICAgICBBZGRlZCBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlIGNoZWNrLgogICAgICAgICAgICBUbyBkeW5hbWljYWxseSBzZXQgdGhlIGZlYXR1cmUgb3B0aW9ucyBzdWNoIGFzIC1mY29tcGFjdCAmIC1mdmlydHVhbAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMi8xMy8yMDAzOiBsZW56CiAgICAgICAgICAgIFVwZGF0ZWQgRG9jL01hbnVhbC9QZXJsNS5odG1sIHRvIHRhbGsgYWJvdXQgQysrIGNvbXBpbGUgcHJvYmxlbXMKICAgICAgICAgICAgY29uZmlndXJlLmluIG5vdyBjaGVja3MgZm9yIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgUnVudGltZS9NYWtlZmlsZS5pbiBhbmQgRXhhbXBsZS9NYWtlZmlsZS5pbiBub3cgdXNlIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgQWRkZWQgTGliL3Blcmw1L25vZW1iZWQuaCB3aGljaCBjb250YWlucyBhbGwgdGhlIGtub3duIG1hY3JvIGNvbmZsaWN0cwoKMDIvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4NTQxMCBdIEMrKyBFeHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhdXNlcyBTV0lHIHRvIGV4aXQuCiAgICAgICAgICAgIEZpeGVzIGEgc3ludGF4IGVycm9yIHdpdGggZGVjbGFyYXRpb25zIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIGluc3RhbnRpYXRpb24gYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZS4KICAgICAgICAgICAgV2UgbWlnaHQgZG8gbW9yZSBsYXRlci4gIFJlcG9ydGVkIGJ5IFRob21hcyBXaWxsaWFtc29uLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJld3JvdGUgYm9vbCB0eXBlbWFwcyB0byByZW1vdmUgcGVyZm9ybWFuY2Ugd2FybmluZyBmb3IgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIFZpc3VhbCBDKysuCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB3cmFwcGluZyByZWZlcmVuY2UgdmFyaWFibGVzIChjb25zdCBub24tcHJpbWl0aXZlIGFuZCBhbGwgbm9uLWNvbnN0IHR5cGVzKSAKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgaW50JiBpOwogICAgICAgICAgICAgIENsYXNzJiBjOwogICAgICAgICAgICAgIGNvbnN0IENsYXNzJiBjOwoKMDIvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBtb3JlIHZlcnkgc3VidGxlIHByZXByb2Nlc3NvciBjb3JuZXIgY2FzZXMgcmVsYXRlZCB0byByZWN1cnNpdmUKICAgICAgICAgICAgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBjYXQoeCx5KSB4ICMjIHkKCiAgICAgICAgICAgICAgICAgICBjYXQoY2F0KDEsMiksMykgICAgLy8gUHJvZHVjZXM6IGNhdCgxLDIpMwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIHhjYXQoeCx5KSBjYXQoeCx5KQoKICAgICAgICAgICAgICAgICAgIHhjYXQoeGNhdCgxLDIpLDMpICAvLyBQcm9kdWNlcyAxMjMKCiAgICAgICAgICAgIFNlZSBLJlIsIDJuZCBFZC4gcC4gMjMxLgoKMDIvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNjgzODgyIF0gLSBwYXRjaCBzdWJtaXR0ZWQgYnkgRi4gUG9zdG1hIGZvciBTV0lHIHRvIGNvbXBpbGUgb24gSFAtVVguCgowMi8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4gUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzEwLzIwMDM6IHNvbmd5YW5mCiAgICAgICAgICAgIEFkZGVkIC1jb21wYWN0IG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIGNvbW1lbnRzIGFuZCBjb21iaW5pbmcgc2hvcnQgbGluZXMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKIAowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUxMzU1IF0gU3ludGF4IGVycm9yIHdpdGggY3N0cmluZy5pCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE9tcmkgQmFyZWwuCgowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjYzNjMyIF0gaW5jb21wYXRpYmlsaXR5IHdpdGggc3RhbmRhcmQgY3BwLgogICAgICAgICAgICBUaGlzIGlzIGEgcmVmaW5lbWVudCB0aGF0IGZpeGVzIHRoaXMgcHJvYmxlbToKCiAgICAgICAgICAgICAgICAgLy8gU29tZSBtYWNybyB3aXRoIGFuIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08oeCkgICAgICAgeAoKICAgICAgICAgICAgICAgICBpbnQgRk9POyAgICAgICAgLyogTm90IGEgbWFjcm8tLS1ubyBhcmd1bWVudHMgKi8KIAowMi8wNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1NDkxIF0gcGFyc2UgZXJyb3Igd2l0aCBnbG9iYWwgbmFtZXNwYWNlIHF1YWxpZmljYXRpb24uCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBKZXJlbXkgWWFsbG9wLgoKMDIvMDQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdmFyYXJncyBwcm9jZXNzaW5nIGludHJvZHVjZWQgYnkgdGhlIG51bWlucHV0cyB0eXBlbWFwIHBhcmFtZXRlci4KCjAxLzA4LzIwMDM6IHR0bgoJICAgIFt4bWxdIEZpeCBzdHJpbmctcmVwbGFjZW1lbnQgb3JkZXJpbmcgYnVnbGV0LgoJICAgIFRoYW5rcyB0byBHYXJ5IEhlcnJvbi4KCjEyLzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGdXJ0aGVyIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gVGhlIFNXSUcgZXhlY3V0YWJsZSBpcyBub3cgYnVpbHQgdXNpbmcgYSBzaW5nbGUgTWFrZWZpbGUuCiAgICAgICAgICAgIC0gVGhpcyBtYWtlZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQXV0b21ha2UgKFNvdXJjZS9NYWtlZmlsZS5hbSkuCiAgICAgICAgICAgIC0gRGVwZW5kZW5jeSB0cmFja2luZyBhbmQgdGFncyBzdXBwb3J0IGFyZSBpbiB0aGlzIG1ha2VmaWxlLgogICAgICAgICAgICAtIEF1dG9tYWtlIDEuNy4yIGFuZCBBdXRvY29uZiAyLjU0IG1pbmltdW0gdmVyc2lvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBTV0lHIGZyb20gQ1ZTLgogICAgICAgICAgICAtIFJ1bm5pbmcgLi9hdXRvZ2VuLnNoIG5vdyBpbnN0YWxscyBBdXRvY29uZi9BdXRvbWFrZSBzdXBwb3J0IGZpbGVzIGludG8KICAgICAgICAgICAgICBUb29scy9jb25maWcgYW5kIHRoZXNlIGZpbGVzIGFyZSBubyBsb25nZXIgc3RvcmVkIGluIENWUy4KICAgICAgICAgICAgLSBCdWcgZml4ZXMgaW4gJ21ha2UgaW5zdGFsbCcgZm9yIHN5c3RlbXMgdXNpbmcgLmV4ZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBhbmQKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcmVsZWFzZS1zdWZmaXg9d2hhdGV2ZXIKCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb3JlIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gQXV0b2NvbmYncyBBQ19DQU5PTklDQUxfSE9TVCByZXBsYWNlcyBwcm9wcmlldGFyeSBhcHByb2FjaCBmb3IgZGV0ZWN0aW5nIGJ1aWxkIGhvc3QuCiAgICAgICAgICAgIC0gQXV0b2NvbmYgc3VwcG9ydCBmaWxlcyBtb3ZlZCB0byBUb29scy9jb25maWcuCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBydW4gb24gTWFjT1MsIHN1Ym1pdHRlZCBieSBCZXJuYXJkIERlc2dyYXVwZXMuCiAgICAgICAgICAgIE1haW5seSBlbnN1cmluZyBnZW5lcmF0ZWQgZmlsZXMgYXJlIG91dHB1dCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZvcgogICAgICAgICAgICBzb21lIG1vZHVsZXMuCgoxMi8xMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmFyaW91cyBidWlsZCBtb2RpZmljYXRpb25zIGFuZCBidWcgZml4ZXM6CiAgICAgICAgICAgIC0gU2ltcGxpZmljYXRpb24gb2YgdmVyc2lvbiBzdHJpbmcuIFVzZSBhdXRvY29uZidzIFBBQ0tBR0VfVkVSU0lPTiBpbnN0ZWFkLgogICAgICAgICAgICAtIEJ1aWxkIHRpbWUgcmVtb3ZlZCBmcm9tIFNXSUcgdmVyc2lvbi4KICAgICAgICAgICAgLSBVc2luZyBzdGFuZGFyZCBhdXRvY29uZiBjb25maWcgaGVhZGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIC0gVXBkYXRlZCBvbGQgYXV0b2NvbmYgbWFjcm9zIGFzIHJlcG9ydGVkIGJ5IGF1dG91cGRhdGUuCiAgICAgICAgICAgIC0gUmVtb3ZlZCAkcHJlZml4IGluIGF1dG9jb25mIGZyb20gc2VhcmNoIHBhdGhzIGFzIGF1dG9jb25mIHdvbid0IGV4cGFuZCB0aGVtLgogICAgICAgICAgICAtIFN1YnRsZSBidWcgZml4IHdoZXJlICdtYWtlIHByZWZpeD0vc29tZXdoZXJlOyBtYWtlIGNsZWFuOyBtYWtlIHByZWZpeD0vc29td2hlcmUvZWxzZScKICAgICAgICAgICAgICBwcm9kdWNlZCBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBpbmNvcnJlY3QgbGlicmFyeSBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSBBZGRlZCAtbGRmbGFncyBjb21tYW5kbGluZSBvcHRpb24gZm9yIE16U2NoZW1lLCBPY2FtbCwgUGlrZSBhbmQgUEhQLgogICAgICAgICAgICAtIEZpeGVkIHJlcG9ydGluZyBvZiBjb21waWxlciB1c2VkIHdoZW4gdXNpbmcgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICAtIFNXSUcgd2ViIGFkZHJlc3MgYWRkZWQgdG8gLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgoKMTIvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBmaXggdG8gVGNsIGR5bmFtaWMgY2FzdCB0eXBlbWFwcy4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgS3Jpc3RvcGhlciBCbG9tLgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdGVtcGxhdGUgYXJndW1lbnQgcmVwbGFjZSBidWcuICBSZXBvcnRlZCBieQogICAgICAgICAgICBDaHJpcyBGbGF0bGV5LgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXZlcnRlZCBDSEFOR0VTIDA5LzAzLzIwMDIsIHByZXByb2Nlc3NvciBhcmd1bWVudCBldmFsdWF0aW9uLiAgQXJndW1lbnRzCiAgICAgICAgICAgIGFyZSBub3QgZXZhbHVhdGVkIGR1cmluZyBjb2xsZWN0aW9uLCBLJlIsIHAuIDIzMC4KCjEyLzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDkwMjIgXSBDb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIEtBSS9LQ0MKCjEyLzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyAncmVsLTEtMycgQ1ZTIGJyYW5jaCBtZXJnZWQgYmFjayBpbnRvIHRoZSBtYWluIGJyYW5jaC4KCgpWZXJzaW9uIDEuMy4xNyAoTm92ZW1iZXIgMjIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxMzkyMiBdIHByZXByb2Nlc3NvciBlcnJvcnMgd2l0aCBIQVZFX0xPTkdfTE9ORy4KICAgICAgICAgICAgCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTU0ODAgXSBtenNjaGVtZSBTV0lHX011c3RHZXRQdHJfLgoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTExOSBdIFNXSUdfY3JvYWsgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmcuCgoxMS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHR5cGVtYXBzIGZvciBwb2ludGVycyB0byBjbGFzcyBtZW1iZXJzLgoKMTEvMTUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMgd2hpY2ggY2Fubm90IGJlIG92ZXJsb2FkZWQgaW4gSmF2YSAKICAgICAgICAgICAgb25jZSBhZ2FpbiBpc3N1ZSBhIHdhcm5pbmcuCgoxMS8xNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEhhbmRsaW5nIG9mIE5VTEwgcG9pbnRlcnMgaXMgaW1wcm92ZWQuIEEgamF2YSBudWxsIG9iamVjdCB3aWxsIG5vdwogICAgICAgICAgICBiZSB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIGEgTlVMTCBDL0MrKyBwb2ludGVyIGJ5IGRlZmF1bHQuIFByZXZpb3VzbHkgd2hlbiAKICAgICAgICAgICAgd3JhcHBpbmc6CgogICAgICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNzIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzICpzKTsKCiAgICAgICAgICAgIGFuZCBpdCB3YXMgY2FsbGVkIGZyb20gSmF2YSB3aXRoIG51bGw6CgogICAgICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28obnVsbCkKCiAgICAgICAgICAgIGEgSmF2YSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiBFeHRyYSB0eXBlbWFwcyBoYWQgdG8gYmUgd3JpdHRlbiBpbgogICAgICAgICAgICBvcmRlciB0byBvYnRhaW4gYSBOVUxMIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jdGlvbnMgbGlrZSB0aGlzIG9uZS4gTm93IHRoZSAKICAgICAgICAgICAgZGVmYXVsdCB3cmFwcGluZyB3aWxsIGRldGVjdCAnbnVsbCcgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIGEgTlVMTCBwb2ludGVyLgogICAgICAgICAgICBBbHNvIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgZWc6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgU29tZUNsYXNzICpiYXIoKSB7IHJldHVybiBOVUxMOyB9CiAgICAgICAgICAgIAogICAgICAgICAgICBUaGVuIHRoaXMgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggYSBTb21lQ2xhc3MgcHJveHkgY2xhc3MgaG9sZGluZyBhIE5VTEwKICAgICAgICAgICAgcG9pbnRlci4gTm93IG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4gVGhlc2UgY2hhbmdlcyBhcmUgc3VidGxlIGJ1dCB1c2VmdWwuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCB0eXBlbWFwczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkJmphdmFjbGFzc25hbWUoJGpuaWNhbGwsIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCjExLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IG1ldGhvZHMgYW5kIHNpZ25hdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgICBtZXRoKGludCBtZXRoX3BhcmFtKSA9IDA7IAogICAgICAgICAgICB9OyAKIAogCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2JhciA6IHB1YmxpYyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIGludCBtZXRoKGludCBtZXRoX3BhcmFtXzEsIGludCBtZXRoX3BhcmFtXzIpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3RfYmFyIGlzIHN0aWxsIGFic3RyYWN0LgoKICAgICAgICAgICAgRml4ZXMgWyA2Mjg0MzggXSBEZXJpdmVkIGFic3RyYWN0IGNsYXNzIG5vdCBhYnN0cmFjdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYW5kIHBhdGNoZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIG1hdGNoaW5nIHByb2JsZW0gd2l0aCB0eXBlbWFwcyBhbmQgYXJyYXkgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICAgaGFkIHRoaXM6CgogICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgYmxhaFsyMF07CgogICAgICAgICAgICBhbmQgYSB0eXBlbWFwOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAgIC4uLiAkMV9kaW0wIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuICQxX2RpbSogdmFyaWFibGVzIHdlcmVuJ3QgYmUgZXhwYW5kZWQgcHJvcGVybHkuICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFua2FqIEt1bWFyIEdvZWwuCiAgICAgICAgICAgICAgIAoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgQWRkZWQgYW4gZXhwZXJpbWVudGFsIG5ldyBtb2R1bGUgdGhhdCBkdW1wcyBTV0lHJ3MgcGFyc2UKCSAgICB0cmVlIGFzIChDb21tb24pIExpc3Agcy1leHByZXNzaW9ucy4gIFRoZSBtb2R1bGUgaXMKCSAgICBpbnZva2VkIHdpdGggU1dJRydzIC1zZXhwIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGUgb3V0cHV0CgkgICAgY2FuIGJlIHJlYWQgaW50byBDb21tb24gTGlzcC4gIFRoZXJlIGlzIChwcm90b3R5cGUpCgkgICAgZXhhbXBsZSBMaXNwIGNvZGUgdGhhdCBnZW5lcmF0ZXMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKCSAgICBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggS2V2aW4gUm9zZW5iZXJnJ3MgVUZGSS4KCgkgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBSZW1vdmVkIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAiY3BwX3RlbXBsYXRlX2RlY2wiIGluCgkgICAgcGFyc2VyLnk7IGJpc29uIDEuNzUgY29tcGxhaW5lZC4KCjExLzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBwcmltaXRpdmUgYXJyYXkgaGFuZGxpbmcgaGFzIGNoYW5nZWQgbGlrZSBhcnJheXMgb2YgY2xhc3Nlcy4gCiAgICAgICAgICAgIEMgcHJpbWl0aXZlIGFycmF5cyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgYSBKYXZhIGFycmF5IGJ1dCB3aXRoIGEgcG9pbnRlciAKICAgICAgICAgICAgKHR5cGUgd3JhcHBlciBjbGFzcykuIEFnYWluIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIAogICAgICAgICAgICBUaGUgb3JpZ2luYWwgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYXJyYXlzX2phdmEuaSwgc28gdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIG1lcmVseSBpbmNsdWRpbmcgdGhpcyBmaWxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgoKICAgICAgICAgICAgVGhlIGFycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZXkgYXJlIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5jbHVkaW5nIHRoaXMgZmlsZSwgdGh1cyB0aGlzIG9mdGVuIHVudXNlZCBjb2RlIGlzIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gc3BlY2lmaWNhbGx5IHJlcXVpcmluZyB0aGlzIHR5cGUgb2YgYXJyYXkgc3VwcG9ydC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjExLzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYXMgd2FzCiAgICAgICAgICAgIHByZXZpb3VzbHkgYWRkZWQgZm9yIHRoZSBQZXJsIG1vZHVsZSkuIFNvIGEgJW1vZHVsZSBkaXJlY3RpdmUKICAgICAgICAgICAgb2YgdGhlIGZvcm06CgogICAgICAgICAgICAgICAgJW1vZHVsZSAiT3V0ZXI6OklubmVyOjpGb28iCgogICAgICAgICAgICB3aWxsIG5lc3QgZXZlcnl0aGluZyBhcyAoaW4gUnVieSBjb2RlKToKCiAgICAgICAgICAgICAgICBtb2R1bGUgT3V0ZXIKICAgICAgICAgICAgICAgICAgbW9kdWxlIElubmVyCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIEZvbwogICAgICAgICAgICAgICAgICAgICAgIyBzdHVmZiBnb2VzIGhlcmUKICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKIAoxMS8wNS8yMDAyOiBta29lcHBlIAoJICAgIFtNelNjaGVtZV0gQWRkIGFuIGFyZ3VtZW50ICgtZGVjbGFyZW1vZHVsZSkgdGhhdCBnZW5lcmF0ZXMKCSAgICBjb2RlIHRvIGNvcnJlY3RseSBkZWNsYXJlIGEgcHJpbWl0aXZlIG1vZHVsZSBleHRlbnNpb24uCgkgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEJydWNlIEJ1dHRlcmZpZWxkLgoKMTEvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBwYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBDYWhpbGwgdG8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgd2FybmluZ3MgZm9yIHRoZSBqZW52IGFuZCBjbHMgcGFyYW1ldGVycy4gVGhpcyBwYXRjaCBhbHNvIGFsc28gYWxsb3dzIG9uZQogICAgICAgICAgICB0byB1c2UgInZvaWQiIGluIHRoZSBqbmkgdHlwZW1hcCBmb3IgYW55IHR5cGUgd2l0aG91dCBjb2RlIGJlaW5nIGdlbmVyYXRlZAogICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHJldHVybiBhIHZhbHVlLgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBcnJheSBoYW5kbGluZyBpcyBkaWZmZXJlbnQuIEFycmF5cyBvZiBjbGFzc2VzIGFyZSBubyBsb25nZXIgd3JhcHBlZAogICAgICAgICAgICB3aXRoIHByb3h5IGFycmF5cywgZWcgd3JhcHBpbmcKCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwogICAgICAgICAgICAKICAgICAgICAgICAgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggdGhlc2UgSmF2YSBnZXR0ZXJzIGFuZCBzZXR0ZXJzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWFtdIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYW10gZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBpbmVmZmljaWVudCBhcyB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBudW1lcm91cwogICAgICAgICAgICB0aW1lcyBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGdldHRlciBvciBzZXR0ZXIuIFRoZXNlIGFycmF5cyBhcmUgbm93CiAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBhIHBvaW50ZXIgc28gaXQgaXMgb25seSBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgCiAgICAgICAgICAgIHVzaW5nIGEgcHJveHkgY2xhc3M6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBBcnJheXMgb2YgZW51bXMgaGF2ZSBhbHNvIGJlZW4gc2ltaWxhcmx5IGNoYW5nZWQuIFRoaXMgYmVoYXZpb3VyIGlzIG5vdyBsaWtlIHRoZSAKICAgICAgICAgICAgb3RoZXIgU1dJRyBsYW5ndWFnZSdzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgYXJyYXkgbGlicmFyeSBzaG91bGQgYmUgdXNlZCB0byAKICAgICAgICAgICAgYWNjZXNzIHRoZSBvdGhlciBlbGVtZW50cy4gVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdGhlIAogICAgICAgICAgICBtYWNyb3MgYW5kIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgSkFWQV9BUlJBWVNPRkNMQVNTRVMoWCkKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFR3byBuZXcgdHlwZW1hcHMgamF2YWluIGFuZCBqYXZhb3V0IGZvciBnZW5lcmF0aW5nIHRoZSBwcm94eSBjbGFzcyAKICAgICAgICAgICAgYW5kIHR5cGUgd3JhcHBlciBjbGFzcyBtZXRob2QgY2FsbHMgdG8gdGhlIEpOSSBjbGFzcy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgCiAgICAgICAgICAgIHJlYWxseSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgdGhlIGpzdHlwZSAodXNlZCBpbiBwcm94eSBjbGFzcyBhbmQgdHlwZSB3cmFwcGVyCiAgICAgICAgICAgIGNsYXNzZXMpIHRvIHRoZSBqdHlwZSAodXNlZCBpbiB0aGUgSk5JIGNsYXNzKSBhbmQgdmlzYSB2ZXJzYS4gQSBqYXZhaW4gdHlwZW1hcAogICAgICAgICAgICBpcyByZXF1aXJlZCB3aGVuZXZlciBhbiBpbiB0eXBlbWFwIGlzIHdyaXR0ZW4gYW5kIHNpbWlsYXJseSBqYXZhb3V0IGZvciBhbiBvdXQKICAgICAgICAgICAgdHlwZW1hcC4gQW4gZXhhbXBsZSBpcyBwcm9iYWJseSBiZXN0IHRvIHNob3cgdGhlbSB3b3JraW5nOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgQ2xhc3MgIkNsYXNzLmdldENQdHIoJGphdmFpbnB1dCkiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIHVuc2lnbmVkIHNob3J0ICIkamF2YWlucHV0IgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgQ2xhc3MgKiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcygkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzcyB7fTsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAqIGJhcihDbGFzcyBjbHMsIHVuc2lnbmVkIHNob3J0IHVzaCkgeyByZXR1cm4gbmV3IENsYXNzKCk7IH07CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBwcm94eSBjb2RlIGlzIHRoZW46CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzcyBiYXIoQ2xhc3MgY2xzLCBpbnQgdXNoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoZXhhbXBsZUpOSS5iYXIoQ2xhc3MuZ2V0Q1B0cihjbHMpLCB1c2gpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgU29tZSBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIHR5cGVtYXBzLgogICAgICAgICAgICBIZXJlICRqYXZhaW5wdXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2NscycgYW5kICd1c2gnLiAkam5pY2FsbCBoYXMgYmVlbiByZXBsYWNlZCBieSAKICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRob2QgY2FsbCwgJ2V4YW1wbGVKTkkuYmFyKC4uLiknIGFuZCAkb3duZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2ZhbHNlJy4KICAgICAgICAgICAgJGphdmFpbnB1dCBpcyBhbmFsb2dvdXMgdG8gdGhlICRpbnB1dCBzcGVjaWFsIHZhcmlhYmxlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICAgICAgICRqbmljYWxsIGlzIGFuYWxvZ291cyB0byAkYWN0aW9uIGluICVleGNlcHRpb24uIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgICRvd25lciBpcyByZXBsYWNlZCBieSBlaXRoZXIgdHJ1ZSBpZiAlbmV3b2JqZWN0IGhhcyBiZWVuIHVzZWQgb3RoZXJ3aXNlIGZhbHNlLgoKICAgICAgICAgICAgVGhlIGphdmEuc3dnIGZpbGUgY29udGFpbnMgZGVmYXVsdCBqYXZhaW4gYW5kIGphdm91dCB0eXBlbWFwcyB3aGljaCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgY29kZQogICAgICAgICAgICBhcyBwcmV2aW91c2x5LiBUaGlzIGNoYW5nZSBpcyBvbmx5IG9mIGNvbmNlcm4gdG8gdGhvc2Ugd2hvIGhhdmUgd3JpdHRlbiB0aGVpciBvd24gdHlwZW1hcHMgYXMKICAgICAgICAgICAgeW91IHdpbGwgdGhlbiBtb3N0IGxpa2VseSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGphdmFpbiBhbmQgamF2YW91dCB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBqYXZhb3V0IHR5cGVtYXAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgYSBKYXZhIGRvd25jYXN0IHRvIGJlIHVzZWQgb24gYWJzdHJhY3QgCiAgICAgICAgICAgIHByb3h5IGJhc2UgY2xhc3Nlcy4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gb24gZHluYW1pY19jYXN0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjQvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBVcGdhZGVkIHRvIGxpYnRvb2wgMS40LjMsIHByZXN1bWFibHkgdy8gYmV0dGVyCgkgICAgc3VwcG9ydCBmb3IgbmV3aXNoIHBsYXRmb3JtcyAobGlrZSBNYWNPUyBYKS4KCjEwLzIxLzIwMDI6IHR0bgoJICAgIEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYnVnIC0tIHRoYW5rcyB0byBSaWNoYXJkIENhbG1iYWNoLgoKMTAvMTgvMjAwMjogdHRuCgkgICAgRml4ZWQgdHlwbyBpbiBkb2guaCAtLSB0aGFua3MgdG8gTWF4IEhvcm4uCgpWZXJzaW9uIDEuMy4xNiAoT2N0b2JlciAxNCwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCAlZmVhdHVyZSByZXBvcnRlZAogICAgICAgICAgICBieSBXaWxsaWFtIEZ1bHRvbi4KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgT3BlblZNUyBidWlsZCBkaXJlY3RvcnkgKHZtcykuICBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgSmVhbi1GcmFu529pcyBQaWVyb25uZS4KCjEwLzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIGNsYXVzZSB0byB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICBUaGUgdGhyb3dzIGNsYXVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdlbmVyYXRlZCBmb3IgcHJveHkgZnVuY3Rpb25zCiAgICAgICAgICAgIGFuZCBtb2R1bGUgY2xhc3MgZnVuY3Rpb25zLgoKMDkvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIGFuZCBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgd2VyZSBkZWZpbmVkIGJ1dCBub3Qgd3JhcHBlZC4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTGVzbGllIEJyb29rcywKICAgICAgICAgICAgR2VycnkgV29vZHMsIGFuZCBvdGhlcnMuCgowOS8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbWUgZXJyb3IgY2hlY2tpbmcgYWRkZWQ6CiAgICAgICAgICAgIDEpIE91dE9mTWVtb3J5RXhjZXB0aW9uIGNoZWNrIGluIHRoZSBjaGFyICogdHlwZW1hcHMuIAogICAgICAgICAgICAyKSBBcyBTV0lHIHRyZWF0cyBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcGFzc2luZyBieSB2YWx1ZSBhbGwgdGhlCiAgICAgICAgICAgIHNhbWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMKICAgICAgICAgICAgYW4gb2JqZWN0IHBhc3NlZCBieSB2YWx1ZSBvciBieSByZWZlcmVuY2UuIEEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgCiAgICAgICAgICAgIG5vdyB0aHJvd24gdW5kZXIgdGhpcyBzY2VuYXJpby4KCjA5LzIwLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2xlYW4iIGFuZCAibWFrZSBpbnN0YWxsIgoJCQkgIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBFeHBsYWluIGhvdyB0byBleHRlbmQgIm1ha2UgaW5zdGFsbCIgdy8gZXh0cmEtaW5zdGFsbC5saXN0LgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGlvbiBvZiB0aGUgImlnbm9yZSIgdHlwZW1hcC4gICBUaGUgImlnbm9yZSIgdHlwZW1hcCBoYXMKICAgICAgICAgICAgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlICJpbiIgdHlwZW1hcC4KICAgICAgICAgICAgVG8gaWdub3JlIGFuIGFyZ3VtZW50LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluLG51bWlucHV0cz0wKSBpbnQgKm91dHB1dCAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uCiAgICAgICAgICAgIG9mIHRoZSAiaW4iIGFuZCAiaWdub3JlIiB0eXBlbWFwcyAod2hpY2ggd2VyZSBzdXBwb3NlZCB0byBiZQogICAgICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUpLgoKICAgICAgICAgICAgVGhlIHVzZSBvZiB0aGUgbnVtaW5wdXRzIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICBDdXJyZW50bHksIHZhbHVlcyA+MSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAgSG93ZXZlciwgZnV0dXJlCiAgICAgICAgICAgIHJlbGVhc2VzIG9mIFNXSUcgbWF5IHV0aWxpemUgdGhhdCB0byBzdXBwb3J0IG11bHRpLWlucHV0IHR5cGVtYXBzLgoKICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBzdGlsbCB3b3JrcywgYnV0IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaXMKICAgICAgICAgICAgdHJhbnNsYXRlZCB0byAldHlwZW1hcChpbixudW1pbnB1dHM9MCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgZm9yIHVubmFtZWQgc3RydWN0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICB9ICpibGFoOwoKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvZ2VyIEdpYnNvbi4KICAgICAgICAgICAgTm90ZTogd2UgbWlnaHQgYmUgYWJsZSB0byBnZW5lcmF0ZSB3cmFwcGVycyBpbiBzcGVjaWFsIGNhc2VzLgoKMDkvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBtb2RpZmljYXRpb24gdG8gZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAgUG9pbnRlciBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICBhbHdheXMgc2V0IHRvIGFuIGluaXRpYWwgdmFsdWUgb2YgMC4gICBTaW1wbGlmaWVzIHR5cGVtYXAgd3JpdGluZyBhbmQgY2xlYW51cAogICAgICAgICAgICBjb2RlIChzaW5jZSB5b3UgY2FuIHJlbHkgb24gemVyby12YWx1ZSBpbml0aWFsaXphdGlvbikuICAgVGhpcyBhbHNvIGdyZWF0bHkKICAgICAgICAgICAgcmVkdWNlcyB0aGUgbmVlZCB0byBldmVyIHdyaXRlIGFuICJhcmdpbml0IiB0eXBlbWFwLgoKMDkvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBzbWFydC1wb2ludGVyIHN1cHBvcnQuICBJZiBvcGVyYXRvci0+KCkKICAgICAgICAgICAgaXMgcGFydCBvZiBhbiBpZ25vcmVkIGJhc2UgY2xhc3MgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAlaWdub3JlIEJhcjsKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgICAgICAgICAvKiBJZ25vcmVkICovCiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIHRoZW4gbWV0aG9kcyBmcm9tIEZvbyBhcmUgc3RpbGwgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpCiAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgIFRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgdGhlIG9wZXJhdG9yLT4oKSBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKHNpbmNlIGl0IHdhc24ndCB3cmFwcGVkKS4gICBUaGVyZWZvcmUsIHRoZXJlIHdvbid0IGJlIGFueQogICAgICAgICAgICAgX19kZXJlZl9fKCkgb3BlcmF0aW9uIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGFkZGVkIHRvIFNwYW0KICAgICAgICAgICAgIChlaXRoZXIgdXNpbmcgJWV4dGVuZCBvciBqdXN0IHBsYWNpbmcgb3BlcmF0b3ItPigpIGluIHRoZQogICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBTcGFtKS4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2hlY2siIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBEb2N1ZW1lbnRlZCBtZXRob2RvbG9neSBpbiBNYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbRG9jc10gUHJlZml4ZWQgTWFudWFsLyouaHRtbCB3aXRoICI8IURPQ1RZUEUgaHRtbCAuLi4+IiB0bwoJICAgIHBhbmRlciBkb3RpbmdseSB0byAob3Zlci0pc2Vuc2l0aXZlIGVkaXRvcnMuCgowOS8xMC8yMDAyOiB0dG4KCSAgICBbR3VpbGVdIENvbnZlcnRlZCBFeGFtcGxlcy9ndWlsZS9zaW1wbGUgIm1ha2UgY2hlY2siCgkgICAgYmVoYXZpb3IgdG8gYWN0dWFsbHkgY2hlY2sgZXhlY3V0aW9uIHJlc3VsdHMuICBSZWR1Y2VkCgkgICAgaXRlcmF0aW9uIGNvdW50cyBzbyB0aGF0IHRoZSB0ZXN0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZy4KCjA5LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRy0xLjMuMTUgcmVsZWFzZWQuCgoKVmVyc2lvbiAxLjMuMTUgKFNlcHRlbWJlciA5LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjA5LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbmFzdHkgcnVudGltZSB0eXBlIGNoZWNraW5nIGJ1ZyB3aXRoIHN1YnR5cGVzIGFuZCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLiAKCjA5LzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBleGNlcHRpb24gY2xhc3NlcyBmb3IgYSBtZXRob2QncyB0aHJvd3MgY2xhdXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgCiAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlbSBpbiBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IGluIHRoZSB0aHJvd3MgYXR0cmlidXRlIGluIGFueSBvbmUKICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB0eXBlbWFwczogaW4sIG91dCwgY2hlY2ssIGZyZWVhcmcsIGFyZ291dCBhbmQgdGhyb3dzLiBBIGNsYXNzaWMKICAgICAgICAgICAgZXhhbXBsZSB3b3VsZCBiZSB0byBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8gYSBzdGFuZGFyZCBKYXZhIGV4Y2VwdGlvbjoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MsIHRocm93cz0iamF2YS5pby5JT0V4Y2VwdGlvbiIpIGZpbGVfZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICBqY2xhc3MgZXhjZXAgPSBqZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vSU9FeGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXApCiAgICAgICAgICAgICAgICAgICAgICAgIGplbnYtPlRocm93TmV3KGV4Y2VwLCAkMS53aGF0KCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsgLy8gb3IgdXNlIFNXSUdfZmFpbAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIGZpbGVfZXhjZXB0aW9uIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB0aHJvdyhmaWxlX2V4Y2VwdGlvbik7CgogICAgICAgICAgICBUaGUgSmF2YSBtZXRob2Qgd2lsbCB0aGVuIGJlIGRlY2xhcmVkIHdpdGggYSB0aHJvd3MgY2xhdXNlOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gey4uLn0KCjA5LzA4LzIwMDI6IG1rb2VwcGUKCSAgKiBbR3VpbGVdIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBhcmdsaXN0IG5vCgkgICAgbG9uZ2VyIGdldHMgY2x1dHRlcmVkIHdpdGggdHlwZSBzcGVjaWZpY2F0aW9uLCBtYWtpbmcgaXQKCSAgICBtb3JlIHJlYWRhYmxlLiAgKEFsc28gdGhlIElMSVNQIGZ1bmN0aW9uIEMtdSBNLXgKCSAgICBgYXJnbGlzdC1saXNwJyBSRVQgd29ya3MgYmV0dGVyIHRoaXMgd2F5LikgIFRoZSB0eXBlcyBvZgoJICAgIGFyZ3VtZW50cyBhcmUgZXhwbGFpbmVkIGluIGFuIGV4dHJhIHNlbnRlbmNlIGFmdGVyIHRoZQoJICAgIGFyZ2xpc3QuIAoJICAgIAoJICAgIFRoZXJlIGFyZSBub3cgdHdvIGRvY3VtZW50YXRpb24tcmVsYXRlZCB0eXBlbWFwIGFyZ3VtZW50czoKCgkgICAgICAgICV0eXBlbWFwKGluLCBkb2M9IiROQU1FIGlzIGEgdmVjdG9yIG9mIGludGVnZXJzIiwgCgkJCSBhcmdsaXN0PSIkbmFtZSIpICBpbnQgKlZFQ1RPUiB7IC4uLiB9CgkJCSAKICAgICAgICAgICAgVGhlICJhcmdsaXN0IiB0ZXh0cyBvZiBhbGwgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gbWFrZSB1cAoJICAgIGl0cyBhcmdsaXN0IGluIHRoZSBkb2N1bWVudGF0aW9uLiAgVGhlICJkb2MiIHRleHRzIG9mIGFsbAoJICAgIGFyZ3VtZW50cyBhcmUgY29sbGVjdGVkIHRvIG1ha2UgYSBzZW50ZW5jZSB0aGF0IGRlc2NyaWJlcwoJICAgIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLiAgUmVhc29uYWJsZSBkZWZhdWx0cyBhcmUKCSAgICBwcm92aWRlZC4gCgoJICAgIEFzIHVzdWFsLCAkbmFtZSBpcyBzdWJzdGl0dXRlZCBieSB0aGUgbmFtZSBvZiB0aGUKCSAgICBhcmd1bWVudC4gVGhlIG5ldyB0eXBlbWFwIHZhcmlhYmxlICROQU1FIGlzIGxpa2UgJG5hbWUsCgkgICAgYnV0IG1hcmtlZC11cCBhcyBhIHZhcmlhYmxlLiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzCgkgICAgdXBwZXItY2FzZWQ7IGluIFRlWGluZm8gbW9kZSAoIi1wcm9jZG9jZm9ybWF0IHRleGluZm8iKSBpdAoJICAgIGNvbWVzIG91dCBhcyBAdmFye25hbWV9LiAKCSAgICAKCSAgICBUaGUgZGlyZWN0aXZlcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgICVtdWx0aXBsZV92YWx1ZXMgbm93IGFsc28gaGF2ZSBhbiBlZmZlY3Qgb24gdGhlCgkgICAgZG9jdW1lbnRhdGlvbi4gKFRoaXMgaXMgYWNoaWV2ZWQgdmlhIHRoZSBuZXcgcHJhZ21hcwoJICAgIHJldHVybl9ub3RoaW5nX2RvYywgcmV0dXJuX29uZV9kb2MsIHJldHVybl9tdWx0aV9kb2MuKQoKCSAgICBEb2N1bWVudGF0aW9uIGhhcyBhbHNvIGltcHJvdmVkIGZvciB2YXJpYWJsZXMgdGhhdCBhcmUKCSAgICB3cmFwcGVkIGFzIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzIChjb21tYW5kLWxpbmUgc3dpdGNoCgkgICAgIi1lbWl0LXNldHRlcnMiKS4KCiAgICAgICAgICAqIFtHdWlsZV0gRW1pdCBjb25zdGFudHMgYXMgX2ltbXV0YWJsZV8gdmFyaWFibGVzLiAgKFRoaXMKICAgICAgICAgICAgd2FzIGJyb2tlbiByZWNlbnRseS4pCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBVcGRhdGVkIHRoZSB0eXBlbWFwcyBpbiBsaXN0LXZlY3Rvci5pLgoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFNob3J0LWNpcmN1aXQgdGhlIHR5cGVjaGVja3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgoJICAgIChUaGUgY2hhbmdlcyBpbiBjb2RlIGdlbmVyYXRpb24gYXJlIHZpc2libGUgaW4gdGhlIG5ldwoJICAgIHRlc3RjYXNlICJvdmVybG9hZF9jb21wbGljYXRlZCIuKQoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb2x1dGlvbiBmb3IgWyA1OTY0MTMgXQogICAgICAgICAgICBOZXcgdHlwZW1hcCBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIHdyYXBwZXIgY29uc3RydWN0b3IgbW9kaWZpZXIgY2FuIGJlIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAKICAgICAgICAgICAgcHJvdGVjdGVkLiBOb3JtYWxseSBTV0lHIGdlbmVyYXRlcyBhIGNvbnN0cnVjdG9yIGxpa2UgdGhpcyB3aGljaCBjYW4gb25seSAKICAgICAgICAgICAgYmUgYWNjZXNzZWQgd2l0aGluIG9uZSBwYWNrYWdlOgoKICAgICAgICAgICAgICBwcm90ZWN0ZWQgQmFyKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSWYgeW91IGFyZSB1c2luZyBTV0lHIGFjcm9zcyBtdWx0aXBsZSBwYWNrYWdlcyBvciB3YW50IHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIGFueXdheSwgaXQgY2FuIG5vdyBiZSBhY2Nlc3NlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLiBUbyBtb2RpZnkgdXNlIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFICJwdWJsaWMiCgogICAgICAgICAgICB0byBjaGFuZ2UgdG8gcHVibGljIGZvciBhbGwgcHJveHkgY2xhc3NlcyBhbmQgc2ltaWxhcmx5IGZvciBhbGwgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICJwdWJsaWMiCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyB0eXBlbWFwcyBmb3IgdGhlIEphdmEgbW9kdWxlLiBDKysgZXhjZXB0aW9ucyBnZXQgY29udmVydGVkIGludG8KICAgICAgICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gSmF2YSBleGNlcHRpb25zLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIFdhcm5pbmc6IFRoaXMgbWF5IGNoYW5nZSBmcm9tIGphdmEubGFuZy5SdW50aW1lIGV4Y2VwdGlvbiBpbiB0aGUgZnV0dXJlLgoKMDkvMDUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHZhcmlhYmxlcyBkZWNsYXJlZCBhcyByZWZlcmVuY2VzLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowOS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9yZSB1cGRhdGVzIHRvIHRoZSBSdWJ5IG1vZHVsZSBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcKCSAgICBhIG5ldyB0eXBlbWFwIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGNvbGxlY3Qga2V5LXZhbHVlCgkgICAgcGFpcnMgZnJvbSBhbiBhcmd1bWVudCBsaXN0IGludG8gYSBIYXNoLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24gYW5kIGNvbnN0cnVjdG9ycy4KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEZvbzxUPigpIHsgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBleHRyYSA8VD4gaW4gdGhlIGNvbnN0cnVjdG9yIHdhcyBjYXJyaWVkIHRocm91Z2ggaW4gdGhlCiAgICAgICAgICAgIG5hbWUtLWNhdXNpbmcgcnVudGltZSBwcm9ibGVtcyBpbiBnZW5lcmF0ZWQgbW9kdWxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9yZGkgQXJuYWJhdCBCZW5lZGljdG8uCiAKMDkvMDUvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gU3VwcG9ydCBvdmVybG9hZGluZy4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlcwoJICAgIHRvIHVzZSBSdWJ5IDEuNyBzdXBwb3J0IGZvciB0aGVzZSB0eXBlcyB3aGVuIGF2YWlsYWJsZS4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBvdXRwdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZSB0byBwcmltaXRpdmUKCSAgICB0eXBlcy4KCjA5LzA0LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBwYXNzLWJ5LXZhbHVlIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgQXJubwoJICAgIFBldGVycyB2aWEgRGViaWFuIGJ1Z3RyYWNraW5nICgjMTU2OTAyKSwgcGF0Y2ggYnkgVG9yc3RlbgoJICAgIExhbmRzY2hvZmYgPHRvcnN0ZW5AZGViaWFuLm9yZz4uCgowOS8wMy8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCgkgICAgQmV0dGVyIHJlZmVyZW5jZSBzdXBwb3J0LgoJICAgIEZ1bmN0aW9ucyB0aGF0IHdhbnQgYSB2b2lkKiogY2FuIHRha2UgYSBOVUxMIGJ5IHJlZmVyZW5jZSBhbmQKCSAgICB0aGUgdm9pZCogd2lsbCBiZSBtYWRlIGZvciB5b3UgYW5kIHRoZW4gcGFzc2VkLWJ5LXJlZmVyZW5jZQoKCSAgICBBbHNvIGFsbCBpbnRlZ2VyLWNsYXNzIG5hdGl2ZSB0eXBlcyBjYW4gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZQoJICAgIHdoZXJlIGFuIGludCogb3IgaW50JiBldGMgaXMgbmVlZGVkCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZWQgdGhlIGV2YWx1YXRpb24gb3JkZXIgb2YgcHJlcHJvY2Vzc29yIG1hY3JvIGFyZ3VtZW50cy4KICAgICAgICAgICAgQXJndW1lbnRzIGFyZSBub3cgZXhwYW5kZWQgYnkgdGhlIHByZXByb2Nlc3NvciAqYmVmb3JlKiB0aGV5CiAgICAgICAgICAgIGFyZSBwYXNzZWQgdG8gbWFjcm8gZXhwYW5zaW9uLiAgVGhpcyBmaXhlcyBhIHN1YnRsZSBleHBhbnNpb24KICAgICAgICAgICAgYnVnIHJlcG9ydGVkIGJ5IEFudGhvbnkgSGVhZGluZy4KCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGhlIGZpbGUgaW5jbHVkZSBvcmRlciAoYWdhaW4sIGFwcGFyZW50bHkpLiBTZWUgMi8yNy85OS4KCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEJldHRlciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIFNpbmNlIFBlcmwgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgICAgcmVsaWVzIG9uIHNldGptcC9sb25nam1wLCB3cmFwcGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkKICAgICAgICAgICAgdG8gcHJvdmlkZSBhbiBleHRyYSBibG9jayBzY29wZToKCiAgICAgICAgICAgICAgICBYUyhmb28pIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgX3N3aWdtc2dbU1dJR19NQVhfRVJSTVNHXSA9ICIiOwogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX3N3aWdlcnIgPSBfc3dpZ21zZzsKICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIC8qIE5vcm1hbCB3cmFwcGVyIGZ1bmN0aW9uIGhlcmUgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgU1dJR19jcm9haygiQW4gZXJyb3Igb2NjdXJyZWRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBYU1JFVFVSTihhcmd2aSk7ICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gKi8KICAgICAgICAgICAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgY29kZSAqLwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgY3JvYWsoX3N3aWdfZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBtYWNybyBTV0lHX2Nyb2FrKHgpIHNldHMgdGhlIHZhbHVlIG9mIF9zd2lnZXJyIHRvIHggYW5kCiAgICAgICAgICAgIGV4ZWN1dGVzIGEgImdvdG8gZmFpbCIuICBUaGUgd2hvbGUgd3JhcHBlciBmdW5jdGlvbiBpcyBlbmNsb3NlZAogICAgICAgICAgICBibG9jayBzY29wZSB0byBwcm92aWRlIHByb3BlciBjbGVhbnVwIG9mIEMrKyBvYmplY3RzLiAgU2luY2UKICAgICAgICAgICAgY3JvYWsgZXhlY3V0ZXMgYSBsb25nam1wKCksIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseSByZWNsYWltCiAgICAgICAgICAgIHJlc291cmNlcyBpZiB0aGlzIGV4ZWN1dGVzIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSB3cmFwcGVyCiAgICAgICAgICAgIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIF9zd2lnbXNnW10gdmFyaWFibGUgaXMgbm9ybWFsbHkgdW51c2VkLCBidXQgY2FuIGJlIHVzZWQKICAgICAgICAgICAgdG8gc3RvcmUgc21hbGwgZXJyb3IgbWVzc2FnZXMgdXNpbmcgc3ByaW50ZiBvciBzbnByaW50Zi4gSXQKICAgICAgICAgICAgaGFzIGEgY2FwYWNpdHkgb2YgYXQgbGVhc3QgMjU2IGJ5dGVzIChTV0lHX01BWF9FUlJNU0cpLgogICAgICAgICAgICAKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBiZXR0ZXIgc3VwcG9ydCBmb3IgZXhjZXB0aW9ucy4gIEluc3RlYWQgb2YgcmV0dXJuaW5nIFRDTF9FUlJPUiwKICAgICAgICAgICAgdXNlIHRoZSBtYWNybyBTV0lHX2ZhaWwgdG8gcmV0dXJuIHdpdGggYW4gZXJyb3IuICBUaGlzIGVuc3VyZXMgdGhhdAogICAgICAgICAgICBhcmd1bWVudHMgYXJlIHByb3Blcmx5IGNsZWFuZWQgdXAuICBFeGNlcHRpb24gc3BlY2lmaWVycyBhcmUgbm93CiAgICAgICAgICAgIGhhbmRsZWQgYnkgZGVmYXVsdC4KCjA5LzAyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBUaGUgdHlwZS1jaGVja2luZyBzeXN0ZW0gZm9yIHRoZSBSdWJ5IG1vZHVsZSBoYXMgaGFkIGEgZmxhdwoJICAgIGluIHRoYXQgc29tZSB0eXBlcyB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVpdmFsZW50CgkgICAgd2VyZW4ndC4gVGhpcyBidWcgd2FzIGJlc3QgZGVtb25zdHJhdGVkIGJ5IHRoZSBpbmhlcml0X21pc3NpbmcuaQoJICAgIHRlc3Qgc3VpdGUgY2FzZSwgd2hpY2ggZGVmaW5lcyBhIGJhc2UgY2xhc3MgIkZvbyIgdGhhdCBpcwoJICAgIHN1YmNsYXNzZWQgYnkgIkJhciIuIFRoZSAiRm9vIiBjbGFzcyBpc24ndCBhY3R1YWxseSB3cmFwcGVkIChpLmUuCgkgICAgaXQncyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIFJ1YnkpIGJ1dCB3ZSdkIHN0aWxsIGxpa2UgdG8gYmUKCSAgICBhYmxlIHRvIHBhc3MgIkJhciIgaW5zdGFuY2VzIHRvIGZ1bmN0aW9ucyBleHBlY3RpbmcgRm9vcyBhbmQgaGF2ZQoJICAgIHRoYXQgd29yazsgaXQgd2Fzbid0LiBUaGUgcmV2aXNlZCBpbXBsZW1lbnRhdGlvbiAoc2ltaWxhciB0byB0aGF0CgkgICAgdXNlZCBmb3Igc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzKSBhZGRzIGEgbmV3IGluc3RhbmNlIHZhcmlhYmxlCgkgICAgKF9fc3dpZ3R5cGVfXykgdG8gZWFjaCBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgaXRzIFNXSUcgdHlwZTsKCSAgICB0aGF0IGlzLCBlYWNoICJCYXIiIGluc3RhbmNlIHdpbGwgbm93IGhhdmUgYSBzdHJpbmcgaW5zdGFuY2UKCSAgICB2YXJpYWJsZSBjYWxsZWQgIl9fc3dpZ3R5cGVfXyIgd2hvc2UgdmFsdWUgaXMgIl9wX0JhciIuCgogICAgICAgICAgICBVbmxlc3MgZGV2ZWxvcGVycyB3ZXJlIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhpcyBsb3ctbGV2ZWwKCSAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHRoZXkgc2hvdWxkbid0IG5vdGljZSBhbnkgY29tcGF0aWJpbGl0eQoJICAgIHByb2JsZW1zOyBuZXZlcnRoZWxlc3MsIEknbSBtYXJraW5nIGl0IGFzIGEgInBvdGVudGlhbAoJICAgIGluY29tcGF0aWJpbGl0eSIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzAxLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTRiBCdWcgIzYwMzE5OS4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgT1VUUFVULCBJTlBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3IgQysrIAogICAgICAgICAgICByZWZlcmVuY2VzLgoKMDgvMjcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4ZWQgZXJyb3IgaW4gImxpYl9zdGRfdmVjdG9yIiB0ZXN0Y2FzZSBhbmQKCSAgICBjb21waWxlciB3YXJuaW5nIGluICJsaWJfY2RhdGEiIHRlc3RjYXNlLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiJW1peGluIiBkaXJlY3RpdmUsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0bwoJICAgIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdG8gbWl4LWluIHRvIGEKCSAgICBjbGFzcy4gU28sIGZvciBleGFtcGxlLCBpZiB5b3UnZCBsaWtlIHRvIHNwZWNpZnkgdGhhdCBSdWJ5J3MKCSAgICBFbnVtZXJhYmxlIG1vZHVsZSBzaG91bGQgYmUgbWl4ZWQtaW4gdG8geW91ciBjbGFzcyBGb28sIHlvdSdkCgkgICAgd3JpdGU6CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkVudW1lcmFibGUiOwoJCQogICAgICAgICAgICBvciB0byBzcGVjaWZ5IHRoYXQgdGhlIG1vZHVsZXMgRmVlLCBGaWUgYW5kIEZvIHNob3VsZCBiZSBtaXhlZAoJICAgIGluIHRvIEZvbzoKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRmVlLEZpZSxGbyI7CgkJCgkgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSAlYWxpYXMgZGlyZWN0aXZlIHNvIHRoYXQgbXVsdGlwbGUgYWxpYXNlcwoJICAgIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCBieSB1c2luZyBhIGNvbW1hLXNlcGFyYXRlZAoJICAgIGxpc3Qgb2YgYWxpYXNlcy4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCAidGhyb3ciIHR5cGVtYXBzIGZvciB0aGUgUnVieSBtb2R1bGUuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIHByaW50aW5nIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgJ3N3aWcgLU0nIGxpc3RzIGFsbCBmaWxlIGRlcGVuZGVuY2llcy4gICdzd2lnIC1NTScgbGlzdHMKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLCBidXQgZXhjbHVkZXMgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeS4gCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAlIHN3aWcgLU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvc3dpZy5zd2cgXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvcHl0aG9uL3B5dGhvbi5zd2cgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICAgICUgc3dpZyAtTU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTc1OTkgXSB1bmlvbiBpbiBjbGFzczogaW5jb3JyZWN0IHNjb3BlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwMDEzMiBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBuYW1lc3BhY2UuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBTaGlidWthd2EgWW9zaGlraS4KIAowOC8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEF1dG9tYXRpYyBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgZm9yIGFsbCBsYW5ndWFnZSBtb2R1bGVzLiAgICBUaGlzIGlzCiAgICAgICAgICAgIHByZXR0eSBzaW1wbGUuICBJZiB5b3UgaGF2ZSBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgd3JhcF9CYXJfYmxhaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLT5ibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRm9vICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAidGhyb3ciIHR5cGVtYXAgY29kZSBpbnNlcnRlZC4gJDEgPSBfZSAqLwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFRoZSAidGhyb3ciIHR5cGVtYXAgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4gZXJyb3IgaW4gdGhlIHRhcmdldCAKICAgICAgICAgICAgbGFuZ3VhZ2UuICBJdCBjYW4gZG8gYW55dGhpbmcuICBIZXJlIGlzIGEgdmVyeSBzaW1wbGUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoInRocm93IikgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkZvbyBleGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVG8gbWFrZSB0aGlzIHdvcmsgaW4gZWFjaCBsYW5ndWFnZSBtb2R1bGUsIHNpbXBseSBkZWZpbmUgYSBmZXcgZGVmYXVsdAogICAgICAgICAgICAidGhyb3ciIHR5cGVtYXBzIGZvciBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgaW50LCBjb25zdCBjaGFyICosIGFuZCBhCiAgICAgICAgICAgIGZldyBjb21tb24gZXhjZXB0aW9uIHR5cGVzLiAgIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQuCgogICAgICAgICAgICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAtbm9leGNlcHQgb3IKICAgICAgICAgICAgc2V0dGluZyB0aGUgTm9FeGNlcHQgZ2xvYmFsIHZhcmlhYmxlIHRvIDEuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgWyBQeXRob24gXQogICAgICAgICAgICBBdXRvbWF0aWMgdHJhbnNsYXRpb24gb2YgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBpbnRvIGVycm9yIGhhbmRsaW5nIGNvZGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgRm9vIGlzIHdyYXBwZWQgYXMgYSBjbGFzc2ljLXN0eWxlIGNsYXNzIChjb21wYXRpYmxlCiAgICAgICAgICAgIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nKS4gIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIHdyaXRlIFB5dGhvbiBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBGb28sZTogICAgICMgTm90ZSB1c2Ugb2YgZXhjZXB0aW9uIGNsYXNzIGhlcmUhCiAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgRm9vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGUgb2JqZWN0ICJlIiBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXMganVzdCBhIHdyYXBwZWQgRm9vCiAgICAgICAgICAgIG9iamVjdC4gIEFjY2VzcyBpdCBsaWtlIGEgbm9ybWFsIG9iamVjdC4KCiAgICAgICAgICAgIElmIGFuIGV4Y2VwdGlvbiBpcyBub3Qgd3JhcHBlZCBhcyBhIGNsYXNzLCBhIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgZXhjZXB0aW9uIGlzCiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gb2JqZWN0LiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coaW50KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcixlOgogICAgICAgICAgICAgICAgICAgcHJpbnQgZS5hcmdzWzBdICAgICAgICMgSW50ZWdlciBleGNlcHRpb24gdmFsdWUKCiAgICAgICAgICAgIENvbW1lbnRzOgoKICAgICAgICAgICAgICAgIC0gIElmIGEgY2xhc3MgaXMgdXNlZCBhcyBhbiBleGNlcHRpb24sIGl0ICptdXN0KiBiZSB3cmFwcGVkCiAgICAgICAgICAgICAgICAgICBhcyBhIFB5dGhvbiBjbGFzc2ljLXN0eWxlIGNsYXNzIChuZXcgY2xhc3NlcyBkb24ndCB3b3JrKS4KCiAgICAgICAgICAgICAgICAtICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGNvbXBhdGlibGUgd2l0aCAlZXhjZXB0aW9uLgoKICAgICAgICAgICAgICAgIC0gIFVzZSAtbm9leGNlcHQgdG8gdHVybiBvZmYgdGhpcyBmZWF0dXJlLgoKICAgICAgICAgICAgICAgIC0gIFRoZSBuZXdseSBpbnRyb2R1Y2VkICJ0aHJvdyIgdHlwZW1hcCBpcyB1c2VkIHRvIHJhaXNlCiAgICAgICAgICAgICAgICAgICBQeXRob24gZXJyb3JzIChuYXR1cmFsbHkpLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5mb3JtYXRpb24gZnJvbSB0aHJvdygpIHNwZWNpZmllcnMgaXMgbm93IHN0b3JlZCBpbiB0aGUgcGFyc2UKICAgICAgICAgICAgdHJlZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgdGhyb3coc3BhbSxiYXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIHN0b3JlZCBpbmZvcm1hdGlvbiBpcyBmdWxseSBjb3JyZWN0ZWQgZm9yIG5hbWVzcGFjZXMgYW5kIHdvcmtzCiAgICAgICAgICAgIHdpdGggdGVtcGxhdGVzLiAgVXNlcyB3aWxsIGZvbGxvdy4KICAgICAgICAgICAgCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm8gbG9uZ2VyIGFwcGxpZWQgdG8gbWVtYmVyIGFjY2VzcwogICAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpbiB0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoKHdoYXRldmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vdCBhcHBsaWVkIHRvIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgICBmb3IgRm9vOjp4LiAgIFRoaXMgc2hvdWxkIHJlZHVjZSB0aGUgYW1vdW50IG9mIGV4dHJhIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGVkLgoKICAgICAgICAgICAgQ2F2ZWF0OiAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgKmlzKiB1c2VkIHdoZW4gYXR0cmlidXRlcyBhcmUKICAgICAgICAgICAgYWNjZXNzZWQgdGhyb3VnaCBhIHNtYXJ0LXBvaW50ZXIgb3IgYSBzeW50aGVzaXplZCBhdHRyaWJ1dGVkCiAgICAgICAgICAgIGFkZGVkIHdpdGggJWV4dGVuZCBpcyB1c2VkLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIG1vcmUgcGF0Y2hlcyB0byBob3BlZnVsbHkgZWxpbWluYXRlIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIFNXSUcgCiAgICAgICAgICAgIGFzIGEgNjQtYml0IGV4ZWN1dGFibGUuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggY29uc3QgcmVmZXJlbmNlIG1lbWJlcnMsIHZhcmlhYmxlcywgYW5kIHN0YXRpYyBtZW1iZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50ICZyZWY7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cnlpbmcgdG8gZ2VuZXJhdGUgInNldCIgZnVuY3Rpb25zIHdoaWNoIHdvdWxkbid0IGNvbXBpbGUuIAoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yICJDbGFzcyBYIG1pZ2h0IGFic3RyYWN0IiBvZmYgYnkgZGVmYXVsdC4KICAgICAgICAgICAgRW5hYmxlIHdpdGggLVdhbGwuCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgaGFuZGxpbmcgb2YgY29uc3QgYW5kIG5vbi1jb25zdCBvdmVybG9hZGVkIG1ldGhvZHMuICBJZgogICAgICAgICAgICBhIGNsYXNzIGRlZmluZXMgYSBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpOwogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KSBjb25zdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZW4gdGhlIG5vbi1jb25zdCBtZXRob2QgaXMgKmFsd2F5cyogc2VsZWN0ZWQgaW4gb3ZlcmxvYWRpbmcgYW5kCiAgICAgICAgICAgIHRoZSBjb25zdCBtZXRob2Qgc2lsZW50bHkgZGlzY2FyZGVkLiAgSWYgcnVubmluZyB3aXRoIC1XYWxsLCBhIHdhcm5pbmcKICAgICAgICAgICAgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCjA4LzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgaW5oZXJpdGFuY2UuICAgQ29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJsYWgoZG91YmxlIHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29CYXIgOiBwdWJsaWMgRm9vLCBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJsYWgoY2hhciAqeCk7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBCYXI6OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IFNXSUcgd3JhcHMgRm9vQmFyOjpibGFoIGFzIGFuIG92ZXJsb2FkZWQgbWV0aG9kIHRoYXQgdXNlcyBhbGwKICAgICAgICAgICAgYWNjZXNzaWJsZSB2ZXJzaW9ucyBvZiBibGFoKCkuICBTZWUgc2VjdGlvbiAxNS4yLjIgaW4gU3Ryb3VzdHJ1cCwgM3JkIEVkLgoKICAgICAgICAgICAgU1dJRyBhbHNvIHN1cHBvcnRzIGFjY2VzcyBjaGFuZ2UgdGhyb3VnaCB1c2luZyBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjp4OwogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIENhdmVhdDogICBTV0lHIGRvZXMgbm90IGFjdHVhbGx5IGNoZWNrIHRvIHNlZSBpZiBkZWNsYXJhdGlvbnMgaW1wb3J0ZWQKICAgICAgICAgICAgdmlhICd1c2luZycgYXJlIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuICBJZiB0aGlzIG9jY3VycywgdGhlCiAgICAgICAgICAgIHdyYXBwZXIgY29kZSB3b24ndCBjb21waWxlIGFueXdheXMtLS1ub3Qgc3VyZSBpdCdzIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgogICAgICAgICAgCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgb3ZlcmxvYWRpbmcgZGlzcGF0Y2ggdG8gbm90IGluY2x1ZGUgbm9kZXMgd2l0aCBhbiAiZXJyb3IiIGF0dHJpYnV0ZS4KICAgICAgICAgICAgQSBsYW5ndWFnZSBtb2R1bGUgY2FuIHNldCB0aGlzIGlmIGEgbm9kZSBjb3VsZG4ndCBiZSB3cmFwcGVkIGFuZCB5b3UgZG9uJ3Qgd2FudAogICAgICAgICAgICBpdCBpbmNsdWRlZCBpbiB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24uCgowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24gZGlzcGF0Y2guICAgVGhlIGRpc3BhdGNoZXIgaXMgbm93IGF3YXJlIG9mCiAgICAgICAgICAgIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEZvbyAqZik7CiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRpc3BhdGNoZXIgcmUtb3JkZXJzIHRoZSBmdW5jdGlvbnMgc28gdGhhdCBzcGFtKEJhciAqYikgaXMKICAgICAgICAgICAgY2hlY2tlZCBmaXJzdC0tLWl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBzcGFtKEZvbyAqZikuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1XZXJyb3IgY29tbWFuZCBsaW5lIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgd2FybmluZyBtZXNzYWdlcyBhcmUgdHJlYXRlZAogICAgICAgICAgICBhcyBlcnJvcnMgYW5kIFNXSUcgd2lsbCByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk2MTM1IF0gVHlwZWRlZiBvZiByZWZlcmVuY2UgY2FuJ3QgY29tcGlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAmSW50UmVmOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKEludFJlZiBpKTsKCiAgICAgICAgICAgIFNXSUctMS4zLjE0IGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4KClZlcnNpb24gMS4zLjE0IChBdWd1c3QgMTIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBTdGF0aWMgY29uc3QgbWVtYmVycyBpbml0aWFsaXplZCBkdXJpbmcgZGVjbGFyYXRpb24sIGFuZAoJICAgIG9ubHkgdGhlbSwgaWU6CgoJICAgIHN0cnVjdCBBCgkgICAgewkJIAoJCXN0YXRpYyBjb25zdCBpbnQgYSA9IDEgOyAgLy8gdGhpcyBvbmUKCQlzdGF0aWMgY29uc3QgaW50IGI7ICAgICAgIC8vIG5vdCB0aGlzIG9uZQogICAgICAgICAgICB9OyAgICAgCgoJICAgIGFyZSBlbWl0dGVkIGxpa2UgY29uc3RhbnRzIChlcXVpdmFsZW50IHRvIGVudW1zIG9yCgkgICAgZXhwbGljaXQgJWNvbnN0YW50KS4KCSAgICAKCSAgICBUaGlzIGlzIGJlY2F1c2UgdGhleSBjYW5ub3QgYmUgYWRkZWQgZGlyZWN0bHkgdG8gJ2N2YXInCgkgICAgc2luY2UgdGhleSBsYWNrIHRoZSBuZWVkZWQgcmVmZXJlbmNlICh3ZWxsLCB5b3UgY2FuIGZvcmNlCgkgICAgdGhlbSB0byBoYXZlIGEgcmVhbCByZWZlcmVuY2UsIGJ1dCBpbiBhbiB1Z2x5IHdheSB3aGljaAoJICAgIGdvZXMgY29tcGxldGVseSBhZ2FpbiB0aGUgb3JpZ2luYWwgcHVycG9zZSBvZiBpbml0aWFsaXplCgkgICAgdGhlbSBkdXJpbmcgZGVjbGFyYXRpb24sIHlvdSBhbHNvIGhhdmUgdG8gZGVhbCB3aXRoIGV4dHJhCgkgICAgbGlua2luZyBtYXR0ZXJzLCBhbmQgaXQgdGFrZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcwoJICAgIHRoZSBwcm9ibGVtIGFuZCBob3cgdG8gc29sdmUgaXQpLgoJICAgIAoJICAgIFBsZWFzZSB0ZXN0IGl0IHdpdGggeW91ciBwcmVmZXJyZWQgdGFyZ2V0IGxhbmd1YWdlLCBhbmQKCSAgICBub3Qgb25seSB0aGUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmVhbGx5IHJ1biB0aGUgZXhhbXBsZQoJICAgIGluIHRoZSB0ZXN0LXN1aXRlIChzdGF0aWMtY29uc3QtbWVtYmVyLTIuaSkgYmVjYXVzZSB0aGUKCSAgICBwcm9ibGVtIGFuZCB0aGUgc29sdXRpb24gY2Fubm90IGJlICJmdWxseSIgYXBwcmVjaWF0ZWQKCSAgICB1bnRpbCB5b3UgdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZSBhbmQgcnVuIGl0LgoKCSAgICBJbiBzb21lIHRhcmdldCBsYW5ndWFnZXMgKHB5dGhvbiBzcGVjaWFsbHkpLCB0aGlzIGNhbgoJICAgIHByb2R1Y2VzIGEgZGlmZmVyZW5jZSBpbiB0aGUgd2F5IHRoYXQgdGhlIHN0YXRpYyBjb25zdGFudAoJICAgIG1lbWJlcnMgJ2EnIGFuZCAnYicgYXJlIGludGVybmFsbHkgd3JhcHBlZC4gSG9wZWZ1bGx5LAoJICAgIHRoZXkgc3RpbGwgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSBzYW1lIHdheS4KCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBOb3cgc3RhdGljIGNvbnN0IG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGluIGEgbW9yZQoJICAgIG5hdHVyYWwgd2F5LCBpZSwgaWYgeW91IGhhdmUKCgkgICAgc3RydWN0IEEKICAgICAgICAgICAgIHsJCSAKCQl0eXBlZGVmIHVuc2lnbmVkIGludCB2aWV3ZmxhZ3M7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBmb3J3YXJkX2ZpZWxkID0gMDsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGJhY2t3YXJkX2ZpZWxkOwogICAgICAgICAgICB9OyAgICAgCgkgICAgCgkgICAgbm93IHlvdSBjYW4gZG86CgoJCXByaW50IEEuYmFja3dhcmRfZmllbGQKCgkgICAgYW5kIGFsc28KCgkgICAgICAgIGEgPSBBKCkKCQlwcmludCBhLmZvcndhcmRfZmllbGQKCQkKCSAgICBOb3RlIHRoYXQgaWYgdGhlIHN0YXRpYyBjb25zdCBtZW1iZXJzIGRvbid0IGhhdmUgYW4KCSAgICBpbml0aWFsaXplciAobGlrZSBiYWNrd2FyZF9maWVsZCksIHN0aWxsIHlvdSBjYW4gYWNjZXNzCgkgICAgdGhlbSBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHB5dGhvbiBzaWRlLCBidXQgdGhlCgkgICAgaW1wbGVtZW50YXRpb24gaXMgYSBxdWl0ZSBkaWZmZXJlbnQ6IGJhY2t3YXJkX2ZpZWxkIHdpbGwKCSAgICBzdGlsbCBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5LCBhbmQgYWxzbywgeW91IGFyZSAKCSAgICByZXNwb25zaWJsZSB0byBpbml0aWFsaXplIGl0IGluIHNvbWUgY29kZSB1bml0LCBhbmQgbGluayBpdAoJICAgIHByb3Blcmx5LiBmb3J3YXJkX2ZpZWxkLCBieSB0aGUgb3RoZXIgaGFuZCwgd2lsbCBub3QKCSAgICBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5IGJ1dCBvbmx5IGFzIGEgQSBtZW1iZXIsIHNpbWlsYXIKCSAgICB0byB3aGF0IGhhcHBlbiB3aXRoIGVudW0gb3IgJWNvbnN0YW50IG1lbWJlcnMuCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBDb21tb24gY29kZSBpbiB0aGUgX19zZXRhdHRyX18vX19nZXRhdHRyX18gbm93CgkgICAgZ29lcyB0byB0d28gImZyZWUiIG1ldGhvZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJveHkKCSAgICBmaWxlLCBmcm9tIHdoZXJlIGVhY2ggY2xhc3MgdXNlIGl0LiBUaGlzIGNoYW5nZSByZWR1Y2VzCgkgICAgdGhlIHNpemUgb2YgdGhlIHByb3h5IGZpbGUsIHNwZWNpYWxseSBpZiB5b3Ugd3JhcCBhIGxvdCBvZgoJICAgIHNtYWxsIGNsYXNzZXMgaW4gb25lIG1vZHVsZSAodXAgdG8gMzMlIGluIHNvbWUgY2FzZXMpLAoJICAgIG1ha2luZyBpdCBmYXN0ZXIgdG8gbG9hZCB0b28uCgowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSWYgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgY2hhciAqIHJldHVybnMgTlVMTCwKICAgICAgICAgICAgdW5kZWYgaXMgcmV0dXJuZWQgdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuCiAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gY29udmVyc2lvbiBvcGVyYXRvcnMgYW5kIG5hbWVzcGFjZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBCYXIgewogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoZSB3cmFwcGVyIGNvZGUsIFNXSUcgd2FzIHVzaW5nIC0+b3BlcmF0b3IgRm9vKigpCiAgICAgICAgICAgIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiB1c2luZyAtPm9wZXJhdG9yIG5zOjpGb28qKCkuCgogICAgICAgICAgICBOb3RlOiBpZiB1c2luZyAlcmVuYW1lIHdpdGggYSBjb252ZXJzaW9uIG9wZXJhdG9yLCB5b3UKICAgICAgICAgICAgbWlnaHQgaGF2ZSB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXJlbmFtZSh0b0Zvb1B0cikgbnM6Om9wZXJhdG9yIG5zOjpGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBeXl5eIG5vdGUgZXh0cmEgcXVhbGlmaWVyCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBNaW5vciBlbmhhbmNlbWVudCB0byAnY29uc3QnIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgIE5vcm1hbGx5IGNvbnN0IGRlY2xhcmF0aW9ucyBhcmUgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzCiAgICAgICAgICAgIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIHRoZSBjdmFyIGF0dHJpYnV0ZSAoc2VlIFNXSUcuaHRtbCBmb3IKICAgICAgICAgICAgYSBkaXNjdXNzaW9uIG9mIHdoeSkuICBIb3dldmVyLCBpbiBtYW55IHByb2dyYW1zLCAiY29uc3QiIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbWF5IGp1c3QgYmUgY29uc3RhbnRzLS0tbWFraW5nIHRoZSBjdmFyLiBhY2Nlc3MKICAgICAgICAgICAgYXdrd2FyZC4gIFRvIGZpeCB0aGlzLCAiY29uc3QiIGRlY2xhcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZQogICAgICAgICAgICBib3RoIHRocm91Z2ggY3Zhci4gYW5kIGFzIGEgc2ltcGxlIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY29uc3QgaW50IEZPTyA9IDQyOwoKICAgICAgICAgICAgSW4gUHl0aG9uOgoKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5jdmFyLkZPTwogICAgICAgICAgICAgICAgIDQyCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuRk9PCiAgICAgICAgICAgICAgICAgNDIKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgYSAiY29uc3QiIHZhcmlhYmxlCiAgICAgICAgICAgIG1pZ2h0IGNoYW5nZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCBCQVIgPSAiSGVsbG8gV29ybGQiOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgcG9pbnRlciBpdHNlbGYgY2FuIG5vdCBjaGFuZ2UsIGJ1dCB0aGUgCiAgICAgICAgICAgIGRhdGEgYmVpbmcgcG9pbnRlZCB0byBjb3VsZCBiZSBtb2RpZmllZC4gIEluIHRoZXNlIHNpdHVhdGlvbnMsCiAgICAgICAgICAgIGN2YXIuQkFSIHNob3VsZCBiZSBhY2Nlc3NlZCB0byBvYnRhaW5lZCB0aGUgY3VycmVudCB2YWx1ZS4KCjA4LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgZ2VuZXJhdGlvbiBvZiB0aGUgcHJveHkgY29kZSAoLnB5IGZpbGVzKSB0byBtb3JlCiAgICAgICAgICAgIGNsb3NlbHkgZm9sbG93IHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbnMgYXMgdGhleSBhcHBlYXIgaW4KICAgICAgICAgICAgdGhlIC5pIGZpbGUuICAgSW4gdGhlIHBhc3QsIGFsbCBvZiB0aGUgY2xhc3Mgd3JhcHBlcnMgYXBwZWFyZWQKICAgICAgICAgICAgZmlyc3QsIGZvbGxvd2VkIGJ5IGZ1bmN0aW9uIHN0dWJzLCBpbnNlcnRlZCBQeXRob24gY29kZSwgYW5kCiAgICAgICAgICAgIG90aGVyIGRldGFpbHMuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5IG1ldGhvZCBfZGVsZXRlKCkgY2hhbmdlZCB0byBkZWxldGUoKS4gVGhlcmUgc2hvdWxkbid0IGV2ZXIKICAgICAgICAgICAgYmUgYSB3cmFwcGVkIGZ1bmN0aW9uIGNhbGxlZCBkZWxldGUoKSBhcyBpdCBpcyBhIEMrKyBrZXl3b3JkIGFuZCB0aGVyZQogICAgICAgICAgICBpcyBubyBzdWNoIHRoaW5nIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIGluIEMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoZSBmdW5jdGlvbiBiYWNrIGluCiAgICAgICAgICAgIGZvciBhbGwgcHJveHkgY2xhc3NlczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEphdmEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VtbWFyeQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gaW1wcm92aW5nIHRoZSBKYXZhIG1vZHVsZSAKICAgICAgICAgICAgZm9yIHZlciAxLjMuMTQuICBJZiBhdCBhbGwgcG9zc2libGUgY2hhbmdlIHlvdXIgY29kZSB0byB0YWtlIGFkdmFudGFnZXMgb2YgdGhlIAogICAgICAgICAgICBpbXByb3ZlbWVudHMuIElmIHlvdSB3ZXJlIHVzaW5nIHByb3h5IGNsYXNzZXMgeW91IG1heSBub3Qgbm90aWNlIGFueSBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgaXNzdWVzLiBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggd2lsbCBoZWxwIHdpdGggbW9zdCBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgY29kZSB0aGF0IHVzZXMKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBvdXRwdXQ6CgogICAgICAgICAgICBSZXBsYWNlOgogICAgICAgICAgICAgICAgJW1vZHVsZSBtb2R1bGVuYW1lCgogICAgICAgICAgICBXaXRoOgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJtb2R1bGVuYW1lIikgbW9kdWxlbmFtZTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycz0icHVibGljIjsKCiAgICAgICAgICAgIFRoZSBwcm94eSBjb25zdHJ1Y3RvcnMgdGhhdCB0b29rIHBhcmFtZXRlcnMgKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKQogICAgICAgICAgICB3ZXJlIHB1YmxpYyBhbmQgYXJlIG5vdyBwcm90ZWN0ZWQuIElmIHlvdSB3ZXJlIG1ha2luZyB1c2Ugb2YgdGhlc2UgdGhlbiB5b3UnbGwgCiAgICAgICAgICAgIGhhdmUgdG8gbW9kaWZ5IHlvdXIgY29kZSBhbmQgdGhlIGJlc3Qgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIHRoZSBuZXcgdHlwZSAKICAgICAgICAgICAgd3JhcHBlciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIG90aGVyIG1haW4gYXJlYXMgYXJlIHRoZSBwcmFnbWFzIGFuZCBnbG9iYWwgdmFyaWFibGUgd3JhcHBpbmcuIFJlcGxhY2UgCiAgICAgICAgICAgIHRoZSBwcmFnbWFzIHdpdGggb25lIG9mIHRoZSBuZXcgZGlyZWN0aXZlcyBvciB0eXBlbWFwcyBtZW50aW9uZWQgYmVsb3cgYW5kIHVzZQogICAgICAgICAgICAlcmVuYW1lIG9uIHRoZSB2YXJpYWJsZXMuCgogICAgICAgICAgICBJZiB5b3Ugd2VyZSBub3QgdXNpbmcgcHJveHkgY2xhc3NlcywgeW91IHdpbGwgaGF2ZSB0byBkZWZpbmUgYSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhcyB3ZWxsIGFzIGEganR5cGUgdHlwZW1hcC4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB3cmFwcGluZyB0d28gZGltZW5zaW9uIGFycmF5IHZhcmlhYmxlcy4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2xdCiAgICAgICAgICAgIE9iamVjdCBtYW5hZ2VtZW50IG5vdyBoYXMgYSBtdWNoIGJldHRlciBzZW5zZSBvZiBvd25lcnNoaXAuCiAgICAgICAgICAgIE93bmVyc2hpcCBiaXRzIGlzIGNoYW5nZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IGlzIHN0b3JlZCBpbiBhCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgbWVtYmVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgICAgICBGb28gKm5leHQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IGluIFB5dGhvbgoKICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duCiAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgPj4+IGcgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZy5uZXh0ID0gZiAgICAgICAgICAjIEFzc2lnbiBhIHBvaW50ZXIKICAgICAgICAgICAgICAgPj4+IGYudGhpc293biAgICAgICAgICAgIyBOb3RpY2Ugb3duZXJzaGlwIGNoYW5nZQogICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgVGhpcyBzY2hlbWUgaXMgbW9zdGx5IGEgY29uc2VydmF0aXZlIGhldXJpc3RpYyBkZXNpZ25lZCB0byAKICAgICAgICAgICAgcHJvdmlkZSBzZWdtZW50YXRpb24gZmF1bHRzLiAgSXQgY291bGQgY2F1c2UgYSBtZW1vcnkgbGVhawogICAgICAgICAgICBpZiBvd25lcnNoaXAgaXMgY2hhbmdlZCB1bm5lY2Vzc2FyaWx5LiAgSW4gdGhpcyBjYXNlLCB5b3UgY2FuCiAgICAgICAgICAgIGVpdGhlciB3cml0ZSBhIHR5cGVtYXAgKHRoYXQgZG9lc24ndCBjaGFuZ2Ugb3duZXJzaGlwKSwgb3IKICAgICAgICAgICAgbWFudWFsbHkgc2V0IHRoZSB0aGlzb3duIGF0dHJpYnV0ZSBiYWNrIHRvIDEuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIE1ham9yIHVzYWJpbGl0eSBpbXByb3ZlbWVudHMgdG8gdGhlIG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICAgIFN1cHBvc2UgeW91IGhhZCBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IAogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB2b2lkICBibGFoKEZvbyAqZik7CgogICAgICAgICAgICBJbiBwYXN0IHZlcnNpb25zIG9mIFNXSUcsIHlvdSBjb3VsZCBjcmVhdGUgb2JqZWN0cyBhbmQgdXNlCiAgICAgICAgICAgIHRoZW0gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICUgRm9vIGYKICAgICAgICAgICAgICAgICUgZiBjb25maWd1cmUgLXggMwogICAgICAgICAgICAgICAgJSBmIHNwYW0KICAgICAgICAgICAgICAgIDM3CiAgICAKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IGlmIHlvdSB0cmllZCB0byBjYWxsIGJsYWgoKSwgaXQgZGlkbid0CiAgICAgICAgICAgIHdvcms6CgogICAgICAgICAgICAgICAgJSBibGFoIGYKICAgICAgICAgICAgICAgIFR5cGUgRXJyb3IuIEV4cGVjdGVkIF9wX0ZvbwogICAgICAgICAgICAgICAgJQoKICAgICAgICAgICAgSW5zdGVhZCwgeW91IGhhZCB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICUgYmxhaCBbZiBjZ2V0IC10aGlzXQogIAogICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGV4dHJhY3RzIHRoZSAtdGhpcyBwb2ludGVyLCBhdm9pZGluZyB0aGlzCiAgICAgICAgICAgIHByb2JsZW0uICBUaGlzIG1lYW5zIHRoYXQgc2F5aW5nICJibGFoIGYiIGlzIHBlcmZlY3RseSBsZWdhbCBhbmQKICAgICAgICAgICAgZXZlcnl0aGluZyB3aWxsIHN0aWxsIHdvcmsgbm9ybWFsbHkuCgogICAgICAgICAgICBDYXZlYXQ6IFNpbmNlIHBvaW50ZXIgc3RyaW5ncyBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlIChfKSwKICAgICAgICAgICAgZG9uJ3QgdXNlIHRoaXMgaW4gb2JqZWN0IG5hbWVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJSBGb28gX2YgCiAgICAgICAgICAgICAgICAlIGJsYWggX2YgICAgICAgICMgUG90ZW50aWFsIGNyYXNoCgogICAgICAgICAgICBPYmplY3RzIG5vdyBoYXZlIGEgLXRoaXNvd24gYXR0cmlidXRlIHRoYXQgc2hvd3MgdGhlIG93bmVyc2hpcC4KICAgICAgICAgICAgVGhpcyBidWlsZHMgdXBvbiB0aGUgQ0hBTkdFUyAxMS8yNC8yMDAxIGVudHJ5LgoKMDgvMDcvMjAwMjogc2FtamFtLCBTYW0gTGlkZGljb3R0CiAgICAgICAgICAgIFByb3Blcmx5IGltcGxlbWVudGVkIHBvaW50ZXIgc3lzdGVtIHVzaW5nIHBocCByZXNvdXJjZXMuCiAgICAgICAgICAgIFN0aWxsIG5lZWQgdG8gd29yayBvdXQgd2hldGhlciBvciBub3QgdG8gbGV0IHNjcmlwdC11c2VycyBjYWxsCiAgICAgICAgICAgIGRlc3RydWN0b3JzIGRpcmVjdGx5CgowOC8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVwZ3JhZGVkIG16c2NoZW1lIG1vZHVsZSB0byBzdXBwb3J0IHZlcnNpb24gMjAxIGFuZCBhZGRlZAogICAgICAgICAgICBvdmVybG9hZGluZyBzdXBwb3J0LgoKMDgvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGV4dHJhIGdyb3VwaW5nIChpbiB2ZXJ5IGxpbWl0ZWQgY2FzZXMpLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKEZ1bmNQdHIpKGludCwgZG91YmxlKTsKCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgKioqCiAgICAgICAgICAgIAowOC8wMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlcyB0byB0eXBlbWFwcy5pIGFzIHRob3NlIGRvbmUgcHJldmlvdXNseSBmb3IgUGVybCwKICAgICAgICAgICAgUHl0aG9uIGFuZCBUY2wgbW9kdWxlcy4gTm93IHN1cHBvcnRzIHJlZmVyZW5jZSB0eXBlcyB3aXRoIElOUFVULAogICAgICAgICAgICBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzLgoKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGNzdHJpbmcuaSBhZGRlZC4gIFByb3ZpZGVzIG1hY3JvcyBmb3IKICAgICAgICAgICAgbWFuaXB1bGF0aW5nIGNoYXIgKiBkYXRhLgogCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICBVc2UgJW5ld29iamVjdCBpbnN0ZWFkLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlbmV3b2JqZWN0IGZvbzsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIGNoYXIgKmZvbygpOwoKICAgICAgICAgICAgJW5ld29iamVjdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLAogICAgICAgICAgICBldGMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGF0dHJpYnV0ZSAnam5pY2xhc3NuYW1lJyBmb3IgdGhlIG1vZHVsZSBkaXJlY3RpdmUgYWxsb3dzIGEgd2F5IG9mCiAgICAgICAgICAgIGNoYW5naW5nIHRoZSBKTkkgY2xhc3MgbmFtZSBmcm9tIHRoZSBkZWZhdWx0IHdoaWNoIHVzZXMgdGhlIG1vZHVsZW5hbWUgd2l0aCBKTkkKICAgICAgICAgICAgYXBwZW5kZWQgYWZ0ZXIgaXQuCgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJuYW1lIikgbW9kdWxlbmFtZQoKICAgICAgICAgICAgSWYgJ25hbWUnIGlzIHRoZSBzYW1lIGFzICdtb2R1bGVuYW1lJyB0aGVuIHRoZSBtb2R1bGUgY2xhc3MgbmFtZSBnZXRzIGNoYW5nZWQKICAgICAgICAgICAgZnJvbSAnbW9kdWxlbmFtZScgdG8gbW9kdWxlbmFtZU1vZHVsZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZpbGUgaW5jbHVkZSBvcmRlci4gIExhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBnZW5lcmljIGRpcmVjdG9yaWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZTogICJzd2lnX2xpYi9weXRob24vZm9vLmkiIHNob3VsZCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgICJzd2lnX2xpYi9mb28uaSIuICAgIEkgdGhvdWdodCB0aGlzIHdhcyB0aGUgY2FzZSBhbHJlYWR5LCBidXQKICAgICAgICAgICAgYXBwYXJlbnRseSBpdCBoYXMgYmVlbiBicm9rZW4gZm9yIHF1aXRlIHNvbWUgdGltZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3RkX2RlcXVlLmkgbGlicmFyeSBmaWxlLiAgV29yayBpbiBwcm9ncmVzcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2wsUGVybF0KICAgICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHR5cGVtYXBzLmkuICBJTlBVVC9JTk9VVCB0eXBlbWFwcyBwZXJmb3JtIGJldHRlcgogICAgICAgICAgICBlcnJvciBjaGVja2luZy4gIFR5cGVtYXBzIGFyZSBub3cgc3VwcGxpZWQgZm9yIHJlZmVyZW5jZXMgbGlrZSAKICAgICAgICAgICAgaW50ICZPVVRQVVQsIGRvdWJsZSAmSU5PVVQsIGV0Yy4KICAgICAgICAgIAowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIERlcHJlY2F0ZWQgdGhlIFRfKiBhbmQgTF8qIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCiAgICAgICAgICAgIE11bHRpcGxlIHJldHVybiB2YWx1ZXMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gYSB0dXBsZS4gRGVwcmVjYXRlZAogICAgICAgICAgICB0aGUgQk9USCB0eXBlbWFwcy4gIFRoaXMgaXMgbm93IElOT1VUIChlLmcuLCBpbnQgKklOT1VUKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBhcnJheS5pLCBjYXJyYXkuaSwgYW5kIHRpbWVyLmkgbGlicmFyeSBmaWxlcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIFVzZSBjcG9pbnRlci5pIGluc3RlYWQuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGb3IgY29uc2lzdGVuY3kgdGhlIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHVzZSB0aGUgSmF2YUJlYW4gCiAgICAgICAgICAgIHByb3BlcnR5IGRlc2lnbiBwYXR0ZXJuIGxpa2UgbWVtYmVyIHZhcmlhYmxlcyBhbHdheXMgaGF2ZS4gVGhpcyBtZWFucyBpZiB5b3UgYXJlIAogICAgICAgICAgICB3cmFwcGluZyBhIHZhcmlhYmxlIGNhbGxlZCBmb28sIHRoZSBnZXR0ZXIgaXMgY2FsbGVkIGdldEZvbygpIGFuZCB0aGUgc2V0dGVyIGlzIAogICAgICAgICAgICBjYWxsZWQgc2V0Rm9vKCkuIEJlZm9yZSB0aGUgcmVjZW50IGNoYW5nZXMgdG8gdGhlIEphdmEgbW9kdWxlIHRoZSBnZXR0ZXJzIGFuZCAKICAgICAgICAgICAgc2V0dGVycyB3ZXJlIGNhbGxlZCBnZXRfZm9vKCkgYW5kIHNldF9mb28oKS4gSWYgeW91IHJlYWxseSB3YW50IHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgZnVuY3Rpb24gbmFtZXMgdXNlIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBsaWtlIHRoaXM6ICVyZW5hbWUoX2ZvbykgRm9vOwoKMDcvMzEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjYXN0aW5nIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gIElmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmFyIDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmF6IDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3Mgc3BhbSA6IHB1YmxpYyBiYXIsIHB1YmxpYyBiYXoge307CgogICAgICAgICAgICB0aGVuIHRoZSB3cmFwcGVycyB3b3VsZG4ndCBjb21waWxlIGR1ZSB0byBhbiBhbWJpZ3VvdXMgY2FzdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRHVlIHRvIG5ldyBzdGF0aWMgdHlwZWNoZWNraW5nIGFsbCBwb2ludGVycyBoZWxkIGluIGEgSmF2YSBsb25nIGFyZSBwYXJ0IG9mIAogICAgICAgICAgICB0aGUgaW50ZXJuYWwgd29ya2luZ3MgYW5kIHRoaXMgcG9pbnRlciB2YWx1ZSBpbiB0aGUgSmF2YSBsb25nIGhhcyBiZWNvbWUgYWJzdHJhY3RlZAogICAgICAgICAgICBkYXRhLiBUaGUgdHlwZSB3cmFwcGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYXMgc3VjaCBwcm90ZWN0ZWQuCiAgICAgICAgICAgIElmIHlvdSBuZWVkIHRvIG1lc3MgYXJvdW5kIHdpdGggcG9pbnRlcnMgZnJvbSBKYXZhIG9yIGZvciBleGFtcGxlIGNyZWF0ZSBhIHByb3h5IAogICAgICAgICAgICBjbGFzcyBvciB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIGEgbnVsbCBwb2ludGVyLCBhZGQgYSBmdW5jdGlvbi9jb25zdHJ1Y3RvciAKICAgICAgICAgICAgdG8gZG8gc28gd2l0aCB0aGUgJWphdmFjb2RlIHR5cGVtYXAuIFlvdSBjYW4gYWxzbyBtYWtlIGdldENQdHIoKSBwdWJsaWMgYWdhaW4gd2l0aAogICAgICAgICAgICB0aGUgJWphdmFnZXRjcHRyIHR5cGVtYXAuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVzIGZvciAldHlwZW1hcChpZ25vcmUpLiBJbiBwYXJ0aWN1bGFyIHdoZW4gaWdub3JpbmcgdGhlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgIGluIGEgZnVuY3Rpb24uIEFsc28gZm9yIGFsbCBwYXJhbWV0ZXJzIGluIGNvbnN0cnVjdG9ycy4gVGhlc2UgbW9kcyBoYXZlIGFsc28gZml4ZWQKICAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMgZm9yIHByb3h5IGNsYXNzZXMgLSBTRiA1ODE3OTEuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVuZXdvYmplY3QgKHJlcGxhY2VtZW50IGZvciAlbmV3KSBub3cgaW1wbGVtZW50ZWQgZm9yIEphdmEuIAoKMDcvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZW1hcCBjb3BpZXMsICVhcHBseSwgYW5kICVjbGVhciBpbnNpZGUKICAgICAgICAgICAgQysrIG5hbWVzcGFjZXMuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKTkkgY2xhc3Mgbm93IGhhcyBwYWNrYWdlIGFjY2VzcyBhcyB0aGUgY2xhc3MgbW9kaWZpZXIKICAgICAgICAgICAgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJwdWJsaWMiIHRvIG5vdGhpbmcuIFRoaXMgaGFzIGJlZW4gZG9uZQogICAgICAgICAgICBhcyB0aGlzIGNsYXNzIGlzIG5vdyBtb3JlIGZvciB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgU1dJRyBzaW5jZSB0aGUgbW9kdWxlCiAgICAgICAgICAgIGNsYXNzIGhhcyBzdGF0aWMgdHlwZSBjaGVja2luZyBmb3IgYWxsIHR5cGVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSAlam5pY2xhc3NjbGFzc21vZGlmaWVyIAogICAgICAgICAgICBwcmFnbWEgdG8gY2hhbmdlIGl0IGJhY2sgdG8gInB1YmxpYyIuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5L1NoYWRvdyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhlIC1wcm94eSBhbmQgCiAgICAgICAgICAgIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgCiAgICAgICAgICAgIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGVuIHVzZSB0aGUgbmV3IC1ub3Byb3h5IGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmVtYWluaW5nIHByYWdtYXMgc2hha2V1cC4gVGhlc2Ugd2VyZSB0aGUgcmVtYWluaW5nIHByYWdtYXMgYW5kIHRoZWlyCiAgICAgICAgICAgIG5ldyBuYW1lcyB3aGVyZSBjaGFuZ2VkOgoKICAgICAgICAgICAgbW9kdWxlYmFzZQogICAgICAgICAgICBtb2R1bGVjb2RlCiAgICAgICAgICAgIG1vZHVsZWNsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIG1vZHVsZWltcG9ydCA9PiBtb2R1bGVpbXBvcnRzCiAgICAgICAgICAgIG1vZHVsZWludGVyZmFjZSA9PiBtb2R1bGVpbnRlcmZhY2VzCgogICAgICAgICAgICBUaGUgbW9kdWxlaW1wb3J0cyB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSB0byBob3cgdGhlIG1vZHVsZWltcG9ydCBwcmFnbWEgd29ya2VkLiAKICAgICAgICAgICAgTm93IGl0IGFjdHVhbGx5IHRha2VzIGNvZGUgd2hpY2ggZ2V0cyBwbGFjZWQgYmVmb3JlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHNvIHRoZSAKICAgICAgICAgICAgd2hvbGUgaW1wb3J0IHN0YXRlbWVudCBoYXMgdG8gYmUgZ2l2ZW4sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbXBvcnRzPSV7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLmlvLio7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLm1hdGguKjsKICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbnRlcmZhY2VzIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb2xkIG1vZHVsZWludGVyZmFjZSBpbiB0aGF0IGlmIAogICAgICAgICAgICBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBpcyByZXF1aXJlZCB0aGV5IG11c3QgYmUgY29tbWEgc2VwYXJhdGVkIGluIG9uZSB1c2Ugb2YgCiAgICAgICAgICAgIHRoZSBwcmFnbWEsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbnRlcmZhY2VzPSJTZXJpYWxpemFibGUsIE15SW50ZXJmYWNlIgoKICAgICAgICAgICAgVGhlc2UgbGFzdCB0d28gcHJhZ21hcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBqYXZhaW50ZXJmYWNlcyBhbmQgamF2YWltcG9ydHMgCiAgICAgICAgICAgIHR5cGVtYXAuCgogICAgICAgICAgICBBIHNpbWlsYXIgc2V0IG9mIHByYWdtYXMgaGFzIGJlZW4gaW50cm9kdWNlZCwgbmFtZWx5OgoKICAgICAgICAgICAgam5pY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0CiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlCgogICAgICAgICAgICBUaGVzZSB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpciBtb2R1bGUgY291bnRlcnBhcnRzLiBOb3RlIHRoYXQgcHJldmlvdXNseQogICAgICAgICAgICB0aGUgbW9kdWxlWFhYIHByYWdtYXMgd29ya2VkIG9uIHRoZSBvbGQgbW9kdWxlIGNsYXNzIHdoaWNoIGlzIG5vdyBjYWxsZWQgdGhlCiAgICAgICAgICAgIEpOSSBjbGFzcyAodGhlIGNsYXNzIHdpdGggdGhlIG5hdGl2ZSBmdW5jdGlvbnMpLiBUaGUgam5pY2xhc3NYWFggcHJhZ21hcyBub3cgCiAgICAgICAgICAgIHdvcmsgb24gdGhlIG5ldyBtb2R1bGUgY2xhc3MgKHRoZSBjbGFzcyB0aGF0IGhhcyBhbGwgdGhlIGdsb2JhbCBmdW5jdGlvbnMgYW5kCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcywgcGx1cyBhbGwgb3RoZXIKICAgICAgICAgICAgcmVtYWluaW5nIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIHRoZSBsb3ctbGV2ZWwgcHJvY2VkdXJhbCBpbnRlcmZhY2UpLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSB0aGUgY29udGVudHMgb2YgdGhlIHByYWdtYXMgbWFrZSB1cCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgIDxqbmljbGFzc2ltcG9ydHM+CiAgICAgICAgICAgIDxqbmljbGFzc21vZGlmaWVycz4gY2xhc3MgbW9kdWxlbmFtZSBleHRlbmRzIDxqbmljbGFzc2Jhc2U+IGltcGxlbWVudHMgPGpuaWNsYXNzaW50ZXJmYWNlcz4gewogICAgICAgICAgICAgICAgPGpuaWNsYXNzY29kZT4KICAgICAgICAgICAgICAgIC4uLiBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgLi4uCiAgICAgICAgICAgIH0KfQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlcHJlY2F0ZWQgbW9kdWxlbWV0aG9kbW9kaWZpZXJzIHByYWdtYSBhbmQgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgYSBiZXR0ZXIgJWZlYXR1cmUgYmFzZWQgZGlyZWN0aXZlIGNhbGxlZCAlamF2YW1ldGhvZG1vZGlmaWVycy4KICAgICAgICAgICAgQSB1c2VmdWwgZXhhbXBsZSB3b3VsZCBiZSBmb3Igc3luY2hyb25pc2F0aW9uIGluIG11bHRpLXRocmVhZGVkIGFwcHM6CgogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyBmb28oaW50IGEpICJwdWJsaWMgc3luY2hyb25pemVkIjsKCiAgICAgICAgICAgIENoYW5nZXMgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBkZWZhdWx0ICgicHVibGljIikgdG8gInB1YmxpYyBzeW5jaHJvbml6ZWQiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBTZXZlcmFsIGRpcmVjdGl2ZXMgbm93IGFsbG93IG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KICAgICAgICAgICAgVGhlc2UgaW5jbHVkZToKCiAgICAgICAgICAgICAgICAlbW9kdWxlKG5hbWU9InZhbHVlIiwgbmFtZT0idmFsdWUiLCAuLi4pIG1vZHVsZW5hbWUKICAgICAgICAgICAgICAgICVpbXBvcnQobmFtZT0idmFsdWUiLCAuLi4pICJmaWxlbmFtZS5pIgogICAgICAgICAgICAgICAgJWV4dGVuZChuYW1lPSJ2YWx1ZSIsIC4uLikgY2xhc3NuYW1lIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlc2UgY3VycmVudGx5IGhhdmUgbm8gZWZmZWN0IGFuZCBhcmUgcmVzZXJ2ZWQgZm9yCiAgICAgICAgICAgIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgICAgIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50cyB0byBzbWFydC1wb2ludGVyIGhhbmRsaW5nLiAgU1dJRyBvbmx5IHByb3ZpZGVzCiAgICAgICAgICAgIGV4dHJhIHN1cHBvcnQgZm9yIGEgc21hcnQtcG9pbnRlciBpZiBvcGVyYXRvci0+KCkgcmV0dXJucwogICAgICAgICAgICBhIHByb3BlciBwb2ludGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwoKICAgICAgICAgICAgSWYgb3BlcmF0b3ItPigpIHJldHVybnMgYW4gb2JqZWN0IGJ5IHZhbHVlIG9yIHJlZmVyZW5jZSwKICAgICAgICAgICAgdGhlbiBTV0lHIGV4YW1pbmVzIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gc2VlIGlmIGl0IGFsc28KICAgICAgICAgICAgaW1wbGVtZW50cyBvcGVyYXRvci0+KCkuICBJZiBzbywgU1dJRyBjaGFzZXMgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIHVudGlsIGl0IGNhbiBmaW5kIG9uZSB0aGF0IHJldHVybnMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY2FzZXMgbGlrZSB0aGlzIHRvIHdvcms6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBCYXIgb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKSAgICAgICMgSW52b2tlcyBGb286OmJsYWgoKQoKICAgICAgICAgICAgVGhlIHMuYmxhaCgpIGNhbGwgYWN0dWFsbHkgaW52b2tlczoKCiAgICAgICAgICAgICAgICAgICgocy5vcGVyYXRvci0+KCkpLm9wZXJhdG9yLT4oKSktPmJsYWgoKTsKIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggdHlwZWRlZiBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyAmIEZvb1JlZjsKICAgICAgICAgICAgICAgICBGb29SZWYgYmxhaCgpOwoKICAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0CiAgICAgICAgICAgIGNvbXBpbGUuCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFdyYXBwaW5nIG9mIHN0YXRpYyBtZXRob2RzIGhhcyBiZWVuIGltcHJvdmVkIGluIHByb3h5IGNsYXNzZXMuICBJbiBvbGRlcgogICAgICAgICAgICB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoaXM6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIGJhcigpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIHN0YXRpYyBtZXRob2Qgd2FzIG9ubHkgYXZhaWxhYmxlIGFzIGEgZnVuY3Rpb24gRm9vX2JhcigpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vX2JhcigpCgogICAgICAgICAgICBOb3csIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBhbHNvIGJlIGludm9rZWQgdGhyb3VnaCBhbiBpbnN0YW5jZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgICAgID4+PiBmLmJhcigpICAgICAgICAjIEludm9rZXMgc3RhdGljIG1ldGhvZAoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBQeXRob24uICBBZGRpdGlvbmFsbHksIGZvciBQeXRob24tMi4yLAogICAgICAgICAgICB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBhczoKCiAgICAgICAgICAgICAgICAgID4+PiBGb28uYmFyKCkKCiAgICAgICAgICAgIFRoZSBvbGQtc3R5bGUgZnVuY3Rpb24gaXMgc3RpbGwgc3VwcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIElmCiAgICAgICAgICAgIHlvdSBjYXJlIGFib3V0IG1ha2luZyB5b3VyIGNvZGUgYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBQeXRob24sCiAgICAgICAgICAgIGVpdGhlciB1c2UgRm9vX2JhcigpIG9yIGFjY2VzcyB0aGUgbWV0aG9kIHRocm91Z2ggYW4gaW5zdGFuY2UuCiAKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlLiAgUHJveHkgY2xhc3NlcyBub3cgdXRpbGl6ZSBuZXcgUHl0aG9uLTIuMgogICAgICAgICAgICBmZWF0dXJlcyBpbmNsdWRpbmcgcHJvcGVydGllcyBhbmQgc3RhdGljIG1ldGhvZHMuICBIb3dldmVyLCB0aGVzZSBmZWF0dXJlcwogICAgICAgICAgICBhcmUgc3VwcG9ydGVkIGluIGEgd2F5IHRoYXQgcHJvdmlkZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgogICAgICAgICAgICBQeXRob24gdmVyc2lvbnMuICBJbiBvdGhlciB3b3JkcywgcHJveHkgY2xhc3NlcyB3b3JrIHdpdGggYWxsIHZlcnNpb25zCiAgICAgICAgICAgIG9mIFB5dGhvbiBhbmQgb25seSB1c2UgbmV3IGZlYXR1cmVzIHdoZW4gcnVubmluZyBvbiBQeXRob24tMi4yLgoKCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJWV4dGVuZCBzbyB0aGF0IG92ZXJsb2FkZWQgbWV0aG9kcyBjYW4gYmUgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB4KSB7IH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKnMpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYm90aCBDKysgKmFuZCogQy4KCjA3LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTW9yZSBuZXcgdHlwZW1hcHMgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICBjYW4gYmUgZnVydGhlciB0YWlsb3JlZCBieSB1c2Vycy4gVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGNvZGUgZm9yIGdlbmVyYXRpbmcgdGhlIAogICAgICAgICAgICBmaW5hbGl6ZSgpIG1ldGhvZHMgKHByb3h5IGNsYXNzZXMgb25seSkgYW5kIHRoZSBnZXRDUHRyKCkgbWV0aG9kcyBmb3IgcHJveHkgCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWZpbmFsaXplKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICAgICAgICAgX2RlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIHR5cGVtYXAgd2lsbCBlbmFibGUgdXNlcnMgdG8gaGFuZGxlIEphdmEgbnVsbCBieSBvdmVycmlkaW5nCiAgICAgICAgICAgIHRoaXMgdHlwZW1hcCAtIGEgcmVxdWVzdGVkIGZlYXR1cmUuCgogICAgICAgICAgICBUaGUgLW5vZmluYWxpemUgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFRoZSBqYXZhZmluYWxpemUKICAgICAgICAgICAgdHlwZW1hcCBpcyBtb3JlIHBvd2VyZnVsIGFzIGl0IHdpbGwgYWxsb3cgdGhlIHJlbW92YWwgb2YgdGhlIGZpbmFsaXplIG1ldGhvZHMgCiAgICAgICAgICAgIGZvciBhbGwgb3IgYW55IG9uZSBvciBtb3JlIHBhcnRpY3VsYXIgcHJveHkgY2xhc3MuCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBnZXRDUHRyWFhYKCkgZnVuY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCB0byBhIHN0YXRpYyBmdW5jdGlvbiBhbmQKICAgICAgICAgICAgaXMgbm93IG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoWFhYIG9iaikgey4uLn0KCiAgICAgICAgICAgIFRoaXMgaXMgYSByZXF1ZXN0ZWQgY2hhbmdlIHdoaWNoIHdpbGwgYWxsb3cgSmF2YSBudWxsIHBvaW50ZXJzIHRvIGJlIHVzZWQgYXMgbnVsbAogICAgICAgICAgICBjYW4gYmUgcGFzc2VkIGluIGZvciBvYmouIEhvd2V2ZXIsIHRvIGFjaGlldmUgdGhpcyB0aGUgYXBwcm9wcmlhdGUgY29kZSBtdXN0IGJlCiAgICAgICAgICAgIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldyBqYXZhZ2V0Y3B0ciB0eXBlbWFwIGRpcmVjdGl2ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhpcyBmdW5jdGlvbiBiYWNrIGluIHVzaW5nIHRoZQogICAgICAgICAgICBuZXcgamF2YWNvZGUgdHlwZW1hcDoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewoKICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMiBhbmQgU1dJRy0xLjMuMTMKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjExIGFuZCBlYXJsaWVyCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlfQoKCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGRpcmVjdGl2ZSB0byBjb250cm9sIGNvbnN0YW50IGNvZGUgZ2VuZXJhdGlvbiAtICVqYXZhY29uc3QuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGhhbmRsaW5nIGZvciBoYW5kbGluZyBjb25zdGFudHMgaXMgdG8gZ2V0IHRoZSB2YWx1ZSB0aHJvdWdoCiAgICAgICAgICAgIGEgSk5JIGNhbGwsIGVnCgogICAgICAgICAgICAjZGVmaW5lIFlFTExPVyA1CiAgICAgICAgICAgICNkZWZpbmUgQklHIDEyMzRMTAoKICAgICAgICAgICAgcmVzdWx0cyBpbjoKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IG1vZHVsZW5hbWUuZ2V0X1lFTExPVygpOwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gbW9kdWxlbmFtZS5nZXRfQklHKCk7CgogICAgICAgICAgICBFYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBKYXZhIG1vZHVsZSBpbml0aWFsaXNlZCB0aGUgdmFsdWUgdXNpbmcgdGhlIEMgdmFsdWU6CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSA1OwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTIzNExMOwoKICAgICAgICAgICAgVGhpcyB3b3JrcyBpbiBtb3N0IGNhc2VzLCBidXQgdGhlIHZhbHVlIGZvciBCSUcgd29uJ3QgY29tcGlsZSBhcyAxMjM0TEwgaXMgbm90CiAgICAgICAgICAgIHZhbGlkIEphdmEgY29kZSBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgd2h5IHRoZSBkZWZhdWx0IGlzIG5vdyB0byBnZXQgdGhlIAogICAgICAgICAgICB2YWx1ZXMgdGhyb3VnaCBhIEpOSSBjYWxsLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGVzZSAnY29uc3RhbnRzJyBjYW5ub3QgYmUgdXNlZCAKICAgICAgICAgICAgaW4gc3dpdGNoIHN0YXRlbWVudHMuIFRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgdGhlCiAgICAgICAgICAgIHdheSB0aGUgY29uc3RhbnQgdmFsdWUgaXMgaW5pdGlhbGlzZWQgYW5kIHdvcmtzIGxpa2Ugb3RoZXIgJWZlYXR1cmUKICAgICAgICAgICAgZGlyZWN0aXZlcywgZWcKCiAgICAgICAgICAgICVqYXZhY29uc3QoMCk7ICAgICAvLyBhbGwgY29uc3RhbnRzIGZyb20gdGhpcyBwb2ludCBvbiBhcmUgaW5pdGlhbGlzZWQgdXNpbmcgdGhlIEMgdmFsdWUKICAgICAgICAgICAgJWphdmFjb25zdCgxKSBCSUc7IC8vIGp1c3QgQklHIGluaXRpYWxpc2VkIHVzaW5nIEpOSSBjYWxsIChtdXN0IGJlIHBhcnNlZCBiZWZvcmUgQklHIGlzIGRlZmluZWQpCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBJTVBPUlRBTlQgQ0hBTkdFUyBUTyBUSEUgUFlUSE9OIE1PRFVMRSAqKioKCiAgICAgICAgICAgICgxKSBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW5hYmxlcyBzaGFkb3cvcHJveHkgY2xhc3NlcyBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdHdvIGZpbGVzIGFyZSBhbHdheXMgY3JlYXRlZCBieSBTV0lHLiAgRm9yCiAgICAgICAgICAgIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgICAvLyBmaWxlOiBmb28uaQogICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vCiAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGVuIHN3aWcgZ2VuZXJhdGVzIHR3byBmaWxlcyAiZm9vX3dyYXAuYyIgYW5kICJmb28ucHkiLgoKICAgICAgICAgICAgKDIpIFRoZSBuYW1lIG9mIHRoZSBsb3ctbGV2ZWwgQyBleHRlbnNpb24gbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQKICAgICAgICAgICAgdG8gc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZS4gICBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUKICAgICAgICAgICAgdG8gY29tcGlsZSB0aGUgbW9kdWxlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgJCBjYyAtYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24yLjIgZm9vX3dyYXAuYwogICAgICAgICAgICAgICAgJCBjYyAtc2hhcmVkIGZvb193cmFwLm8gJChPQkpTKSAtbyBfZm9vLnNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSBleHRyYSB1bmRlcnNjb3JlCgogICAgICAgICAgICBUaGlzIG5hbWluZyBzY2hlbWUgaXMgY29uc2lzdGVudCB3aXRoIG90aGVyIFB5dGhvbiBtb2R1bGVzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBleHRlbnNpb24gY29kZS4gIEZvciBpbnN0YW5jZSwgdGhlIHNvY2tldCBtb2R1bGUgY29uc2lzdHMKICAgICAgICAgICAgb2YgIl9zb2NrZXQuc28iIGFuZCAic29ja2V0LnB5Ii4gIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsCiAgICAgICAgICAgIHRoZSBzaGFyZWQgb2JqZWN0IGZpbGUgd2FzIG5hbWVkICJmb29jbW9kdWxlLnNvIi4KCiAgICAgICAgICAgICgzKSBBIG5ldyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IFB5dGhvbiBjb2RlIGludG8KICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgLnB5IGZpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcHl0aG9uY29kZSAlewogICAgICAgICAgICAgICAgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICAgIHByaW50ICJIZWxsbyBXb3JsZCIKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBjcmVhdGUgbW9kdWxlcyBhcyBhIG1peCBvZiBDIGFuZCBQeXRob24uCiAgICAgICAgICAgICBQeXRob24gY29kZSBpcyBzZWFtbGVzc2x5IGFkZGVkIHRvIHRoZSBtb2R1bGUuCgogICAgICAgICAgICAoNCkgVGhlIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAgVGhpcyBpcyB0dXJuZWQgb24KICAgICAgICAgICAgYnkgZGVmYXVsdC4KCiAgICAgICAgICAgICg1KSBUbyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBleHRyYSBweXRob24gZmlsZSwgdXNlIHRoZSAiLW5vcHJveHkiCiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBsaWtlbHkgYnJlYWsgdGhlIGJ1aWxkIGVudmlyb25tZW50IG9mIHByb2plY3RzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBzaGFkb3cgY2xhc3Nlcy4gICBUbyBmaXggdGhpcywgeW91IHByb2JhYmx5IG9ubHkgbmVlZCB0bwogICAgICAgICAgICBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCAuc28gZmlsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBNYWtlZmlsZSBpbmZvcm1hdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gZXhhbXBsZWNtb2R1bGUuc28KCiAgICAgICAgICAgIEp1c3QgY2hhbmdlIGl0IHRvOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IF9leGFtcGxlLnNvCgogICAgICAgICAgICAqKiogRE9DVU1FTlRBVElPTiBVUERBVEUgKioqCiAgICAgICAgICAgIFRoZSBmaWxlIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgaGFzIGJlZW4gdXBkYXRlZCB0byBkZXNjcmliZSB0aGVzZSBjaGFuZ2VzLgoKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLW5vZXh0ZXJuIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgU1dJRyB3aWxsIG5vdCBnZW5lcmF0ZQogICAgICAgICAgICBleHRyYSBleHRlcm4gZGVjbGFyYXRpb25zLiAgVGhpcyBpcyBzb21ldGltZXMgYW4gaXNzdWUgb24gCiAgICAgICAgICAgIG5vbi11bml4IHBsYXRmb3Jtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSB3YXJuaW5nIGZvciBpZ25vcmVkIGZyaWVuZCBmdW5jdGlvbnMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc0NDk4IF0gLXByb3h5IGFuZCAlaW5jbHVkZSAicG9pbnRlci5pIiBjbGFzaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGF2aWQgQ3JlYXN5LgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NjEwMyBdIGdsb2JhbCBkZXN0cnVjdGlvbiB3YXJuaW5nIHdpdGggc2hhZG93LgogICAgICAgICAgICBQZXJsIGV4dGVuc2lvbnMgc2hvdWxkIG5vIGxvbmdlciByZXBvcnQgdGhlIHdhcm5pbmcKCiAgICAgICAgICAgICAgICJVc2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZSBkdXJpbmcgZ2xvYmFsIGRlc3RydWN0aW9uLiIKIAogICAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCAicGVybCAtdyIuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcmV0dCBXaWxsaWFtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW4gQysrIG1vZGUsIFNXSUcgbm93IGFsd2F5cyBkZWZpbmVzIG5hbWVzcGFjZSBzdGQuICBCeSBkZWZhdWx0LAogICAgICAgICAgICBpdCdzIGVtcHR5LiAgSG93ZXZlciwgdGhpcyB3aWxsIHNpbGVuY2UgZXJyb3JzIGZyb20gcHJvZ3JhbXMKICAgICAgICAgICAgdGhhdCBpbmNsdWRlIHN0YXRlbWVudHMgc3VjaCBhcyAidXNpbmcgbmFtZXNwYWNlIHN0ZDsiLgogICAgICAgICAgICBUaGlzIGZpeGVzIEJ1ZyBbIDU4NDAxNyBdIHVzaW5nIG5hbWVzcGFjZSBzdGQgZ2VuZXJhdGVzIGVycm9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KCjA3LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSBuZXcgd2FybmluZyBtZXNzYWdlIGZvciAlYXBwbHkuICBJZiB5b3UgdXNlICVhcHBseSBidXQgbm8gdHlwZW1hcHMKICAgICAgICAgICAgYXJlIGRlZmluZWQsIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgc2hvdWxkIGhlbHAgd2l0aAogICAgICAgICAgICBwcm9ibGVtcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKk9VVFBVVCB7IC4uLiB9OwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zIG9mIFNXSUcsIHRoaXMgc2lsZW50bHkgZGlkIG5vdGhpbmcuICBOb3cgeW91IGdldCBhbiBlcnJvciBsaWtlIHRoaXM6CiAgCiAgICAgICAgICAgICAgICAgICBmaWxlOmxpbmUuIFdhcm5pbmcuIENhbid0IGFwcGx5IChjaGFyICpPVVRQVVQpLiBObyB0eXBlbWFwcyBhcmUgZGVmaW5lZC4KCjA3LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3RhcnRlZCBKYXZhIHByYWdtYSBkZXByZWNhdGlvbi4gUmVwbGFjZW1lbnRzIHVzZSAldHlwZW1hcCBiYXNlZCAKICAgICAgICAgICAgZGlyZWN0aXZlcyBhbmQgZW5hYmxlIHByb3h5IGNsYXNzZXMgYW5kIHRoZSBuZXcgdHlwZSB3cmFwcGVyIGNsYXNzZXMgdG8gYmUgCiAgICAgICAgICAgIHRhaWxvcmVkIGluIHZhcmlvdXMgd2F5cy4gVGhlc2UgYXJlIHRoZSBuZXcgdHlwZW1hcHM6CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSkgICAgICAgICAgIC0gYmFzZSAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSAtIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIEphdmEgY2xhc3M6IGRlZmF1bHQgaXMgInB1YmxpYyIKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpICAgICAgICAgICAtIGphdmEgY29kZSBpcyBjb3BpZWQgdmVyYmF0aW0gdG8gdGhlIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpICAgICAgICAtIGltcG9ydCBzdGF0ZW1lbnRzIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbnRlcmZhY2VzKSAgICAgLSBpbnRlcmZhY2VzIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAKICAgICAgICAgICAgQW5kIHRoZXNlIGFyZSB0aGUgJXByYWdtYSBkaXJlY3RpdmVzIGJlaW5nIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgIGFsbHNoYWRvd2Jhc2UKICAgICAgICAgICAgYWxsc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYWxsc2hhZG93Y29kZQogICAgICAgICAgICBhbGxzaGFkb3dpbXBvcnQKICAgICAgICAgICAgYWxsc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIHNoYWRvd2Jhc2UKICAgICAgICAgICAgc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgc2hhZG93Y29kZQogICAgICAgICAgICBzaGFkb3dpbXBvcnQKICAgICAgICAgICAgc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gdGFyZ2V0IGEgcGFydGljdWxhciBwcm94eSBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIEZvbyAiaW1wb3J0IGphdmEudXRpbC4qIjsKICAgICAgICAgICAgb3IgYSBwYXJ0aWN1bGFyIHR5cGUgd3JhcHBlciBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIGRvdWJsZSogImltcG9ydCBqYXZhLm1hdGguKiI7CiAgICAgICAgICAgIE5vdGUgdGhhdCAkamF2YWNsYXNzbmFtZSBpbiB0aGVzZSB0eXBlbWFwcyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBlaXRoZXIgdGhlIHByb3h5IAogICAgICAgICAgICBjbGFzc25hbWUgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzIG9yIHRoZSBTV0lHVFlQRSBjbGFzcyBuYW1lLgoKMDcvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIG1vZHVsZSBvdmVyaGF1bCB0byBpbXBsZW1lbnQgc3RhdGljIHR5cGUgY2hlY2tpbmcgb2YgYWxsIAogICAgICAgICAgICB0eXBlcy4gCiAgICAgICAgICAgIAogICAgICAgICAgICAxKSBDaGFuZ2VzIHdoZW4gdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgd2hlbiB3cmFwcGluZyBnbG9iYWwgZnVuY3Rpb25zOiAKCiAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzc3t9OwogICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MqIHMpOwogICAgICAgICAgICBTb21lQ2xhc3MqIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2QgcHJvdG90eXBlcyB1c2VkIGEgbG9uZyBmb3IgcG9pbnRlcnMgYW5kIGxvb2tlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGZvbyhsb25nIGphcmcxKTsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIGxvbmcgYmFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCB1bmxpa2UgbWVtYmVyIGZ1bmN0aW9ucyBvZiBhIEMrKyBjbGFzcyB0aGVyZSB3YXMgbm8gd3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBjYWxscyAKICAgICAgICAgICAgdG8gbWFrZSB0aGUgdXNlIG9mIHRoZW0gbW9yZSB1c2VyIGZyaWVuZGx5LiBUaGV5IHdvdWxkIGJlIHVzZWQgZnJvbSBKYXZhIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbmV3IFNvbWVDbGFzcyhtb2R1bGVuYW1lLmJhcigpLCBmYWxzZSk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMuZ2V0Q1B0clNvbWVDbGFzcygpKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QsIGJ1dCB0aGVuIGl0IHdvdWxkIG5vdCBoYXZlIAogICAgICAgICAgICBiZWVuIHBvc3NpYmxlIHRvIGNhbGwgYW55IHByb3h5IG1lbWJlciBmdW5jdGlvbnMgaW4gU29tZUNsYXNzOgoKICAgICAgICAgICAgbG9uZyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICBOb3cgd3JhcHBlciBmdW5jdGlvbnMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9vKFNvbWVDbGFzcyBzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU29tZUNsYXNzIGJhcigpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdoaWNoIG1lYW5zIHRoZXNlIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgd2l0aCBwcm94eSBjbGFzc2VzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIDIpIENoYW5nZXMgd2hlbiBub3QgdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGUgc28gY2FsbGVkIGxvdy1sZXZlbCBpbnRlcmZhY2Ugd2FzIHJhdGhlciBsb3ctbGV2ZWwgaW5kZWVkLiBUaGUgCiAgICAgICAgICAgIG5ldyBzdGF0aWMgdHlwZSBjaGVja2luZyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBsZXNzIHNvIGJ1dCBpdCByZW1haW5zIGEKICAgICAgICAgICAgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdG8gdGhlIEMvQysrIHdvcmxkLiBQcm94eSBjbGFzc2VzIGFyZSB0aGUgb2J2aW91cyB3YXkgdG8gdXNlCiAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIGNvZGUsIGJ1dCBmb3IgdGhvc2Ugd2hvIHdhbnQgYSBmdW5jdGlvbmFsIGludGVyZmFjZSBhbGwgbm9uLXByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBub3cgaGF2ZSBhIHNpbXBsZSBKYXZhIGNsYXNzIHdyYXBwZXIgYXJvdW5kIHRoZSBDL0MrKyB0eXBlLiBQb2ludGVycyBhbmQKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgYXJlIGFsc28gd3JhcHBlZCBieSB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHR5cGUKICAgICAgICAgICAgd3JhcHBlciBjbGFzc25hbWVzIGFyZSBiYXNlZCBvbiB0aGUgU1dJRyBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBvdGhlciBsYW5ndWFnZSAKICAgICAgICAgICAgbW9kdWxlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBDL0MrKyB0eXBlICAgICAgSmF2YSB0eXBlIHdyYXBwZXIgY2xhc3MgbmFtZQogICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBpbnQqICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQKICAgICAgICAgICAgZG91YmxlKiogICAgICAgIFNXSUdUWVBFX3BfcF9kb3VibGUKICAgICAgICAgICAgU29tZUNsYXNzKiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyYgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKCiAgICAgICAgICAgIE5vdGUgdGhhdCBldmVyeXRoaW5nIHdyYXBwZWQgYnkgU1dJRyBpcyBhY2Nlc3NlZCB2aWEgYSBwb2ludGVyIGV2ZW4gd2hlbiB3cmFwcGluZyAKICAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgcGFzcyBieSB2YWx1ZSBvciByZWZlcmVuY2UuIFNvIHRoZSBwcmV2aW91cyBleGFtcGxlIHdvdWxkIG5vdyBiZSAKICAgICAgICAgICAgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcyBzID0gZXhhbXBsZS5iYXIoKTsKICAgICAgICAgICAgZXhhbXBsZS5mb28ocyk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdHlwZWRlZnMgdGhhdCBTV0lHIGtub3dzIGFib3V0IGFyZSByZXNvbHZlZCwgc28gdGhhdCBpZiBvbmUgaGFzIAoKICAgICAgICAgICAgY2xhc3MgRm9ve307CiAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgIHRoZW4gYW55IHVzZSBvZiBCYXIgd2lsbCByZXF1aXJlIG9uZSB0byB1c2UgU1dJR1RZUEVfcF9Gb287CgogICAgICAgICAgICBTb21lIGNvbnNpZGVyYXRpb25zOgogICAgICAgICAgICBNYWtlIHN1cmUgeW91IG1ha2UgYSBmaXJtIGRlY2lzaW9uIHRvIHVzZSBlaXRoZXIgcHJveHkgY2xhc3NlcyBvciB0aGUgZnVuY3Rpb25hbCAKICAgICAgICAgICAgaW50ZXJmYWNlIGVhcmx5IG9uIGFzIHRoZSBjbGFzc25hbWVzIGFyZSBkaWZmZXJlbnQuCgogICAgICAgICAgICAzKSBQb2ludGVycyBhbmQgbm9uLXBhcnNlZCB0eXBlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBTb21ldGltZXMgU1dJRyBjYW5ub3QgZ2VuZXJhdGUgYSBwcm94eSBjbGFzcy4gVGhpcyBvY2N1cnMgd2hlbiB0aGUgZGVmaW5pdGlvbiBvZiAKICAgICAgICAgICAgYSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRywgYnV0IGlzIHRoZW4gdXNlZCBhcyBhIHZhcmlhYmxlIG9yIGEgcGFyYW1ldGVyLiAKICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICB2b2lkIGZvbyhTbmF6enkgc2RzKTsKCiAgICAgICAgICAgIElmIFNXSUcgaGFzIG5vdCBwYXJzZWQgU25henp5IGl0IGhhbmRsZXMgaXQgc2ltcGx5IGFzIGEgcG9pbnRlciB0byBhIFNuYXp6eS4KICAgICAgICAgICAgVGhlIEphdmEgbW9kdWxlIGdpdmVzIGl0IGEgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCB0aGUgcG9pbnRlciBhbmQgY2FsbHMgaXQgCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU25henp5LiBJbiBvdGhlciB3b3JkcyBpdCBoYW5kbGVzIGl0IGluIHRoZSBzYW1lIG1hbm5lciBhcyB0eXBlcyBhcmUgCiAgICAgICAgICAgIGhhbmRsZWQgaW4gdGhlIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZS4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGZvciBhbGwgCiAgICAgICAgICAgIG5vbi1wcm94eSBjbGFzc2VzLCBlZyBhbGwgcG9pbnRlciB0byBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gcHJpbWl0aXZlIHR5cGVzLgoKICAgICAgICAgICAgNCkgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGlmIHlvdSBoYXZlIGJlZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBhbmQgCiAgICAgICAgICAgIG5vIGdsb2JhbCB2YXJpYWJsZXMvZnVuY3Rpb25zLiBPdGhlcndpc2Ugc29tZSBjaGFuZ2VzIHdpbGwgaGF2ZSB0byBiZSBtYWRlLiAKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2RzIHN0aWxsIGV4aXN0IGJ1dCB0aGV5IGFyZSBub3cgaW4gYSBKTkkgY2xhc3MsIHdoaWNoIGlzIGNhbGxlZCAKICAgICAgICAgICAgbW9kdWxlbmFtZUpOSS4gQXMgdGhpcyBjbGFzcyBpcyByZWFsbHkgcGFydCBvZiB0aGUgaW50ZXJuYWwgd29ya2luZ3MsCiAgICAgICAgICAgIGl0IHNob3VsZCBub3QgYmUgcmVxdWlyZWQgc28gdGhlIGNsYXNzIGhhcyBiZWNvbWUgcHJvdGVjdGVkLiBTb21lIHByYWdtYXMvZGlyZWN0aXZlcwogICAgICAgICAgICB3aWxsIGhvcGVmdWxseSBiZSBhZGRlZCB0byBoZWxwIHdpdGggYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIHdyYXBwaW5nIG9mIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcyByZXR1cm5lZCBieQogICAgICAgICAgICB2YWx1ZS4gIEp1c3QgdG8gYmUgc2FmZSwgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgU3dpZ1ZhbHVlV3JhcHBlcjw+CiAgICAgICAgICAgIGp1c3QgaW4gY2FzZSB0aGV5IGRvbid0IGRlZmluZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBUaGlzCiAgICAgICAgICAgIHdvdWxkIGJlIHVzZWQgaWYgeW91IGhhZCBjb2RlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICBGb288aW50PiBibGFoKCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgbW9yZWJsYWgoRm9vPGludD4geCk7CgogICAgICAgICAgICBidXQgeW91IGRpZG4ndCBpbnN0YW50aWF0ZSBGb288aW50PiB1c2luZyAldGVtcGxhdGUuICAKICAgICAgICAgICAgV2Ugc2hvdWxkIHByb2JhYmx5IGFkZCBhIHdhcm5pbmcgZm9yIHRoaXMuCgowNy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFuIGVycm9yIGNoZWNrIHRvIGRldGVjdCBzaGFkb3dlZCB0ZW1wbGF0ZSBwYXJhbWF0ZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgaW50IFQ7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IsIG5vdCBhIHdhcm5pbmcuICBUaGlzIHdhcm5pbmcgaXMKICAgICAgICAgICAgYWxzbyBuZWVkZWQgdG8gZml4IHNvbWUgcmF0aGVyIGluc2lkaW91cyBwcm9ibGVtcyBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBUIHsKICAgICAgICAgICAgICAgICAgICAgIGludCAgYmxhaDsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBUcmFpdHM7ICAgIC8vIFdoaWNoIFQgaXMgdGhpcz8/Pz8KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgc2hhZG93cyB0aGUgb3V0ZXIKICAgICAgICAgICAgc3RydWN0dXJlICh3aGljaCBpcyB3aGF0IHlvdSB3YW50KS4KCjA3LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIHdpdGggaW50ZWdlciBhcmd1bWVudHMuICBTV0lHIGlzCiAgICAgICAgICAgIG11Y2ggbW9yZSBhd2FyZSBvZiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhpczoKCiAgICAgICAgICAgICAgICBjb25zdCBpbnQgU2l6ZSA9IDEwMDsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vMTAwKSBGb288MTAwPjsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKEZvbzxTaXplPiAqeCk7ICAgLy8gS25vd3MgdGhhdCBGb288U2l6ZT4gaXMgdGhlIHNhbWUgYXMgRm9vPDEwMD47CgowNy8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVmZWF0dXJlLyVpZ25vcmUvJXJlbmFtZSBhbmQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA3LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBjb25zdHJ1Y3RvcnMgdGhhdCB0cnkgdG8gY2F0Y2gKICAgICAgICAgICAgZXhjZXB0aW9ucyBpbiBpbml0aWFsaXplcnMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgQmFyIGI7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEZvbyhpbnQgeCkgdHJ5IAogICAgICAgICAgICAgICAgICAgICA6IGIoeCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIGNhdGNoKGludCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMuICBIb3dldmVyLCB0aGUgdHJ5IGFuZCBjYXRjaAogICAgICAgICAgICBwYXJ0cyBvZiB0aGUgZGVjbGFyYXRpb24gYXJlIGlnbm9yZWQuICBTZWUgU3Ryb3VzdHJ1cCwgM3JkIEVkLCBzZWN0aW9uIAogICAgICAgICAgICAxNC40LjYuMSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICAgICAgIAowNy8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBzeW1ib2wgdGFibGUgbWFuYWdlbWVudC4gIFRoaXMgZml4ZXMKICAgICAgICAgICAgdHdvIGJ1Z3MuICBGaXJzdCwgbWl4aW5nIGFic3RyYWN0IG1ldGhvZHMsIHRlbXBsYXRlcywgYW5kIAogICAgICAgICAgICBpbmhlcml0YW5jZSBubyBsb25nZXIgZ2VuZXJhdGVzIGEgZmFpbGVkIGFzc2VydGlvbi4KIAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKSA9IDA7CiAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEE8VD4KICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQV9pbnQpIEE8aW50PjsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEJfaW50KSBCPGludD47CgogICAgICAgICAgICBUaGlzIGZpeCBhbHNvIGZpeGVzIGEgc3VidGxlIHByb2JsZW0gd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQKICAgICAgICAgICAgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KICAgICAgICAgICAgICAgc3RydWN0IEIgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90eXBlOwogICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBuaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHNpemVfdHlwZSBpbmRleCA9IG5pbmRleCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBCdWdzIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgoKMDcvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIENoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIFNXSUdfQ29udmVydFB0cigpIGZ1bmN0aW9uCgkgICAgZm9yIHRoZSBTV0lHL1J1YnkgcnVudGltZSBzdXBwb3J0IHNvIHRoYXQgaXQgbG9va3MgbGlrZSB0aGUKCSAgICBQeXRob24gdmVyc2lvbi4gSWYgdGhlIGxhc3QgYXJndW1lbnQgKGZsYWdzKSBpcyBub24temVybywKCSAgICBTV0lHX0NvbnZlcnRQdHIoKSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgdHlwZSBtaXNtYXRjaGVzCgkgICAgYXMgYmVmb3JlLiBJZiBmbGFncyBpcyB6ZXJvLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC0xIGZvcgoJICAgIHR5cGUgbWlzbWF0Y2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBSVUJZIE1PRFVMRSAqKioKCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMvbWV0aG9kcy9jb25zdHJ1Y3RvcnMgbm93IHdvcmsgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzLiAgVGhlIHN1cHBvcnQgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC0tanVzdCBjYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxseSBhbmQgU1dJRyB3aWxsIGRpc3BhdGNoIHRvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAgICBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGlzc3VlcyBhc3NvY2lhdGVkIHdpdGggdGhpcy4gIFBsZWFzZSByZWZlcgogICAgICAgICAgICB0byB0aGUgb3ZlcmxvYWRpbmcgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBuYW1lc3BhY2VzLCBlbnVtcywgYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgbmFtZXNwYWNlIGhlbGxvIHsKICAgICAgICAgICAgICAgICAgZW51bSBIZWxsbyB7IEhpLCBIb2xhIH07CiAKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPEhlbGxvIEg+CiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgdmFsdWVfdHlwZTsKICAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlIHNheV9oaSgpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlKDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTV0lHIHdhc24ndCBnZW5lcmF0aW5nIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgcXVhbGlmaWVkIAogICAgICAgICAgICB0cmFpdHM8SGk+LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4gICAgICAgICAKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgYXJyYXkgdmFyaWFibGUgdHlwZW1hcHMgZm9yIFRjbCBtb2R1bGUuICAgSWYgeW91IGhhdmUgYQogICAgICAgICAgICB2YXJpYWJsZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgaW50IGZvb1sxMF07CgogICAgICAgICAgICB0aGVuIGEgc2V0IGZ1bmN0aW9uIGxpa2UgdGhpcyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgdm9pZCBmb29fc2V0KGludCAqeCkgewogICAgICAgICAgICAgICAgICAgbWVtbW92ZShmb28seCwxMCpzaXplb2YoaW50KSk7CiAgICAgICAgICAgICAgICB9CgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAlZnJhZ21lbnQgZGlyZWN0aXZlLiAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgaXQgY2FuIGJlIGVhc3kgdG8KICAgICAgICAgICAgZ2V0IGNhcnJpZWQgYXdheSBhbmQgd3JpdGUgYSBsb3Qgb2YgY29kZS4gIEhvd2V2ZXIsIGRvaW5nIHNvIGNhdXNlcwogICAgICAgICAgICB0cmVtZW5kb3VzIGNvZGUgYmxvYXQuICAgQSBjb21tb24gd2F5IHRvIHNvbHZlIHRoaXMgaXMgdG8gd3JpdGUgCiAgICAgICAgICAgIGhlbHBlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHRoZSB3cmFwcGVyIGZpbGUgZ2V0cyBwb2xsdXRlZAogICAgICAgICAgICB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkLiAgICBUbyBmaXggdGhpcywKICAgICAgICAgICAgYSBuZXcgZnJhZ21lbnQgZGlyZWN0aXZlIGlzIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZyYWdtZW50KCJ0eXBlX2hlbHBlciIsImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIGZyYWdtZW50PSJ0eXBlX2hlYWRlciIpIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgY29kZSBmcmFnbWVudCBpcyBvbmx5IGVtaXR0ZWQgaWYgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYWN0dWFsbHkgdXNlZC4gICBBIHNpbWlsYXIgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCBmb3IgZGVjbGFyYXRpb24KICAgICAgICAgICAgYW5ub3RhdGlvbiBhbmQgdGhlICVmZWF0dXJlIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImZyYWdtZW50IiwidHlwZV9oZWFkZXIiKSAgU29tZURlY2xhcmF0aW9uOwoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvICVmcmFnbWVudCBpcyB0aGUgZnJhZ21lbnQgbmFtZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgICAgaXMgdGhlIGZpbGUgc2VjdGlvbiB3aGVyZSB0aGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQuICAKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGRpcmVjdGl2ZSBpcyBmb3Igd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgIGFuZCBhZHZhbmNlZCB1c2VycyB3YW50aW5nIHRvIHN0cmVhbWxpbmUgdHlwZW1hcCBjb2RlLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgbWVtYmVyaW4gdHlwZW1hcHMgZm9yIGFsbCBhcnJheXMgaW4gYW4gYXR0ZW1wdCB0byBlbGltaW5hdGUKICAgICAgICAgICAgY29uZnVzaW9uIGFib3V0IHRoZWlyIHVzZS4KCjA2LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHNtYXJ0LXBvaW50ZXJzLiAgV2hlbiBhIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgb3BlcmF0b3ItPigpIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEJhciAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbG9jYXRlcyBjbGFzcyBCYXIgYW5kIHRyaWVzIHRvIHdyYXAgaXRzIG1lbWJlciB2YXJpYWJsZXMgYW5kCiAgICAgICAgICAgIG1ldGhvZHMgYXMgcGFydCBvZiBGb28uICBGb3IgZXhhbXBsZSwgaWYgQmFyIHdhcyBkZWZpbmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgWW91IGNvdWxkIGRvIHRoaXMgKGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpOgoKICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICBmLnggPSA0ICAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OngKICAgICAgICAgICAgICBmLnNwYW0oKSAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OnNwYW0KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgQysrCiAgICAgICAgICAgIHNtYXJ0LXBvaW50ZXJzLS0td2hpY2ggYWxsb3cgYXR0cmlidXRlcyB0byBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5CiAgICAgICAgICAgIHRocm91Z2ggb3BlcmF0b3ItPi4KCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpbiBTV0lHLS0tbm8gc3BlY2lhbCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGFyZSBuZWVkZWQuICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLiAgVXNlICVpZ25vcmUgdG8gaWdub3JlIAogICAgICAgICAgICBvcGVyYXRvci0+LgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNi8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVleGNlcHQgZGlyZWN0aXZlLiAgICVleGNlcHRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCjA2LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2xlYW51cCBvZiB0aGUgbW9kdWxlcyBkaXJlY3RvcnkuICBFbGltaW5hdGVkIG1vc3QKICAgICAgICAgICAgaGVhZGVyIGZpbGVzLCBjb25zb2xpZGF0ZWQgbW9kdWxlIGNvZGUgaW50byBzaW5nbGUgZmlsZXMuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBpbnN0YW50aWF0aW9uIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBBbGwgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcyBtdXN0IG5vdyBkZWZpbmUgYSBmYWN0b3J5IGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICoKICAgICAgICAgICAgICAgIHN3aWdfcHl0aG9uKHZvaWQpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUFlUSE9OKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZW4gcGxhY2VkIGluIGEgdGFibGUgYW5kIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgICBhIGNvbW1hbmQgbGluZSBvcHRpb24gaW4gc3dpZ21haW4uY3h4LiAgCgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGhhcyBhIG51bWJlciBvZiBiZW5lZml0cy4gIEl0IGRlY291cGxlcyB0aGUgCiAgICAgICAgICAgIFNXSUcgbWFpbiBwcm9ncmFtIGZyb20gaGF2aW5nIHRvIGtub3cgYWJvdXQgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb25zIGZvciBlYWNoIG1vZHVsZS4gIEFsc28sIGJ5IHVzaW5nIGEgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbiwgaXQgd2lsbCBiZSBlYXNpZXIgdG8gaW1wbGVtZW50IGR5bmFtaWMgbG9hZGluZwogICAgICAgICAgICBvZiBtb2R1bGVzIChzaW1wbHkgbG9hZCB0aGUgZmlsZSBhbmQgaW52b2tlIHRoZSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uKS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciByZWZlcmVuY2UgY29udmVyc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyAmKCk7CgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3Igb3BlcmF0b3IgbmV3W10gYW5kIG9wZXJhdG9yIGRlbGV0ZVtdLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gcHJvYmxlbSBmb3IgY29uc3RhbnRzIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICBpbnZvbHZpbmcgdGVtcGxhdGVzLgoKMDYvMTkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIGEgYnVnIGZvciB0aGUgJy1mZWF0dXJlJyBjb21tYW5kIGxpbmUgYXJndW1lbnQ7CiAgICAgICAgICAgIHRoYXQgc2V0dGluZyB3YXMgZWZmZWN0aXZlbHkgYmVpbmcgaWdub3JlZCBhbmQgc28gdGhlIGZlYXR1cmUKICAgICAgICAgICAgbmFtZSB3YXMgYWx3YXlzIHNldCBlcXVhbCB0byB0aGUgbW9kdWxlIG5hbWUuCgowNi8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW1zIHdpdGggc3RhdGljIG1lbWJlcnMgYW5kIGVudW1zIGluIHRlbXBsYXRlcy4KClZlcnNpb24gMS4zLjEzIChKdW5lIDE3LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMDYvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIF9fRklMRV9fIGV4cGFuc2lvbiBpbiB0aGUgcHJlcHJvY2Vzc29yLiAgIE9uIFdpbmRvd3MsCiAgICAgICAgICAgIHRoZSBiYWNrc2xhc2ggKFwpIGlzIG5vdyBjb252ZXJ0ZWQgdG8gKFxcKSBpbiB0aGUgc3RyaW5nIGxpdGVyYWwKICAgICAgICAgICAgdXNlZCBmb3IgX19GSUxFX18uICBSZXBvcnRlZCBieSBTdGV2ZSBHbGFzZXIuCgowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAnbmFtZSBwcml2YXRlIGluIHRoaXMgY29udGV4dCcuICBUaGUKICAgICAgICAgICAgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBmb3IgcHVibGljIG1ldGhvZHMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBTY290dCBNaWNoZWwuCiAKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKICAgICAgICAgICAgYW5kIG5hbWVzcGFjZXMuICAgV2hlbiBTV0lHIGV4cGFuZHMgYSB0ZW1wbGF0ZSwgaXQgZG9lcwogICAgICAgICAgICBzbyB3aXRoIGZ1bGx5IHJlc29sdmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERvdWJsZTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShmb29fZCkgZm9vPERvdWJsZT47CgogICAgICAgICAgICB0aGVuLCBpdCBpcyBoYW5kbGVkIGFzIGZvbzxkb3VibGU+IGluIHRoZSB0eXBlc3lzdGVtLgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuCgowNi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBib29sIHR5cGVtYXBzIGZvciBJTlBVVCwgT1VUUFVUIGFuZAoJICAgIElOT1VUIGluIExpYi9ydWJ5L3R5cGVtYXBzLmkuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgYSBjb3VwbGUgb2YgYnJva2VuIHByYWdtYXMuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB1bm5lY2Vzc2FyeSBjYXN0IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlIHdoZXJlIAogICAgICAgICAgICB0aGUgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcgLSBKYXZhIHZhcmlhYmxlcyBleGFtcGxlIAogICAgICAgICAgICBmYWlsdXJlIGFzIHJlcG9ydGVkIGJ5IExhcnJ5IFZpcmRlbi4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJXRlbXBsYXRlIHRvIGFsbG93IGZvciBlbXB0eSBpbnN0YW50aWF0aW9ucy4KCiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIGZvbzxpbnQsaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXJzIGZvbzxpbnQsaW50PiB3aXRoIHRoZSB0eXBlIHN5c3RlbSwgYnV0CiAgICAgICAgICAgIGRvZXNuJ3Qgd3JhcCBpdCAoc2FtZSBhcyAlaWdub3JlKS4gICBUaGlzIG1heSBvbmx5IGJlIGEKICAgICAgICAgICAgdGVtcG9yYXJ5IG1lYXN1cmUuICAgU1dJRyBtaWdodCBiZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgaW5zdGFudGlhdGUgdGVtcGxhdGVzIGluIGNlcnRhaW4gY2FzZXMuCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGZ1bmN0aW9uIHByb3RvdHlwZSBwcm9ibGVtcyB3aXRoIFRjbCA4LjQKCjA2LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRlbXBsYXRlcyBhbmQgbG9jYXRpb24gb2YgYmFzZSBjbGFzc2VzLiAgCiAgICAgICAgICAgIFRoaXMgb25lIGlzIGEgbGl0dGxlIG1pbmQtYmVuZGluZywgYnV0IGhlcmUgaXMgYW4gZXhhbXBsZQogICAgICAgICAgICB0aGF0IGlsbHVzdHJhdGVzOgogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBBcmdUeXBlIGFyZ190eXBlOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIFJlc1R5cGUgcmVzX3R5cGU7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCBGdW5jdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFGLCBjbGFzcyBBRz4KICAgICAgICAgICAgIHN0cnVjdCBDbGFzcyA6IEZ1bmN0aW9uPHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjphcmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjpyZXNfdHlwZT4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgJXRlbXBsYXRlKHRyYWl0c19kZCkgdHJhaXRzIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoRnVuY3Rpb25fZGQpIEZ1bmN0aW9uIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoQ2xhc3NfZGQpIENsYXNzIDxkb3VibGUsIGRvdWJsZT47CgoKICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgYmFzZSBjbGFzcyBvZiAnQ2xhc3MnIGlzIGRldGVybWluZWQgZnJvbQogICAgICAgICAgICB0aGUgRnVuY3Rpb24gdGVtcGxhdGUsIGJ1dCB0aGUgdHlwZXMgYXJlIG9idGFpbmVkIHRocm91Z2ggdHlwZWRlZnMuCiAgICAgICAgICAgIEJlY2F1c2Ugb2YgdGhpcywgU1dJRyBjb3VsZCBub3QgbG9jYXRlIHRoZSB3cmFwcGVkIGJhc2UgY2xhc3MKICAgICAgICAgICAgKEZ1bmN0aW9uPGRvdWJsZSxkb3VibGU+KS4gICBTaG91bGQgYmUgZml4ZWQgaW4gMS4zLjEzIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIEkgY2FuIHRoaW5rIG9mIGEgbWlsbGlvbiBvdGhlciB0aGluZ3MgdGhhdCBtaWdodAogICAgICAgICAgICBhbHNvIGJlIGJyb2tlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29udmVyc2lvbiBvcGVyYXRvcnMuICBJZiB5b3UgaGFkIGFuCiAgICAgICAgICAgIG9wZXJhdG9yIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OwoKICAgICAgICAgICAgU1dJRyB3YXMgb21taXR0aW5nIHRoZSAiY29uc3QiIHF1YWxpZmllci4gIFRoaXMgYWZmZWN0ZWQKICAgICAgICAgICAgJXJlbmFtZSBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gIFJlcG9ydGVkIGJ5IFpob25nIFJlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTGVzc2VuZWQgdGhlIHN0cmljdG5lc3Mgb2YgYWJzdHJhY3QgY2xhc3MgY2hlY2tpbmcuICBJZgogICAgICAgICAgICB5b3UgaGF2ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgbWV0aG9kKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgU1dJRyB3aWxsIGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycwogICAgICAgICAgICAgZm9yIEJhci4gIEhvd2V2ZXIsIGl0IHdpbGwgYWxzbyBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSAKICAgICAgICAgICAgIHRoYXQgIkJhciIgbWlnaHQgYmUgYWJzdHJhY3QgKHNpbmNlIG1ldGhvZCgpIGlzbid0IGRlZmluZWQpLgogICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTIsIFNXSUcgcmVmdXNlZCB0byBnZW5lcmF0ZSBhIGNvbnN0cnVjdG9yIGF0IGFsbC4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBJZiB5b3Ugc3BlY2lmeSBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIEl0IGlzICpleGFjdGx5KiB0aGUgc2FtZSBhcyB0aGlzOgogCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgU1dJRy0xLjMuMTIgdHJpZWQgdG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG91dHNpZGUgb2YgdGhlIG5hbWVzcGFjZQogICAgICAgICAgICB1c2luZyBzb21lIHRyaWNrLiAgSG93ZXZlciwgdGhpcyB3YXMgZXh0cmVtZWx5IHByb2JsZW1hdGljIGFuZCBmdWxsCiAgICAgICAgICAgIGhvbGVzLiAgIFRoaXMgdmVyc2lvbiBpcyBzYWZlci4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggc2NvcGUgcXVhbGlmaWNhdGlvbiBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEE8Qjo6Qz46OkRECgogICAgICAgICAgICBCZWZvcmUsIHRoaXMgd2FzIHNlcGFyYXRlZCBhcyBzY29wZXMgQTxCLCBDPiwgYW5kIERELiAgRml4ZWQgbm93LgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBBbGxvdyB0aGUgZm9sbG93aW5nIHN5bnRheDogCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBjbGFzcyBBIHsgfTsKICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsgLi4uIH07CgogICAgICAgICAgICBBIGJhc2UgY2xhc3Mgd2l0aG91dCBhIHNwZWNpZmllciBpcyBhc3N1bWVkIHRvIGJlIHB1YmxpYyBmb3IgYSBzdHJ1Y3QuCiAKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3Igd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByb2JsZW1zIHdpdGggJXJlbmFtZSBkaXJlY3RpdmUgYW5kIHRlbXBsYXRlCiAgICAgICAgICAgIGV4cGFuc2lvbi4KCiAgICAgICAgICAgIENvZGUgbGlrZSB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaCkgZm9vPGRvdWJsZT46Om1ldGhvZDsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAldGVtcGxhdGUod2hhdGV2ZXIpIGZvbzxkb3VibGU+OwoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXNvbHZlZCBzb21lIHRyaWNreSBpc3N1ZXMgb2YgbXVsdGktcGFzcyBjb21waWxhdGlvbiBhbmQgCiAgICAgICAgICAgIGFuZCBpbmhlcml0YW5jZS4gIFRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uIG5vdyBnZW5lcmF0ZXMKICAgICAgICAgICAgYW4gZXJyb3I6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGluY29tcGxldGUgY2xhc3Nlcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhcjsKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBhbiB1bmRlZmluZWQgY2xhc3MuCgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsgIC8vIEJhciB1bmRlZmluZWQKCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIGJ1ZyByZXBvcnRlZCBieSBKYXNvbiBTdGV3YXJ0LgoKMDYvMDUvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGUgUnVieSBtb2R1bGUgYWJvdXQgdGhlIGxhY2sKICAgICAgICAgICAgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIE9ubHkgdGhlIGZpcnN0IGJhc2UgY2xhc3MKICAgICAgICAgICAgbGlzdGVkIGlzIHVzZWQgYW5kIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQuIChSZXBvcnRlZCBieSBDcmFpZwogICAgICAgICAgICBGaWxlcykuCiAgICAgICAgICAgIAowNi8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggc3RydWN0IGRlY2xhcmF0aW9ucyBhbmQgdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEZvbyBGb287CiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEEgZmV3IG90aGVyIHN1YnRsZSBzdHJ1Y3QgcmVsYXRlZCB0eXBpbmcgcHJvYmxlbXMgd2VyZQogICAgICAgICAgICBhbHNvIHJlc29sdmVkLgoKVmVyc2lvbiAxLjMuMTIgKEp1bmUgMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSByZWxhdGVkIHRvIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgICBuYW1lc3BhY2VzLiAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkICdtYWtlIHVuaW5zdGFsbCcgdGFyZ2V0LiAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIGJ1ZyB3aXRoICVyZW5hbWUsICVmZWF0dXJlIGFuZCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB2ZWN0b3I6Ol9fZ2V0aXRlbV9fIHsKICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBGaW5lCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gT29wcy4KICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3csIHRoZSAlZXhjZXB0aW9uIGRpcmVjdGl2ZSAoYW5kIG90aGVyIGZlYXR1cmVzKSBzaG91bGQgY29ycmVjdGx5IGFwcGx5IHRvCiAgICAgICAgICAgIGJvdGggdmVjdG9yIGFuZCBzcGVjaWFsaXphdGlvbnMuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2VzIHRvICV0ZW1wbGF0ZSgpIGRpcmVjdGl2ZS4gICBUZW1wbGF0ZSBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICByZWR1Y2VkIHRvIHByaW1pdGl2ZSB0eXBlcyBpbiB0ZW1wbGF0ZSBtYXRjaGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgLi4uIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpJbnRQdHI7ICAgICAvLyBHcm9zcyB0eXBlZGVmCgogICAgICAgICAgICAgICAvLyBHZXRzIHRoZSBhYm92ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JJbnRQdHIpIHZlY3RvcjxJbnRQdHI+OwoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgZXh0cmVtZWx5IHN1YnRsZSwgYnV0IGl0IGZpeGVzIGEgbnVtYmVyIG9mIHBvdGVudGlhbAogICAgICAgICAgICBob2xlcyBpbiBMdWlnaSdzIFNUTCBsaWJyYXJ5IG1vZHVsZXMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yaSkgdmVjdG9yPGludD47CgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgdHlwZW1hcCBidWcgcmVsYXRlZCB0byBjb25zdC4gIGNvbnN0CiAgICAgICAgICAgIHdhcyBiZWluZyBkaXNjYXJkZWQgdGhyb3VnaCB0eXBlZGVmcy4KCjA1LzI5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBpbnB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgKGluIExpYi9ydWJ5L3J1Ynkuc3dnKS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGphdmEgYXJycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBlbmNsb3NlZCBieSAKICAgICAgICAgICAgYSBTV0lHX05PQVJSQVlTICNkZWZpbmUuIFVzZWZ1bCBpZiBub3QgdXNpbmcgYXJyYXlzIGFuZCAKICAgICAgICAgICAgaXQgaXMgZGVzaXJhYmxlIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgY29tcGlsZWQgY29kZS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRW51bXMgd2VyZSBub3QgcmVuYW1lZCB3aGVuIHVzaW5nICVuYW1lIG9yICVyZW5hbWUKICAgICAgICAgICAgZml4LgoKMDUvMjgvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhlCgkgICAgIm5ldyIgc2luZ2xldG9uIG1ldGhvZCBhbmQgImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IKCSAgICBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzLiBUaGUgd3JhcHBlciBuYW1lCgkgICAgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgIm5ldyIgaXMgYWxsb2NfY2xhc3NuYW1lIGFuZAoJICAgIHRoZSB3cmFwcGVyIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgImluaXRpYWxpemUiCgkgICAgaXMgbmV3X2NsYXNzbmFtZS4KCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gcnVudGltZS4gIFBvaW50ZXIgY29udmVyc2lvbi9jcmVhdGlvbiBmdW5jdGlvbnMKICAgICAgICAgICAgbm93IGFsbW9zdCBhbHdheXMgaGF2ZSBhbiBleHRyYSAiZmxhZ3MiIGFyZ3VtZW50LiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ29udmVydFB0cihvYmosIHZvaWQgKiosIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl4KICAgICAgICAgICAgVGhpcyBleHRyYSBwYXJhbWV0ZXIgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gYW5kIHdpbGwKICAgICAgICAgICAgYmUgdXNlZCBmb3IgbW9yZSBjb250cm9sIG92ZXIgcG9pbnRlcnMgaW4gZnV0dXJlIHZlcnNpb25zLgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggZm9yIEMrKyBjbGFzc2VzIHdpdGggcHJpdmF0ZSBhc3NpZ25tZW50IG9wZXJhdG9ycy4gIEl0CiAgICAgICAgICAgIGlzIG5vdyBwb3NzaWJsZSB0byBzYWZlbHkgcmV0dXJuIG9iamVjdHMgbGlrZSB0aGlzIGJ5IHZhbHVlLgogICAgICAgICAgICBDYXZlYXQ6ICB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIGEgY29weSBjb25zdHJ1Y3Rvci4KCSAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICAtcHJveHkgb3B0aW9uIGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4gIFRoaXMgaXMgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgLXNoYWRvdy4gIFdlIGFyZSBtZXJlbHkgY2hhbmdpbmcgdGVybWlub2xvZ3kuCiAgICAgICAgICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0aGUgLXBhY2thZ2Ugb3B0aW9uLgogICAgICAgICAgICAtcGFja2FnZSBtZXJlbHkgc2V0cyB0aGUgcGFja2FnZSBuYW1lIHRvIGJlIHVzZWQgb24gdGhlCiAgICAgICAgICAgIHdyYXBwZXJzLiAgSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQogICAgICAgICAgICBmaWxlIG9yIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuICBUaGlzIHdhcwogICAgICAgICAgICBicm9rZW4gYXQgc29tZSBwb2ludCwgYnV0IHdvcmtzIGFnYWluIG5vdy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNDc1NDUyIF0gbWVtb3J5IGxlYWsgaW4gcmV0dXJuLWJ5LXZhbHVlLgogICAgICAgICAgICBQcm9ibGVtIHJlbGF0ZWQgdG8gc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgcmV0dXJuaW5nIG5ld2x5CiAgICAgICAgICAgIGFsbG9jYXRlZCBvYmplY3RzLiBSZXBvcnRlZCBieSBSb3kgTGVjYXRlcy4KIAowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDUxMzEzNCBdICVCTEVTU0VETUVNQkVSUyBpc24ndCBhbHdheXMgcmlnaHQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsZXVyIERpYW5hIERyYWdhbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA3MzUgXSAtaW1wb3J0YWxsIGFuZCB0aGUgLUkgb3B0aW9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbZ3VpbGVdIEZpeGVkIFsgNTMyNzIzIF0gRGVmYXVsdCBhcmcgZm9yIGNoYXIqIGNhbiBTZWdWLiAgCiAgICAgICAgICAgIEVycm9yIGluIGd1aWxlIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHR5cGVtYXAgYXBwbGljYXRpb24gY29kZS4gIFRoZSAiZnJlZWFyZyIKICAgICAgICAgICAgdHlwZW1hcCBtdXN0IGV4YWN0bHkgbWF0Y2ggdXAgd2l0aCB0aGUgImluIiBvciAiaWdub3JlIgogICAgICAgICAgICB0eXBlbWFwLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoY2hhciAqZGF0YSwgaW50IGxlbikgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBjaGFyICpkYXRhIHsgLi4uIH07IAoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpkYXRhLCBpbnQgbGVuKTsKCiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSAiaW4iIHR5cGVtYXAgaXMgYXBwbGllZCwgYnV0IHRoZQogICAgICAgICAgICAgZnJlZWFyZyB0eXBlbWFwIGlzIG5vdC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZnJlZWFyZwogICAgICAgICAgICAgdHlwZW1hcCBkb2Vzbid0IG1hdGNoIHVwIHdpdGggdGhlIGlucHV0IGFyZ3VtZW50IHNlcXVlbmNlLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0ODI3MiBdIERlZmF1bHQgYXJndW1lbnQgY29kZSBtaXNzaW5nIGJyYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ3NzMwIF0gU3dpZ1ZhbHVlV3JhcHBlciBuZWVkZWQgZm9yIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVuZGVmaW5lZCBpZGVudGlmaWVycyBub3cgZXZhbHVhdGUgdG8gMCB3aGVuIGV2YWx1YXRpbmcKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjaWYgIUZPTwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgIAogICAgICAgICAgICB3aGVyZSBGT08gaXMgdW5kZWZpbmVkIG9yIHNldCB0byBzb21lIG5vbi1udW1lcmljIHZhbHVlLgoKICAgICAgICAgICAgRml4ZXMgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KCiAKMDUvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBDKysgJ2V4cG9ydCcga2V5d29yZC4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSByZWZpbmVtZW50IG9mIHR5cGUtbmFtZSBtYW5nbGluZyB0byBhY2NvdW50IGZvciBwb2ludGVycywgYXJyYXlzLAogICAgICAgICAgICByZWZlcmVuY2VzLCBhbmQgb3RoZXIgZW1iZWRkZWQgdHlwZSBjb25zdHJ1Y3RzLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbml0aWFsIGF0dGVtcHQgYXQgc3VwcG9ydGluZyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgQXQKICAgICAgICAgICAgdGhlIHZlcnkgbGVhc3QsIGl0IGlzIHBhcnNlZCBhbmQgdGhlIGNsYXNzZXMgYXJlIHN0b3JlZC4gIE1hdGNoaW5nCiAgICAgICAgICAgIG9mIGluc3RhbnRpYXRpb25zIHRvIHNwZWNpYWxpemVkIHZlcnNpb24gaXMgbW9yZSBsaW1pdGVkIGFuZCBiYXNlZCBvbgogICAgICAgICAgICB0aGUgU1dJRyBkZWZhdWx0IHR5cGVtYXAgcnVsZXM6CgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICYKCiAgICAgICAgICAgIE5vdywgd2h5IGluIHRoZSB3b3JsZCB3b3VsZCB5b3Ugd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlPyAgT3RoZXIKICAgICAgICAgICAgdGhhbiBhbGxvd2luZyBmb3Igc2xpZ2h0bHkgbW9kaWZpZWQgY2xhc3MgQVBJcywgdGhpcyBjYXBhYmlsaXR5IGlzCiAgICAgICAgICAgIHByaW1hcmlseSB1c2VkIHRvIHByb3ZpZGUgYWR2YW5jZWQgd3JhcHBpbmcgc3VwcG9ydCBmb3IgU1RMLWxpa2UKICAgICAgICAgICAgb2JqZWN0cy4gIEl0IGNhbiBhbHNvIGJlIG1peGVkIHdpdGggdHlwZW1hcHMuICBIZXJlIGlzIGFuIGV4YW1wbGU6CgoKICAgICAgICAgICAgICAgIC8qIEdlbmVyaWMgdmVyc2lvbiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBvYmplY3RzIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIChwb2ludGVycykgKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBwb2ludGVycyB0byBvYmplY3RzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBTcGVjaWFsaXphdGlvbiAoaW50ZWdlcnMpLiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBpbnRlZ2Vycy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICAgTm9ybWFsbHksIHR5cGVtYXAgdmFyaWFibGVzIGFyZQogICAgICAgICAgICByZW5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqIChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBjb2RlIHRoYXQgY3JlYXRlcyBhbmQgdXNlcyB2YXJpYWJsZXMgInRlbXAxIiwidGVtcDIiLCAKICAgICAgICAgICAgInRlbXAzIiBhbmQgc28gZm9ydGggZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRpbWVzIHRoZSB0eXBlbWFwIGlzIHVzZWQuCiAgICAgICAgICAgIFNvbWV0aW1lcyB5b3Ugd2FudCBhIHNpbmdsZSB2YXJpYWJsZSBpbnN0ZWFkLiAgVG8gZG8gdGhhdCwgdXNpbmcKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKihpbnQgX2dsb2JhbF90ZW1wKSB7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgSXMgdGhpcyBjYXNlLCBhIHNpbmdsZSB2YXJpYWJsZSBfZ2xvYmFsX3RlbXAgaXMgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgd3JhcHBlciBmdW5jdGlvbnMuICBJdCBpcyBzaGFyZWQgYWNyb3NzIGFsbCB0eXBlbWFwcy4gIFJlcGVhdGVkCiAgICAgICAgICAgIHR5cGVtYXBzIGRvIG5vdCByZXBsaWNhdGUgdGhlIHZhcmlhYmxlLS0tdGhleSB1c2UgdGhlIGZpcnN0IG9uZQogICAgICAgICAgICBlbWl0dGVkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICBJZiB5b3UgaGF2ZSB0aGlzIGNvZGUsCgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vIChpbnQgc29tZXZhciA9IDMpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBzb21ldmFyIGlzIG5vdyBlbWl0dGVkIGludG8gdGhlIHdyYXBwZXIgY29kZS4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgJWV4dGVuZCB0byBiZSBiZXR0ZXIgYmVoYXZlZCBpbiBuYW1lc3BhY2VzLiAgSWYgeW91IGhhdmUgY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgU1dJRyBtYXRjaGVzIHRoZSBibGFoKCkgbWV0aG9kIHRvIGEgQyBmdW5jdGlvbiBuYW1lZCAKICAgICAgICAgICAgdm9pZCBmb29fYmFyX2JsYWgoZm9vOjpiYXIgKnNlbGYpLgoKICAgICAgICAgICAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1uYW1lc3BhY2UgdmVyc2lvbi4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGVzOiBjcG9pbnRlci5pLCBjYXJyYXlzLmksIGNtYWxsb2MuaS4gIFRoZXNlCiAgICAgICAgICAgIHByb3ZpZGUgYWNjZXNzIHRvIEMgcG9pbnRlcnMgYW5kIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvTGlicmFyeS5odG1sIGZvciBkZXRhaWxzLgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDIHR5cGUgY2hhciBubyBsb25nZXIgbWFwcyB0byBKYXZhIHR5cGUgYnl0ZSwgYnV0IHRvIEphdmEgdHlwZSBjaGFyLgogICAgICAgICAgICBJdCBpcyBub3cgdHJlYXRlZCBhcyBhIGNoYXJhY3RlciByYXRoZXIgdGhhbiBhIHNpZ25lZCBudW1iZXIuIFRoaXMgZml0cyBpbgogICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIGFuZCBpcyBhIG1vcmUgbmF0dXJhbCBtYXBwaW5nIGFzIGNoYXIqIGlzIAogICAgICAgICAgICBtYXBwZWQgYXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4gTm90ZSB0aGF0IHRoZSBDIHNpZ25lZCBjaGFyIHR5cGUgaXMgc3RpbGwKICAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBieXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBJbXByb3ZlZCBjb25zdGFudHMgd3JhcHBpbmcuIENvbnN0YW50cyAoI2RlZmluZSBhbmQgJWNvbnN0YW50KSB2YWx1ZXMgCiAgICAgICAgICAgIGFyZSBub3cgb2J0YWluZWQgdGhyb3VnaCBhIEpOSSBjYWxsLiBQcmV2aW91c2x5IHRoZSB2YWx1ZSB3YXMgY29tcGlsZWQgYXMgCiAgICAgICAgICAgIEphdmEgY29kZSwgYnV0IHRoaXMgZGlkbid0IHdvcmsgZm9yIGFsbCBjYXNlcywgZWcgI2RlZmluZSAxMjNVTEwuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgQysrCiAgICAgICAgICAgIGFjY2VzcyBzcGVjaWZpZXJzLiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmFtZXNwYWNlcyBhbmQgZW51bXMgbm93IHdvcmsgY29ycmVjdGx5LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgZW51bSBCYXIgeyBBLCBCIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0eXBlcyBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIHNwZWNpZnkgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcwogICAgICAgICAgICBpbiB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICV0eXBlcyhGb28gPSBCYXIpOwoKICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgRm9vIGlzYSBCYXIuICAgIFVzaW5nIHRoaXMgaXMgcG90ZW50aWFsbHkgcXVpdGUgZGFuZ2Vyb3VzLgogICAgICAgICAgICBIb3dldmVyLCB0aGlzIGlzIHVzZWZ1bCBpbiBjZXJ0YWluIGNhc2VzIChhbmQgaW4gdGhlIFNXSUcgbGlicmFyeSkuCiAgICAgICAgICAgIAowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVub2RlZmF1bHQgYW5kICVtYWtlZGVmYXVsdCBkaXJlY3RpdmVzIG5vdyByZXF1aXJlIGEgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0OwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQ7CgogICAgICAgICAgICBJbiBhZGRpdGlvbiBib3RoIGRpcmVjdGl2ZXMgY2FuIHRha2UgYSBjbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdCBGb287CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgICAvKiBObyBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgIC8qIERlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSWYgeW91IGRvbid0IHVzZSB0aGUgdHJhaWxpbmcgc2VtaWNvbG9uLCB0aGluZ3Mgd2lsbCBteXN0ZXJpb3VzbHkgYnJlYWsuCgowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vcmUgaW1wcm92ZW1lbnRzIHRvIHR5cGUgc3lzdGVtIGhhbmRsaW5nLiAgU1dJRyBub3cgY29ycmVjdGx5IGhhbmRsZXMKICAgICAgICAgICAgdGVtcGxhdGUgbmFtZXMgYW5kIHBhcmFtZXRlcnMgaW4gYSBuYW1lc3BhY2UuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJhciB7IH07CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhcjxJbnRlZ2VyPiAqeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhlIGdlbmVyYXRlZCBjb2RlLCBhbGwgb2YgdGhlIHR5cGVuYW1lcyBhcmUgcHJvcGVybHkgcXVhbGlmaWVkLgoKMDUvMTcvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBkZXByZWNhdGVkIGJyb2tlbiAtam5pYyBhbmQgLWpuaWNwcCBjb21tYW5kbGluZSBvcHRpb25zLiBUaGUgQyBvciBDKysgCiAgICAgICAgICAgIEpOSSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgbm93IGRldGVybWluZWQgZnJvbSB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24uCgowNS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKQ0FMTCBtYWNyb3Mgd2hpY2ggZXhpc3Qgc28gdGhhdCB0aGUgc2FtZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgICBmb3IgZ2VuZXJhdGluZyBib3RoIHRoZSBDIGFuZCBDKysgSk5JIGNhbGxpbmcgY29udmVudGlvbnMgbm8gbG9uZ2VyIGFwcGVhcgogICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgb3V0cHV0IGlzIG5vdyBwYXNzZWQgdGhyb3VnaCB0aGUgCiAgICAgICAgICAgIFNXSUcgcHJlcHJvY2Vzc29yIHdoaWNoIGRvZXMgdGhlIG1hY3JvIGV4cGFuc2lvbiBmb3IgZWl0aGVyIEMgb3IgQysrIChkZXBlbmRpbmcKICAgICAgICAgICAgb24gd2hldGhlciAtYysrIGlzIHBhc3NlZCBvbiB0aGUgU1dJRyBjb21tYW5kbGluZSkuCgogICAgICAgICAgICBUaGUgZ2VuZXJhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBhZGp1c3RlZCAKICAgICAgICAgICAgdG8gdGFrZSBhY2NvdW50IG9mIHRoaXMuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IGFueSB0eXBlbWFwcyB3aGljaCBjb250YWluZWQgCiAgICAgICAgICAgIEpDQUxMIG1hY3JvcyB3aXRoaW4gJXsgJX0gYnJhY2tldHMgd2lsbCBoYXZlIHRvIGJlIG1vdmVkIHdpdGhpbiB7fSBicmFja2V0cyAKICAgICAgICAgICAgc28gdGhhdCB0aGUgU1dJRyBwcmVwcm9jZXNzb3IgY2FuIGV4cGFuZCB0aGUgbWFjcm9zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDbGFzcyB0ZW1wbGF0ZXMgbWF5IG5vdyBiZSB1c2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEM+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb2kpIEZvbzxpbnQsIEJhcj47CiAgICAgCiAgICAgICAgICAgIFNXSUcgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgc3BlY2lhbCB3aXRoIHRoaXMtLS1pdCdzIGp1c3QKICAgICAgICAgICAgYW5vdGhlciB3YXkgb2Ygc3BlY2lmeWluZyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gIAogICAgICAgICAKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIHRlbXBsYXRlIHN1cHBvcnQuICBUZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIG5vIGxvbmdlcgogICAgICAgICAgICByZXF1aXJlZCBmb3IgdHlwZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxib29sPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE9idmlvdXNseSwgbmFtZXMgYXJlIHJlcXVpcmVkIGZvciB0ZW1wbGF0ZTxjbGFzcyBUPjsKCjA1LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IG1hY3JvIGV4cGFuc2lvbiBpbiB0eXBlbWFwcy4gIFRoZSBzZXF1ZW5jZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih0eXBlKQoKICAgICAgICAgICAgV2lsbCBleHBhbmQgaW50byB0aGUgU1dJRyB0eXBlIGRlc2NyaXB0b3Igc3RydWN0b3IgZm9yCiAgICAgICAgICAgIHRoZSBnaXZlbiB0eXBlLiAgVHlwZSBtYXkgYmUgYW55IGFic3RyYWN0IGRhdGF0eXBlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKikKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAoKikoaW50LGRvdWJsZSkpCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih2ZWN0b3I8aW50PiAqKQoKICAgICAgICAgICAgQ2F2ZWF0OiBJdCBpcyAqTk9UKiBjdXJyZW50bHkgbGVnYWwgdG8gdXNlIG90aGVyIHR5cGVtYXAKICAgICAgICAgICAgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBpbiB0aGUgbWFjcm8uICBGb3IgZXhhbXBsZSAKICAgICAgICAgICAgJGRlc2NyaXB0b3IoJDFfdHlwZSkuCgogICAgICAgICAgICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbW9kaWZpY2F0aW9uIGlzIHRvIGJldHRlcgogICAgICAgICAgICBzdXBwb3J0IHR5cGVtYXBzIGZvciBjb250YWluZXIgb2JqZWN0cyBvciB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IG1pZ2h0IGJlIHBlcmZvcm1pbmcgdHlwZSBjb252ZXJzaW9ucy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgd3JhcHBpbmcgb2YgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgaGFzIGJlZW4KICAgICAgICAgICAgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgQXJndW1lbnRzIG9mIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgbm93IHBhc3NlZAogICAgICAgICAgICBieSB2YWx1ZSBhcyBvcHBvc2VkIHRvIHBvaW50ZXJzLiAgUmV0dXJuIHZhbHVlcyBvZgogICAgICAgICAgICB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIHJldHVybmVkIGFzIHZhbHVlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXJzLgoKICAgICAgICAgICAgJ3ByaW1pdGl2ZScgaXMgYW55IG9uZSBvZiBpbnQsIHNob3J0LCBsb25nLCBsb25nIGxvbmcsCiAgICAgICAgICAgIGNoYXIsIGZsb2F0LCBkb3VibGUsIGJvb2wgKGFzIHdlbGwgYXMgdW5zaWduZWQgdmFyaWFudHMpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSB0byBiZXR0ZXIgc3VwcG9ydCBDKysgd3JhcHBpbmctLWVzcGVjaWFsbHkKICAgICAgICAgICAgY29kZSB0aGF0IG1ha2VzIHVzZSBvZiB0ZW1wbGF0ZXMgYW5kIHRoZSBTVEwuCiAgICAgICAgICAgIAowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBhY2Nlc3MgdGVtcGxhdGVzCiAgICAgICAgICAgIGluIGEgbmFtZXNwYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgY29tcGxleCB7CiAgICAgICAgICAgICAgICAgICAgICAgVCByZSwgaW07CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXgoVCBfciA9IFQoKSwgVCBfaSA9IFQoKSkgOiByZShfciksIGltKF9pKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIHJlYWwoKSB7IHJldHVybiByZTsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgaW1hZygpIHsgcmV0dXJuIGltOyB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoY29tcGxleCkgc3RkOjpjb21wbGV4PGRvdWJsZT47CgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgc29tZSB2ZXJ5IHN1YnRsZSBuYW1lc3BhY2Uvc3ltYm9sIHRhYmxlIAogICAgICAgICAgICBtYW5hZ2VtZW50IGlzc3VlcyBpbnZvbHZlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcy4KICAgICAgICAgICAgSXQgbWF5IG5vdCB3b3JrIGluIGNlcnRhaW4gY2FzZXMuCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBzdXBwb3J0IGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4gCiAgICAgICAgICAgICAgIHN0cnVjdCBwYWlyIHsKICAgICAgICAgICAgICAgICBfVDEgZmlyc3Q7CiAgICAgICAgICAgICAgICAgX1QyIHNlY29uZDsKICAgICAgICAgICAgICAgICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChfVDIoKSkgeyB9CiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+IHBhaXIoY29uc3QgcGFpcjxfVTEsX1UyPiAmeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUsIHVzZSAldGVtcGxhdGUgYW5kICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIGV4cGFuZHMgdGhlIGNvbnN0cnVjdG9yIGludG8gYSBkZWZhdWx0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3I6CgogICAgICAgICAgICAgICAlZXh0ZW5kIHBhaXIgewogICAgICAgICAgICAgICAgICAldGVtcGxhdGUocGFpcikgcGFpcjxfVDEsX1QyPjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbC4gIE90aGVyIHVzZXMgbWF5IGJlIGJyb2tlbi4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVleHRlbmQgKCVhZGRtZXRob2RzKSBkaXJlY3RpdmUgbm8gbG9uZ2VyIHdvcmtzIHVubGVzcwogICAgICAgICAgICBpdCBhcHBlYXJzIGluIHRoZSBwdWJsaWMgc2VjdGlvbiBvZiBhIGNsYXNzLiAgIEFuIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2UgaXMgbm93IGdlbmVyYXRlZCAoYXMgb3Bwb3NlZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdCkuCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAld2FybmZpbHRlcigpIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGF0dGFjaGVzIGEgd2FybmluZwogICAgICAgICAgICBmaWx0ZXIgdG8gc3BlY2lmaWMgZGVjbGFyYXRpb25zIGFuZCBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgZm9vOyAgIC8vIFN1cHByZXNzIG92ZXJsb2FkZWQgd2FybmluZwogICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsgCgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBPYmplY3Q6OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgICBjbGFzcyBPYmplY3QgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIG9ubHkgc3VwcHJlc3NlcyB3YXJuaW5ncyBpbiBsYXRlciBzdGFnZXMgb2YgY29kZQogICAgICAgICAgICBnZW5lcmF0aW9uLiAgSXQgZG9lcyBub3Qgc3VwcHJlc3Mgd2FybmluZ3MgcmVsYXRlZCB0byBwcmVwcm9jZXNzaW5nCiAgICAgICAgICAgIG9yIHBhcnNpbmcuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgc3VwcG9ydHMgQzk5IHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCxfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCAiLi4uIiBpcyB1c2VkIHRvIGluZGljYXRlIHZhcmlhYmxlIGFyZ3VtZW50cyB3aGljaAogICAgICAgICAgICBhcmUgYWxsIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWFsIGFyZ3VtZW50IG5hbWUgX19WQV9BUkdTX18gaW4KICAgICAgICAgICAgdGhlIG1hY3JvIGV4cGFuc2lvbi4gIAoKICAgICAgICAgICAgU1dJRyBhbHNvIGltcGxlbWVudHMgdGhlIEdOVSAoIyMpIGV4dGVuc2lvbiBmb3Igc3dhbGxvd2luZyB0aGUKICAgICAgICAgICAgcHJlY2VkaW5nIGNvbW1hIHdoZW4gX19WQV9BUkdTX18gaXMgZW1wdHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LCAjI19fVkFfQVJHU19fKQoKICAgICAgICAgICAgSGVyZSBpcyBob3cgdGhpcyBpcyBleHBhbmRlZDoKCiAgICAgICAgICAgICAgIGRlYnVnZigiJWQiLCAzKSAgLS0+IGZwcmludGYoc3RkZXJyLCIlZCIsMykKICAgICAgICAgICAgICAgZGVidWdmKCJIZWxsbyIpICAtLT4gZnByaW50ZihzdGRlcnIsIkhlbGxvIiApCgogICAgICAgICAgICAobm90aWNlIHRoZSBkZWxldGVkIGNvbW1hKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDgvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQogICAgICAgICAgICBNYW55IGNoYW5nZXMgdG8gcGhwIG1vZHVsZS4gIFNoYWRvdyBjbGFzc2VzIGFyZSBub3cgaW1wbGVtZW50ZWQKICAgICAgICAgICAgZW50aXJlbHkgaW4gbmF0aXZlIEMgYW5kIG5vIG5lZWQgZm9yIHBocC1jb2RlIHNoYWRvdyB3cmFwcGVycwogICAgICAgICAgICBQb3B1bGF0ZWQgdGVtcGxhdGUgY29uZmlnLm00IGFuZCBNYWtlZmlsZS5pbiBhcyBuZWVkZWQgYnkKICAgICAgICAgICAgcGhwaXplIGFyZSBnZW5lcmF0ZWQuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQSBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vdyB0dXJuZWQgaW50byBhICJjbG9uZSIKICAgICAgICAgICAgaW5zdGFuY2UgbWV0aG9kIChzZWUgRGF2ZSdzIGNoYW5nZSBmb3IgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgZGF0ZWQgNC83LzIwMDIpLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGFwcHJvcHJpYXRlIHRoaW5nCiAgICAgICAgICAgIHRvIGRvIGZvciBSdWJ5IGNvZGUuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1NTM4NjQgXSBJbmxpbmUgZGVzdHJ1Y3RvciBjb2RlIG5vdCB3cml0dGVuLgoKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICAlaWdub3JlIGJlaGF2ZXMgYmV0dGVyIHdpdGggY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICB0eXBlIHN5c3RlbSBpbiBnZW5lcmFsLiAgIEZvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLAogICAgICAgICAgICAlaWdub3JlIG5vdyBzdXBwcmVzc2VzIHRoZSBjcmVhdGlvbiBvZiBhIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgb3IgZGVzdHJ1Y3Rvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlaWdub3JlIH5Gb287CiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB+Rm9vKCkgc2ltcGx5ICJkaXNhcHBlYXJlZCIgYW5kIHRoZSBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgICBjcmVhdGVkIGEgd3JhcHBlciBmb3IgYSBkZWZhdWx0IGRlc3RydWN0b3IgKGFzIGlmIGl0IHdhcyBuZXZlcgogICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgaW50ZXJmYWNlKS4gIEluIFNXSUctMS4zLjEyLCAlaWdub3JlIHN1cHByZXNzZXMKICAgICAgICAgICAgdGhlIGNyZWF0aW9uIG9mIGEgZGVzdHJ1Y3RvciBpZiBvbmUgaXMgYWN0dWFsbHkgZGVmaW5lZC4gCgogICAgICAgICAgICBTaW1pbGFybHksIGV2ZW4gdGhvdWdoIGEgZGVjbGFyYXRpb24gaXMgaWdub3JlZCwgaW5mb3JtYXRpb24KICAgICAgICAgICAgbWF5IHN0aWxsIGJlIG5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMuIEZvciBleGFtcGxlLCBoZXJlCiAgICAgICAgICAgIGlzIGEgdmVyeSBzdWJ0bGUgZXJyb3IgdGhhdCBpcyBmaXhlZCBieSB0aGlzIGNoYW5nZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIHN0ZDo6c3RyaW5nOyAgICAgICAgIC8vIFByZXZlbnQgY2xhc3Mgd3JhcHBpbmcKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgY2xhc3Mgc3RyaW5nIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHN0cmluZyAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZvaWQgZm9vKHN0ZDo6c3RyaW5nICpzKTsgICAvLyBCcm9rZW4uCgogICAgICAgICAgICBCZWZvcmUgdGhpcyBmaXgsICVpZ25vcmUgd291bGQgY2F1c2UgdGhlIGNsYXNzIGRlZmluaXRpb24gdG8gZGlzYXBwZWFyLgogICAgICAgICAgICBUaGlzLCBpbiB0dXJuLCB3b3VsZCBjYXVzZSB0aGUgdHlwZW1hcCB0byBiZSBtaXNhcHBsaWVkLiAKIAowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMKICAgICAgICAgICAgZm9yIGJldHRlciBzdXBwb3J0IG9mIGRlc3RydWN0b3JzLiAgRGVzdHJ1Y3RvcnMgY2FuIG5vdyBiZSBwcmVjaXNlbHkKICAgICAgICAgICAgdGFnZ2VkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6fkZvbzsKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIH5CYXIgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAqRGV2ZWxvcGVyIHdhcm5pbmcqIAogICAgICAgICAgICBPcGVyYXRpb25zIHN1Y2ggYXMgcmVuYW1pbmcgYW5kIGZlYXR1cmUgYXR0YWNobWVudCBmb3IgY2xhc3NlcyB1c2VkIHRvCiAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gZGVzdHJ1Y3RvcnMgYXMgd2VsbC4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGRpZCB0aGlzOgogCiAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKCiAgICAgICAgICAgIFRoZSBvcGVyYXRpb24gYXBwbGllZCB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsIGFuZAogICAgICAgICAgICB0aGUgZGVzdHJ1Y3Rvci4gICBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gIE5vdyBzdWNoIG9wZXJhdGlvbnMKICAgICAgICAgICAgd2lsbCBvbmx5IGFwcGx5IHRvIHRoZSBjbGFzcyBhbmQgdGhlIGNvbnN0cnVjdG9yLiAgTm90ZTogaWYgeW91CiAgICAgICAgICAgIHdlcmUgcmVseWluZyBvbiB0aGlzIGZvciBjbGFzcyByZW5hbWluZywgYmUgYXdhcmUgdGhhdCByZW5hbWVkCiAgICAgICAgICAgIGNsYXNzZXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIGhhbmRsZWQgYXQgdGhlIGxldmVsIG9mIHRoZSBjbGFzcyBpdHNlbGYKICAgICAgICAgICAgYW5kIG5vdCB0aGUgbGV2ZWwgb2YgaW5kaXZpZHVhbCBkZWNsYXJhdGlvbnMgaW4gdGhlIGNsYXNzIChhbHRob3VnaAogICAgICAgICAgICB0aGV5IGNhbiBiZSByZW5hbWVkIGluZGl2aWR1YWxseSBpZiBuZWVkZWQpLiAgQXMgZmFyIGFzIEkga25vdywKICAgICAgICAgICAgdGhlIExhbmd1YWdlIGNsYXNzIGlzIGFscmVhZHkgdGFraW5nIGNhcmUgb2YgdGhpcyBjYXNlIGNvcnJlY3RseS4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IHNldCBvZiB0ZXN0cy4gIFRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2Vycm9ycyBkaXJlY3RvcnkgY29udGFpbnMKICAgICAgICAgICAgdGVzdHMgdGhhdCB0cnkgdG8gZXhlcmNpc2UgYWxsIG9mIFNXSUcncyBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcy4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3RhcnQgb2YgYSB3YXJuaW5nIGZyYW1ld29yay4gIFdhcm5pbmcgbWVzc2FnZXMgYXJlIG5vdyBhc3NpZ25lZCBudW1lcmljIHZhbHVlcwogICAgICAgICAgICB0aGF0IGFyZSBzaG93biBpbiB3YXJuaW5nIG1lc3NhZ2VzLiAgIFRoZXNlIGNhbiBiZSBzdXBwcmVzc2VkIHVzaW5nIHRoZQogICAgICAgICAgICAtdyBvcHRpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiBleGFtcGxlLmkKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyLDMwNSBleGFtcGxlLmkKCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSAjcHJhZ21hIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGlzOgoKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyLDMwNQoKICAgICAgICAgICAgTm90ZTogU2luY2UgU1dJRyBpcyBhIG11bHRpLXBhc3MgY29tcGlsZXIsIHRoaXMgcHJhZ21hIHNob3VsZAogICAgICAgICAgICBvbmx5IGJlIHVzZWQgdG8gY2hhbmdlIGdsb2JhbCBzZXR0aW5ncyBvZiB0aGUgd2FybmluZyBmaWx0ZXIuICBJdCBzaG91bGQKICAgICAgICAgICAgbm90IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgd2FybmluZ3MgaW4gYW4gaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAgIFRoZSBoYW5kbGluZyBvZiAjcHJhZ21hIG9jY3VycyBpbiB0aGUgQysrIHByZXByb2NvZXNzb3IgYW5kIGFmZmVjdHMgYWxsIAogICAgICAgICAgICBzdWJzZXF1ZW50IHN0YWdlcyBvZiBjb21waWxhdGlvbi4KCiAgICAgICAgICAgIFRoZSAtV2FsbCBvcHRpb24gdHVybnMgb24gYWxsIHdhcm5pbmdzIGFuZCBvdmVycmlkZXMgYW55IGZpbHRlcnMgdGhhdAogICAgICAgICAgICBtaWdodCBoYXZlIGJlZW4gc2V0LgoKICAgICAgICAgICAgV2FybmluZ3MgY2FuIGJlIGlzc3VlZCBmcm9tIGFuIGludGVyZmFjZSB1c2luZyAld2Fybi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAld2FybiAiMTEwOiVzZWN0aW9uIGlzIGRlcHJlY2F0ZWQiCgogICAgICAgICAgICBUaGUgZmlyc3QgcGFydCBvZiBhIHdhcm5pbmcgbWVzc2FnZSBpcyBhbiBvcHRpb25hbCB3YXJuaW5nIG51bWJlci4KICAgICAgICAgICAgQSBjb21wbGV0ZSBzZXQgb2Ygd2FybmluZyBudW1iZXJzIGlzIGZvdW5kIGluIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmguCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgcGFyc2luZyBjaGFuZ2UuICAgRGlyZWN0aXZlcyB0byBpbmNsdWRlIGZpbGVzIG5vdyB1c2UgYnJhY2tldHMgWyAuLi4gXQogICAgICAgICAgICBpbnN0ZWFkIG9mIHsgLi4uIH0uICAgCgogICAgICAgICAgICAgICAgICAlaW5jbHVkZWZpbGUgImZvby5pIiBbCiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBdCgogICAgICAgICAgICBUaGUgdXNlIG9mIHsgLi4uIH0gd2FzIGEgYmFkIGNob2ljZSBiZWNhdXNlIHRoZXkgd2VyZSBpbmNsdWRlZCBpbXBsaWNpdGx5IGJ5CiAgICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IgYW5kIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBwcm9wZXJseSBkZXRlY3QgbGVnaXRpbWF0ZSBtaXNzaW5nICd9JyAKICAgICAgICAgICAgZXJyb3JzLgoKMDQvMTYvMjAwMi0KMDUvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIEV1cm9wZWFuIFRvdXI6IFBhcmlzLUFtc3RlcmRhbS1CYXRoLgoKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGhhcyBiZWVuIHJlbmFtZWQgdG8gJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vdGl2YXRpb246IHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgZm9yIG1hbnkKICAgICAgICAgICAgb3RoZXIgdGFza3MgaW5jbHVkaW5nIGFkZGluZyBzeW50aGVzaXplZCBhdHRyaWJ1dGVzLCBjb25zdHJ1Y3RvcnMsCiAgICAgICAgICAgIGFuZCB0eXBlbWFwcy4gQmVjYXVzZSBvZiB0aGlzLCAiYWRkbWV0aG9kcyIgaXMgc29tZXdoYXQgbWlzbGVhZGluZy4KICAgICAgICAgICAgJWV4dGVuZCBtb3JlIHByZWNpc2VseSBkZXNjcmliZXMgdGhpcyBvcGVyYXRpb24tLS1leHRlbnNpb24gb2YgYQogICAgICAgICAgICBjbGFzcyBvciBzdHJ1Y3R1cmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWFkZG1ldGhvZHMgc3RpbGwgd29ya3MgdmlhIGEgbWFjcm8gZGVmaW5pdGlvbi4gICBIb3dldmVyLAogICAgICAgICAgICBhIHdhcm5pbmcgbWVzc2FnZSBtYXkgYmUgZ2VuZXJhdGVkLiAgIEVycm9ycyBpbnZvbHZpbmcgJWFkZG1ldGhvZHMKICAgICAgICAgICAgd2lsbCBhY3R1YWxseSByZWZlciB0byB0aGUgJWV4dGVuZCBkaXJlY3RpdmUuICAKICAgICAgICAgICAgCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIHRoZSB0eXBlIHN5c3RlbS4gIFR5cGVkZWYgbm93CiAgICAgICAgICAgIHByb3BhZ2F0ZXMgdGhyb3VnaCBmdW5jdGlvbnMsIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywKICAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICgqeCkoaW50KSwgSW50ZWdlciAoKnkpKEludGVnZXIpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzICd4JyBhbmQgJ3knIGhhdmUgZXhhY3RseQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlIChhbmQgd291bGQgb2J2aW91c2x5IGFjY2VwdCBvYmplY3RzCiAgICAgICAgICAgIG9mIGVpdGhlciB0eXBlKS4KCiAgICAgICAgICAgIFNpbWlsYXJseSwgY29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CiAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCAoRm9vOjoqeCkoaW50KSwgaW50IChCYXI6Oip5KShpbnQpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzIHggYW5kIHkgYXJlIHRoZSBzYW1lIAogICAgICAgICAgICB0eXBlICh2aWEgdHlwZWRlZikuCiAgICAgICAgICAgIAowNC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhbnkgcGFydCBvZgogICAgICAgICAgICBhbiBleHByZXNzaW9uIGludm9sdmVzIHZhbHVlcyBmcm9tIGEgcHJpdmF0ZSBwYXJ0IG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgWDsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IFgpOyAgIC8vIFdhcm5pbmcKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGVyZQogICAgICAgICAgICBhcmUgd29ya2Fyb3VuZHMsIGJ1dCB0aGV5IGFyZSByYXRoZXIgY2x1bXN5LiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgICB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIGJsYWgoaW50LGludCkgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmFyZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gMCk7CgoKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBVc2Ugb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlIGluc2lkZSBhIG5hbWVzcGFjZSBpcwogICAgICAgICAgICBmb3JiaWRkZW4gYW5kIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZS4gICBUaGlzIGlzCiAgICAgICAgICAgIG5vdCBhbGxvd2VkIHNpbmNlIHRoZSBpbmxpbmVkIGNvZGUgdGhhdCBpcyBlbWl0dGVkIGlzCiAgICAgICAgICAgIG5vdCBwbGFjZWQgaW5zaWRlIGEgbmFtZXNwYWNlLiAgVGhpcyBjb25mdXNlcyBvdGhlcgogICAgICAgICAgICBzdGFnZXMgb2YgcGFyc2luZy4KICAgICAgICAgICAgICAgICAgICAKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGJ1ZyBmaXhlcyB0byBjYXN0aW5nIG9wZXJhdGlvbnMgYW5kIGV4cHJlc3Npb24KICAgICAgICAgICAgcGFyc2luZy4gICBEdWUgdG8gc29tZSBwYXJzaW5nIGlzc3VlcywgaXQgaXMgbm90IAogICAgICAgICAgICBjdXJyZW50bHkgcG9zc2libGUgdG8gdXNlIGNhc3RzIGZvciBhbGwgcG9zc2libGUKICAgICAgICAgICAgZGF0YXR5cGVzLiAgIEhvd2V2ZXIsIHRoZSBjb21tb24gY2FzZXMgd29yay4KCjA0LzIwLzIwMDI6IGJlYXpsZXkgKEFtc3RlcmRhbSkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlcyBub3cgd29yay4gIFNpbXBseSB1c2UgdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3Mgb3IgJWFkZG1ldGhvZHMgdG8gY3JlYXRlCiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zIChzZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sKS4gIFN1cHBvcnRpbmcKICAgICAgICAgICAgdGhpcyB3YXMgZWFzeS0tLWVhcmxpZXIgY2hhbmdlcyB0byB0ZW1wbGF0ZXMgbWFkZSBpdAogICAgICAgICAgICBwb3NzaWJsZSB1c2luZyBvbmx5IGEgdHdvLWxpbmUgbW9kaWZpY2F0aW9uIHRvIHRoZSBwYXJzZXIKICAgICAgICAgICAgYW5kIGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgZWxzZXdoZXJlLiAgSG1tbSwgY29tZSB0byAKICAgICAgICAgICAgdGhpbmsgb2YgaXQsIHRoZSBzbW9rZSB3YXMgcmF0aGVyIHRoaWNrIGluIHRoYXQgSW50ZXJuZXQgImNhZmUiLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNC8xOS8yMDAyOiBiZWF6bGV5IChUR1YpCiAgICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgU2ltcGxlIG51bWJlcnMgYW5kIHN0cmluZ3MgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBhcyB3ZWxsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQxMDApIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIE5vdGU6IEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgYXJlIG5vdCBjdXJyZW50bHkgYWxsb3dlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIERlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzIG5vdyB3b3JrIGFuZCBkbyBub3QgaGF2ZSB0bwogICAgICAgICAgICBiZSBnaXZlbiB0byAldGVtcGxhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgIAowNC8xOC8yMDAyOiBiZWF6bGV5IChQYXJpcykKICAgICAgICAgICAgQ2hhbmdlIGluIGludGVybmFsIHRlbXBsYXRlIGhhbmRsaW5nLiAgVGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgbm93IGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0gYW5kIGFyZSBhd2FyZSBvZiB0eXBlZGVmcywgZXRjLiAgVGhpcyBidWlsZHMKICAgICAgICAgICAgdXBvbiB0aGUgY2hhbmdlIGJlbG93LiAgIAoKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBXQVJOSU5HICoqKgogICAgICAgICAgICBXb3JkIG9mIGNhdXRpb24gdG8gbGFuZ3VhZ2UgbW9kdWxlIHdyaXRlcnMuICBUaGUgIm5hbWUiCiAgICAgICAgICAgIHBhcmFtZXRlciBvZiBjZXJ0YWluIHBhcnNlIHRyZWUgbm9kZXMgKGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikKICAgICAgICAgICAgbWF5IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCB0eXBlcy4gICBUaGlzIHBhcmFtZXRlcml6YXRpb24gaXMKICAgICAgICAgICAgZG9uZSB1c2luZyBTV0lHIHR5cGUtc3RyaW5ncyBhbmQgbm90IHRoZSB1bmRlcmx5aW5nIEMgdmVyc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICBpbnQgbWF4PGludCAqPihpbnQgKixpbnQgKikgIAoKICAgICAgICAgICAgaGFzIGEgbmFtZSBvZiAibWF4PChwLmludCk+Ii4gIElmIHlvdSB1c2UgdGhlIG5hbWUgZGlyZWN0bHksCiAgICAgICAgICAgIHlvdSBtYXkgZ2V0IHN5bnRheCBlcnJvcnMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIHVzZSBTd2lnVHlwZV9uYW1lc3RyKG5hbWUpIHRvIGNvbnZlcnQgYSBwYXJhbWV0ZXJpemVkIG5hbWUgCiAgICAgICAgICAgIHRvIGEgQyBuYW1lIHdpdGggdmFsaWQgc3ludGF4LiAgVGhlIGludGVybmFsIHZlcnNpb24gaXMKICAgICAgICAgICAgdXNlZCB0byByZWR1Y2UgdGVtcGxhdGUgdHlwZXMgdG8gYSBjb21tb24gcmVwcmVzZW50YXRpb24gCiAgICAgICAgICAgIGFuZCB0byBoYW5kbGUgaXNzdWVzIG9mIHR5cGVkZWYuCiAgICAgICAgICAgIAowNC8xNi8yMDAyOiBiZWF6bGV5IChzb21ld2hlcmUgb3ZlciB0aGUgQXRsYW50aWMpCiAgICAgICAgICAgIEVuaGFuY2VtZW50IG9mIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFRoZSB0eXBlIHN5c3RlbSBpcyBub3cKICAgICAgICAgICAgYXdhcmUgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmb28odmVjdG9yPGludD4gKngsIHZlY3RvcjxJbnRlZ2VyPiAqeSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHZlY3RvcjxpbnQ+IGFuZCB2ZWN0b3I8SW50ZWdlcj4gYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUuICAgVGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMKICAgICAgICAgICAgbWVjaGFuaXNtIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgYSB0eXBlbWFwIGRlZmluZWQgZm9yIHZlY3RvcjxpbnQ+ICogd291bGQgYXBwbHkgdG8gZWl0aGVyIHR5cGUuCiAgICAgICAgICAgIEhvd2V2ZXIsIGEgdHlwZW1hcCBmb3IgdmVjdG9yPEludGVnZXI+ICogd291bGQgb25seSBhcHBseSB0bwogICAgICAgICAgICB0aGF0IHR5cGUuCgogICAgICAgICAgICBUeXBlZGVmcyBhbmQgdHlwZW1hcHMgYW5kIG1hdGNoZWQgYnkgbGVmdC1tb3N0IGV4cGFuc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZlY3RvcjxJbnRlZ2VyLEludGVnZXI+IC0tPiAKICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBJbnRlZ2VyPiAtLT4KICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBpbnQ+CgoKMDQvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDaGFuZ2VzIHRvIEphdmEgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICAgIE92ZXJjb21lcyBhIGJ1ZyB3aGVyZSB0aGUgbW9kdWxlIGFzc3VtZWQgdGhhdCBhIHBvaW50ZXIgdG8gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGNvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYSBwb2ludGVyIHRvIGEgYmFzZSBjbGFzcy4gVGhhbmtzIAogICAgICAgICAgICB0byBTdGVwaGVuIE1jQ2F1bCBmb3IgYW5hbHlzaW5nIHRoZSBidWcgYW5kIHN1Ym1pdHRpbmcgcGF0Y2hlcy4KCiAgICAgICAgICAgIEEgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGUgZ2V0Q1B0cigpIG1ldGhvZCBpbiBlYWNoIHNoYWRvdyBjbGFzcyBoYXMKICAgICAgICAgICAgZGlzYXBwZWFyZWQgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBnZXRDUHRyWFhYKCksIHdoZXJlIFhYWCBpcyB0aGUgCiAgICAgICAgICAgIHNoYWRvdyBjbGFzcyBuYW1lLiBJZiB5b3UgaGF2ZSBjb2RlIHRoYXQgcHJldmlvdXNseSB1c2VkIGdldENQdHIoKSwgCiAgICAgICAgICAgIGFuZCB0aGUgYXNzb2NpYXRlZCBjbGFzcyBpcyB3cmFwcGluZyBhIEMgc3RydWN0IG9yIGEgQysrIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgbm90IGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCBqdXN0IHVzZSB0aGUgbmV3IG1ldGhvZC4gSWYKICAgICAgICAgICAgaG93ZXZlciwgdGhlIGNsYXNzIGlzIGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCB5b3UnbGwgaGF2ZQogICAgICAgICAgICB0byBjaG9vc2Ugd2hpY2ggcG9pbnRlciB5b3UgcmVhbGx5IHdhbnQuIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IAogICAgICAgICAgICBoYXMgYmVlbiBicm9rZW4gYXMgbm90IHVzaW5nIHRoZSBjb3JyZWN0IHBvaW50ZXIgY2FuIGxlYWQgdG8gd2VpcmQgYnVncwogICAgICAgICAgICB0aHJvdWdoIGlsbC1kZWZpbmVkIGJlaGF2aW91ci4gSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRoZSBvbGQgbWV0aG9kcywgCiAgICAgICAgICAgIHlvdSBjb3VsZCBhZGQgdGhlbSBiYWNrIGludG8gYWxsIHNoYWRvdyBjbGFzc2VzIGJ5IGFkZGluZyB0aGlzIGF0IHRoZSAKICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHlvdXIgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIGFsbHNoYWRvd2NvZGU9JXsKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgUGxlYXNlIHNlZSBlbnRyeSBkYXRlZCAwNy8yMy8yMDAyIHRvIHNlZSBob3cgdG8gZG8gdGhpcyBhZnRlciB0aGUgZGVwcmVjYXRpb24KICAgICAgICAgICAgb2YgdGhlIGFsbHNoYWRvd2NvZGUgcHJhZ21hLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDQvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHJlZmVyZW5jZXMuICAgRGVjbGFyYXRpb25zIHN1Y2ggCiAgICAgICAgICAgIGFzIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNvbnN0IHN0cmluZyAmeCA9ICJIZWxsbyIpOwoKMDQvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCB0eXBlbWFwICQqIHN1YnN0aXR1dGlvbnMgZm9yIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMuCiAgICAgICAgICAgIFJlcXVlc3RlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgbm93IHN1cHBvcnRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgV2hlbiB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyB1c2VkLCBpdCB3aWxsIHVzZSBhIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGlmIG9uZSBpcyBkZWZpbmVkLiAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIGxpbWl0YXRpb25zLiBQYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICBBIHRlbXBsYXRlIG9mIHR5cGUgPHZvaWQgKj4gZG9lcwogICAgICAgICAgICBub3QgbWF0Y2ggYWxsIHBvaW50ZXJzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNoYW5nZSB0byB0ZW1wbGF0ZSB3cmFwcGluZyBpbnRlcm5hbHMuIFRlbXBsYXRlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHByb2Nlc3NlZCBhcyBtYWNyb3MgYnV0IG5vdyByZXN1bHQgaW4gcmVhbCBwYXJzZS10cmVlCiAgICAgICAgICAgIG5vZGVzLiAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgZXhwYW5kcyB0aGVzZSBub2RlcyBpbnRvIGEKICAgICAgICAgICAgc3BlY2lmaWMgaW5zdGFudGlhdGlvbi4gICBUaGlzIGNoYW5nZSBlbmFibGVzIGEgbnVtYmVyIG9mCiAgICAgICAgICAgIG5ldyBhbmQgaW50ZXJlc3RpbmcgY2FwYWJpbGl0aWVzOgoKICAgICAgICAgICAgRGlyZWN0aXZlcyBzdWNoIGFzICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgJWFkZG1ldGhvZHMgY2FuCiAgICAgICAgICAgIG5vdyBiZSBhcHBsaWVkIHRvIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcnNpemUpIHZlY3Rvcjo6YmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmKTsKICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYsIGludCBsZW4pOyAgIC8vIFJlbmFtZWQKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjdG9yKSB2ZWN0b3I8aW50PjsgICAvLyBSZW5hbWluZyBjYXJyaWVzIHRocm91Z2gKCiAgICAgICAgICAgIAogICAgICAgICAgICBCeSBwYXJzaW5nIHRlbXBsYXRlcyBpbnRvIGFuIGludGVybmFsIGRhdGEgc3RydWN0dXJlLCBpdCB3aWxsCiAgICAgICAgICAgIGJlIHBvc3NpYmxlIHRvIHN1cHBvcnQgc3BlY2lhbGl6YXRpb24gKGFuZCBtYXliZSBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBhbmQgYSB3b3JrIGluIHByb2dyZXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgd2VyZSBzaW1wbHkgcHJvY2Vzc2VkCiAgICAgICAgICAgIGFzIHdlaXJkIG1hY3Jvcy4gIE5vIG90aGVyIGluZm9ybWF0aW9uIHdhcyByZXRhaW5lZC4gICBUaGlzIAogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gc3VwcG9ydCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIGFuZCAKICAgICAgICAgICAgY29tcGxpY2F0ZWQgbWFueSBvdGhlciBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24uCgowNC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byB0ZW1wbGF0ZSBjbGFzcyB3cmFwcGluZy4gICBUaGVyZSB3ZXJlIGEgdmFyaWV0eSBvZgogICAgICAgICAgICAiaXNzdWVzIiB3aXRoIHRoZSBvbGQgYXBwcm9hY2ggcmVsYXRlZCB0byBwYXJzaW5nLCB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0sIGFuZCBuYW1lc3BhY2VzLiAgIFRoZXNlIGNoYW5nZXMgYXJlIG1lYW50IHRvIHJlY3RpZnkKICAgICAgICAgICAgc29tZSBvZiB0aGVzZSBwcm9ibGVtczoKCiAgICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBvZiBhIHRlbXBsYXRlIGNhbiBub3cgYmUgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5IGluY2x1ZGluZyB0aGUgY2xhc3MgaW5saW5lIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgIH52ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCgkgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBpcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgYnV0IHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMKICAgICAgICAgICAgbm90IHlldCBpbXBsZW1lbnRlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGV4cGFuZCByb3VnaGx5IGFzCiAgICAgICAgICAgIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgICAlcmVuYW1lKHZlY2ludD4gdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBzaW1wbHkgYnVpbGRzIHVwb24gdGhlIGNvZGUgYWJvdmUgKHRlbXBsYXRlcwogICAgICAgICAgICBpbmNsdWRlZCBpbmxpbmUpLgoKICAgICAgICAgICAgVGhpcyBtb2RpZmllZCBhcHByb2FjaCB0byB3cmFwcGluZyBmaXhlcyBzb21lIHN1YnRsZSB0eXBlCiAgICAgICAgICAgIGlzc3Vlcy4gIEZvciBpbnN0YW5jZSwgeW91IGNhbiBub3cgZGVmaW5lIHR5cGVtYXBzIGFuZCB0eXBlZGVmcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWN0b3I7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludHZlY3RvciAqdik7ICAgLy8gR2V0cyB0aGUgYWJvdmUgdHlwZW1hcAoKICAgICAgICAgICAgVGhpcyBkaWQgbm90IHdvcmsgaW4gU1dJRy0xLjMuMTEgZHVlIHRvIGEgcGVjdWxpYXJpdHkgb2YKICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgJXRlbXBsYXRlKG5hbWUpIG5vIGxvbmdlciBpbnN0YWxscyB0aGUgdGVtcGxhdGUgYXMgYSBjbGFzcwogICAgICAgICAgICB3aXRoIG5hbWUgIm5hbWUiLiAgIFRoaXMgbWlnaHQgYnJlYWsgJWFkZG1ldGhvZHMgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgIGluIHRoZSBtYW51YWwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjaW50IHsgICAgLy8gRmFpbHMuIHZlY2ludCBub3QgYSBjbGFzcwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAKICAgICAgICAgICAgVG8gZml4IHRoaXMsIGp1c3QgdXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogVGhpcyB0ZWNobmlxdWUgbWlnaHQgYmUgYSB3YXkgdG8gaW1wbGVtZW50IHNvbWUgYml6YXJyZQogICAgICAgICAgICB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0ZWNobmlxdWVzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXBwbGllZCBpZiB2ZWN0b3I8aW50PiBpbnN0YW50aWF0ZWQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICAKMDQvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4gIFNXSUcgc2hvdWxkCiAgICAgICAgICAgIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlOiB3YXMgaW1wbGVtZW50ZWQgcHJldmlvdXNseSwgYnV0IHRoZXJlIHdhcyBhIG1pbm9yIGJ1Zy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgogICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGFyZSBkZXByZWNhdGVkIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgSW5zdGVhZCBvZiBiZWluZyBwcmFnbWFzLCBtdXRhYmlsaXR5IGlzIG5vdwogICAgICAgICAgICBjb250cm9sbGVkIGFzIGEgImZlYXR1cmUiIHVzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICAgICVpbW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICBpbnQgeTsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgICVtdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB6OyAgICAgICAgICAgLy8gTW9kaWZpYWJsZQoKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgYXJlIG11Y2ggbW9yZSBwb3dlcmZ1bCB0aGFuIHRoZWlyIG9sZGVyCiAgICAgICAgICAgIGNvdW50ZXJwYXJ0cy4gIFRoZXkgY2FuIG5vdyBwaW5wb2ludCBhIHNwZWNpZmljIGRlY2xhcmF0aW9uIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIHg7ICAgICAgICAgLyogQW55IHggKi8KICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OyAgICAvKiB4IGluIGNsYXNzIEZvbyAqLwoKICAgICAgICAgICAgSW4gZmFjdCwgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSBpcyB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZSwgCiAgICAgICAgICAgICVpZ25vcmUsIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjbGFyYXRpb24KICAgICAgCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsKCiAgICAgICAgICAgIHdvdWxkIG5vdCBvbmx5IGFwcGx5IHRvIGNsYXNzIEZvbyBidXQgdG8gYWxsIGRlcml2ZWQgY2xhc3NlcwogICAgICAgICAgICBhcyB3ZWxsLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIG11c3QgYmUgdGVybWluYXRlZCBieSBhIHNlbWktY29sb24uICBUaGlzCiAgICAgICAgICAgIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgb2xkZXIgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgIFNpbmNlICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGNhbiBiZSBhcHBsaWVkIHRvIGRlY2xhcmF0aW9ucyB0aGUKICAgICAgICAgICAgc2VtaWNvbG9uIGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2xvYmFsIGZlYXR1cmUgYW5kIAogICAgICAgICAgICBvbmUgdGFyZ2V0ZWQgdG8gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBOb3RlOiB0aGlzIGluY29tcGF0aWJpbGl0eSBpcyB0aGUKICAgICAgICAgICAgcHJpbWFyeSByZWFzb24gZm9yIGNoYW5naW5nIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBoYW5kbGluZyBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gIElmIGEgY2xhc3MgZGVmaW5lcyAKICAgICAgICAgICAgY29uc3RydWN0b3JzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgICBGb28oY29uc3QgRm9vICYpOyAgICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSBmdW5jdGlvbiBjb3B5X0ZvbygpIGZvciB0aGUgY29weQogICAgICAgICAgICBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcmlvbnMsIHRoaXMgZ2VuZXJhdGVkIGEgbmFtZS1jbGFzaCBhbmQgYW4KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZS4gICBUbyBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgU1dJRwogICAgICAgICAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIGlmICVyZW5hbWUgaXMgdXNlZCB0byByZXNvbHZlCiAgICAgICAgICAgIHRoZSBuYW1lIGNvbmZsaWN0LiAgIEhvd2V2ZXIsIGlmIG5vIG5hbWUgcmVzb2x1dGlvbiBpcyBtYWRlLAogICAgICAgICAgICB0aGlzIG5ldyBhcHByb2FjaCBpcyB1c2VkLgoKICAgICAgICAgICAgQ29weSBjb25zdHJ1Y3RvcnMgbWF5IGJlIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhlCiAgICAgICAgICAgIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIHRoaXMgaXMgdXAgdG8gdGhlIGxhbmd1YWdlIG1vZHVsZQogICAgICAgICAgICBpdHNlbGYuCiAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIG5vdyBuYW1lc3BhY2UgYXdhcmUuICAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gbWF4KFQgYSwgVCBiKSB7IHJldHVybiBhID4gYiA/IGEgOiBiOyB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGZvbzsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAgIC8vIE9rCgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGJhciB7CiAgICAgICAgICAgICAgICAgICB1c2luZyBmb286Om1heDsKICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OyAgIC8vIE9rCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBDYXZlYXQ6IHRoZSB0ZW1wbGF0ZSBuYW1lIHN1cHBsaWVkIHRvICV0ZW1wbGF0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICAgIHNhbWUgc2NvcGUgaW4gd2hpY2ggdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXBwZWFycy4gICBUaGlzIGNvZGUgaXMKICAgICAgICAgICAgaWxsZWdhbDoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBmb286Om1heDxpbnQ+OwoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBwcmVwcm9jZXNzb3IuICAgVGhlIHByZXByb2Nlc3NvciBjYW4gbm93IHBlcmZvcm0KICAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24uICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIEEgImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2lmIEEgPT0gImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBpcyBpbiBTV0lHIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZGVmaW5lIEZPTyh4KSAKICAgICAgICAgICAgICAjaWYgI3ggPT0gImludCIKICAgICAgICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpbnQgKi8KICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICBOb3JtYWwgdXNlcnMgY2FuIHByb2JhYmx5IHNhZmVseSBpZ25vcmUgdGhpcyBmZWF0dXJlLiAgSG93ZXZlciwgaXQgbWF5CiAgICAgICAgICAgIGJlIHVzZWQgaW4gcGFydHMgb2YgdGhlIFNXSUcgbGlicmFyeS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB3cmFwcGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFNXSUcgaXMgbm93IG11Y2ggbW9yZSBhd2FyZSBvZiBwdXJlIHZpcnR1YWwgbWV0aG9kcy4gRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICBjbGFzcyBBIHsgICAgICAgICAgICAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSA9IDA7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgeyAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgY2xhc3MgQyA6IHB1YmxpYyBCIHsgIC8qIE9rICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIFNXSUcgd2lsbCBvbmx5IGdlbmVyYXRlIGRlZmF1bHQgY29uc3RydWN0b3JzIGZvciBDLgogICAgICAgICAgICBFdmVuIHRob3VnaCBCIGxvb2tzIGZpbmUsIGl0J3MgbWlzc2luZyBhIHJlcXVpcmVkIG1ldGhvZCBhbmQgaXMgYWJzdHJhY3QuCgowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc3RydWN0dXJlIGRhdGEgbWVtYmVyIGFjY2Vzcy4gIElmIHlvdQogICAgICAgICAgICBoYXZlIGEgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBCYXIgICBiOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGIgYXJlIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgKDEpIElmIGIgaXMgKm5vdCogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoMikgSWYgYiAqaXMqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyICpGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgKnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9ICp2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU2VlIHRoZSAiU3RydWN0dXJlIGRhdGEgbWVtYmVycyIgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUcuaHRtbAogICAgICAgICAgICBmb3IgZnVydGhlciBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWxpZWQgb24gYSBsb3Qgb2YgYSB1bmRlY2xhcmVkCiAgICAgICAgICAgIHN0cnVjdHVyZSBhbmQgY2xhc3MgbmFtZXMuICAgIFRvIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBzaW1wbHkKICAgICAgICAgICAgdXNlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBzdWNoIGFzICJzdHJ1Y3QgQmFyOyIKICAgICAgICAgICAgCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrIG5hbWVzcGFjZSBzdXBwb3J0IGFkZGVkLiAgU1dJRyBzdXBwb3J0cyBhbGwgYXNwZWN0cyBvZgogICAgICAgICAgICBuYW1lc3BhY2VzIGluY2x1ZGluZyBuYW1lc3BhY2UsIHVzaW5nLCBhbmQgbmFtZXNwYWNlIGFsaWFzCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgU1dJRyBpcyB0byBmbGF0dGVuCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIG5hbWVzcGFjZXMgYXJlCiAgICAgICAgICAgIGZ1bGx5IHN1cHBvcnRlZCBhdCB0aGUgQysrIGxldmVsIGFuZCBpbiB0aGUgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIGltcGxlbWVudGF0aW9uLgogICAgIAowNC8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN1biBoYXMgbW9kaWZpZWQgamF2YWMgaW4gamRrMS40IHRvIG5vIGxvbmdlciBjb21waWxlCiAgICAgICAgICAgIGFuIGltcG9ydCBvZiBhbiB1bm5hbWVkIG5hbWVzcGFjZS4gVG8gZml4IHRoaXMgU1dJRyBubyBsb25nZXIgCiAgICAgICAgICAgIGdlbmVyYXRlcyB0aGUgaW1wb3J0IGZvciBwYWNrYWdlbGVzcyBjbGFzc2VzLgogICAgICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM2MTU3NS5odG1sCiAgICAgICAgICAgIEFzIHJlcG9ydGVkIFNGICM1Mzg0MTUuCgowMy8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgcG9pbnRlci10by1tZW1iZXIsIHNpbWlsYXIgdG8gdGhhdAogICAgICAgICAgICBmb3IgdGhlIFB5dGhvbiBtb2R1bGUuIFJlbWFya2FibHkgc2ltaWxhci4gQWxzbyBhZGRlZCBhIG5ldwogICAgICAgICAgICBleGFtcGxlIGZvciB0aGlzIChFeGFtcGxlcy9ydWJ5L21wb2ludGVyKSwgd2hpY2ggaXMgcmVtYXJrYWJseQogICAgICAgICAgICBzaW1pbGFyIHRvIHRoZSBQeXRob24gZXhhbXBsZSBvZiB0aGUgc2FtZSBuYW1lLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmZXcgbWlub3IgZWRpdHMgdG8gdGhlICJBZHZhbmNlZCBUb3BpY3MiCiAgICAgICAgICAgIGNoYXB0ZXIgb2YgdGhlIFNXSUcgbWFudWFsIGFuZCBhZGRlZCBhIG5ldyBtYWpvciBzZWN0aW9uCiAgICAgICAgICAgIGFib3V0IGhvdyB0byBjcmVhdGUgbXVsdGktbW9kdWxlIFJ1YnkgcGFja2FnZXMgd2l0aCBTV0lHLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlbW92ZWQgYWxsIG9mIHRoZSBvbGQgUnVieSBwcmFnbWFzLiBJZiBhbnkgb2YgdGhpcwogICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIHRydWx5IG1pc3NlZCB3ZSBjYW4gcmVzdXJyZWN0IGl0LCBwcmVmZXJhYmx5CiAgICAgICAgICAgIHdpdGggc29tZSBraW5kIG9mIGZlYXR1cmUtYmFzZWQgZGlyZWN0aXZlLgogICAgICAgICAgICAKMDMvMjUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnkgc3VwcG9ydCBmb3IgUnVieSwgd2hpY2gKICAgICAgICAgICAgaGFzIGFwcGFyZW50bHkgYmVlbiBicm9rZW4gZm9yIHNvbWUgdGltZS4gTHVja2lseSwgbm8gb25lIHNlZW1zCiAgICAgICAgICAgIHRvIGhhdmUgbm90aWNlZC4KCjAzLzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrLW5hbWVzcGFjZSBzdXBwb3J0IGluIFNXSUcgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICVhZGRtZXRob2RzOiAKCiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgbm93IGFjY2VwdHMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgQysrIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEZvbzo6QmFyIGJlbG93CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgRm9vOjpCYXIgewogICAgICAgICAgICAgICAgICAgICBpbnQgc29tZW1ldGhvZCgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgQmFyIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBvdGhlcm1ldGhvZCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlLCAlZXhjZXB0aW9uLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgTmFtZXNwYWNlcyBhcmUgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0aGUgcmVuYW1pbmcgYW5kIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIG1hdGNoZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBGb286OnByaW50OyAgICAgICAgICAvLyBSZW5hbWUgaW4gbmFtZXNwYWNlIEZvbwogICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXI6OmJsYWg7ICAgICAgICAgICAgICAgLy8gSWdub3JlIGEgZGVjbGFyYXRpb24KCiAgICAgICAgICAgICVyZW5hbWUgZGlyZWN0aXZlcyBjYW4gYmUgcGxhY2VkIGluc2lkZSBuYW1lc3BhY2UgYmxvY2tzIGFzIHdlbGwuIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBwcmludDsgICAgICAgICAvLyBBcHBsaWVzIHRvIHByaW50IGJlbG93CgogICAgICAgICAgICAgICAgICAgdm9pZCBwcmludCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vc3Qgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIHNob3VsZCB3b3JrIHByb3Blcmx5IGluc2lkZSBuYW1lc3BhY2VzLgogICAgICAgICAgICBObyBvdGhlciBjaGFuZ2VzIGFyZSBuZWVkZWQuCiAgICAgIAowMy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byBpbnRlcm5hbCBzeW1ib2wgdGFibGUgaGFuZGxpbmcuICAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgbWFuYWdlcyBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgaW4gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgdGhhbiBub3JtYWwKICAgICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgQU5TSSBDLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QgaGF2ZSBhIHN0cnVjdHVyZQogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBmdW5jdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgRm9vKCkgeyAuLi4gfQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyBtb3JlIGxpa2UgQysrLiAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgU1dJRyBldmVyCiAgICAgICAgICAgIHJlYWxseSBzdXBwb3J0ZWQgdGhlIEFOU0kgQyBhbnl3YXlzLS0tdXNpbmcgdGhlIHNhbWUgbmFtZSB3b3VsZAogICAgICAgICAgICBhbG1vc3QgY2VydGFpbmx5IGdlbmVyYXRlIGEgbmFtZS1jbGFzaCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMDMvMjIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTE3MzAyIF0gZm9yIGhhbmRsaW5nIG9mIHJlbmFtZWQgb3ZlcmxvYWRlZAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMuIE5vdywgcmVuYW1lZCBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBhcmUgY29udmVydGVkCiAgICAgICAgICAgIGludG8gY2xhc3Mgc2luZ2xldG9uIG1ldGhvZHMgKGJhc2ljYWxseSBhY3RpbmcgYXMgImZhY3RvcnkiCiAgICAgICAgICAgIG1ldGhvZHMpLgoKMDMvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUzMjk1NyBdICVpZ25vcmUgcGFyc2UgZXJyb3IgYW5kIGNhc3Rpbmcgb3BlcmF0b3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDMvMTgvMjAwMjogYmVhemxleSAoKiogQURWQU5DRUQgVVNFUlMgT05MWSAqKikKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBjYXN0aW5nIGluIHJldHVybiB2YWx1ZXMuICBBIHNvbWV3aGF0CiAgICAgICAgICAgIGNvbW1vbiBwcm9ibGVtIGluIGNlcnRhaW4gQysrIHByb2dyYW1zIGlzIGZ1bmN0aW9ucyB0aGF0IGhpZGUKICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHVuZGVybHlpbmcgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIAogICAgICAgICAgICBmcm9tIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBhIHByb2dyYW0gbWlnaHQgaW5jbHVkZQogICAgICAgICAgICBzb21lIGdlbmVyaWMgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICBOb2RlICpnZXROb2RlKCk7CgogICAgICAgICAgICBIb3dldmVyLCBOb2RlICogbWF5IGp1c3QgYmUgYmFzZSBjbGFzcyB0byBhIHdob2xlIGhpZXJhcmNoeQogICAgICAgICAgICBvZiBkaWZmZXJlbnQgb2JqZWN0cy4gICBJbnN0ZWFkIG9mIHJldHVybmluZyB0aGlzIGdlbmVyaWMgTm9kZSAqLAogICAgICAgICAgICBpdCBtaWdodCBiZSBuaWNlIHRvIGF1dG9tYXRpY2FsbHkgZG93bmNhc3QgdGhlIG9iamVjdCBpbnRvIHRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlIHVzaW5nIHNvbWUga2luZCBkeW5hbWljIGNhc3QuCgogICAgICAgICAgICBBc3N1bWluZyB5b3UgdW5kZXJzdGFuZCB0aGUgcGVyaWwgaW52b2x2ZWQsIGEgZG93bmNhc3QgY2FuIG5vdwogICAgICAgICAgICBiZSBwZXJmb3JtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbiB0aGUgcnVuLXRpbWUgdHlwZQogICAgICAgICAgICBjaGVja2VyOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqU1dJR19UeXBlRHluYW1pY0Nhc3Qoc3dpZ190eXBlX2luZm8gKiwgdm9pZCAqKnB0cik7CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhbm90aGVyCiAgICAgICAgICAgIHR5cGUuICBJZiBzbywgYSBkaWZmZXJlbnQgdHlwZSBkZXNjcmlwdG9yIChmb3IgdGhlIGNvbnZlcnRlZCB0eXBlKQogICAgICAgICAgICBpcyByZXR1cm5lZC4gICBUaGlzIHR5cGUgZGVzY3JpcHRvciB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gY3JlYXRlCiAgICAgICAgICAgIGEgcG9pbnRlciBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKICAgICAgICAgICAgVG8gdXNlIHRoaXMsIHlvdSB3b3VsZCB3cml0ZSBhIHR5cGVtYXAgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiB7CiAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTV0lHX1R5cGVEeW5hbWljQ2FzdCgkMV9kZXNjcmlwdG9yLCAodm9pZCAqKikgJiQxKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBTV0lHX05ld1BvaW50ZXJPYmooJDEsIHR5KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LAoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiA9IFNXSUdUWVBFICpEWU5BTUlDOwoKICAgICAgICAgICAgVG8gbWFrZSB0aGUgdHlwZW1hcCBoYXZlIGFueSBlZmZlY3QsIHlvdSBoYXZlIHRvIHdyaXRlIGEgc3VwcG9ydGluZyAKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gcGVyZm9ybSBkb3duY2FzdGluZy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgc3RhdGljIHN3aWdfdHlwZV9pbmZvICoKICAgICAgICAgICAgICBOb2RlX2R5bmFtaWNfY2FzdCh2b2lkICoqcHRyKSB7CiAgICAgICAgICAgICAgICAgTm9kZSAqKm5wdHIgPSAoTm9kZSAqKikgcHRyOwogICAgICAgICAgICAgICAgIEVsZW1lbnQgKmUgPSBkeW5hbWljX2Nhc3Q8RWxlbWVudCAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9FbGVtZW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEYXRhICpkID0gZHluYW1pY19jYXN0PERhdGEgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRGF0YTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgdHlwZXMgYXJlIGRldGVybWluZWQuIGR5bmFtaWNfY2FzdDw+CiAgICAgICAgICAgIHVzZXMgQysrIFJUVEkuICBIb3dldmVyLCBpZiB5b3UgaGFkIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBkZXRlcm1pbmluZwogICAgICAgICAgICB0aGUgdHlwZSwgeW91IGNvdWxkIHVzZSB0aGF0IGhlcmUuICBOb3RlOiBpdCBpcyBpbXBvcnRhbnQgdG8gc2F2ZQogICAgICAgICAgICB0aGUgbmV3IHBvaW50ZXIgdmFsdWUgYmFjayBpbnRvIHRoZSBhcmd1bWVudCBhcyBzaG93bi4gIFdoZW4gZG93bmNhc3RpbmcsCiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBjb3VsZCBjaGFuZ2UuIAoKICAgICAgICAgICAgRmluYWxseSwgdG8gbWFrZSB0aGUgY2FzdGluZyBmdW5jdGlvbiBhdmFpbGFibGUsIHlvdSBoYXZlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgIGl0IHdpdGggdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlci4gUHV0IHRoaXMgbWFjcm8gaW4geW91ciBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgICAgIERZTkFNSUNfQ0FTVChTV0lHVFlQRV9wX05vZGUsIE5vZGVfZHluYW1pY19jYXN0KTsKCiAgICAgICAgICAgIE5vdGU6IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIAogICAgICAgICAgICBub3JtYWwgU1dJRyBvcGVyYXRpb24uICBUaGUgZmVhdHVyZSBpcyBvbmx5IGVuYWJsZWQgYnkgd3JpdGluZwogICAgICAgICAgICBhIG5ldyB0eXBlbWFwIHRoYXQgZXhwbGljaXRseSBjYWxscyBTV0lHX1R5cGVEeW5hbWljQ2FzdCgpIHRvCiAgICAgICAgICAgIG1ha2UgYSBjb252ZXJzaW9uLiAKICAKICAgICAgICAgICAgRXhhbXBsZXMvdGVzdC1zdWl0ZS9keW5hbWljX2Nhc3QuaSBjb250YWlucyBhIHNpbXBsZSBleGFtcGxlLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgSmF2YSBtb2R1bGUgZHVlIHRvIGRpZmZlcmVuY2VzCiAgICAgICAgICAgIGluIHRoZSB0eXBlLWNoZWNraW5nIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKMDMvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTbWFsbCBjaGFuZ2UgdG8gdHlwZS1uYW1lIGhhbmRsaW5nIG9mIHVubmFtZWQgc3RydWN0dXJlcyBhbmQKICAgICAgICAgICAgdHlwZWRlZi4gIElmIGEgc3RydWN0dXJlIG9mIHRoaXMgZm9ybSBhcHBlYXJzOgoKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFRoZW4gJ0ZvbycgaXMgdXNlZCBhcyB0aGUgcHJvcGVyIHR5cGVuYW1lIGZvciB0aGUgc3RydWN0dXJlLgogICAgICAgICAgICBGdXJ0aGVybW9yZSwgRm9vIGNhbiBub3cgYmUgdXNlZCBhcyBhIG5hbWUgaW4gQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgICBTV0lHIHdhcyBhbHJlYWR5IGtpbmQgb2YgZG9pbmcgdGhpcywgYnV0IHRoaXMgbW9kaWZpY2F0aW9uIHJlZmluZXMKICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIHRvIG1vcmUgY2xvc2VseSBmb2xsb3cgdGhlIEMrKyBBUk0sIHNlY3Rpb24KICAgICAgICAgICAgNy4xLjMsIHAuIDEwNi4gIFRoaXMgZml4ZXMgYSBjb3VwbGUgb2Ygb2JzY3VyZSBjb3JuZXIgY2FzZXMuCgowMy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIEMrKyBpbmhlcml0YW5jZSB3aXRoIGEgZmV3IGVuaGFuY2VtZW50cy4gIEZpcnN0LCB0eXBlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG5lZWRlZCBmb3IgY2FzdGluZyBhbmQgdHlwZS1lcXVpdmFsZW5jZSBpcyBnZW5lcmF0ZWQgZXZlbiB3aGVuIGJhc2UtY2xhc3NlcwogICAgICAgICAgICBhcmVuJ3QgZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciAgeyAgICAvKiBCYXIgdW5zcGVjaWZpZWQgKi8KICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdm9pZCBibGFoKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBibGFoKCkgZnVuY3Rpb24gc3RpbGwgYWNjZXB0cyBGb28gKiBldmVuIHRob3VnaCBub3RoaW5nCiAgICAgICAgICAgIGlzIHJlYWxseSBrbm93biBhYm91dCBCYXIuICAgUHJldmlvdXMgU1dJRyB2ZXJzaW9ucyB3b3VsZCBqdXN0IGdlbmVyYXRlCiAgICAgICAgICAgIGEgdHlwZSBlcnJvci4KCiAgICAgICAgICAgIEluaGVyaXRhbmNlIGhhcyBhbHNvIGJlZW4gbW9kaWZpZWQgdG8gd29yayB0aHJvdWdoIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEJhciBPdGhlckJhcjsKICAgICAgICAgICAgICAgY2xhc3MgRm9vOiBwdWJsaWMgT3RoZXJCYXIgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBiYXNlIGNsYXNzIG9mIE90aGVyQmFyIGlzIGNvcnJlY3RseSByZXNvbHZlZCBiYWNrIHRvCiAgICAgICAgICAgIEJhci4gICBUaGUgdXNlIG9mIHRoZSBuYW1lIE90aGVyQmFyIGlzIGxvc3QgaW4gdGhpcyByZXNvbHV0aW9uICh0aGUgd3JhcHBlcnMKICAgICAgICAgICAgd2lsbCBzaW1wbHkgdXNlIEJhciBpbnN0ZWFkIG9mIHRoZSB0eXBlZGVmIG5hbWUgT3RoZXJCYXIpLgogICAgICAgICAgIAowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICV0eXBlbWFwLCAlYXBwbHksIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgY2FuIG5vdyBhcHBlYXIgaW5zaWRlCiAgICAgICAgICAgIGNsYXNzIGRlZmluaXRpb25zLiAgIAoKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgcmVsYXRlZCB0byBjb21waWxpbmcgU1dJRyBvbiA2NC1iaXQKICAgICAgICAgICAgcGxhdGZvcm1zLgoKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggImlnbm9yZSIgYW5kICJpbiIgdHlwZW1hcHMuICBMb2NhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoICJpbiIgd2VyZSBiZWluZyBhZGRlZCB0byB0aGUgd3JhcHBlciBmdW5jdGlvbiBldmVuCiAgICAgICAgICAgIHRob3VnaCB0aGV5IHdlcmUgbmV2ZXIgdXNlZC4gICBNb3N0bHkgaGFybWxlc3MsIGJ1dCBpdCB3b3VsZCBsZWFkCiAgICAgICAgICAgIHRvIGEgdmFyaWV0eSBvZiBjb21waWxhdGlvbiB3YXJuaW5ncy4KICAKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gdGhlIGludGVybmFsIHR5cGUgc3lzdGVtIGFuZCBoYW5kbGluZyBvZiBuZXN0ZWQgQysrCiAgICAgICAgICAgIHR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc29tZW1ldGhvZChCbGFoIHgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd291bGQgaW1wbGljaXRseSBiZSBzZXQgdG8gQmFyOjpCbGFoLgogICAgICAgICAgICBBbHRob3VnaCB0aGlzIGlzIHRlY2huaWNhbGx5IGFsbG93ZWQsIGl0IGJyZWFrcyB0eXBlbWFwcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vOjpCbGFoIHsgLi4uIH0KCiAgICAgICAgICAgIGRvZXNuJ3QgbWF0Y2ggbGlrZSB5b3UgZXhwZWN0LiAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBpbiBTV0lHLTEuMy4xMi4KICAgICAgICAgICAgTm93LCB0eXBlcyBhcmUgZXhwYW5kZWQgdXNpbmcgdGhlIGNsYXNzIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkLgogICAgICAgICAgICBTbywgdGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdpbGwgYmUgRm9vOjpCbGFoLS0tc2luY2UgdGhlCiAgICAgICAgICAgIHR5cGUgQmxhaCB3YXMgZGVmaW5lZCBpbiBGb28uCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHN1YnRsZSB0eXBlIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0eXBlZGVmIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIEJsYWg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oQmxhaCB4LCA6OkJsYWggeSk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gaGFuZGxlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCiAgICAgICAgICAgIEZpcnN0LCB0aGVyZSBpcyBubyBwb3J0YWJsZSBvciByZWxpYWJsZSB3YXkgdG8gd3JhcAogICAgICAgICAgICBhIHZhcmFyZ3MgZnVuY3Rpb24gaW4gZnVsbCBnZW5lcmFsaXR5LiAgSG93ZXZlciwgeW91ICpjYW4qIGNoYW5nZQogICAgICAgICAgICB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIHVzaW5nICV2YXJhcmdzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqKSBmcHJpbnRmOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgLi4uKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHZhcmlhYmxlIGxlbmd0aCBwYXJhbWV0ZXIgIi4uLiIgaXMKICAgICAgICAgICAgc2ltcGx5IHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXJzIGdpdmVuIGluICV2YXJhcmdzLiBUaGlzCiAgICAgICAgICAgIHJlc3VsdHMgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCBjaGFyICpzKTsKCiAgICAgICAgICAgIE1vcmUgdGhhbiBvbmUgYXJndW1lbnQgY2FuIGJlIHVzZWQgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgICAgIGNhbiBiZSBkZWZpbmVkLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBzcGVjaWZpZXMgYQogICAgICAgICAgICBtYXhpbXVtIG9mIGZvdXIgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqeDEgPSAwLCBjaGFyICp4MiA9IDAsIGNoYXIgKngzID0gMCwgY2hhciAqeDQgPSAwKSBmcHJpbnRmOwogCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gaGFuZGxpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4gIHZhcmFyZ3MKICAgICAgICAgICAgaXMgbm93IGhhbmRsZWQgYXMgYSBwcm9wZXIgcGFyYW1ldGVyIGFuZCBpcyBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdG9yLiAgSG93ZXZlciwgaXQgc3RpbGwgY2FuJ3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkKICAgICAgICAgICAgKGFuZCB3aWxsIGdlbmVyYXRlIGEgdHlwZW1hcCB3YXJuaW5nKS4gICBUaGlzIGNoYW5nZSBoYXMgYmVlbgogICAgICAgICAgICBtYWRlIHRvIGJldHRlciBpbmNvcnBvcmF0ZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzIHdpdGggb3RoZXIKICAgICAgICAgICAgZGlyZWN0aXZlcyBzdWNoIGFzICVpZ25vcmUsICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguCgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTIyNTU1IF0gU3ludGF4IGVycm9yIHBhcnNpbmcgImRlZmluZSIgY29uc3RydWN0LiBTV0lHCiAgICAgICAgICAgIGlzIGEgbGl0dGxlIG1vcmUgcmVzdHJpY3RpdmUgaW4gZGV0ZXJtaW5pbmcgI2RlZmluZSBzdGF0ZW1lbnRzCiAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGFzIGNvbnN0YW50cy4gIEFsc28gYWRkZWQgYSBiZXR0ZXIgcGFyc2VyCiAgICAgICAgICAgIGVycm9yIHJ1bGUgZm9yIGhhbmRsaW5nIGJhZCBjb25zdGFudHMuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IENsYXNzZXMgcmVuYW1lZCB3aXRoICVyZW5hbWUgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIAogICAgICAgICAgICBhbm90aGVyIGNsYXNzIGdlbmVyYXRlIG1vcmUgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIGNvZGUuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFNGIFsgIzUyMzYzMiBdIGFuZCBbICM1MTMzMzUgXSBib3RoIHJlcG9ydGVkIGJ5IElzcmFlbCAKICAgICAgICAgICAgVGFubmVyLiBTdXBwb3J0IGZvciB0eXBlcyB0aGF0IGFyZSB1c2VkIHdoaWNoIGFyZSBpbiBhIHR5cGVkZWYuIFRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgbmFtZSBpcyBnZW5lcmF0ZWQuIEFsc28gZ2VuZXJhdGVkIGNvcnJlY3QKICAgICAgICAgICAgc2hhZG93IGNsYXNzbmFtZSB3aGVuIGEgdGVtcGxhdGVkIGNsYXNzIGlzIHVzZWQgd2l0aGluIGFub3RoZXIgCiAgICAgICAgICAgIHRlbXBsYXRlZCBjbGFzcy4gU2VlIHRoZSBjcHBfdHlwZWRlZi5pIHRlc3RjYXNlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyB0eXBlIHdhcyBnZW5lcmF0ZWQgaW4gc2hhZG93IGNsYXNzZXMgZm9yIHR5cGVzIAogICAgICAgICAgICB0aGF0IHdlcmVuJ3Qgd3JhcHBlZCBieSBTV0lHLiAgVGhlIHR5cGUgaXMgdHJlYXRlZCBhcyBhIHJhdyAKICAgICAgICAgICAgcG9pbnRlciwgaWUgbm8gc2hhZG93IGNsYXNzLgoKMDIvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gdXNlZCBieSAlcmVuYW1lLCAlaWdub3JlLCBhbmQKICAgICAgICAgICAgJWZlYXR1cmUuICAgSWYgYSB0eXBlIHNpZ25hdHVyZSBpcyBzdXBwbGllZCwgaXQgbXVzdCBleGFjdGx5CiAgICAgICAgICAgIG1hdGNoIHRoYXQgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24tLS1pbmNsdWRpbmcgYW55IHVzZSBvZgogICAgICAgICAgICBjb25zdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vMSkgICBmb28oaW50KTsKICAgICAgICAgICAgICAgICVyZW5hbWUoYmFyMSkgICBiYXIoaW50KSBjb25zdDsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7ICAgICAgIC8vIE1hdGNoZWQgLS0+IGZvbzEKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCkgY29uc3Q7IC8vIE5vdCBtYXRjaGVkIAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsgICAgICAgLy8gTm90IG1hdGNoZWQKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCkgY29uc3Q7IC8vIE1hdGNoZWQgLS0+IGJhcjEKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIG5vbi1jb25zdCBzcGVjaWZpY2F0aW9uIHdvdWxkIG1hdGNoCiAgICAgICAgICAgIGJvdGggdGhlIG5vbi1jb25zdCBhbmQgY29uc3QgZGVjbGFyYXRpb25zLiAgSG93ZXZlciwgdGhlIHdob2xlCiAgICAgICAgICAgIHBvaW50IG9mICVyZW5hbWUgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBpcyB0aGF0IHRoZXkgYmUgYWJsZQogICAgICAgICAgICB0byBwcmVjaXNlbHkgcGlucG9pbnQgZXhhY3QgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgdGhlIHByb2JsZW0uCgowMi8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBoYW5kbGluZyBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9ycy4KICAgICAgICAgICAgU1dJRyBub3cgbWFrZXMgYSBwcmVsaW1pbmFyeSBwYXNzIG92ZXIgdGhlIHBhcnNlIHRyZWUgdG8gZGlzY292ZXIKICAgICAgICAgICAgd2hpY2ggY2xhc3NlcyBzdXBwb3J0IGRlZmF1bHQgYWxsb2NhdGlvbi4gICBUaGlzIGZpeGVzIGEgbnVtYmVyCiAgICAgICAgICAgIG9mIHZlcnkgc3VidGxlIGlzc3VlcyBpbiBjb2RlIGdlbmVyYXRpb24gYW5kIGNhbGwvcmV0dXJuIGJ5IHZhbHVlLgoKMDIvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgb24gQ3lnd2luOiBQZXJsLCBQeXRob24sIFRjbCwgUnVieSBhbmQgSmF2YSBzaG91bGQKICAgICAgICAgICAgd29yayBvdXQgb2YgdGhlIGJveCwgYmFycmluZyB0aGUgcnVudGltZSBsaWJyYXJ5LiBSZW1vdmVkIGRsbHdyYXAgCiAgICAgICAgICAgIGFuZCByZXBsYWNlZCB3aXRoIG5ld2x5IHdvcmtpbmcgZ2NjIC1zaGFyZWQgaW5zdGVhZCBmb3IgQ3lnd2luLiAKICAgICAgICAgICAgQWxsIHRoaXMgd2lsbCByZXF1aXJlIHRoZSBuZXcgaW1wcm92ZWQgYmludXRpbHMgMjAwMTA4MDIgYW5kIGxhdGVyLAogICAgICAgICAgICBidXQgdGhlIGxhdGVzdCBDeWd3aW4gaXMgdXN1YWxseSB0aGUgYmVzdCByZWNvbW1lbmRhdGlvbi4KCjAyLzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYW5kIFBlcmwgc2hhZG93IGNsYXNzZXMuIFJlcG9ydGVkIGJ5IENoaWEtbGlhbmcgS2FvLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmaXggdG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQysrIGNsYXNzCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBzbyB0aGF0IHdlIGdldCBib3RoIGEgIm5ldyIgc2luZ2xldG9uIG1ldGhvZAogICAgICAgICAgICBhbmQgYW4gImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IgZWFjaCBjbGFzcy4gVGhpcwogICAgICAgICAgICBjaGFuZ2UgZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGRlcml2ZSBuZXcgUnVieSBjbGFzc2VzIGZyb20KICAgICAgICAgICAgU1dJRy13cmFwcGVkIEMrKyBjbGFzc2VzIGFuZCB0aGVuIG92ZXJyaWRlIHRoZWlyIGluaXRpYWxpemUKICAgICAgICAgICAgbWV0aG9kcyB0byBwcm92aWRlIHN1YmNsYXNzLXNwZWNpZmljIGluc3RhbmNlIGluaXRpYWxpemF0aW9uLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hc3NpdmUgZG9jdW1lbnRhdGlvbiB1cGRhdGUgZm9yIHRoZSBSdWJ5IG1vZHVsZSwKICAgICAgICAgICAgY29udHJpYnV0ZWQgYnkgQ3JhaWcgRmlsZXMuCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogQW4gZXJyb3IgaW4gdGhlIFNXSUcgcnVudGltZSBzdXBwb3J0IGZvciBSdWJ5CiAgICAgICAgICAgIHdhcyBjYXVzaW5nIHNldmVyYWwgb2YgdGhlIGV4YW1wbGVzIHRvIGZhaWwuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEVudW1lcmF0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzIChzdWNoCiAgICAgICAgICAgIGFzIHRob3NlIHNlZW4gaW4gdGhlIEV4YW1wbGVzL3J1YnkvZW51bSBleGFtcGxlKSB3ZXJlIG5vdAogICAgICAgICAgICBiZWluZyBleHBvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzLiBSZXBvcnRlZCBieSBXaWxsaWFtCiAgICAgICAgICAgIEZ1bHRvbi4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHdlIHJ1biBhY3Jvc3Mgb3ZlcmxvYWRlZAogICAgICAgICAgICBjbGFzcyBjb25zdHJ1Y3RvcnMgZm9yIEMrKyBjb2RlLCB0aGF0IHRoaXMgaXMgY3VycmVudGx5IG5vdAogICAgICAgICAgICBzdXBwb3J0ZWQgKGV2ZW4gaWYgdGhlIG92ZXJsb2FkcyBoYXZlIGJlZW4gJXJlbmFtZWQpLiBGb3IgYW4KICAgICAgICAgICAgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGRvZXNuJ3Qgd29yaywgc2VlIEV4YW1wbGVzL3J1Ynkvb3BlcmF0b3IuCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYW4gImlnbm9yZWQiIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHRoZSBwYXJzZXIgcnVucwogICAgICAgICAgICBhY3Jvc3MgYW4gb3BlcmF0b3IhPSgpIGRlY2xhcmF0aW9uIGZvciBDKysgY29kZS4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgImltcG9ydCIsICJpbXBvcnRfdGVtcGxhdGUiLCAib3BlcmF0b3IiIGFuZAogICAgICAgICAgICAidGVtcGxhdGUiIGV4YW1wbGVzLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG11bHRpLW1vZHVsZSBzdXBwb3J0LgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSBtaXNzaW5nICIjZGVmaW5lIFNXSUdfTk9JTkNMVURFIiBhdCB0aGUgdG9wIG9mCiAgICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2hlbiB0aGUgJy1jJyBvcHRpb24gaXMgdXNlZC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIENvcnJlY3RlZCBhIG1pbm9yIG9mZi1ieS1vbmUgZXJyb3IgZm9yIHRoZSBzaXplIG9mIHRoZQogICAgICAgICAgICBzd2lnX3R5cGVzW10gYXJyYXkgdGhhdCdzIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlciBjb2RlLgoKMDIvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBTRiBbICM1MTUwNTggXSBXcm9uZyBjb2RlIGZvciBDKysgdGVtcGxhdGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKVmVyc2lvbiAxLjMuMTEgKEphbnVhcnkgMzEsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gcGFzcy9yZXR1cm4gYnkgdmFsdWUgZm9yIEMrKyBvYmplY3RzIHRoYXQgZGVmaW5lCiAgICAgICAgICAgIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuICBDaGFuZ2VzIHRvIHRoZSB0eXBlbWFwIHN5c3RlbQogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gd3JhcCBDKysgb2JqZWN0cyB3aXRoIG5vIGRlZmF1bHQKICAgICAgICAgICAgY29uc3RydWN0b3IuICAgVGhpcyBoYXMgYmVlbiBmaXhlZCwgYnV0IHRoZSBzb2x1dGlvbiAKICAgICAgICAgICAgaW52b2x2ZXMgc29tZSBjbGV2ZXIgdGVtcGxhdGUgbWFnaWMgY29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLiAgUGxlYXNlIHNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGZpbGUKICAgICAgICAgICAgTGliL3N3aWcuc3dnIGZvciBmdXJ0aGVyIGRldGFpbHMuICBUaGlzIHNvbHV0aW9uIGlzCiAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJlZmluZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgR2xvYmFsIHZhcmlhYmxlcyBhbmQgbWVtYmVyIGRhdGEgb2YgdHlwZSAiY29uc3QgY2hhciAqIgogICAgICAgICAgICBjYW4gYmUgc2V0LCBidXQgdGhlIG9sZCB2YWx1ZSBpcyBzaWxlbnRseSBkaXNjYXJkZWQgd2l0aG91dAogICAgICAgICAgICBhbnkgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgIFRoaXMgbWF5IGdlbmVyYXRlIGEgbWVtb3J5IGxlYWsuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIG5lZWRlZCB0byBtb3JlIHNhZmVseSBoYW5kbGUgdmFyaWFibGVzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb28gPSAiSGVsbG8gV29ybGRcbiI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0J3Mgbm90IHNhZmUgdG8gZnJlZSB0aGUgb2xkIHZhbHVlLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBjYW4gZHluYW1pY2FsbHkgYWxsb2NhdGUgYSBuZXcgdmFsdWUgYW5kIG1ha2UgZm9vIHBvaW50CiAgICAgICAgICAgIHRvIGl0LiAgIFRvIGZpeCB0aGlzIG1lbW9yeSBsZWFrLCB5b3UgY2FuIHByb2JhYmx5IGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2xlYXIgY29uc3QgY2hhciAqZm9vOwogICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqIHtjb25zdCBjaGFyICpmb299OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBtaW5vciB0eXBlbWFwIGVuaGFuY2VtZW50cyBoYXZlIGJlZW4gYWRkZWQuICBGaXJzdCwKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlIGJ5IGluY2x1ZGluZyBhIHNwZWNpYWwKICAgICAgICAgICAgd2FybmluZyBhdHRyaWJ1dGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGluLHdhcm5pbmc9IkknbSBnb2luZyB0byBkbyBzb21ldGhpbmcgZGFuZ2Vyb3VzIikgLi4uCgogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlIHdpbGwgc2hvdyB1cCB3aGVuZXZlciB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhcHBsaWVkLgoKICAgICAgICAgICAgU2Vjb25kLCBhIHR5cGVtYXAgY2FuIGZvcmNlIGEgbm8tbWF0Y2ggYnkgZGVmaW5pbmcKCiAgICAgICAgICAgICAldHlwZW1hcChpbikgc29tZXR5cGUgInBhc3MiOwoKICAgICAgICAgICAgSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHlwZW1hcCBzeXN0ZW0gd2lsbCAqbm90KiByZWNvcmQgYQogICAgICAgICAgICB0eXBlbWFwIG1hdGNoIGZvciAic29tZXR5cGUiLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICAgICAgICAgICAgc2VsZWN0ZWQgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBkaXNhYmxlCiAgICAgICAgICAgIGEgdHlwZW1hcCBmZWF0dXJlIGZvciBzb21lIHR5cGUsIHlvdSBjb3VsZCBkbyB0aGlzLgoKICAgICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgb2YgdHlwZSAnY29uc3QgY2hhciAqJyB0byBiZSBzZXQuCiAgICAgICAgICAgICAgICV0eXBlbWFwKHZhcmluKSBjb25zdCBjaGFyICogInBhc3MiOwoKICAgICAgICAgICAgSXQgbWlnaHQgYWxzbyBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyB0byBkbyBzdWJ0bGUgYW5kCiAgICAgICAgICAgIHN0cmFuZ2UgdGhpbmdzIHdpdGggdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgICBtYWtlICdibGFoIConIGFuIG91dHB1dCB2YWx1ZSBhbmQgJ2NvbnN0IGJsYWggKicgYW4gaW5wdXQKICAgICAgICAgICAgcGFyYW1ldGVyLCB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGJsYWggKihibGFoIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEJsb2NrIHVucXVhbGlmaWVkIHR5cGVtYXBzIGRlZmluZWQgYWJvdmUgKi8KICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAgICAgY29uc3QgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGlucHV0IHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgIChUaGlzIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMgb2YgdHlwZW1hcHMgc3VnZ2VzdGVkIGJ5IEdyZWcgU3RlaW4pLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8yOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gZW51bWVyYXRpb25zIHdlcmUgd3JhcHBlZCB3aGVuIHRoZSAtc2hhZG93IAogICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZC4gUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KCjAxLzI4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBHbG9iYWwgYXJyYXlzIGFyZSBzdWNjZXNzZnVsbHkgd3JhcHBlZC4gSW4gZmFjdCB0aGV5IHN0YXJ0ZWQKICAgICAgICAgICBtb3N0bHkgd29ya2luZyBpbiBTV0lHLTEuMy4xMC4KCjAxLzI4LzIwMDI6cmljaGFyZHAKCSAgIEFkZGVkIGZpcnN0IGF0dGVtcHQgYXQgQysrIGFuZCAtc2hhZG93IHN1cHBvcnQgZm9yIFBIUDQgbW9kdWxlLAoJICAgcGxlYXNlIHRlc3QgYW5kIG1haWwgbWUgaWYgYW55IHByb2JsZW1zL2lkZWFzIG9uIGltcHJvdmluZyBpdC4KCgkgICBUaGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCB1bmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMsCgkgICBwbGVhc2Ugc2VlIEV4YW1wbGVzL3BocDQvc3luYy9SRUFETUUgZm9yIGRldGFpbHMuCgoJICAgQWxzbyBtb3JlIFBIUCBkb2N1bWVudGF0aW9uIGFkZGVkIHRvIERvYy9NYW51YWwvUGhwLmh0bWwKCjAxLzI3LzIwMDI6YmVhemxleQogICAgICAgICAgIFRoZSBBTlNJIEMgc2l6ZV90IHR5cGUgaXMgbm93IHJlY29nbml6ZWQgYXMgYW4gaW50ZWdlciBieSBkZWZhdWx0LgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgc3VwcG9ydCBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgVGhpcyBpcyBub3QgYSBwb3J0YWJsZSBmZWF0dXJlIGFuZCB3aWxsIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydAogICAgICAgICAgIGZvciB0aGUgbG9uZyBsb25nIHR5cGUuICBJbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgICBsb25nIGxvbmcgKGUuZy4sIFRjbCBhbmQgUGVybCksIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZwogICAgICAgICAgIG9mIGRpZ2l0cy4gIFRoaXMgcHJldmVudHMgdGhlaXIgdXNlIGluIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBidXQKICAgICAgICAgICBzdGlsbCBhbGxvd3MgdmFsdWVzIHRvIGJlIHNldCBmcm9tIGEgc3RyaW5nLiAgCgogICAgICAgICAgIGxvbmcgbG9uZyBzdXBwb3J0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHN0cnRvbGwoKSBhbmQgc3RydG91bGwoKQogICAgICAgICAgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSAnbGxkJyBhbmQgJ2xsdScgZm9ybWF0IHNwZWNpZmllcnMKICAgICAgICAgICBvZiBzcHJpbnRmKCkuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM1MDE4MjcgXSBEZWxldGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQuICAgVGhlIFRjbAogICAgICAgICAgIG1vZHVsZSB3YXNuJ3QgY29ycmVjdGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMgd2hlbiB0aGV5CiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHVzaW5nICVhZGRtZXRob2RzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBSZWluaGFyZCBGb2JiZS4KCjAxLzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuICBUeXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBoYW5kbGluZyB0aGVzZSB0eXBlcy4KICAgICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHBhcnNlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhY2NlcHQgbG9uZyBsb25nCiAgICAgICAgICAgbGl0ZXJhbHMgc3VjaCBhcyAxMjM0TEwgYW5kIDEyMzRVTEwuCgowMS8yNy8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQSBDIGNoYXJbXSBpcyBtYXBwZWQgdG8gYSBKYXZhIFN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCAKICAgICAgICAgICBTV0lHIGhhbmRsaW5nIG9mIGNoYXJbXSBhbmQgY2hhciouIEl0IHVzZWQgdG8gYmUgbWFwcGVkIHRvIGJ5dGVbXS4gCiAgICAgICAgICAgTm90ZSB0aGF0IGEgQyBzaWduZWQgY2hhcltdIGFycmF5IGlzIG1hcHBlZCB0byBieXRlW10uCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDEvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHJldHVybi1ieS12YWx1ZSwgQysrLCBhbmQKICAgICAgICAgICBvYmplY3RzIHRoYXQgZGVmaW5lIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9lbCBSZWVkLgoKMDEvMjUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE92ZXJoYXVsIG9mIHRoZSBKYXZhIG1vZHVsZS4gVGhlIEMgY29kZSBnZW5lcmF0aW9uIGlzIG5vdyAKICAgICAgICAgICBkb25lIGZyb20gdHlwZW1hcHMuCgowMS8yNC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gU3VwcG9ydCBmb3IgYXJyYXlzIG9mIGVudW0gcG9pbnRlcnMKCjAxLzIwLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBFcnJvciBjaGVja2luZyBmb3IgbnVsbCBKYXZhIG9iamVjdHMgYmVpbmcgcGFzc2VkIHRvIG5hdGl2ZSAKICAgICAgICAgICBmdW5jdGlvbnMuICBFeGNlcHRpb24gdGhyb3duIG5vdyB3aGVyZWFzIGJlZm9yZSB0aGUgSlZNIGNyYXNoZWQuCgowMS8xOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ29ycmVjdGVkIGJlaGF2aW91ciBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhcnJheXMuIEZvciAKICAgICAgICAgICBleGFtcGxlLCB3aGVuIHRoaXMgYyBmdW5jdGlvbjogCgogICAgICAgICAgIHZvaWQgYXJyYXlmbihpbnQgYXJyYXlbXSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaXMgd3JhcHBlZCB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgZnVuY3Rpb24KCiAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWZuKGludFtdIGFycmF5KTsKCiAgICAgICAgICAgaXMgcHJvZHVjZWQuIFByZXZpb3VzbHkgaWYgdGhlIEMgZnVuY3Rpb24gbWFkZSBhbnkgY2hhbmdlcyB0byB0aGUgCiAgICAgICAgICAgYXJyYXkgZWxlbWVudHMsIHRoZXNlIHdlcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gdGhlIEphdmEgYXJyYXkuIAogICAgICAgICAgIFRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBwcm9wb2dhdGVkIGJhY2sKICAgICAgICAgICB0byBKYXZhIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aWxsIHNlZSB0aGVzZSBjaGFuZ2VzLiBUaGlzIGlzIAogICAgICAgICAgIGhvdyBwdXJlIEphdmEgZnVuY3Rpb25zIHdvcmssIGllIGFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KCjAxLzE1LzIwMDI6bWtvZXBwZQogICAgICAgICAgIFtHdWlsZV0gTmV3IGZpbGUgY3BsdXNwbHVzLmkgd2l0aCBDKysgdHlwZW1hcHMgY29udHJpYnV0ZWQKICAgICAgICAgICBieSBNYXJjaW8gTHVpcyBUZWl4ZWlyYSA8bWFyY2lvdEBob2xseS5jb2xvc3RhdGUuZWR1Pi4KCjAxLzExLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDaGFuZ2VkIG1hcHBpbmcgb2YgQyBsb25nIHRvIEphdmEgdHlwZS4gV2FzIG1hcHBlZCB0byBKYXZhCiAgICAgICAgICAgbG9uZywgbm93IG1hcHBlZCB0byBKYXZhIGludC4gSWYgeW91IHdhbnQgdGhlIHByZXZpb3VzIG1hcHBpbmcgdG8gCiAgICAgICAgICAgSmF2YSBsb25nIHVzZSB0aGlzIGFwcHJvYWNoIGluIHlvdXIgaW50ZXJmYWNlIGZpbGU6CiAgICAgICAgICAgCiAgICAgICAgICAgICAlY2xlYXIgbG9uZzsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZyAgICAgICAgICAgICAiamxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZyAgICAgICAgICAgImxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmcgICAgICAgICAgImxvbmciCgogICAgICAgICAgICAgJWNsZWFyIGxvbmdbQU5ZXTsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZ1tBTlldICAgICAgICAiamxvbmdBcnJheSIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nW0FOWV0gICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nW0FOWV0gICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChpbikgbG9uZ1tBTlldICAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBsb25nW0FOWV0gICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgbG9uZ1tBTlldICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBsb25nW0FOWV0gICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgVGhpcyBuZXcgbWFwcGluZyBpcyBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gaW50ZXJmYWNpbmcgdG8gMzIgYml0IAogICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudCAzMi1iaXQgSlZNcy4gRm9yIGZ1dHVyZSAKICAgICAgICAgICA2NC1iaXQgSlZNcyB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZXNlIG1hcHBpbmdzIC0gZWcgb24gVW5peCBMUDY0IAogICAgICAgICAgIHN5c3RlbXMsIGJ1dCBub3Qgb24gTWljcm9zb2Z0IDY0Yml0IFdpbmRvd3Mgd2hpY2ggd2lsbCBiZSB1c2luZyBhIAogICAgICAgICAgIFA2NCBJTDMyIG1vZGVsLiBUaGlzIG1heSBiZSBhdXRvbWF0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTV0lHLgoKMDEvMTAvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyA1MDE2NzcgXSAlaW5pdCBibG9jayBpbiB3cm9uZyBwbGFjZS4gUmVwb3J0ZWQKICAgICAgICAgICBieSBMdWlnaSBCYWxsYWJpby4KCjAxLzA5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHN1cHBvcnQgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gc2lnbmVkIGxvbmcgbG9uZyBpcyAKICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGxvbmcuIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBtYXBwZWQgdG8gQmlnSW50ZWdlci4KCjAxLzA5LzIwMDI6YmVhemxleQogICAgICAgICAgIEV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gcGFyc2VyIHRvIGJldHRlciBzdXBwb3J0IG1peGluZyBvZgogICAgICAgICAgIGludCwgbG9uZywgc2hvcnQsIHVuc2lnbmVkLCBmbG9hdCwgYW5kIGRvdWJsZS4gICBUaGUgcGFyc2VyCiAgICAgICAgICAgc2hvdWxkIG5vdyBzdXBwb3J0IHR5cGVzIGxpa2UgdGhpczoKICAgIAogICAgICAgICAgICAgICAgc2hvcnQgdW5zaWduZWQgaW50CiAgICAgICAgICAgICAgICBpbnQgICB1bnNpZ25lZCBzaG9ydAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hvcnQKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5hYmxlcyBhIHR5cGUgb2YgJ2xvbmcgZG91YmxlJyAocHJldmlvdXNseQogICAgICAgICAgICB1bnN1cHBvcnRlZCkgdG8gYmUgdXNlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENhc3RpbmcgZml4IGZvciB3aGVuIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcG9pbnRlciBhcyAKICAgICAgICAgICByZXBvcnRlZCBieSBHYXJ5IFBlbm5pbmd0b24gMjAwMi0wMS0wNS4gVGhlIHVwcGVyIDMyYml0cyBvZiB0aGUgCiAgICAgICAgICAgNjQgYml0IGpsb25nIHdpbGwgaGF2ZSBjb250YWluZWQganVuayBmb3IgMzJiaXQgcG9pbnRlcnMuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBpcyBwb3NzaWJsZSBhcyB0aGUgCiAgICAgICAgICAgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkZGVkIGludG8gdHlwZW1hcHMuaS4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSAkbnVsbCBjYW4gYmUgdXNlZCBpbiBpbnB1dCB0eXBlbWFwcyB0byByZXR1cm4gZWFybHkgZnJvbSBKTkkgCiAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBlaXRoZXIgdm9pZCBvciBhIG5vbi12b2lkIHJldHVybiB0eXBlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrKSBpbnQgKiAleyAKICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgJX0KCiAgICAgICAgICAgSWYgdGhlIHR5cGVtYXAgZ2V0cyBwdXQgaW50byBhIGZ1bmN0aW9uIHdpdGggdm9pZCBhcyByZXR1cm4sICRudWxsIAogICAgICAgICAgIHdpbGwgZXhwYW5kIHRvIG5vdGhpbmc6CgogICAgICAgICAgICAgdm9pZCBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgogICAgICAgICAgIG90aGVyd2lzZSAkbnVsbCBleHBhbmRzIHRvIHplcm8sIHdoZXJlIGphdmFyZXR1cm50eXBlIGlzIGVpdGhlciBhIAogICAgICAgICAgIHBvaW50ZXIgb3IgYSBwcmltaXRpdmUgdHlwZToKCiAgICAgICAgICAgICBqYXZhcmV0dXJudHlwZSBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKMDEvMDIvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFRoZSBKYXZhIG1vZHVsZSBpbmNvcnJlY3RseSB1c2VkIGFyZ291dCB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgc3RyaW5ncy4gVGhpcyBpcyBub3cgY29ycmVjdGVkIGFuZCB0aGUgY29kZSBub3cgcmVzaWRlcwogICAgICAgICAgIGluIHRoZSBmcmVlYXJnIHR5cGVtYXAuIFRoZSBhcmdvdXQgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIHNwbGl0IGludG8gCiAgICAgICAgICAgYXJnb3V0IGFuZCBmcmVlYXJnIHR5cGVtYXBzLiBUaGlzIGNvcnJlY3Rpb24gbWF5IHJlcXVpcmUgc29tZSB1c2VyIAogICAgICAgICAgIHdyaXR0ZW4gdHlwZW1hcHMgdG8gYmUgbW9kaWZpZWQuIAogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE11bHRpIHR5cGVtYXBzIG5vdyB3b3JraW5nIGZvciBKYXZhIHNlZSBtdWx0aW1hcCBleGFtcGxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIC0gZnJlZWFyZyB0eXBlbWFwIGNvZGUgd2FzIGFwcGVhcmluZwogICAgICAgICAgIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4KCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBKQ0FMTCBtYWNybyBmb3IgSk5JIGNhbGxzIHRoYXQgd29yayBpbiBib3RoIEMgYW5kIEMrKyB0eXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIEpDQUxMMCwgSkNBTEwxLCBKQ0FMTDIsIEpDQUxMMyBhbmQgSkNBTEw0IAogICAgICAgICAgIG1hY3Jvcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJlc29sdmVkIHNvbWUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggJXJlbmFtZSBhbmQgY2xhc3MgcmVuYW1pbmcuCiAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgIEJhcjsKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlbiB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgYXBwbGllcyB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsCiAgICAgICAgICAgYW5kIHRoZSBkZXN0cnVjdG9yIChhbGwgd2lsbCBiZSByZW5hbWVkIHRvIEZvbykuCgogICAgICAgICAgIElmIGEgY2xhc3MgZGVmaW5lcyBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yLCB0aGUgb3ZlcmxvYWRlZCB2YXJpYW50cwogICAgICAgICAgIGNhbiBzdGlsbCBiZSByZW5hbWVkIGJ5IHNwZWNpZnlpbmcgcGFyYW1ldGVycyB0byAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlcmVuYW1lKEJhcl9jb3B5KSBCYXIoQmFyICYpOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgICBCYXIoQmFyICYpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgb2RkIGNvcm5lciBjYXNlcy4gIElmIHlvdSBzcGVjaWZ5CgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgOjpCYXI7CgogICAgICAgICAgIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgY2hhbmdlZCBhbmQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKICAgICAgICAgICBuYW1lcyBhcmUgbGVmdCB1bm1vZGlmaWVkLiAgSWYgeW91IHNwZWNpZnkgCgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgKjo6QmFyOwoKICAgICAgICAgICB0aGVuIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGJ1dAogICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QuCgoxMi8yMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gam5pLCBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzIG5vIGxvbmdlciBoYXJkY29kZWQgYnV0IHJlYWwgCiAgICAgICAgICAgdHlwZW1hcHMuIE5ldyB2YXJpYWJsZSBzdWJzdGl0dXRpb24sICRqYXZhY2xhc3NuYW1lLCBjYW4gYmUgdXNlZCBpbgogICAgICAgICAgIHRoZSBqc3R5cGUgdHlwZW1hcHMuIEl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIEphdmEgc2hhZG93IGNsYXNzIG5hbWUKICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIHRvIGRvIHdpdGggaW5oZXJpdGFuY2Ugd2hlbiAKICAgICAgICAgICB1c2luZyAlaW1wb3J0LgogICAgICAgICAgIFtKYXZhXSBBIGZldyBtb3JlIGJ1ZyBmaXhlcywgdG9kbyB3aXRoICVyZW5hbWUgYW5kIHVzaW5nIHRoZSBraW5kCiAgICAgICAgICAgd2l0aCB0aGUgdHlwZSwgZWcgCiAgICAgICAgICAgdm9pZCBmbih1bmlvbiB1bmkgbXl1bmksIHN0cnVjdCBzdHIgbXlzdHIsIGNsYXNzIGNsIG15Y2wpOwoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDk0NTI0IF0gUHJlcHJvY2Vzc29yIGJ1ZyAtIGFwb3N0cm9waGUgYW5kICNzdWJzdC4KCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIFNXSUdfVkVSU0lPTiBwcmVwcm9jZXNzb3Igc3ltYm9sLiAgIFRoaXMgaXMgYSBoZXhhZGVjaW1hbAogICAgICAgICAgIGludGVnZXIgc3VjaCBhcyAweDAxMDMxMSAoY29ycmVzcG9uZGluZyB0byBTV0lHLTEuMy4xMSkuICBUaGlzIGNhbgogICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGludGVyZmFjZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgI2lmIFNXSUdfVkVSU0lPTiA+PSAweDAxMDMxMQogICAgICAgICAgICAgICAvKiBVc2Ugc29tZSBmYW5jeSBuZXcgZmVhdHVyZSAqLwogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgTm90ZTogVGhlIHZlcnNpb24gc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgU1dJRwogICAgICAgICAgIHdyYXBwZXIgZmlsZS4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTIvMjAvMjAwMTpta29lcHBlCgkgICBbTXpTY2hlbWVdOiBSZW5hbWVkIG16c3dpZ19tYWtlX2Jvb2xlYW4gdG8KCSAgIHN3aWdfbWFrZV9ib29sZWFuLCBhcyB0aGUgbGF0dGVyIGlzIHVzZWQgaW4gdGhlIHR5cGVtYXBzLgoJICAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoxMi8xNy8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IFJld3JvdGUgbGlzdC12ZWN0b3IuaSB1c2luZyBtdWx0aS1kaXNwYXRjaAoJICAgdHlwZW1hcHMuICBVcGRhdGVkIHBvaW50ZXItaW4tb3V0LmkuICBNYWtlIHRoZQoJICAgZGVwcmVjYXRlZCB0eXBlbWFwLXN1YnN0aXR1dGlvbiBvZiAiJHNvdXJjZSIgaW4gImFyZ291dCIKCSAgIHdvcmsgYXMgYmVmb3JlLgoKMTIvMTYvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCBtYWNyb3MgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICVtdWx0aXBsZV92YWx1ZXMgdG8gdXNlIHRoZSBwcm9wZXIgJXByYWdtYSBzeW50YXguICBOZXcKCSAgIEd1aWxlIGV4YW1wbGUvdGVzdCAibXVsdGl2YWx1ZSI7IG5ldyBHdWlsZSBydW4tdGVzdCBmb3IKCSAgIHRlc3Qtc3VpdGUgaXRlbSAibGlzdC12ZWN0b3IiIChjdXJyZW50bHkgYnJva2VuKS4KCjEyLzE0LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgdHlwZW1hcC1zdWJzdGl0aW9uIGJ1ZyBmb3IgInZhcmluIi4gIFJlbGF4ZWQKCSAgIHZhbGlkLWlkZW50aWZpZXIgY2hlY2sgdG8gYWxsb3cgYWxsIFI1UlMgaWRlbnRpZmllcnMuCgoKVmVyc2lvbiAxLjMuMTAgKERlY2VtYmVyIDEwLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCAldHlwZW1hcCBzbyB0aGF0ICV7IC4uLiAlfSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEKICAgICAgICAgICBjb2RlIGJsb2NrIChtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcykuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICV7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhpcyBmb3JtIGRvZXMgbm90IGludHJvZHVjZSBhIG5ldyBibG9jayBzY29wZS4gIEFsc28sIHRoZQogICAgICAgICAgIGNvZGUgZW5jbG9zZWQgaW4gJXsgLi4uICV9IGlzIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ1OTYxNCBdIFNXSUcgd2l0aCBtdWx0aXBsZSBUQ0wgaW50ZXJwcmV0ZXJzLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDE3MTQxIF0gcnVieWRlYy5zd2cgaXMgd3JvbmcKICAgICAgICAgICBSZXBvcnRlZCBieSBQYXVsIEJyYW5uYW4uCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTA1NTcgXSBQcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgb24gTlQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFnbnVzIExqdW5nLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDQ1MjMzIF0gRW5oYW5jZW1lbnQ6IGhhbmRsZSBhY2Nlc3MgY2hhbmdlLgogICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyAoYnV0IGlnbm9yZXMpIEMrKyBhY2Nlc3MgY2hhbmdlcyBmb3IgdGhlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKCkgeyB9CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBBKCkge30KICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgY2xhc3MgQiA6IHByaXZhdGUgQSB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICBBOjpzb21ldGhpbmc7ICAgIDwtLS0tIFBhcnNlZCwgYnV0IGlnbm9yZWQKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjEyLzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIEZpeCBmb3IgUnVieSB0byB3b3JrIHVzaW5nIFZpc3VhbCBDKysuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NjU2ODcgXSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJzIGZhaWwuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDg5NTk0IF0gUHlTdHJpbmdfRnJvbVN0cmluZyBjYW4ndCB0YWtlIE5VTEwgYXJnLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvaG4gTWVycml0dC4gICBTV0lHIG5vdyBjb252ZXJ0cyBzdHJpbmcgdmFsdWVzCiAgICAgICAgICAgdG8gUHl0aG9uIHVzaW5nIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICByZXN1bHRvYmogPSByZXN1bHQgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ2MzU2MSBdIFR5cGUgY29udmVyc2lvbnMgbm90IGdlbmVyYXRlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgkKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcwMjE3IF0gVGNsIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzIwODggXSBkZWZpbmVkKE1BQ1JPKSBleHBhbmRlZCBldmVyeXdoZXJlLgogICAgICAgICAgIEVtYmVkZGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgJSNpZiBkZWZpbmVkKEZPTykKCiAgICAgICAgICAgYXJlIG5vdCBleHBhbmRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc2NDY3IF0gUHJvYmxlbXMgd2l0aCAjZGVmaW5lICYgY29tbWFzLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc3NTQ3IF0gd3JvbmcgZGVjbGFyYXRpb24gb2YgcG9pbnRlciBmdW5jdGlvbnMuCiAgICAgICAgICAgQmFkIHByb3RvdHlwZXMgaW4gTGliL3RjbC9wdHJsYW5nLmkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODMxODIgXSBDb25zdGFudHMgY2FuIHRha2UgYXJncyBieSBtaXN0YWtlLiAKICAgICAgICAgICBXaGVuIHN3aWcgLXBlcmw1IC1jb25zdCBpcyB1c2VkLCBjb25zdGFudHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICAgd2l0aCBhIHZvaWQgcHJvdG90eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3ViIElDT05TVCAoKSB7ICRleGFtcGxlYzo6SUNPTlNUIH0KCiAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IFJpY2ggV2FsZXMuCgoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBOZXcgJWV4Y2VwdGlvbiBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byByZXBsYWNlICVleGNlcHQuCiAgICAgICAgICAgSXQgd29ya3MgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCBhIAogICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgY2F0Y2goU29tZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAlZXhjZXB0aW9uIGlzIGFsc28gbmFtZSBhd2FyZS0tLWFsbG93aW5nIGl0IHRvIGJlIGFwcGxpZWQgdG8KICAgICAgICAgICBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgYW55IGZ1bmN0aW9uL21ldGhvZCBmb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhciBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhcihkb3VibGUpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhcihkb3VibGUpIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBuYW1lIG1hdGNoaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJzdGFudGlhbCBjbGVhbnVwIG9mIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUuICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIHVzZWQgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIHJhdGhlciBjb21wbGljYXRlZCBtYW5uZXIgaW52b2x2aW5nIGFib3V0CiAgICAgICAgICAgYSBoYWxmLWRvemVuIHN0cmluZ3MgY3JlYXRlZCBpbiBiaXRzIGFuZCBwaWVjZXMuICAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZCBpbiBhIG1vcmUgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci0taW4gdGhlIHNhbWUKICAgICAgICAgICBvcmRlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgc2hhZG93IGZpbGUgbWF5IGRpZmZlci4KICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVpbnNlcnQgZGlyZWN0aXZlICgleyAuLi4gJX0sICVydW50aW1lLCAlaGVhZGVyLCAld3JhcHBlciwgZXRjLikKICAgICAgICAgICBjYW4gbm93IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBUaGlzIGhhcyBwb3RlbnRpYWwKICAgICAgICAgICB1c2VzIHdoZW4gZ2VuZXJhdGluZyBzaGFkb3cgY2xhc3MgY29kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlaW5zZXJ0KCJzaGFkb3ciKSAlewogICAgICAgICAgICAgICAgICMgU29tZSBweXRob24gY29kZQogICAgICAgICAgICAgICAgIGRlZiBibGFoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkknbSBibGFoISIKICAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgY2xhc3MgY29kZSBpbnNlcnRpb24gZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2UgbW9kdWxlLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBpbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGV4dGVuZGluZwogICAgICAgICAgIHNoYWRvdyBjbGFzcyBjb2RlLiAgIEluIHRoZSBQeXRob24gbW9kdWxlLCB0aGlzIGluc2VydHMgY29kZSB3aXRoIHRoZQogICAgICAgICAgIHByb3BlciBsZXZlbCBvZiBpbmRlbmRhdGlvbiAocmVnYXJkbGVzcyBvZiB3aGF0IHdhcyB1c2VkIGluIHRoZSBTV0lHCiAgICAgICAgICAgaW50ZXJmYWNlKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBKYXZhIGFuZCBQeXRob24gbW9kdWxlcyB0byB3b3JrIG9uIGN5Z3dpbi4KICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIHRoZSBweXRob24gbW9kdWxlIGhhcyBzdGFydGVkIHRvIHByb2R1Y2VzIGNvZGUgCiAgICAgICAgICAgd2hpY2ggY2Fubm90IGJlIGF1dG8taW1wb3J0ZWQgdXNpbmcgY3lnd2luIGxpYnRvb2xzIHNvIG1vc3Qgb2YgaXQgaXMgCiAgICAgICAgICAgc3RpbGwgYnJva2VuLgoKMTEvMjgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVyZW5hbWUgYW5kICVmZWF0dXJlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlICVyZW5hbWUgZGlyZWN0aXZlIG9ubHkgYXBwbGllcwogICAgICAgICAgIHRvIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGFwcGVhcnMgYXMgd2VsbCBhcyBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMuICBJbiBmYWN0LCB0aGlzIGlzIHJlYWxseSBqdXN0IHRoZSBzYW1lCiAgICAgICAgICAgYXMgc2F5aW5nOgoKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIEZvbzo6Zm9vKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBGb286OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgdGhlIGV4cGVyaW1lbnRhbCAlZmVhdHVyZSBkaXJlY3RpdmUuICAlZmVhdHVyZSBjYW4gYmUKICAgICAgICAgICB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gcGFyc2UgdHJlZSBub2Rlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBibGFoIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXI7ICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNldCIpICo6Onhfc2V0ICJ4IjsKCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImJsYWgiKSBGb286OmJhcihpbnQsZG91YmxlKSBjb25zdCAic3BhbSI7CgogICAgICAgICAgIFRoZSBzeW50YXggaXMgYm9ycm93ZWQgZnJvbSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuICBJbiBmYWN0LCB0aGUKICAgICAgICAgICBleGFjdCBzYW1lIHNlbWFudGljcyBhcHBseSAoaW5oZXJpdGFuY2UsIG1hdGNoaW5nLCBldGMuKS4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgYSB2ZXJ5IHBvd2VyZnVsIGxvdy1sZXZlbCBwcmltaXRpdmUgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgIGN1c3RvbWl6ZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgYW5kIHRvIHByb3ZpZGUgaGludHMgdG8gCiAgICAgICAgICAgYW55IHN0YWdlIG9mIGNvZGUgZ2VuZXJhdGlvbi4gICBGZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8KICAgICAgICAgICBwYXJzZSB0cmVlIG5vZGVzIGFzIGF0dHJpYnV0ZXMgd2l0aCBuYW1lcyBsaWtlICJmZWF0dXJlOioiIHdoZXJlICogCiAgICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGZlYXR1cmUgbmFtZSAoZS5nLiwgImZlYXR1cmU6ZXhjZXB0IiwgImZlYXR1cmU6c2V0IiwgCiAgICAgICAgICAgZXRjLikuICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGhlbiBsb29rIGZvciB0aGUgZmVhdHVyZXMgdXNpbmcgCiAgICAgICAgICAgYSBzaW1wbGUgYXR0cmlidXRlIGxvb2t1cC4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgYSBudW1iZXIgb2YKICAgICAgICAgICBvbGRlciBTV0lHIGRpcmVjdGl2ZXMgaW5jbHVkaW5nICVleGNlcHQgYW5kIHNwZWNpYWxpemVkCiAgICAgICAgICAgcHJhZ21hcy4gSXQgaXMgbW9yZSBwb3dlcmZ1bCAoZHVlIHRvIGl0cyBwYXJhbWV0ZXJpemVkCiAgICAgICAgICAgbmFtZSBtYXRjaGluZykgYW5kIGl0IHByb3ZpZGVzIHZlcnkgcHJlY2lzZSBjb250cm9sIG92ZXIKICAgICAgICAgICBob3cgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8gaW5kaXZpZHVhbAogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICBUaGVyZSBhcmUgZnV0dXJlIGV4cGFuc2lvbiBwbGFucyB0aGF0IHdpbGwKICAgICAgICAgICBidWlsZCB1cG9uIHRoaXMgY2FwYWJpbGl0eSBhcyB3ZWxsLgoKICAgICAgICAgICBJdCdzIG5vdCBjZXJ0YWluIHRoYXQgJWZlYXR1cmUgd2lsbCBldmVyIGJlIHVzZWQgZGlyZWN0bHkKICAgICAgICAgICBieSBTV0lHIHVzZXJzLiAgSW5zdGVhZCwgaXQgbWF5IGJlIGEgbG93LWxldmVsIHByaW1pdGl2ZQogICAgICAgICAgIHRoYXQgaXMgdXNlZCBpbiBoaWdoLWxldmVsIG1hY3JvIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgIHRvIHN1cHBvcnQgcHJvcGVydGllcywgeW91IG1pZ2h0IGRlZmluZSBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgJWRlZmluZSAlcHJvcGVydHkobmFtZSwgc2V0ZiwgZ2V0ZikKICAgICAgICAgICAlZmVhdHVyZSgic2V0Iikgc2V0ZiAjbmFtZTsKICAgICAgICAgICAlZmVhdHVyZSgiZ2V0IikgZ2V0ZiAjbmFtZTsKICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFdoaWNoIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAlcHJvcGVydHkocCwgZ2V0X3AsIHNldF9wKTsKCiAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgIGludCAgZ2V0X3AoKTsKICAgICAgICAgICAgICB2b2lkIHNldF9wKGludCk7CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAKMTEvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFRjbCBtb2R1bGUgaGFzIGJlZW4gZXhwYW5kZWQgd2l0aCBzb21lIG5ldyBmZWF0dXJlcyBmb3IKICAgICAgICAgICBtYW5hZ2luZyBvYmplY3Qgb3duZXJzaGlwLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0IGMgW0NpcmNsZSAtYXJncyAyMF0KICAgICAgICAgICAgICAgICRjIGFyZWEgICAgICAgICAgICAgIyBJbnZva2UgYSBtZXRob2QKICAgICAgICAgICAgICAgICRjIC1kaXNvd24gICAgICAgICAgIyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAogICAgICAgICAgICAgICAgJGMgLWFjcXVpcmUgICAgICAgICAjIEFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CgogICAgICAgICAgIElmIFRjbCBvd25zIHRoZSBvYmplY3QsIGl0cyBkZXN0cnVjdG9yIGlzIGludm9rZWQgd2hlbiB0aGUgCiAgICAgICAgICAgY29ycmVzcG9uZGluZyBvYmplY3QgY29tbWFuZCBpcyBkZWxldGVkIGluIFRjbC4gIAoKICAgICAgICAgICBUbyBzaW1wbGlmeSB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cywgdGhlIGZvbGxvd2luZyBzeW50YXgKICAgICAgICAgICBjYW4gYmUgdXNlZDoKCiAgICAgICAgICAgICAgICAkYyAtZGVsZXRlICAgICAgICAgIyBEZWxldGUgYW4gb2JqZWN0CgogICAgICAgICAgIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBtb3JlIG9ic2N1cmUgdmFyaWFudCBvZiAKCiAgICAgICAgICAgICAgICByZW5hbWUgJGMge30KCiAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYWxzbyBhZGQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgQyBBUEkgbGV2ZWwuCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIG93bmVyc2hpcCBmcm9tIEMgYW5kCiAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICAgICAgU1dJR19BY3F1aXJlKHZvaWQgKnB0cik7CiAgICAgICAgICAgICAgICBTV0lHX0Rpc293bih2b2lkICpwdHIpOwoKICAgICAgICAgICBBIG5ldyBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGluc3RhbmNlcyBpcyBhbHNvIGF2YWlsYWJsZToKCiAgICAgICAgICAgICAgICBUY2xfT2JqICoKICAgICAgICAgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmooVGNsX0ludGVycCAqaW50ZXJwLCB2b2lkICpwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlLCBpbnQgb3duKTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIGEgdHlwZW1hcCwgdGhpcyBjcmVhdGVzIGEgcG9pbnRlciBvYmplY3QgYW5kCiAgICAgICAgICAgYW4gaW50ZXJwcmV0ZXIgY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIG1ldGhvZHMgYW5kCiAgICAgICAgICAgYWNjZXNzIGF0dHJpYnV0ZXMgYXMgc2hvd24gYWJvdmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBbGwgUHl0aG9uLXJlbGF0ZWQgJXByYWdtYSBvcGVyYXRpb25zIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgIE1vc3Qgb2YgdGhlc2Ugd2VyZSB3cml0dGVuIGZvciBvbGRlciBTV0lHIHZlcnNpb25zIGluIG9yZGVyIHRvCiAgICAgICAgICAgY29tcGVuc2F0ZSBmb3IgbGltaXRhdGlvbnMgaW4gZWFybGllciByZWxlYXNlcy4gIEluIGFuIGVmZm9ydAogICAgICAgICAgIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUtY2x1dHRlciBhbmQgcG90ZW50aWFsIGZvciBlcnJvcnMsCiAgICAgICAgICAgaXQgaXMgZWFzaWVyIHRvIHNpbXBseSBlbGltaW5hdGUgdGhlIHByYWdtYXMgYW5kIHRvIHN0YXJ0IG92ZXIKICAgICAgICAgICAoaWYgbmVlZGVkKS4gIFRvIGJlIGhvbmVzdCwgSSdtIG5vdCBldmVuIHN1cmUgdGhlIHByYWdtYXMKICAgICAgICAgICB3b3JrZWQgaW4gMS4zLjkgYW5kIHJlY2VudCByZWxlYXNlcy4KCiAgICAgICAgICAgTm90ZTogSWYgeW91IG5lZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgc2hhZG93IGNsYXNzIGZpbGUKICAgICAgICAgICBjcmVhdGVkIGJ5IFNXSUcsIHNpbXBseSB1c2UgdGhlICVzaGFkb3cgZGlyZWN0aXZlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXNoYWRvdyAlewogICAgICAgICAgICAgIGRlZiBzb21lX3B5dGhvbl9jb2RlKCk6ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIHByaW50ICJibGFoISIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFN3ZWVwaW5nIGNoYW5nZXMgdG8gdGhlIHdheSBpbiB3aGljaCB0aGUgUHl0aG9uIG1vZHVsZSBoYW5kbGVzCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMuICAgSW4gZWFybHkgaW1wbGVtZW50YXRpb25zLCBzaGFkb3cgY2xhc3NlcyB3ZXJlCiAgICAgICAgICAgbWVyZWx5IFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdHlwZWQgcG9pbnRlciBvYmplY3RzLiBIb3dldmVyLCAKICAgICAgICAgICBzb21lIHVzZXJzIGFjdHVhbGx5IHdhbnRlZCB0byByZWNlaXZlIHRoZSBzaGFkb3cgY2xhc3Mgb2JqZWN0IGluIEMuCiAgICAgICAgICAgVG8gYWNjb21vZGF0ZSB0aGlzLCB0aGUgZGVyZWZlcmVuY2luZyBvZiB0aGUgInRoaXMiIHBvaW50ZXIgaW4KICAgICAgICAgICBhIHNoYWRvdyBjbGFzcyB3YXMgbW92ZWQgdG8gQyBhcyBkZXNjcmliZWQgaW4gQ0hBTkdFUyBbOC84Lzk5XS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgcHJvY2VzcyBvZiByZXR1cm5pbmcgcG9pbnRlcnMgdG8gUHl0aG9uIHdhcyBzdGlsbAogICAgICAgICAgIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgU3BlY2lmaWNhbGx5LCBzaGFkb3cgY2xhc3NlcyBuZXZlciB3b3JrZWQKICAgICAgICAgICBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhlc2U6CgogICAgICAgICAgICAgLSAgIFVzZSBvZiBhbnkga2luZCBvZiBvdXRwdXQgdHlwZW1hcCAoJ291dCcgb3IgJ2FyZ291dCcpCiAgICAgICAgICAgICAtICAgR2xvYmFsIHZhcmlhYmxlcyAoYnJva2VuIGFzIGZhciBhcyBJIGNhbiB0ZWxsKS4KCiAgICAgICAgICAgSW4gdGhlIHBhc3QsIHNvbWUgdXNlcnMgaGF2ZSBkZWFsdCB3aXRoIHRoaXMgYnkgbWFudWFsbHkgdHJ5aW5nCiAgICAgICAgICAgdG8gY3JlYXRlIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRoZW1zZWx2ZXMgZnJvbSBDL0MrKy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhpcyB3YXMgZGlmZmljdWx0IGJlY2F1c2UgdGhlIEMgd3JhcHBlcnMgZG9uJ3QgcmVhbGx5IGtub3cgaG93CiAgICAgICAgICAgdG8gZ2V0IGFjY2VzcyB0byB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gY2xhc3MuCgogICAgICAgICAgIFRoZSBQeXRob24gbW9kdWxlIGhhcyBub3cgYmVlbiBtb2RpZmllZCB0byBhdXRvbWF0aWNhbGx5IGF0dGFjaAogICAgICAgICAgIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRvIHBvaW50ZXJzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgdG8gCiAgICAgICAgICAgUHl0aG9uLiAgIFRoaXMgcHJvY2VzcyBvY2N1cnMgaW4gdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iaigpCiAgICAgICAgICAgc28gdGhlIHByb2Nlc3MgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byB1c2Vycy4gICAgQXMgYSByZXN1bHQsCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMgYXJlIG5vdyBtb3JlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCB3aXRoIHR5cGVtYXBzCiAgICAgICAgICAgYW5kIG90aGVyIGZlYXR1cmVzIG9mIFNXSUcuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBpbnRyb2R1Y2UgYSBudW1iZXIgb2YgaW5jb21wYXRpYmlsaXRpZXMuICBUaGUKICAgICAgICAgICBTV0lHX05ld1BvaW50ZXJPYmooKSBub3cgdGFrZXMgYW4gZXh0cmEgcGFyYW1ldGVyICJvd24iIHRvIAogICAgICAgICAgIGluZGljYXRlIG9iamVjdCBvd25lcnNoaXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXR1cm4gYSBwb2ludGVyCiAgICAgICAgICAgdG8gUHl0aG9uIHRoYXQgUHl0aG9uIHNob3VsZCBkZXN0cm95LiAgIEluIGFkZGl0aW9uLCBvbGRlciBjb2RlCiAgICAgICAgICAgdGhhdCB0cmllcyB0byBtYW51YWxseSBjb25zdHJ1Y3Qgc2hhZG93IGNsYXNzIG9iamVjdHMgb3Igd2hpY2gKICAgICAgICAgICBleHBlY3RzIGJhcmUgcG9pbnRlcnMgbWF5IGJyZWFrLS0tc3VjaCBwb2ludGVycyBtYXkgYWxyZWFkeSBiZQogICAgICAgICAgIGVuY2Fwc3VsYXRlZCBieSBhIHNoYWRvdyBjbGFzcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSB0byBhY2NlcHQgc2luZ2xlIGJyYWNlcyB7IC4uLiB9LgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbnNlcnQoImhlYWRlciIpIHsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICV7IC4uLiAlfSBleGNlcHQgdGhhdCB0aGUgY29kZSBpbiB0aGUKICAgICAgICAgICBicmFjZXMgaXMgcHJvY2Vzc2VkIHVzaW5nIHRoZSBwcmVwcm9jZXNzb3IuICAgVGhpcyBjYW4gYmUgdXNlZnVsCiAgICAgICAgICAgaW4gY2VydGFpbiBjb250ZXh0cyBzdWNoIGFzIGxvdy1sZXZlbCBjb2RlIGdlbmVyYXRpb24gaW4gCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cgdHJhbnNsYXRlZCBpbnRvIHByZXByb2Nlc3NvcgogICAgICAgICAgIHN5bWJvbHMuICBGb3IgZXhhbXBsZToKCQogICAgICAgICAgICAgIC4vc3dpZyAtcHl0aG9uIC1zaGFkb3cgLW1vZHVsZSBibGFoIGludGVyZmFjZS5pCgogICAgICAgICAgIENyZWF0ZXMgdGhlIHN5bWJvbHM6CgogICAgICAgICAgICAgIFNXSUdPUFRfUFlUSE9OIDEKICAgICAgICAgICAgICBTV0lHT1BUX1NIQURPVyAxCiAgICAgICAgICAgICAgU1dJR09QVF9NT0RVTEUgYmxhaAogICAgICAgICAgICAgIAogICAgICAgICAgIE1vZHVsZXMgY2FuIGxvb2sgZm9yIHRoZXNlIHN5bWJvbHMgdG8gYWx0ZXIgdGhlaXIgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaWYgbmVlZGVkLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBQZXJsNSBtb2R1bGUuICBBIGxvdCBvZiBjb2RlIGdlbmVyYXRpb24gaXMKICAgICAgICAgICBub3cgZHJpdmVuIGJ5IHRhYmxlcyBhbmQgdHlwZW1hcHMuICAgVGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgCiAgICAgICAgICAgYWxzbyBtYWtlcyB1c2Ugb2YgdGFibGVzIHRvIGluc3RhbGwgY29uc3RhbnRzLCB2YXJpYWJsZXMsIGFuZAogICAgICAgICAgIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGlubGluaW5nIGEgYnVuY2ggb2YgcHJvY2VkdXJlIGNhbGxzLiAgVGhlCiAgICAgICAgICAgc2VwYXJhdGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgZ29uZS4gICBNb3N0CiAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBwZXJsNS5zd2cgZmlsZSBpbiB0aGUKICAgICAgICAgICBsaWJyYXJ5LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIAoxMS8xMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSBDKysgdHlwZW5hbWUga2V5d29yZC4gIFByaW1hcmlseSB0aGlzCiAgICAgICAgICAgaXMgYWRkZWQgdG8gYmV0dGVyIHN1cHBvcnQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCAgYmxhaChDJiB2KSB7CiAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IgaSA9IHYuYmVnaW4oKTsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgTm90ZTogdHlwZW5hbWUgaXMgc3VwcG9ydGVkIGluIHRoZSBwYXJzZXIgaW4gdGhlIHNhbWUgd2F5IGFzICdzdHJ1Y3QnCiAgICAgICAgICAgb3IgJ2NsYXNzJy4gIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIGl0IGFueXdoZXJlIGV4Y2VwdCBpbiB0ZW1wbGF0ZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlIEFQSS4gICBNb3N0IGZ1bmN0aW9ucyBub3cKICAgICAgICAgICB1c2UgYSBjb21tb24sIHZlcnkgc2ltcGxlLCAgQVBJLiAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mCiAgICAgICAgICAgaW50ZXJlc3Rpbmcgc2VtYW50aWMgc2lkZS1lZmZlY3RzIG9mIGhvdyBjb2RlIGlzIGFjdHVhbGx5IGdlbmVyYXRlZC4KICAgICAgICAgICBEZXRhaWxzIHdpbGwgYmUgZm9ydGhjb21pbmcgaW4gRG9jL01hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIExhbmd1YWdlIG1vZHVsZXMgd3JpdHRlbiBmb3IKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdvcmssCgoxMS8xMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHZlcnkgc3VidGxlIGJ1ZyBkdWUgdG8gdW5uYW1lZCBjbGFzcyB3cmFwcGluZy4gRm9yIGV4YW1wbGUsIGlmCiAgICAgICAgICAgeW91IGRpZCB0aGlzCgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHgseTsKICAgICAgICAgICAgICB9IGdkUG9pbnQsICpnZFBvaW50UHRyOwoKICAgICAgICAgICAgICB2b2lkIGZvbyhnZFBvaW50UHRyIHgpOwoKICAgICAgICAgICBUaGVuIHRoZSBmb28gZnVuY3Rpb24gd291bGQgZ2V0IGEgdHlwZS1lcnJvci4gICBUaGUgcHJvYmxlbSBoYXMKICAgICAgICAgICB0byBkbyB3aXRoIGludGVybmFsIHR5cGVkZWYgaGFuZGxpbmcgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGVkZWYKICAgICAgICAgICBkZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdCBhcHBlYXIgbGF0ZXIgaW4gdGhlIHBhcnNlIHRyZWUuCiAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUHJvYmxlbSByZXBvcnRlZCBieSBWaW4gSm92YW5vdmljLgoKMTEvMDkvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byAib3V0IiB0eXBlbWFwcyAoYW5kIHJlbGF0ZWQgdmFyaWF0aW9ucykuICBUaGUgbmFtZQogICAgICAgICAgIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIHR5cGVtYXAgaXMgbm93IHRoZSByYXcgQyBpZGVudGlmaWVyIHRoYXQKICAgICAgICAgICBhcHBlYXJzIG9uIGEgZGVjbGFyYXRpb24uICBUaGlzIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCiAgICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGZvbygpOyAgICAvLyB0eXBlbWFwIGdldHMgYXBwbGllZAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG5ldmVyIHJlYWxseSBzcGVjaWZpZWQgaG93IHRoaXMgd2FzIHN1cHBvc2VkIHRvCiAgICAgICAgICAgd29yay4gIEluIFNXSUcxLjEsIHlvdSBjb3VsZCBwcm9iYWJseSB3cml0ZSBhIHR5cGVtYXAgZm9yIHRoZQogICAgICAgICAgIHdyYXBwZXIgbmFtZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgQmxhaF9mb28geyAuLi4gfQoKICAgICAgICAgICBIb3dldmVyLCB0aGlzIG9sZCBiZWhhdmlvciBpcyBub3cgd2l0aGRyYXduIGFuZCBub3Qgc3VwcG9ydGVkLiAKICAgICAgICAgICBKdXN0IHVzZSB0aGUgbWVtYmVyIG5hbWUgd2l0aG91dCBhbnkgc29ydCBvZiBzcGVjaWFsIHByZWZpeC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gVGNsIG1vZHVsZSBpbml0aWFsaXphdGlvbjoKCiAgICAgICAgICAgKDEpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHdvcmsgd2l0aAogICAgICAgICAgICAgICAgVGNsIHN0dWJzLiAgU2ltcGx5IGNvbXBpbGUgd2l0aCAtRFVTRV9UQ0xfU1RVQlMuCgogICAgICAgICAgICgyKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGNhbGxzIFRjbF9Qa2dQcm92aWRlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgICAgIGEgcGFja2FnZSBuYW1lLiAgVGhlIHBhY2thZ2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZQogICAgICAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuICBUaGUgdmVyc2lvbiBudW1iZXIgaXMKICAgICAgICAgICAgICAgc2V0IHRvICIwLjAiIGJ5IGRlZmF1bHQuICBUbyBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyLCB1c2UKICAgICAgICAgICAgICAgc3dpZyAtcGtndmVyc2lvbiAxLjIgaW50ZXJmYWNlLmkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIE1vZHVsZXMgdGhhdCBwcm92aWRlZCBzdHVicyBhbmQgVGNsX1BrZ1Byb3ZpZGUgb24gdGhlaXIgb3duIG1pZ2h0CiAgICAgICAgICAgYnJlYWsuICBTaW1wbHkgcmVtb3ZlIHRoYXQgY29kZS4KCjExLzA1LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgY29kZSBnZW5lcmF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgVGNsIG1vZHVsZS4gIENvbnN0YW50cwogICAgICAgICAgIGFyZSBub3cgc3RvcmVkIGluIGEgbGFyZ2UgdGFibGUgdGhhdCBnZXQgaW5zdGFsbGVkIGF0IG1vZHVsZSBzdGFydHVwLgogICAgICAgICAgIFRoZXJlIGFyZSBhbHNvIG5vIGxvbmdlciBhbnkgc3RhdGljIHZhcmlhYmxlcyBzbyBpdCBzaG91bGQgZ2VuZXJhdGUKICAgICAgICAgICBzb21ld2hhdCBsZXNzIGNvZGUuCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgImNvbnN0IiB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gImNvbnN0YW50IiBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcy4gICJjb25zdCIgaXMgYSBDIGtleXdvcmQgd2hpY2ggbWFkZSB0aGUgaGFuZGxpbmcgb2YgdGhlIHR5cGVtYXAKICAgICAgICAgICBkaXJlY3RpdmUgc29tZXdoYXQgYXdrd2FyZCBpbiB0aGUgcGFyc2VyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgJXR5cGVtYXAgZGlyZWN0aXZlIGNhbiBub3cgYWNjZXB0IG5lYXJseSBhcmJpdHJhcnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbixwYXJzZT0iaSIsZG9jPSJpbnRlZ2VyIikgaW50ICIuLi4iOwoKICAgICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBseSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBoaW50cyB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIG1vZHVsZS4gICBUaGUgaW50ZXByZXRhdGlvbiBvZiB0aGUKICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgdG8gaW50ZXJuYWwgY2FsbC9yZXR1cm4gYnkgdmFsdWUgaGFuZGxpbmcuCiAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgY2FsbC1ieS12YWx1ZSB3YXMgdHJhbnNsYXRlZAogICAgICAgICAgIGludG8gcG9pbnRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwoKICAgICAgICAgICB0dXJuZWQgaW50byB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHRyYW5zbGF0aW9uIHdhcyBub3JtYWxseSBwZXJmb3JtZWQgYnkgdGhlIFNXSUcgY29yZSwgb3V0c2lkZQogICAgICAgICAgIG9mIHRoZSBjb250cm9sIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBhIHNpZGUgZWZmZWN0CiAgICAgICAgICAgb2YgdGhpcyB3YXMgYSBsb3Qgb2YgYml6YXJyZSB0eXBlbWFwIGJlaGF2aW9yLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgIGlmIHlvdSBkaWQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBZb3Ugd291bGQgZmluZCB0aGF0IGludDMyIHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGEgcG9pbnRlciBldmVyeXdoZXJlIQogICAgICAgICAgIChuZWVkbGVzcyB0byBzYXksIHN1Y2ggYmVoYXZpb3IgaXMgdW5leHBlY3RlZCBhbmQgcXVpdGUgYXdrd2FyZCB0bwogICAgICAgICAgIGRlYWwgd2l0aCkuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIGlmIGEgdHlwZWRlZiB3YXMgYWxzbyB1c2VkLAogICAgICAgICAgIHRoZSBwb2ludGVyIGJlaGF2aW9yIHN1ZGRlbmx5IGRpc2FwcGVhcmVkLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIHBvaW50ZXIgdHJhbnNmb3JtYXRpb24gaXMgbm93IHB1c2hlZCB0byB0aGUKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiAgIFRoaXMgcHJvZHVjZXMgd3JhcHBlcnMgdGhhdCBsb29rIHJvdWdobHkKICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMSA9ICphOwogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMiA9ICpiOwogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lIHR5cGVtYXBzIGZvcgogICAgICAgICAgIGFyYml0cmFyeSB1bmRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGlzIChhbmQgaXQKICAgICAgICAgICB3aWxsIHdvcmsgcmVnYXJkbGVzcyB3aGF0IGludDMyIGlzKToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICQxID0gKGludDMyKSBQeUludF9Bc0xvbmcoJGlucHV0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElNQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2FsbC9yZXR1cm4gYnkgdmFsdWUgY29kZSBnZW5lcmF0aW9uIGluCiAgICAgICAgICAgc29tZSBsYW5ndWFnZSBtb2R1bGVzLgoKMTEvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0eXBlbWFwcyB0byB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAgeyAKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBvYmplY3QgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAqIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAmIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIGVudW0gU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAuLi4gYW4gZW51bSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIChDTEFTUzo6KikgewogICAgICAgICAgICAgICAgICAgLi4uIHBvaW50ZXIgdG8gbWVtYmVyIC4uLgogICAgICAgICAgICAgICB9CgoKICAgICAgICAgICBUaGVzZSB0eXBlcyBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIHR5cGVzIHRoYXQgZG9uJ3QgbWF0Y2gKICAgICAgICAgICBhbnl0aGluZyBlbHNlLiAgU2VlIENIQU5HRVMgbG9nIGVudHJ5IGZvciA4LzI3LzIwMDAgZm9yIHRoZQogICAgICAgICAgIG9sZCBiZWhhdmlvci4gIFRoZSByb2xlIG9mIHRoZXNlIHR5cGVzIGlzIGFsc28gZGVzY3JpYmVkIGluIAogICAgICAgICAgIERvYy9NYW51YWwvVHlwZW1hcHMuaHRtbAoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIAoxMC8yNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCBHdWlsZSBhbmQgTXpzY2hlbWUgbW9kdWxlcyB0byBzdXBwb3J0CiAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRml4IHRvIGhhbmRsZSBwb2ludGVycyB0byBhcnJheXMuCgoxMC8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBEZWZpbmluZyBhIHR5cGVtYXAgcnVsZSBmb3IgZW51bSBTV0lHRU5VTSBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgICB0byBkZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZW51bSB2YXJpYWJsZXMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSdWJ5IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFJ1YnkgbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGFuIGFyYml0cmFyeQogICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICBQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIGxpbWl0ZWQgdG8gCiAgICAgICAgICAgdG8gZnVuY3Rpb25zIHdpdGggb25seSA5IG9yIDE2IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdXNlIG9mIGRlZmF1bHQgYXJndW1lbnRzLiAgIE5vdGU6IGZyb20gc29tZSBpbnNwZWN0aW9uCiAgICAgICAgICAgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgc291cmNlLCB0aGUgbmV3IGFwcHJvYWNoIG1pZ2h0IGJlCiAgICAgICAgICAgYSBsaXR0bGUgZmFzdGVyIGFzIHdlbGwuCgoxMC8xOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgIHRlbXBsYXRlcy4KCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDxTLFQ+OwoKICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSXJpbmEgS290bG92YS4KCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzIGFkZGVkLiAgVGhlIHR5cGVtYXBzCiAgICAgICAgICAgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgc3ludGF4IGJlbG93LiAgIFdpdGhpbiBlYWNoCiAgICAgICAgICAgdHlwZW1hcCwgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICRhcmc7ICAvLyBUaGUgaW5wdXQgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgJDE7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQyOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBzZWNvbmQgYXJndW1lbnQKCiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyByZWZlciB0byBlaXRoZXIgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDFfdHlwZSwgJDFfbHR5cGUsICQxX2Jhc2V0eXBlLCBldGMuLi4gIChhcmdjKQogICAgICAgICAgICAgICAgICAkMl90eXBlLCAkMl9sdHlwZSwgJDJfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ3ZbXSkKCiAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGRpbWVuc2lvbiBvZiBhcmd2CiAgICAgICAgICAgICAgICAgICQyX2RpbTAKICAgICAgICAgICAgICB9CgogICAgICAgICAgIEJhc2ljYWxseSBhbnkgdmFyaWFibGUgdGhhdCB3YXMgYXZhaWxhYmxlIGluIG5vcm1hbCB0eXBlbWFwcwogICAgICAgICAgIGlzIGF2YWlsYWJsZSBmb3IgZWl0aGVyIGFyZ3VtZW50IGJ5IHByZWZhY2luZyB0aGUgdmFyaWFibGUKICAgICAgICAgICBuYW1lIGJ5ICckbl8nIHdoZXJlIG4gaXMgdGhlIGFyZ3VtZW50IHBvc2l0aW9uLgoKICAgICAgICAgICBOb3RlczogIAogICAgICAgICAgICgxKSBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHNpbmdsZQogICAgICAgICAgICAgICBvYmplY3QgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgIHlvdSBjYW4gc3BsaXQgYSBzdHJpbmcgaW50byBhIChjaGFyICosIGludCkgcGFpciBvcgogICAgICAgICAgICAgICBzcGxpdCBhIGxpc3QgaW50byBhIChpbnQsIGNoYXIgW10pIHBhaXIuICBJdCBpcyBub3QKICAgICAgICAgICAgICAgcG9zc2libGUgdG8gbWFwIG11bHRpcGxlIG9iamVjdHMgdG8gbXVsdGlwbGUgYXJndW1lbnRzLgoKICAgICAgICAgICAoMikgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIFNXSUcgdmVyc2lvbnMsIHRoZQogICAgICAgICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyAkdGFyZ2V0IGFuZCAkdHlwZSBhcmUgcHJlc2VydmVkIGFuZAogICAgICAgICAgICAgICBhcmUgbWFwcGVkIG9udG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9ubHkuCgogICAgICAgICAgICgzKSBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLgogICAgICAgICAgICAgICBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgYXJlIGFuIGV4dGVuc2lvbiB0byB0eXBlbWFwIGhhbmRsaW5nLgogICAgICAgICAgICAgICBTaW5nbGUgdmFsdWVkIHR5cGVtYXBzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsCiAgICAgICAgICAgICAgIHdheS4KCiAgICAgICAgICAgVGhlIG9sZCAkc291cmNlIGFuZCAkdGFyZ2V0IHZhcmlhYmxlcyBhcmUgb2ZmaWNpYWxseQogICAgICAgICAgIGRlcHJlY2F0ZWQuICBJbnB1dCB2YXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaAogICAgICAgICAgICRhcmckIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSByZWZlcmVuY2UgdGhyb3VnaCAkcmVzdWx0JC4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcy4gIFRoZSBzeW50YXgKICAgICAgICAgICBpcyBhIGxpdHRsZSBmdW5reSwgYnV0IGhlcmUgZ29lczoKCiAgICAgICAgICAgICAgLy8gRGVmaW5lIGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBNdWx0aXZhbHVlZCB0eXBlbWFwIHdpdGggbG9jYWxzCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKShpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIENvcHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSA9IChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKCiAgICAgICAgICAgICAgLy8gQXBwbHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJWFwcGx5IChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSB9OwoKICAgICAgICAgICBOb3RlOiB0aGlzIGV4dHJhIHBhcnNpbmcgc3VwcG9ydCBpcyBhZGRlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbi4KICAgICAgICAgICBObyBsYW5ndWFnZSBtb2R1bGVzIGN1cnJlbnRseSBzdXBwb3J0IG11bHRpLXZhbHVlZCB0eXBlbWFwcy4KCjEwLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1hdGNoaW5nIGNvZGUgdG8gZGlzY2FyZCBxdWFsaWZpZXJzIHdoZW4KICAgICAgICAgICBjaGVja2luZyBmb3IgYSBtYXRjaC4gICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkZWNsYXJhdGlvbgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGNoYXIgKngpOwoKICAgICAgICAgICBUaGUgdHlwZW1hcCBjaGVja2VyIGNoZWNrcyBmb3IgYSBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBJZiB0eXBlZGVmJ3MgYXJlIGludm9sdmVkLCBxdWFsaWZpZXIgc3RyaXBwaW5nIG9jY3VycyBiZWZvcmUKICAgICAgICAgICB0eXBlZGVmIHJlc29sdXRpb24uICBTbyBpZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyICpzdHJpbmc7CiAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3Qgc3RyaW5nIHgpOwoKICAgICAgICAgICB0eXBlbWFwIGNoZWNraW5nIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHgKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZwogICAgICAgICAgICAgICAgc3RyaW5nIHgKICAgICAgICAgICAgICAgIHN0cmluZwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV2l0aG91dCBxdWFsaWZpZXIgc3RyaXBwaW5nLCBvbmUgaGFzIHRvIHdyaXRlCiAgICAgICAgICAgc2VwZXJhdGUgdHlwZW1hcHMgZm9yIGFsbCB2YXJpYXRpb25zIG9mIGNvbnN0IGFuZCB2b2xhdGlsZSAod2hpY2gKICAgICAgICAgICBpcyBhIHBhaW4pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFR5cGVtYXBzIG1pZ2h0IGJlIGFwcGxpZWQgaW4KICAgICAgICAgICBwbGFjZXMgd2hlcmUgdGhleSB3ZXJlbid0IGJlZm9yZS4KCgoxMC85LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBkaXNhbWJpZ3VhdGUKICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBvbmx5IHZhcnkgaW4gY29uc3RuZXNzLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIG5vcm1hbGx5LgogICAgICAgICAgIAogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWhfY29uc3QpIGJsYWgoKSBjb25zdDsKCiAgICAgICAgICAgSW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUsIG1ldGhvZCBjYWxscyBsaWtlIHRoaXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgIChvYmopLT5ibGFoKCkgICAgICAgICAgICAgICAvLyBOb24tY29uc3QgdmVyc2lvbgogICAgICAgICAgICAgICAoKEZvbyBjb25zdCAqKW9iaiktPmJsYWgoKSAgLy8gY29uc3QgdmVyc2lvbgoKICAgICAgICAgICBUaGlzIHNob3VsZCBmb3JjZSB0aGUgcmlnaHQgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICAgICAgQWRtaXR0ZWRseSwgdGhpcyBpcyBwcm9iYWJseSBvYnNjdXJlLCBidXQgd2UgbWlnaHQKICAgICAgICAgICBhcyB3ZWxsIGdldCBpdCByaWdodC4KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3Igbm93IGlnbm9yZXMgJ1xyJyBpbiB0aGUgaW5wdXQuCiAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHRoZSBmb2xsb3dpbmcgYnVnOgogICAgICAgICAgIFsgIzQ2ODQxNiBdIFNXSUcgdGhpbmtzIG1hY3JvIGRlZnMgYXJlIGRlY2xhcmF0aW9ucz8KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHx8LCAmJiwgYW5kICEgaW4gY29uc3RhbnRzLiAgVGhpcwogICAgICAgICAgIGZpeGVzIFNGIFsgIzQ2ODk4OCBdIExvZ2ljYWwgb3BzIGJyZWFrIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBIb3dldmVyLCBhdCB0aGlzIHRpbWUsIGNvbnN0YW50cyB1c2luZyB0aGVzZSBvcGVyYXRvcnMKICAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCAodGhlIHBhcnNlciB3aWxsIGlzc3VlIGEgd2FybmluZykuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAtc2hvd190ZW1wbGF0ZXMgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFRoaXMgbWFrZXMKICAgICAgICAgICBTV0lHIGRpc3BsYXkgdGhlIGNvZGUgaXQgYWN0dWFsbHkgcGFyc2VzIHRvIGdlbmVyYXRlCiAgICAgICAgICAgdGVtcGxhdGUgd3JhcHBlcnMuICBNb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHNlbWFudGljcyBvZiAldGVtcGxhdGUgZGlyZWN0aXZlLiAgV2hlbgogICAgICAgICAgIHVzaW5nICV0ZW1wbGF0ZSwgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZAogICAgICAgICAgIGFzIHR5cGVzIGJ5IGRlZmF1bHQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICBUbyBzcGVjaWZ5IGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBpcyAqbm90KiBhIHR5cGUsIHlvdQogICAgICAgICAgIG5lZWQgdG8gdXNlIGRlZmF1bHQtdmFsdWUgc3ludGF4LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50LGludD01MD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8aW50LHNpemU9MTAwPjsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci0tb25seQogICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuLCA1MCwgMTAwKSBpcyB1c2VkIGR1cmluZwogICAgICAgICAgIGV4cGFuc2lvbi4gIFRoaXMgZGlmZmVycyBmcm9tIG5vcm1hbCBDKyssIGJ1dCBJIGNvdWxkbid0CiAgICAgICAgICAgZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gaXQgaW4gdGhlIHBhcnNlci4gIE1pZ2h0CiAgICAgICAgICAgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGxhdGVyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1ham9yIGNoYW5nZXMgdG8gdGVtcGxhdGUgaGFuZGxpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZQogICAgICAgICAgIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDKysgdHlwZS1zeXN0ZW0uIFRoZSBtYWluCiAgICAgICAgICAgcHJvYmxlbSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVtcGxhdGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGJsYWgoY29uc3QgVCB4KSB7IHN0dWZmIH07CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBOb3cgc3VwcG9zZSwgdGhhdCB5b3UgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG9uIGEKICAgICAgICAgICB0eXBlIGxpa2UgdGhpcyBpbiBTV0lHOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxpbnQgKj47CgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyAqc3VwcG9zZWQqIHRvIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIEhvd2V2ZXIsIGluIFNXSUctMS4zLjksIHRoZSB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gZ2V0cyBpdCB3cm9uZwogICAgICAgICAgIGFuZCBwcm9kdWNlcwoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgaW50ICp4KSB7IHN0dWZmIH07CgogICAgICAgICAgIChub3RpY2UgdGhlIGJhZCBwbGFjZW1lbnQgb2YgdGhlICdjb25zdCcgcXVhbGlmaWVyKS4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBTV0lHIHBhcnNlciBub3cgZ2VuZXJhdGVzIGltcGxpY2l0IHR5cGVkZWZzCiAgICAgICAgICAgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgY29kZSByb3VnaGx5CiAgICAgICAgICAgZXF1aXZhbGVudCB0byBkb2luZyB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAqX19zd2lndG1wbDE7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8X19zd2lndG1wbDE+OwoKICAgICAgICAgICB3aGljaCBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIFNpbmNlIHRoaXMgaXMgY29ycmVjdCBpbiBib3RoIEMrKyBhbmQgU1dJRywgaXQgcHJvdmlkZXMgdGhlIHJpZ2h0CiAgICAgICAgICAgc2VtYW50aWNzIGFuZCBhbGxvd3MgZXZlcnl0aGluZyB0byBjb21waWxlIHByb3Blcmx5LiAgSG93ZXZlciwKICAgICAgICAgICB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgYSBsaXR0bGUgYml0LCB0aGUgcGFyc2VyIGtlZXBzCiAgICAgICAgICAgdHJhY2sgb2YgdGhlIHRlbXBsYXRlIHR5cGVzIGFuZCBwZXJmb3JtcyBiYWNrLXN1YnN0aXR1dGlvbiB0bwogICAgICAgICAgIHRoZSBvcmlnaW5hbCB0eXBlIHdoZW4gYnVpbGRpbmcgdGhlIHBhcnNlIHRyZWUuICBUaHVzLCBldmVuCiAgICAgICAgICAgdGhvdWdoIHRoZSBpbXBsaWNpdCB0eXBlZGVmIGlzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBtYXkgYXBwZWFyCiAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGUgKGZvciBwcm9wZXIgY29tcGlsYXRpb24pLCB0aGUgcGFyc2UKICAgICAgICAgICB0cmVlIHdpbGwgaGlkZSBhIGxvdCBvZiB0aGVzZSBkZXRhaWxzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICB3aWxsIGxvb2sgbGlrZSBpdCB3YXMgZGVjbGFyZWQgYXMgZm9sbG93cyAod2hpY2ggaXMgd2hhdAogICAgICAgICAgIHlvdSB3YW50KToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9CgogICAgICAgICAgIFRoZSBvbmx5IHBsYWNlIHlvdSBhcmUgbGlrZWx5IHRvIG5vdGljZSB0aGUgdHlwZWRlZiBoYWNrCiAgICAgICAgICAgaXMgaW4gYm9kaWVzIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICBkaWQgdGhpcywKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmxhaCB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHsKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdGVtcHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgIHlvdSB3aWxsIGZpbmQgdGhhdCAnVCB0ZW1wdmFsdWUnIGdvdCBleHBhbmRlZCBpbnRvIHNvbWUKICAgICAgICAgICBzdHJhbmdlIHR5cGVkZWYgdHlwZS4gIFRoaXMgKnN0aWxsKiBjb21waWxlcyBjb3JyZWN0bHkgCiAgICAgICAgICAgc28gaXQncyBub3QgYSBiaWcgZGVhbCAob3RoZXIgdGhhbiBsb29raW5nIGtpbmQgb2YgdWdseQogICAgICAgICAgIGluIHRoZSB3cmFwcGVyIGZpbGUpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgc29tZSBpbmhlcml0YW5jZSBwcm9ibGVtcyBpbiBUY2wgT2JqZWN0IGludGVyZmFjZS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRjbCBtb2R1bGUgaGFzIGNoYW5nZWQgdG8gdXNlIGJ5dGUtYmFja2VkIHBvaW50ZXIgc3RyaW5ncy4gIFRoaXMKICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgSG93ZXZlciwKICAgICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggZGlnaXRzIGFwcGVhciBpbiBwb2ludGVyIHZhbHVlcyBubyBsb25nZXIKICAgICAgICAgICBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG51bWVyaWNhbCB2YWx1ZSBvZiBhCiAgICAgICAgICAgcG9pbnRlciAob24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgcGFpcnMgb2YgZGlnaXRzIGFwcGVhcgogICAgICAgICAgIGluIHJldmVyc2Ugb3JkZXIpLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUGVybDUgbW9kdWxlIGlzIG5vdyBkcml2ZW4gYnkgYSBjb25maWd1cmF0aW9uIGZpbGUgJ3Blcmw1LnN3ZycKICAgICAgICAgICBpbiB0aGUgU1dJRyBsaWJyYXJ5LgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHBlcmw1IG1vZHVsZSBubyBsb25nZXIgdHJpZXMgdG8gYXBwbHkgdGhlICJvdXQiIHR5cGVtYXAKICAgICAgICAgICBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgbWFnaWMgdmFyaWFibGVzLiAgSSdtIHN1cnByaXNlZCB0aGF0CiAgICAgICAgICAgdGhpcyBldmVyIHdvcmtlZCBhdCBhbGwgKHNpbmNlIGFsbCBvZiB0aGUgY29kZSB0aGF0IHdhcyB0aGVyZQogICAgICAgICAgIHdhcyB3cm9uZyBhbnl3YXlzKS4gICBVc2UgdGhlICJ2YXJvdXQiIHR5cGVtYXAgdG8gaGFuZGxlCiAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcy4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIGFycmF5IG1lbWJlcnMgb2Ygc3RydWN0dXJlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIGlzIG5vcm1hbGx5IHN1cHBvc2VkIHRvIHJldHVybiBhIHN0cmluZywgYnV0IHRoaXMgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy45LiAgIFRoZSByZWFzb24gaXQgd2FzIGJyb2tlbiB3YXMgYWN0dWFsbHkKICAgICAgICAgICBkdWUgdG8gYSBzdWJ0bGUgbmV3IGZlYXR1cmUgb2YgdHlwZW1hcHMuICBXaGVuIGEgZGF0YSBtZW1iZXIKICAgICAgICAgICBpcyBzZXQgdG8gYW4gYXJyYXkgbGlrZSB0aGlzLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlbGF0ZWQKICAgICAgICAgICBhY2Nlc3NvciBmdW5jdGlvbiBpcyBhY3R1YWxseSBzZXQgdG8gYW4gYXJyYXkuICBUaGlzIG1lYW5zCiAgICAgICAgICAgdGhhdCB5b3UgY2FuIG5vdyB3cml0ZSB0eXBlbWFwcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixvdXQpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICR0YXJnZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgkc291cmNlLCRkaW0wKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZSBkZWZ1bmN0CiAgICAgICAgICAgbWVtYmVyb3V0IHR5cGVtYXAgaW4gYSBtb3JlIGVsZWdhbnQgbWFubmVyLgoKOS8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU29tZSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgcXVhbGlmaWVkIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAoaSkgVGhlIFNXSUcgcGFyc2VyIHdhcyBleHRlbmRlZCBzbGlnaHRseSB0byBhbGxvdyAndm9sYXRpbGUnCiAgICAgICAgICAgYW5kIGNvbWJpbmF0aW9ucyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIHRvIGJlIHVzZWQuICBUaGlzCiAgICAgICAgICAgaXMgcHJvYmFibHkgcmFyZSwgYnV0IHRlY2huaWNhbGx5IGxlZ2FsLiAgT25seSBhZGRlZCBmb3IKICAgICAgICAgICBjb21wbGV0ZW5lc3MuCgogICAgICAgICAgIChpaSkgRm9yIHRoZSBwdXJwb3NlcyBvZiBvdmVybG9hZGluZywgcXVhbGlmaWVkIGFuZCBub24tcXVhbGlmaWVkCiAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQuICBUaHVzLCB3aGVuIGEgY2xhc3MgaGFzIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CgogICAgICAgICAgIFR3byBkaXN0aW5jdCBtZXRob2RzIGFyZSBkZWNsYXJlZC4gIFRvIGRlYWwgd2l0aCB0aGlzLCAlcmVuYW1lCiAgICAgICAgICAgYW5kIHNpbWlsYXIgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gcmVjb2duaXplIGNvbnN0LgogICAgICAgICAgIFRodXMsIG9uZSBjYW4gZGlzYW1iaWd1YXRlIHRoZSB0d28gZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb2NvbnN0KSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBvciBzaW1wbHkgaWdub3JlIHRoZSBjb25zdCB2YXJpYW50IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIE5vdGU6IFNXSUcgY3VycmVudGx5IGhhcyBubyB3YXkgdG8gYWN0dWFsbHkgaW52b2tlIHRoZSBjb25zdAogICAgICAgICAgIG1lbWJlciBzaW5jZSB0aGUgJ2NvbnN0JyBpcyBkaXNjYXJkZWQgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzCiAgICAgICAgICAgZm9yIG9iamVjdHMuICAKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIE5ldyBkaXJlY3RpdmUuICVuYW1ld2FybiBjYW4gYmUgdXNlZCB0byBpc3N1ZSB3YXJuaW5nCiAgICAgICAgICAgbWVzc2FnZXMgZm9yIGNlcnRhaW4gZGVjbGFyYXRpb24gbmFtZXMuICAgVGhlIG5hbWUKICAgICAgICAgICBtYXRjaGluZyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlICVyZW5hbWUgZGlyZWN0aXZlLgogICAgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhpcyBkaXJlY3RpdmUgaXMgdG8gaXNzdWUgd2FybmluZ3MgZm9yCiAgICAgICAgICAgcG9zc2libGUgbmFtZXNwYWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbmFtZXdhcm4oInByaW50IGlzIGEgcHl0aG9uIGtleXdvcmQiKSBwcmludDsKCiAgICAgICAgICAgVGhlIG5hbWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHBlcmZvcm1lZCBhZnRlciBhIG5hbWUKICAgICAgICAgICBoYXMgYmVlbiByZXNvbHZlZCB1c2luZyAlcmVuYW1lLiAgVGhlcmVmb3JlLCBhCiAgICAgICAgICAgZGVjbGFyYXRpb24gbGlrZSB0aGlzIHdpbGwgbm90IGdlbmVyYXRlIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiUHJpbnQiKSBwcmludDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB2b2lkIHByaW50KCk7ICAgIC8qIE5vIHdhcm5pbmcgZ2VuZXJhdGVkICovCgogICAgICAgICAgIFNpbmNlIHRoZSB3YXJuaW5nIG1lY2hhbmlzbSBmb2xsb3dzICVyZW5hbWUgc2VtYW50aWNzLCBpdCBpcwogICAgICAgICAgIGFsc28gdG8gaXNzdWUgd2FybmluZ3MgZm9yIHNwZWNpZmljIGNsYXNzZXMgb3IganVzdCBmb3IKICAgICAgICAgICBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbiBuYW1lcy4KCiAgICAgICAgICAgKERhdmUgLSBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgYWRkaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKICAgICAgICAgICBmb3IgcXVpdGUgc29tZSB0aW1lLiAgSnVzdCBuZXZlciBnb3QgYXJvdW5kIHRvIGl0KQogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbmhhbmNlZCB0aGUgJWlnbm9yZSBkaXJlY3RpdmUgc28gdGhhdCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgY2FuIGJlIGlzc3VlZCB0byB1c2Vycy4gICBUaGlzIGlzIGRvbmUgdXNpbmcgJWlnbm9yZXdhcm4KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWlnbm9yZXdhcm4oIm9wZXJhdG9yIG5ldyBpZ25vcmVkIikgb3BlcmF0b3IgbmV3OwoKICAgICAgICAgICBUaGUgbmFtZXMgYW5kIHNlbWFudGljcyBvZiAlaWdub3Jld2FybiBpcyBleGFjdGx5IHRoZSAKICAgICAgICAgICBzYW1lIGFzICVpZ25vcmUuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICBpcyBmb3IgbW9kdWxlIHdyaXRlcnMgd2hvIHdhbnQgdG8gaWdub3JlIGNlcnRhaW4gdHlwZXMKICAgICAgICAgICBvZiBkZWNsYXJhdGlvbnMsIGJ1dCB3aG8gYWxzbyB3YW50IHRvIGFsZXJ0IHVzZXJzIGFib3V0IGl0LgogICAgICAgICAgIEEgdXNlciBtaWdodCBhbHNvIHVzZSB0aGlzIGZvciBkZWJ1Z2dpbmcgKHNpbmNlIG1lc3NhZ2VzCiAgICAgICAgICAgd2lsbCBhcHBlYXIgd2hlbmV2ZXIgYW4gaWdub3JlZCBkZWNsYXJhdGlvbiBhcHBlYXJzKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzI2LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTdXBlci1leHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBvcGVyYXRvcnMuIAogICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50IHBhcnRzLgoKICAgICAgICAgICAoaSkgT3BlcmF0b3IgbmFtZXMgc3VjaCBhcyAnb3BlcmF0b3IrJyBhcmUgbm93IGFsbG93ZWQKICAgICAgICAgICBhcyB2YWxpZCBkZWNsYXJhdG9yIG5hbWVzLiAgVGh1cyB0aGUgJ29wZXJhdG9yJyBzeW50YXgKICAgICAgICAgICBjYW4gYXBwZWFyICphbnlwbGFjZSogYSBub3JtYWwgZGVjbGFyYXRvciBuYW1lIHdhcyB1c2VkCiAgICAgICAgICAgYmVmb3JlLiAgT24gdGhlIHN1cmZhY2UsIHRoaXMgbWVhbnMgdGhhdCBvcGVyYXRvcnMgY2FuCiAgICAgICAgICAgYmUgcGFyc2VkIGp1c3QgbGlrZSBub3JtYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLiAKICAgICAgICAgICBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgb3BlcmF0b3IgbmFtZXMgY2FuIGJlIHVzZWQKICAgICAgICAgICBpbiBtYW55IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVyZW5hbWUoX19hZGRfXykgQ29tcGxleDo6b3BlcmF0b3IrKGNvbnN0IENvbXBsZXggJik7CgogICAgICAgICAgIChpaSkgT3BlcmF0b3JzIGFyZSB3cmFwcGVkICpleGFjdGx5KiBsaWtlIG5vcm1hbCBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgbWV0aG9kcy4gIEludGVybmFsbHksIHRoZSBvcGVyYXRvciBuYW1lIGlzIHVzZWQgCiAgICAgICAgICAgZGlyZWN0bHkgbWVhbmluZyB0aGF0IHRoZSB3cmFwcGVyIGNvZGUgbWlnaHQgY29udGFpbgogICAgICAgICAgIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGFyZzAtPm9wZXJhdG9yKigoQ29tcGxleCBjb25zdCAmKSphcmcxKTsKCiAgICAgICAgICAgVGhpcyBhbGwgc2VlbXMgdG8gcGFyc2UgYW5kIGNvbXBpbGUgY29ycmVjdGx5IChhdCBsZWFzdAogICAgICAgICAgIG9uIG15IG1hY2hpbmUpLgoKICAgICAgICAgICAoaWlpKSBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdyYXAgYSBkZWNsYXJhdGlvbiBpZiBpdHMgc3ltYm9sCiAgICAgICAgICAgdGFibGUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycy4gIElmCiAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBkZXRlY3RlZCwgeW91IHdpbGwgc2VlIGFuIGVycm9yCiAgICAgICAgICAgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICBXYXJuaW5nLiBDYW4ndCB3cmFwIG9wZXJhdG9yKiB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuCgogICAgICAgICAgIFRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgJXJlbmFtZSBvciAlbmFtZSB0byBiaW5kCiAgICAgICAgICAgdGhlIG9wZXJhdG9yIHRvIGEgbmljZSBuYW1lIGxpa2UgImFkZCIgb3Igc29tZXRoaW5nLiBOb3RlOgogICAgICAgICAgIHRoZSBsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldAogICAgICAgICAgIGxhbmd1YWdlLgoKICAgICAgICAgICBUaGVyZSBhcmUgY2VydGFpbiBpc3N1ZXMgd2l0aCBmcmllbmQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCiAgICAgICAgICAgU29tZXRpbWVzLCBmcmllbmRzIGFyZSB1c2VkIHRvIGRlZmluZSBtaXhlZCBvcGVyYXRvcnMgc3VjaAogICAgICAgICAgIGFzIGFkZGluZyBhIENvbXBsZXggYW5kIGEgZG91YmxlIHRvZ2V0aGVyLiAgQ3VycmVudGx5LCBTV0lHCiAgICAgICAgICAgaWdub3JlcyBhbGwgZnJpZW5kIGRlY2xhcmF0aW9ucyBpbiBhIGNsYXNzLiAgQSBnbG9iYWwgb3BlcmF0b3IKICAgICAgICAgICBkZWNsYXJhdGlvbiBjYW4gcHJvYmFibHkgYmUgbWFkZSB0byB3b3JrLCBidXQgeW91J2xsIGhhdmUgdG8KICAgICAgICAgICByZW5hbWUgaXQgYW5kIGl0IHByb2JhYmx5IHdvbid0IHdvcmsgdmVyeSBjbGVhbmx5IGluIHRoZQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBzaW5jZSBpdCdzIG5vdCBhIGNsYXNzIG1lbWJlci4KCiAgICAgICAgICAgU1dJRyBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBvcGVyYXRvciBzcGVjaWZpY2F0aW9ucyAKICAgICAgICAgICBzb21ldGltZXMgdXNlZCBmb3IgYXV0b21hdGljIHR5cGUgY29udmVyc2lvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIFN0cmluZyB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9OwoKICAgICAgICAgICAodGhpcyBkb2Vzbid0IHBhcnNlIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGF4IGVycm9yKS4KCiAgICAgICAgICAgQWxzbzogb3BlcmF0b3JzIG5vIGxvbmdlciBzaG93IHVwIGFzIHNlcGFyYXRlIHBhcnNlLXRyZWUKICAgICAgICAgICBub2RlcyAoaW5zdGVhZCB0aGV5IGFyZSBub3JtYWwgJ2NkZWNsJyBub2RlcykuICBJIG1heQogICAgICAgICAgIHNlcGFyYXRlIHRoZW0gYXMgYSBzcGVjaWFsIGNhc2UgbGF0ZXIuCgogICAgICAgICAgIFNlZSBFeGFtcGxlcy9weXRob24vb3BlcmF0b3IgZm9yIGFuIGV4YW1wbGUuCgogICAgICAgICAgICoqKiBTVVBFUi1FWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgpWZXJzaW9uIDEuMy45IChTZXB0ZW1iZXIgMjUsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZSBkZWNsYXJhdGlvbnMgbGlrZSAKICAgICAgICAgICAnY2hhciAqKiBjb25zdCcuICBTV0lHIHBhcnNlZCB0aGlzIGNvcnJlY3RseSwgYnV0IHRoZQogICAgICAgICAgIGludGVybmFsIHR5cGUgd2FzIHJlcHJlc2VudGVkIGluY29ycmVjdGx5ICh0aGUgcG9pbnRlcnMKICAgICAgICAgICBhbmQgcXVhbGlmaWVycyB3ZXJlIGluIHRoZSB3cm9uZyBvcmRlcikuCgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBXaXRoZHJldyBleHBlcmltZW50YWwgZmVhdHVyZSAobm90ZWQgYmVsb3cpIHRoYXQgd2FzCiAgICAgICAgICAgY2F1c2luZyBzZXJpb3VzIHBhcnNpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDEuMy44IChTZXB0ZW1iZXIgMjMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgaW1wcm92ZWQgZGlzdHV0aWxzIHNldHVwLnB5IGZpbGUgaW4gdGhlIFRvb2xzIAogICAgICAgICAgIGRpcmVjdG9yeSAobG9vayBmb3IgdGhlIHNldHVwLnB5LnRtcGwgZmlsZSkuICBDb250cmlidXRlZCBieQogICAgICAgICAgIFRvbnkgU2V3YXJkLgoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgdHdvIG5ldyBSUE0gc3BlYyBmaWxlcyBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiBDb250cmlidXRlZAogICAgICAgICAgIGJ5IFRvbnkgU2V3YXJkIGFuZCBVd2UgU3RlaW5tYW5uLgogIAo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYzNjM1IF0gUGVybDUuc3dnIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIEMrKwoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVHdvIG5ldyBkaXJlY3RpdmVzIGNvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGRlZmF1bHQKICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQKICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdAoKICAgICAgICAgICBUaGVzZSByZXBsYWNlICVwcmFnbWEgbm9kZWZhdWx0IGFuZCAlcHJhZ21hIG1ha2VkZWZhdWx0LgogICAgICAgICAgIChvbGQgY29kZSB3aWxsIHN0aWxsIHdvcmssIGJ1dCBkb2N1bWVudGF0aW9uIHdpbGwgb25seQogICAgICAgICAgIGRlc2NyaWJlIHRoZSBuZXcgZGlyZWN0aXZlcykuCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYyMzU0IF0gJWltcG9ydCBicm9rZW4gaW4gMS4zLjcuCgo5LzIwLzIwMDE6IGJlYXpsZXkKCiAgICAgICAgICAgUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBvdXQtb2YtY2xhc3MgY29uc3RydWN0b3IKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGlubGluZSBGb286OkZvbygpIDoKICAgICAgICAgICAgICAgICAgICBCYXIoImZvbyIpCiAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjp+Rm9vKCkgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBKYXNvbiBTdGV3YXJ0LgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gaWdub3JlIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFYsIGxvbmcgUz4gY2xhc3MgTWFwSXRlcjsKCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IGFuIGVtYWlsIGV4YW1wbGUgZnJvbSBJcmluYSBLb3Rsb3ZhLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHVuZGVjbGFyZWQgdGNsX3Jlc3VsdCB2YXJpYWJsZSBpbiAKICAgICAgICAgICB0aGUgIm91dCIgdHlwZW1hcCBmb3IgVGNsLiAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEFjdGl2ZVBlcmwuICAKICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzaW5nIG9mIEMrKyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgRm9vKCkgOiBCYXIoLi4uKSB7Li4ufQogICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgbm93IGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgKC4uLikgcmVnYXJkbGVzcyBvZiAKICAgICAgICAgICB3aGF0IG1pZ2h0IGVuY2xvc2VkIChldmVuIGlmIHN5bnRhY3RpY2FsbHkgd3JvbmcpLiAgU1dJRwogICAgICAgICAgIGRvZXNuJ3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KICAgICAgICAgICBuZWVkbGVzcyBhZGQgc3ludGF4IHJ1bGVzIHRvIGhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmlsaXRpZXMKICAgICAgICAgICBoZXJlLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHR5cGVtYXBzIGZvciBzdHJ1Y3R1cmUgbWVtYmVycy4gIElmIHlvdSBoYXZlIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgIGludCAqYmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBtZW1iZXIgbmFtZSAnYmFyJyBpcyBub3cgdXNlZCBpbiBhbnkgYWNjZXNzb3IgZnVuY3Rpb25zLgogICAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSAiaW4iIHR5cGVtYXAgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlLgogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIHR5cGVtYXAKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixpbikgaW50ICpiYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgbm93IG1hdGNoZXMgVmVjdG9yOjpiYXIuICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIHdpbGwgYWxzbwogICAgICAgICAgIG1hdGNoIGFueSBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mICJpbnQgKmJhciIgKHNvIHlvdSBzaG91bGQKICAgICAgICAgICBiZSBjYXJlZnVsKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUuIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjY0MiBzZXR0aW5nIHN0cmluZyB2YWx1ZXMgaW4gc3RydWN0dXJlcwoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjIzOTggcHJvYmxlbSB3aXRoIG5lc3RlZCB0ZW1wbGF0ZXMuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MTYyNiBwcm9ibGVtIHdpdGggZm9ybWF0dGluZyBhbmQgQysrIGNvbW1lbnRzLgogICAgICAgICAgICAKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI4NDUgV3Jvbmcgb3duZXJzaGlwIG9mIHJldHVybmVkIG9iamVjdHMuCiAgICAgICAgICAgCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDU5MzY3LiAgRGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIGNsYXNzZXMKICAgICAgICAgICB3aXRoIHB1cmUgdmlydHVhbCBtZXRob2RzLgoKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBjbGFzcyBzY29wZS4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGVudW0gYmFyIHsgRk9PLCBCQVIgfTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhciBiID0gRk9PKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU1dJRyBub3cgY29ycmVjdGx5IGdlbmVyYXRlcyBhIGRlZmF1bHQgdmFsdWUgb2YgIkZvbzo6Rk9PIiBmb3IKICAgICAgICAgICB0aGUgYmxhaCgpIG1ldGhvZCBhYm92ZS4gIFRoaXMgdXNlZCB0byB3b3JrIGluIDEuMSwgYnV0IHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuNy4gICBCdWcgcmVwb3J0ZWQgYnkgTWlrZSBSb21iZXJnLgoKVmVyc2lvbiAxLjMuNyAgKFNlcHRlbWJlciAzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzcGVjaWFsICVpZ25vcmUgZGlyZWN0aXZlIHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMuICBUaGlzCiAgICAgICAgICAgZmVhdHVyZSB3b3JrcyBleGFjdGx5IGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgIGZvbzsgICAgICAgIC8vIElnbm9yZSBhbGwgZGVjbGFyYXRpb25zIGZvbwogICAgICAgICAgICAgJWlnbm9yZSAgOjpmb287ICAgICAgLy8gT25seSBpZ25vcmUgZm9vIGluIGdsb2JhbCBzY29wZQogICAgICAgICAgICAgJWlnbm9yZSAgU3BhbTo6Zm9vOyAgLy8gT25seSBpZ25vcmUgaW4gY2xhc3MgU3BhbQogICAgICAgICAgICAgJWlnbm9yZSAgKjo6Zm9vOyAgICAgLy8gSWdub3JlIGluIGFsbCBjbGFzc2VzCgogICAgICAgICAgICVpZ25vcmUgY2FuIGFsc28gYmUgcGFyYW1ldGVyaXplZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIDo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIFNwYW06OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSAqOjpmb28oaW50KTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKCjkvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIHNoYWRvd2NvZGUgcHJhZ21hIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGNvZGUgdGhhdCBpcyBvdXRwdXQgCiAgICAgICAgICAgaW4gdGhlIHNoYWRvdyBmaWxlIGlzIHBsYWNlZCByZWxhdGl2ZSB0byB3aGVyZSBpdCBpcyBwbGFjZWQgaW4gdGhlIAogICAgICAgICAgIGMvYysrIGNvZGUuIFRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIEphdmFEb2MgZnVuY3Rpb24gY29tbWVudHMuIAoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgUGF0Y2ggWyAjNDQ3NzkxIF0gRml4IGZvciBweXRob24gLWludGVyZmFjZSBvcHRpb24uCiAgICAgICAgICAgU3VibWl0dGVkIGJ5IFRhcm4gV2Vpc25lciBCdXJ0b24uCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKICAgICAgICAgICBmb3IgYSBjbGFzcyBpZiBpdCBvbmx5IGRlZmluZXMgYSBwcml2YXRlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcgogICAgICAgICAgIG9yIGRlc3RydWN0b3Igb3IgaWYgYW55IG9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzIG9ubHkgaGFzCiAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuICBUaGlzIHdhcyByZXBvcnRlZCBpbgogICAgICAgICAgIFNGIFBhdGNoIFsgIzQ0NDI4MSBdIG5vbnB1YmxpYy9kZWZhdWx0L2luaGVyZXRlZCBjdG9yL2R0b3IKICAgICAgICAgICBieSBNYXJjZWxvIE1hdHVzLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gUGVybDUgbW9kdWxlIHRoYXQgYWxsb3dzIGNvbnN0YW50cyB0byBiZQogICAgICAgICAgIHdyYXBwZWQgYXMgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGUgbGVhZGluZyAkLgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIHVzaW5nIHRoZSAtY29uc3Qgb3B0aW9uLgogICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFJpY2ggV2FsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgJ3ZvbGF0aWxlJyB0eXBlIHF1YWxpZmllci4KICAgICAgICAgICB2b2xhdGlsZSBkb2Vzbid0IG1lYW4gYW55dGhpbmcgdG8gU1dJRywgYnV0IGl0IGlzCiAgICAgICAgICAgbmVlZGVkIHRvIHByb3Blcmx5IGdlbmVyYXRlIHByb3RvdHlwZXMgZm9yIGRlY2xhcmF0aW9ucwogICAgICAgICAgIHRoYXQgdXNlIGl0LiAgSXQncyBhbHNvIGJlZW4gYWRkZWQgdG8gbWFrZSB0aGUgU1dJRyB0eXBlCiAgICAgICAgICAgc3lzdGVtIG1vcmUgY29tcGxldGUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCAlcmVuYW1lIGRpcmVjdGl2ZS4gICoqKiBUaGlzCiAgICAgICAgICAgbmV3IGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZgogICAgICAgICAgIHJlc29sdmluZyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gKioqCiAgICAgICAgICAgCiAgICAgICAgICAgSW4gcHJpb3IgdmVyc2lvbnMgb2YgU1dJRywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIHdhcwogICAgICAgICAgIHVzZWQgdG8gY29uc2lzdGVudGx5IGFwcGx5IGFuIGlkZW50aWZpZXIgcmVuYW1pbmcuIEZvciAKICAgICAgICAgICBleGFtcGxlLCBpZiB5b3Ugc2FpZCB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUgZm9vIGJhcjsKCiAgICAgICAgICAgRXZlcnkgb2NjdXJyZW5jZSBvZiAnZm9vJyB3b3VsZCBiZSByZW5hbWVkIHRvICdiYXInLiAKICAgICAgICAgICBBbHRob3VnaCB0aGlzIHdvcmtzIGZpbmUgZm9yIHJlc29sdmluZyBhIGNvbmZsaWN0IHdpdGggYQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSByZXNlcnZlZCB3b3JkLCBpdCBpcyB1c2VsZXNzIGZvcgogICAgICAgICAgIGZvciBkZWFsaW5nIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzLiAgICBUaGlzIGlzIGJlY2F1c2UKICAgICAgICAgICBhbGwgbWV0aG9kcyBhcmUgc2ltcGx5IHJlbmFtZWQgdG8gdGhlIHNhbWUgdGhpbmcgCiAgICAgICAgICAgKGdlbmVyYXRpbmcgdGhlIHNhbWUgY29uZmxpY3QgYXMgYmVmb3JlKS4KCiAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgb25seSB3YXkgdG8gZGVhbCB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcwogICAgICAgICAgIHdhcyB0byBnbyB0aHJvdWdoIGFuZCBpbmRpdmlkdWFsbHkgcmVuYW1lIHRoZW0gYWxsIHVzaW5nCiAgICAgICAgICAgJW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGhhZCB0byBkbyB0aGlzIGZvciBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMgdG9vLgoKICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOZWVkbGVzcyB0byBzYXksIHRoaXMgbWFrZXMgaXQgZXh0cmVtZWx5IGhhcmQgdG8gcmVzb2x2ZQogICAgICAgICAgIG92ZXJsb2FkaW5nIHdpdGhvdXQgYSBsb3Qgb2Ygd29yayBhbmQgbWFrZXMgaXQgYWxtb3N0CiAgICAgICAgICAgaW1wb3NzaWJsZSB0byB1c2UgU1dJRyBvbiByYXcgQysrIC5oIGZpbGVzLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgJXJlbmFtZSBub3cgYWNjZXB0cyBwYXJhbWV0ZXIgZGVjbGFyYXRvcnMuCiAgICAgICAgICAgVGhlIHN5bnRheCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIHJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXIoaW50KScKICAgICAgICAgICB0byAnYmFyX2knLCBsZWF2aW5nIGFueSBvdGhlciBvY2N1cnJlbmNlIG9mICdiYXInIGFsb25lLgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwoKICAgICAgICAgICBVc2luZyB0aGlzIGZlYXR1cmUsIHlvdSBjYW4gbm93IHNlbGVjdGl2ZWx5IHJlbmFtZSAKICAgICAgICAgICBjZXJ0YWluIGRlY2xhcmF0aW9ucyBpbiBhZHZhbmNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9kKSBiYXIoZG91YmxlKTsKCiAgICAgICAgICAgICAvLyBJbmNsdWRlIHJhdyBDKysgaGVhZGVyICAgIAogICAgICAgICAgICAgJWluY2x1ZGUgImhlYWRlci5oIgoKICAgICAgICAgICBXaGVuICVyZW5hbWUgaXMgdXNlZCBpbiB0aGlzIG1hbm5lciwgYWxsIG9jY3VycmVuY2Ugb2YgYmFyKGludCkKICAgICAgICAgICBhcmUgcmVuYW1lZCB3aGVyZXZlciB0aGV5IG1pZ2h0IG9jY3VyLiAgTW9yZSBjb250cm9sIGlzIG9idGFpbmVkCiAgICAgICAgICAgdGhyb3VnaCBleHBsaWNpdCBxdWFsaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgOjpiYXIoaW50KTsKCiAgICAgICAgICAgb25seSBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCiAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uLAogICAgIAogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIEZvbzo6YmFyKGludCk7CgogICAgICAgICAgIGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gYSBjbGFzcyBGb28uCiAgICAgICAgICAgVGhpcyBsYXR0ZXIgZm9ybSBhbHNvIHN1cHBvcnRzIGluaGVyaXRhbmNlLiAgVGhlcmVmb3JlLCBpZiB5b3UKICAgICAgICAgICBoYWQgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIFNwYW06OmJhcihpbnQpIG1ldGhvZCB3b3VsZCBhbHNvIGJlIHJlbmFtZWQgKHNpbmNlIFNwYW0gCiAgICAgICAgICAgaXMgYSBzdWJjbGFzcyBvZiBGb28pLiAgIFRoaXMgbGF0dGVyIGZlYXR1cmUgbWFrZXMgaXQgZWFzeQogICAgICAgICAgIGZvciBTV0lHIHRvIGFwcGx5IGEgY29uc2lzdGVudCByZW5hbWluZyBhY3Jvc3MgYW4gZW50aXJlCiAgICAgICAgICAgY2xhc3MgaGllcmFyY2h5IHNpbXBseSBieSBzcGVjaWZ5aW5nIHJlbmFtaW5nIHJ1bGVzIGZvcgogICAgICAgICAgIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICBBIGNsYXNzIHdpbGRjYXJkIG9mICogY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gcmVuYW1pbmcKICAgICAgICAgICBhbGwgbWF0Y2hpbmcgbWVtYmVycyBvZiBhbGwgY2xhc3Nlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSAqOjpiYXIoaW50KTsKCiAgICAgICAgICAgd2lsbCByZW5hbWUgYWxsIG1lbWJlcnMgYmFyKGludCkgdGhhdCBhcmUgZGVmaW5lZCBpbiBjbGFzc2VzLgogICAgICAgICAgIEl0IHdpbGwgbm90IHJlbmFtZWQgZGVmaW5pdGlvbnMgb2YgYmFyKGludCkgaW4gdGhlIGdsb2JhbAogICAgICAgICAgIHNjb3BlLgoKICAgICAgICAgICBUaGUgb2xkIHVzZSBvZiAlcmVuYW1lIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGlzIHNvbWV3aGF0CiAgICAgICAgICAgZW5oYW5jZWQuICAKCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIGJhcjsgICAgICAvLyBSZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyJy4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgOjpiYXI7ICAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gZ2xvYmFsIHNjb3BlIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pICo6OmJhcjsgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGNsYXNzZXMgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgRm9vOjpiYXI7IC8vIFJlbmFtZSBhbGwgJ2JhcicgZGVmaW5lZCBpbiBjbGFzcyBGb28uCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRhdGEtbWVtYmVyIHRvIG1lbWJlci1mdW5jdGlvbiAKICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5vdyBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBhY2Nlc3MgeCBhbmQgeSAKICAgICAgICAgICB0aHJvdWdoIGEgbWVtYmVyIGZ1bmN0aW9uIGludGVyZmFjZSBpbnN0ZWFkIAogICAgICAgICAgIG9mIHRoZSB1c3VhbCBTV0lHIGJlaGF2aW9yLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZi5zZXRfeCgzLjQpICAgICAgIyBpbnN0ZWFkIG9mIGYueCA9IDMuNAogICAgICAgICAgICAgIHggPSBmLmdldF94KCkgICAgICMgaW5zdGVhZCBvZiB4ID0gZi54CgogICAgICAgICAgIFRvIGRvIHRoaXMsIHNpbXBseSB1c2UgdGhlIG5ldyAlYXR0cmlidXRlZnVuYwogICAgICAgICAgIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXRfJXMsc2V0XyVzKQogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlbm9hdHRyaWJ1dGVmdW5jCgogICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gJWF0dHJpYnV0ZWZ1bmMgYXJlIEMtc3R5bGUgcHJpbnRmCiAgICAgICAgICAgZm9ybWF0IHN0cmluZ3MgdGhhdCBkZXRlcm1pbmUgdGhlIG5hbWluZyBjb252ZW50aW9uCiAgICAgICAgICAgdG8gdXNlLiAgJXMgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlCiAgICAgICAgICAgZGF0YSBtZW1iZXIuIFNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgcHJpbnRmCiAgICAgICAgICAgZXh0ZW5zaW9ucyB0aGF0IG1pZ2h0IGhlbHAuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgd2FudGVkIHRvIHRpdGxlIGNhc2UgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzLCB5b3UKICAgICAgICAgICBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXQlKHRpdGxlKXMsc2V0JSh0aXRsZSlzKTsKCiAgICAgICAgICAgVGhpcyB3aWxsIHR1cm4gYW4gYXR0cmlidXRlICdiYXInIHRvICdnZXRCYXIoKScgYW5kICdzZXRCYXIoKScuCgogICAgICAgICAgIChzb21lb25lIHJlcXVlc3RlZCB0aGlzIGxvbmcgYWdvLCBidXQgSSBmaW5hbGx5IGZpZ3VyZWQKICAgICAgICAgICBob3cgdG8gaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIG1hbm5lcikuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgaWYgbm9uZSBhcmUgZGVmaW5lZC4gIFRoaXMgdXNlZCB0byBiZQogICAgICAgICAgIGVuYWJsZWQgd2l0aCBhIGNvbW1hbmQgbGluZSBzd2l0Y2ggLW1ha2VfZGVmYXVsdCwgYnV0CiAgICAgICAgICAgbW9zdCBwZW9wbGUgd2FudCB0aGVzZSBmdW5jdGlvbnMgYW55d2F5cy4gIFRvIHR1cm4KICAgICAgICAgICBvZmYgdGhpcyBiZWhhdmlvciB1c2UgdGhlIC1ub19kZWZhdWx0IG9wdGlvbiBvciBpbmNsdWRlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW4gdGhlIGludGVyZmFjZSBmaWxlOgogCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0OwogIAogICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGNlcnRhaW4gaW50ZXJmYWNlcyB0aGF0IGRlZmluZWQgdGhlaXIKICAgICAgICAgICBvd24gY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIHVzaW5nIHRoZSBzYW1lIG5hbWluZwogICAgICAgICAgIGNvbnZlbnRpb24gYXMgU1dJRy4gIElmIHNvLCB5b3Ugd2lsbCBnZXQgZHVwbGljYXRlCiAgICAgICAgICAgc3ltYm9scyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFBlcmw1IHNoYWRvdyBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBJdGVyYXRvcnMKICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoRklSU1RLRVksIE5FWFRLRVkpLiAgQWxzbywgYXR0cmlidXRlCiAgICAgICAgICAgYWNjZXNzIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmVseSBvbiBpbmhlcml0YW5jZSBpbiBvcmRlcgogICAgICAgICAgIHRvIHByb3ZpZGUgYmV0dGVyIGJlaGF2aW9yIGFjcm9zcyBtb2R1bGVzLiAgCgo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBWYXJpb3VzIG9ic2N1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSB0eXBlIHN5c3RlbSBhbmQgY2xhc3Nlcy4KICAgICAgICAgICBTdHJhbmdlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMgYXJlIG5vdyB3cmFwcGVkIGNvcnJlY3RseQogICAgICAgICAgIChpLmUuLCB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBkb2Vzbid0IGNhdXNlIHRoZSBDKysKICAgICAgICAgICAgY29tcGlsZXIgdG8gZGllIHdpdGggYSB0eXBlIGVycm9yKS4KCiAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBSZWFsOwogICAgICAgICAgICAgICAgIFJlYWwgZm9vKFJlYWwgKCpvcCkoUmVhbCxSZWFsKSwgUmVhbCB4LCBSZWFsIHkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICBJbmhlcml0YW5jZSBvZiB0eXBlcyBpcyBhbHNvIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICAgIAo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIGNsYXNzIHdyYXBwZXJzLiAgIFdoZW4gU1dJRyBzZWVzIHR3byBjbGFzc2VzIGxpa2UgdGhpcywKIAogICAgICAgICAgIGNsYXNzIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBjbGFzcyBZIDogcHVibGljIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBpdCBub3cgb25seSBnZW5lcmF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zOgogCiAgICAgICAgICAgICBYX2ZvbyhYICp4KSB7IHgtPmZvbygpOyB9CiAgICAgICAgICAgICBZX2JhcihZICp5KSB7IHktPmJhcigpOyB9CiAKICAgICAgICAgICBVbmxpa2UgU1dJRzEuMTUsIHRoZSBmb28oKSBtZXRob2QgZG9lcyAqbm90KiBwcm9wYWdhdGUgdG8gYSB3cmFwcGVyCiAgICAgICAgICAgZnVuY3Rpb24gWV9mb28oKS4gSW5zdGVhZCwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIFhfZm9vKCkgbXVzdCBiZQogICAgICAgICAgIHVzZWQuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IG1vZHVsZXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMsIGJ1dAogICAgICAgICAgIGl0IG1pZ2h0IGJyZWFrIG1vZHVsZXMgdGhhdCBkaXJlY3RseSB1c2UgdGhlIGxvdy1sZXZlbCBDIHdyYXBwZXJzLgogICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnM6CgogICAgICAgICAgICAgICAtICBJdCBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNXSUctLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgd2l0aCBhbnRpY2lwYXRlZCBmdXR1cmUgY2hhbmdlcyBzdWNoIGFzIG92ZXJsb2FkZWQgbWV0aG9kcy4KCiAgICAgICAgICAgICAgIC0gIEl0IHJlc3VsdHMgaW4gc3Vic3RhbnRpYWxseSBsZXNzIHdyYXBwZXIgY29kZS0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICBmb3IgYmlnIEMrKyBjbGFzcyBoaWVyYXJjaGllcyAoaW5oZXJpdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIGNvcGllZCBpbnRvIGV2ZXJ5IHNpbmdsZSBkZXJpdmVkIGNsYXNzKS4KCiAgICAgICAgICAgICAgIC0gIEl0IGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyAoY29kZSBpc24ndCByZXBsaWNhdGVkIGluCiAgICAgICAgICAgICAgICAgIGV2ZXJ5IHNpbmdsZSBtb2R1bGUpLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgUHJvdmlkZWQgc29tZSBXaW5kb3dzIGRvY3VtZW50YXRpb24gaW4gdGhlIFdpbiBkaXJlY3RvcnkgYW5kIHNvbWUKICAgICAgICAgICBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgZm9yIHJ1bm5pbmcgZXhhbXBsZXMgb24gV2luZG93cy4KCjgvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcmVuYW1lZCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBwcm9wZXJseTsKCSAgIHRoYW5rcyB0byBNYXJjIFpvbnpvbiA8TWFyYy5ab256b25AdW5pdi1yZW5uZXMxLmZyPiBmb3IgdGhlCgkgICBwYXRjaC4gIFNlZSB0aGUgbmV3IHRlc3QgY2FzZSBuYW1lX2N4eC4KCjgvMjcvMjAwMTogbWtvZXBwZQoJICAgW1RjbF0gUmVtb3ZlZCBsb3RzIG9mIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMsIHdoaWNoIHdlcmUgY2F1c2VkIGJ5IG1peGluZyBmdW5jdGlvbiBwb2ludGVycwoJICAgb2YgZGlmZmVyZW50IGxpbmthZ2VzIChDKysvQykuIAoKOC8yMy8yMDAxOiBta29lcHBlCgkgICBJbXByb3ZlZCB0aGUgTXpTY2hlbWUgbW9kdWxlIGJ5IHBvcnRpbmcgR3VpbGUncyBwb2ludGVyCgkgICB0eXBlIGNoZWNraW5nIHN5c3RlbSBhbmQgbWFraW5nIHR5cGUgZGlzcGF0Y2gKCSAgIHR5cGVtYXAtZHJpdmVuLiAKCjgvMjIvMjAwMTogYmVhemxleQogICAgICAgICAgIEVudGlyZWx5IG5ldyBzeW1ib2wgdGFibGUgcHJvY2Vzc2luZy4gICBTV0lHIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgICAgICAgcmVwb3J0IG11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgIEFsc28sIHRoZSBuZXcgc3ltYm9sIHRhYmxlIGFsbG93cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMKICAgICAgICAgICAoYWx0aG91Z2ggb3ZlcmxvYWRpbmcgaXNuJ3QgcXVpdGUgc3VwcG9ydGVkIGluIHRoZSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMgeWV0KS4KCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gJW5ldyBzdXBwb3J0IGFkZGVkLgogICAgICAgICAgICogW0phdmFdIFBhY2thZ2UgSk5JIG5hbWUgcmVmaXhlZCEKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFB5dGhvbiBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBwb2ludGVycyB0byBDKysgbWVtYmVycy4gIFRoaXMKICAgICAgICAgICBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIGxpbWl0ZWQgcGFyc2luZyBhbmQgZnVsbCB0eXBlLXN5c3RlbSBzdXBwb3J0IGZvciBwb2ludGVycyB0bwogICAgICAgICAgIG1lbWJlcnMuIE5vbmUgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgcmVhbGx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAogICAgICAgICAgIHRoaXMgc28gdGhpcyBpcyByZWFsbHkgb25seSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzIGFuZCBmdXR1cmUKICAgICAgICAgICBleHBhbnNpb24uICBOb3RlOiBTV0lHIGRvZXMgbm90IHN1cHBvcnQgcG9pbnRlcnMgdG8gbWVtYmVycyB3aGljaCAKICAgICAgICAgICBhcmUgdGhlbXNlbHZlcyBwb2ludGVycyB0byBtZW1iZXJzLCByZWZlcmVuY2VzIHRvIHBvaW50ZXJzIHRvIG1lbWJlcnMsCiAgICAgICAgICAgb3Igb3RoZXIgY29tcGxpY2F0ZWQgZGVjbGFyYXRpb25zIGxpa2UgdGhpcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIGlzIG11Y2ggYmV0dGVyIGF0IHBhcnNpbmcgY2VydGFpbiBDKysgZGVjbGFyYXRpb25zLiBPcGVyYXRvcnMgYW5kCiAgICAgICAgICAgZnJpZW5kcyBnZW5lcmFsbHkgZG9uJ3QgY2F1c2UgYW55bW9yZSBzeW50YXggZXJyb3JzLiAgSG93ZXZlciwgbmVpdGhlcgogICAgICAgICAgIGFyZSByZWFsbHkgc3VwcG9ydGVkLgoKOC8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgKmhpZ2hseSogZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIG9mIEMrKwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4gIFNpbmNlIEMrKyB0ZW1wbGF0ZXMgYXJlIGVzc2VudGlhbGx5CiAgICAgICAgICAgZ2xvcmlmaWVkIG1hY3JvcyBhbmQgU1dJRyBoYXMgYSBmdWxseSBvcGVyYXRpb25hbCBDIAogICAgICAgICAgIHByZXByb2Nlc3NvciB3aXRoIG1hY3JvIHN1cHBvcnQsIHRoZSBwYXJzZXIgbm93IGNvbnZlcnRzCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHRvIG1hY3Jvcy4gIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGVtcGxhdGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBUIG1heChUIGEsIFQgYik7CgogICAgICAgICAgIGlzIGludGVybmFsbHkgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfbWF4KF9fbmFtZSxUKQogICAgICAgICAgICAgICAlbmFtZShfX25hbWUpIFQgbWF4KFQgYSwgVCBiKTsKICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSBhIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlLCBhIHNwZWNpYWwgJXRlbXBsYXRlIGRlY2xhcmF0aW9uCiAgICAgICAgICAgaXMgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OwoKICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHRvIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgcHJvcGVyIEMgaWRlbnRpZmllciB0aGF0J3MKICAgICAgICAgICB1c2VkIHRvIHVuaXF1ZWx5IG5hbWUgdGhlIHJlc3VsdGluZyBpbnN0YW50aWF0aW9uLiAgIFdoZW4gdXNlZCwgdGhlCiAgICAgICAgICAgdGhlIGV4cGFuZGVkIG1hY3JvIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJW5hbWUobWF4aW50KSBpbnQgbWF4KGludCBhLCBpbnQgYik7CiAgICAgICAgICAgICAgJW5hbWUobWF4ZG91YmxlKSBkb3VibGUgbWF4KGRvdWJsZSBhLCBkb3VibGUgYik7CgogICAgICAgICAgIEEgc2ltaWxhciB0ZWNobmlxdWUgaXMgdXNlZCBmb3IgdGVtcGxhdGUgY2xhc3Nlcy4gICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZlY3RvcihpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgIEdldHMgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV92ZWN0b3IoX19uYW1lLCBUKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8VD4gX19uYW1lOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgX19uYW1lIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgX19uYW1lKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIF9fbmFtZSB2ZWN0b3I8VD47CiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBBbiBhIHNwZWNpZmljIGluc3RhbnRpYXRpb24gaXMgY3JlYXRlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheToKCiAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjKSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgVGhlIHJlc3VsdGluZyBjb2RlIHBhcnNlZCBieSBTV0lHIGlzIHRoZW46CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWM7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBpbnR2ZWMgewogICAgICAgICAgICAgICAgICBpbnQgKmRhdGE7CiAgICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludHZlYyhpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICAgaW50ICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgaW50dmVjIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBOb3RlOiB0aGUgbGFzdCB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZCBDIGFuZCBpcyB1c2VkIGJ5IFNXSUcgdG8gcHJvdmlkZQogICAgICAgICAgIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIG5hbWUgImludHZlYyIgYW5kIHRoZSB0ZW1wbGF0ZSB0eXBlIAogICAgICAgICAgICJ2ZWN0b3I8aW50PiIuCgogICAgICAgICAgIENBVVRJT046ICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCB0aGUgZmlyc3QgdGltZSBTV0lHIGhhcwogICAgICAgICAgIHN1cHBvcnRlZCBDKysgdGVtcGxhdGVzLiAgIEVycm9yIHJlcG9ydGluZyBpcyBlc3NlbnRpYWwgbm9uLWV4aXN0ZW50LgogICAgICAgICAgIEl0IHdpbGwgcHJvYmFibHkgYnJlYWsgaW4gY2VydGFpbiBjYXNlcy4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKioKCjgvMTUvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB3cmFwcGluZyBvZiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuICBBcnJheXMKICAgICAgICAgICBhcmUgbm93IHByb3Blcmx5IG1hcHBlZCB0byBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKICAgICAgICAgICBvbmUgbGVzcyBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgWzEwXTsgICAgICAgICAgICAgIC0tPiAgaW50ICoKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXTsgICAgICAgICAgLS0+ICBpbnQgKCopWzIwXTsKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXVszMF07ICAgICAgLS0+ICBpbnQgKCopWzIwXVszMF07CgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjZXJ0YWluIFNXSUcgZXh0ZW5zaW9ucyBiZWNhdXNlCiAgICAgICAgICAgb2xkZXIgdmVyc2lvbnMgc2ltcGx5IG1hcHBlZCBhbGwgYXJyYXlzIGludG8gYSBzaW5nbGUKICAgICAgICAgICBwb2ludGVyIHN1Y2ggYXMgImludCAqIi4gICBBbHRob3VnaCBwb3NzaWJseSB1bnVzdWFsLCAKICAgICAgICAgICB0aGUgbmV3IHZlcnNpb24gaXMgY29ycmVjdCBpbiB0ZXJtcyBvZiB0aGUgQyB0eXBlIHN5c3RlbS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgIAo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdIEFycmF5IHNldHRlcnMgZ2VuZXJhdGVkIGZvciBzdHJ1Y3QvY2xhc3MgYXJyYXkgbWVtYmVycy4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hbnkgaW1wcm92ZW1lbnRzIHRvIFRjbC9QZXJsL1B5dGhvbiBtb2R1bGVzIHRvIGJldHRlcgogICAgICAgICAgIHdvcmsgd2l0aCBtdWx0aXBsZSBpbnRlcmZhY2UgZmlsZXMgYW5kIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSBiZWhhdmlvciBvZiAlaW1wb3J0IGluIHRoZSBQeXRob24gbW9kdWxlLgogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIHBvbGx1dGVzIHRoZSBtb2R1bGUgbmFtZXNwYWNlIGJ5IHVzaW5nCiAgICAgICAgICAgJ2Zyb20gbW9kdWxlIGltcG9ydCAqJyB0byByZWZlciB0byB0aGUgb3RoZXIgbW9kdWxlLiAKICAgICAgICAgICBJbnN0ZWFkLCBpdCBkb2VzIGEgcHJvcGVyICdpbXBvcnQgbW9kdWxlJy4gICBBbHNvLCBTV0lHCiAgICAgICAgICAgbWF5IHdvcmsgYSBsb3QgYmV0dGVyIHdoZW4gaW1wb3J0aW5nIG1vZHVsZXMgdGhhdCBpbmNsdWRlCiAgICAgICAgICAgcmVmZXJlbmNlcyB0byBvdGhlciBpbXBvcnRlZCBtb2R1bGVzLgoKOC8xMy8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBuZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsaXppbmcgdGhvc2Ugb2YgdGhlCgkgICBHdWlsZS1zcGVjaWZpYyA1LzI3LzIwMDEgY2hhbmdlczogCgkgICAqICRkZXNjcmlwdG9yIGlzIHRoZSBzYW1lIGFzIFNXSUdUWVBFJG1hbmdsZSwgYnV0IGFsc28KCSAgICAgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBuYW1lIGdldHMKCSAgICAgZGVmaW5lZC4KCSAgICogJCp0eXBlLCAkKmx0eXBlLCAkKm1hbmdsZSwgJCpkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBzdGFyLCBidXQgdGhleSBSRU1PVkUgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIGZyb20gdGhlIHR5cGUuIChUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHBvaW50ZXIgCgkgICAgIHR5cGVzLikKCSAgICogJCZ0eXBlLCAkJmx0eXBlLCAkJm1hbmdsZSwgJCZkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBhbXBlcnNhbmQsIGJ1dCB0aGV5IEFERCBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgdG8gdGhlIHR5cGUuCgkgICBUaGUgR3VpbGUtc3BlY2lmaWMgc3Vic3RpdHV0aW9uICRiYXNlZGVzY3JpcHRvciB3YXMgcmVtb3ZlZAoJICAgYmVjYXVzZSBpdCB3YXMgdXNlbGVzcy4KCjgvMTIvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlZXh0ZXJuIGRpcmVjdGl2ZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgd2l0aGRyYXduLiAgVGhlCiAgICAgICAgICAgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZSB3YXMgdG8gaW1wb3J0IHNlbGVjdGVkIGRlZmluaXRpb25zCiAgICAgICAgICAgZnJvbSBvdGhlciBpbnRlcmZhY2UgZmlsZXMgYW5kIGhlYWRlcnMuICBIb3dldmVyLCB0aGUgc2FtZQogICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgYmV0dGVyIGhhbmRsZWQgdGhyb3VnaCAlaW1wb3J0LiAgIFRoaXMKICAgICAgICAgICBsZWF2ZXMgU1dJRyB3aXRoIHR3byBmaWxlIGluY2x1c2lvbiBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlaW5jbHVkZSBmaWxlbmFtZSAgICAgLSBJbnNlcnRzIGludG8gY3VycmVudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAlaW1wb3J0IGZpbGVuYW1lICAgICAgLSBJbXBvcnQgdHlwZXMgYW5kIGNsYXNzZXMgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZHVsZQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIG5ldyBzdXBwb3J0IGZvciB3cmFwcGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMuIAogICAgICAgICAgIEEgY29tbW9uIHByb2JsZW0gd2l0aCBzb21lIEMgbGlicmFyaWVzIGlzIHRoYXQgbWFueQogICAgICAgICAgIGZ1bmN0aW9ucyB0YWtlIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGludCBkb19vcCguLi4sIGludCAoKm9wKShpbnQsaW50KSwgLi4uKTsKCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhlIG9ubHkgd2F5IHRvIGNhbGwgc3VjaCBhIGZ1bmN0aW9uIGlzIHRvCiAgICAgICAgICAgcGFzcyBpdCBhIGZ1bmN0aW9uIHBvaW50ZXIgb2Ygc29tZSBjb21wYXRpYmxlIHR5cGUuICBJbgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIHlvdSBoYWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCiAgICAgICAgICAgd2l0aCBzb21lIHJlYWxseSBncm9zcyBoYWNrcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXMgYSBjYWxsYmFjaywKCiAgICAgICAgICAgICAgIGludCBmb28oaW50LCBpbnQpOwoKICAgICAgICAgICB5b3UgaGFkIHRvIGluc3RhbGwgYSBwb2ludGVyIHRvIGl0IGFzIGEgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciAKCiAgICAgICAgICAgICAgIGNvbnN0IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIGlmIHlvdSBoYWQgYSByZWFsbHkgb2xkIFNXSUcgdmVyc2lvbjoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqT1BfRlVOQykoaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBkb19vcCguLi4sIE9QX0ZVTkMsIC4uLik7CiAgICAgICAgICAgICAgIGNvbnN0IE9QX0ZVTkMgRk9PID0gZm9vOwoKICAgICAgICAgICAKICAgICAgICAgICBOb3csIHlvdSBjYW4gZG8gb25lIG9mIHR3byB0aGluZ3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50IGZvbyhpbnQsaW50KTsKCiAgICAgICAgICAgVGhpcyBjcmVhdGVzIGEgY29uc3RhbnQgJ2Zvbycgb2YgdHlwZSBpbnQgKCopKGludCxpbnQpLgogICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXMiKQogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjawoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbnMgYXJlIGluc3RhbGxlZCBhcyBjb25zdGFudHMgd2hlcmUKICAgICAgICAgICB0aGUgbmFtZSBpcyBkZWZpbmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGdpdmVuIHRvICVjYWxsYmFjaygpLgogICAgICAgICAgIElmIHRoZSBuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZGlmZmVyIGZyb20gdGhlCiAgICAgICAgICAgYWN0dWFsIGZ1bmN0aW9uIG5hbWUsIGJvdGggYSBmdW5jdGlvbiB3cmFwcGVyIGFuZCBhIGNhbGxiYWNrIAogICAgICAgICAgIGNvbnN0YW50IGFyZSBjcmVhdGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiUodXBwZXIpcyIpCiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrCiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9OwoJICAgICBUZXN0Q2xhc3MoaW50IGEpIHt9OwoJICAgICB+VGVzdENsYXNzKCkge307CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9OwoJICAgICB1bnNpZ25lZCBsb25nIHh5eihpbnQgbikge307CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKCkge307CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fTsKCSAgIH07CgkgICB2b2lkIGRlbGV0ZV9UZXN0Q2xhc3MoaW50IGEpOwoKNi8yNy8yMDAxOiBta29lcHBlCgkgICAqIFtQZXJsXSBBbm90aGVyIGNvbnN0LXJlbGF0ZWQgcG9ydGFiaWxpdHkgZml4LgoKNi8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEFkZGVkIGluIGNwcF9wcmFnbWEoKSBzdXBwb3J0IHdpdGggYSBob3N0IG9mIG5ldyBwcmFnbWFzIC0gc2VlIAoJICAganN3aWcuaHRtbC4gVGhlc2UgYXJlIGRlc2lnbmVkIGZvciBiZXR0ZXIgbWl4aW5nIG9mIEphdmEgYW5kIGMrKy4gSXQgCgkgICBlbmFibGVzIHRoZSB1c2VyIHRvIHNwZWNpZnkgcHVyZSBKYXZhIGNsYXNzZXMgYXMgYmFzZXMgYW5kL29yIGludGVyZmFjZXMgCgkgICBmb3IgdGhlIHdyYXBwZWQgYy9jKysuCgkgICAqIFtKYXZhXSBPbGQgcHJhZ21hcyByZW5hbWVkLiBXYXJuaW5nIGdpdmVuIGZvciB0aGUgbW9tZW50IGlmIHVzZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LzI1LzIwMDE6IG1rb2VwcGUKCSAgICogSW5jb3Jwb3JhdGVkIG1vcmUgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+IGZvciBzd2lnL3J1Ynkgb24gY3lnd2luLgoKNi8yMC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTWFrZWZpbGUgbW9kcyBzbyB0aGF0ICdtYWtlIGNoZWNrJyB1c2VzIHRoZSBzd2lnIG9wdGlvbnMgaW4gdGhlIG1ha2VmaWxlcwoJICAgKiBbSmF2YV0gUmVtb3ZlZCBHZW5lcmF0aW5nIHdyYXBwZXJzIG1lc3NhZ2UKCSAgICogW0phdmFdIE5VTEwgcG9pbnRlciBidWcgZml4CgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBLYWZmZSBKVk0KCjYvMjAvMjAwMTogbWtvZXBwZQoJICAgKiBTV0lHX1R5cGVRdWVyeSBmcm9tIGNvbW1vbi5zd2cgbm93IHJldHVybnMgYQoJICAgc3dpZ190eXBlX2luZm8qIHJhdGhlciB0aGFuIGEgdm9pZCouICBUaGlzIGZpeGVzIGEgcHJvYmxlbQoJICAgd2hlbiB1c2luZyBwb2ludGVyLmkgYW5kIEMrKywgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIG5ldwoJICAgdGVzdC1zdWl0ZSBleGFtcGxlIHBlcmw1L3BvaW50ZXItY3h4LgoJICAgKiBQb3J0YWJpbGl0eSBmaXhlcyAoY29uc3QgY2hhciAqKS4gCgkgICAqIEluY29ycG9yYXRlZCBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4sIHdoaWNoIG1ha2Ugc3dpZyBydW5uYWJsZSBvbiBjeWd3aW4uCgo2LzE5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgU0YgYnVnICMyMTExNDQuIFRoaXMgZml4IGlzIGEgd29ya2Fyb3VuZCAKCSAgICAgdW50aWwgZml4ZWQgaW4gdGhlIGNvcmUuCgo2LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogUG9ydGFiaWxpdHkgZml4ZXMgZm9yIHVzZSB3aXRoIHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycy4gCgkgICAqIFtUY2xdOiBQb3J0YWJpbGl0eSBmaXggKGNvbnN0IGNoYXIgKikuCgkgICAqIFtUY2xdOiBDb25maWd1cmUgbm93IGZpcnN0IHRyaWVzIHRvIGZpbmQgYSB0Y2xDb25maWcuc2gKCSAgIGZpbGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgVGNsIGluY2x1ZGUgZGlyZWN0b3J5LCBsaWJyYXJ5CgkgICBsb2NhdGlvbiBhbmQgbGlicmFyeSBuYW1lLgoJICAgKiBbUHl0aG9uXTogQWRkZWQgYSBmZXcgcG9zc2libGUgbGlicmFyeSBsb2NhdGlvbnMuCgo2LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRG9uJ3QgY2FsbCBzY21fY19leHBvcnQgaWYgbm90aGluZyBpcyB0byBiZQoJICAgICBleHBvcnRlZC4gIERvbid0IHdhcm4gb24gJW1vZHVsZSBpZiBtb2R1bGUgaGFzIGJlZW4gc2V0CgkgICAgIGFscmVhZHkgKHRoaXMgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiAlaW1wb3J0IGlzIHVzZWQpLgoKNi8xNi8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IE5ldyAicGFzc2l2ZSIgbGlua2FnZSwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgZm9yCgkgICAgIG11bHRpLW1vZHVsZSBleHRlbnNpb25zIHdpdGhvdXQgR3VpbGUgbW9kdWxlIG1hZ2ljLgoKNi8xNS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEZpeGVkIHByaW50aW5nIG9mIHNtb2JzIChzcGFjZSBhbmQgYW5nbGUgd2VyZQoJICAgICBtaXNzaW5nKS4gCgkgICAqIFByb3Blcmx5IGdlbmVyYXRlIHR5cGUgaW5mb3JtYXRpb24gZm9yIGJhc2UgY2xhc3NlcwoJICAgICBpbXBvcnRlZCB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoYW5rcyB0byBNYXJjZWxvCgkgICAgIE1hdHVzIDxtbWF0dXNAYWNtcy5hcml6b25hLmVkdT4gZm9yIHRoZSByZXBvcnQgYW5kIHRoZQoJICAgICBwYXRjaDsgdGhpcyBjbG9zZXMgU0YgYnVnICMyMzE2MTk7IHNlZSBhbHNvCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvaW1wb3J0Ki4gCgkgICAqIFtHdWlsZV06IEZpeCBjYXN0aW5nIGJldHdlZW4gY2xhc3MgYW5kIGJhc2UgY2xhc3M7IHRoZQoJICAgICBydW50aW1lIHR5cGUgc3lzdGVtIGhhZCBpdCB0aGUgd3Jvbmcgd2F5IGFyb3VuZDsgc2VlCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvY2FzdHMuaQoJICAgKiBNYWtlIHR5cGVtYXBzIGZvciBTV0lHUE9JTlRFUiAqIHdpdGggYXJnIG5hbWUgdGFrZQoJICAgICBwcmVjZWRlbmNlIG92ZXIgdGhvc2Ugd2l0aG91dCBhcmcgbmFtZSwgdG8gbWF0Y2ggbm9ybWFsCgkgICAgIHR5cGVtYXAgcHJlY2VkZW5jZSBydWxlcy4KCSAgICogRml4ZWQgdGhlIHJhbmRvbS1saW5lLW51bWJlcnMgcHJvYmxlbSByZXBvcnRlZCBhcyBTRiBidWcKCSAgICAgIzIxNzMxMDsgdGhhbmtzIHRvIE1pY2hhZWwgU2NoYXJmIDxzY2hhcmZAdXNlcnMuc2YubmV0Pi4KCSAgICogW0d1aWxlXTogSGFuZGxlIHRoZSAlbmFtZSBhbmQgJXJlbmFtZSBkaXJlY3RpdmVzLgoJICAgKiBOZXcgc3ludGF4OiAlbmFtZSBhbmQgJXJlbmFtZSBub3cgb3B0aW9uYWxseSB0YWtlIGRvdWJsZQoJICAgICBxdW90ZXMgYXJvdW5kIHRoZSBzY3JpcHRpbmcgbmFtZS4gIFRoaXMgaXMgdG8gYWxsb3cgc2NyaXB0aW5nCgkgICAgIG5hbWVzIHRoYXQgYXJlbid0IHZhbGlkIEMgaWRlbnRpZmllcnMuCgo2LzE0LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWRlIGEgbWlub3IgY2hhbmdlIHRvIHRoZSB3YXkgZmlsZXMgYXJlIGxvYWRlZCBpbgogICAgICAgICAgIG9yZGVyIHRvIGdldCBmaWxlL2xpbmUgbnVtYmVyIHJlcG9ydGluZyBjb3JyZWN0IGluCiAgICAgICAgICAgdGhlIHByZXByb2Nlc3Nvci4KCjYvMTQvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyB0aGUgKG5vbi1zdGFuZGFyZCkgImxvbmcgbG9uZyIKCSAgICAgdHlwZXMuIEl0IGlzIHVwIHRvIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgdG8KCSAgICAgcHJvdmlkZSB0eXBlbWFwcyBpZiBuZWVkZWQuIFJlcG9ydGVkIGJ5IFNhbSBTdGVpbmdvbGQsIFNGCgkgICAgIGJ1ZyAjNDI5MTc2LgoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyBhcmd1bWVudHMgbGlrZSAiY29uc3QgaW50ICoKCSAgICAgY29uc3QgaSIuIFRoaXMgZml4ZXMgU0YgYnVnICMyMTU2NDkuCgkgICAqIEZpeGVkIHRoZSBHdWlsZSB0ZXN0LXN1aXRlLgoKNi8xMy8yMDAxOiBta29lcHBlCgkgICBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuayBhdCB0YWcKCSAgICJta29lcHBlLW1lcmdlLTEiLiBUaGlzIGNvdmVycyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Cgp8IDAxLzE2LzAxOiB0dG4KfAkgICBXcm90ZSB0YWJsZSBvZiBjb250ZW50cyBmb3IgRG9jL2VuZ2luZWVyaW5nLmh0bWwuICBBZGRlZCBzZWN0aW9uCnwJICAgb24gQ1ZTIHRhZ2dpbmcgY29udmVudGlvbnMuICBBZGRlZCBjb3B5cmlnaHQgdG8gb3RoZXIgZG9jcy4KfCA5LzI1LzAwIDogYmVhemxleQp8IAkgICBNb2RpZmllZCB0aGUgcHJlcHJvY2Vzc29yIHNvIHRoYXQgbWFjcm8gbmFtZXMgY2FuIHN0YXJ0IHdpdGggYSAnJScuCnwgCSAgIFRoaXMgbWF5IGFsbG93IG5ldyBTV0lHICJkaXJlY3RpdmVzIiB0byBiZSBkZWZpbmVkIGFzIG1hY3JvcyBpbnN0ZWFkCnwgCSAgIG9mIGhhdmluZyB0byBiZSBoYXJkLWNvZGVkIGludG8gdGhlIHBhcnNlci4gIAp8CnwgKioqIEFsc28gYSB5ZXQtdG8tYmUtZG9jdW1lbnRlZCBxdW90aW5nIG1lY2hhbmlzbSB3aXRoIGJhY2txdW90ZXMKfCAqKiogaGFzIGJlZW4gaW1wbGVtZW50ZWQ/Cgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAqIFdoZW4gY29uZmlndXJlIGRvZXMgbm90IGZpbmQgYSBsYW5ndWFnZSwgZG9uJ3QgdXNlIGRlZmF1bHQKCSAgIHBhdGhzIGxpa2UgL3Vzci9sb2NhbC9pbmNsdWRlOyB0aGlzIG9ubHkgY2F1c2VzIGJ1aWxkCgkgICBwcm9ibGVtcy4KCSAqIE5ldyBkaXJlY3Rvcnk6IEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUsIHdoZXJlIGEgZmV3CgkgICBidWdzIGluIDEuM2E1IGFyZSBkZW1vbnN0cmF0ZWQuIAoJICogSGFuZGxlIEMrKyBtZXRob2RzIHRoYXQgaGF2ZSBib3RoIGEgImNvbnN0IiBhbmQgYSAidGhyb3ciCgkgICBkaXJlY3RpdmUgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL2NwbHVzcGx1cy10aHJvdy5pKTsgCgkgICB0aGFua3MgdG8gU2NvdHQgQi4gRHJ1bW1vbmRzIGZvciB0aGUgcmVwb3J0IGFuZCB0aGUgZml4LiAKCSAqIEhhbmRsZSBDKysgcG9pbnRlci1yZWZlcmVuY2UgYXJndW1lbnRzIChsaWtlICJpbnQgKiYgYXJnIikgCgkgICAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvcG9pbnRlci1yZWZlcmVuY2UuaSwKCSAgIHJlcG9ydGVkIGFzIFNGIGJ1ZyAjNDMyMjI0KS4KCSAqIFtSdWJ5XSBGaXhlZCB0eXBvIGluIHJ1YnlkZWMuc3dnOyB0aGFua3MgdG8gTHlsZSBKb2huc29uIQoJICogRG9uJ3Qgc3RvcCB0ZXN0aW5nIHdoZW4gb25lIHRlc3QgZmFpbHMuCgkgKiBbR3VpbGUsIE16U2NoZW1lXSBEb24ndCBwcmludCAiR2VuZXJhdGluZyB3cmFwcGVycy4uLiIuCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVkVDVE9STEVOSU5QVVQgYW5kIExJU1RMRU5JTlBVVCBub3cgaGF2ZSBzZXBhcmF0ZQoJICAgbGlzdCBsZW5ndGggdmFyaWFibGVzLiBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUCgkgICBhdHRhY2hlcyBhcmd1bWVudCBkb2N1bWVudGF0aW9uIGludm9sdmluZyBTQ01fVFlQRSB0byB0aGUKCSAgIHN0YW5kYXJkIHBvaW50ZXIgdHlwZW1hcHMuIElOT1VUIGlzIG5vdyBhbiBhbGlhcyBmb3IgQk9USC4KCjYvMTIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBTb21lIEphdmEgZG9jdW1lbnRhdGlvbiBhZGRlZC4KCSAgIFtKYXZhXSBGaXhlZCBidWdzIGluIGltcG9ydCBwcmFnbWEgYW5kIHNoYWRvdyBwcmFnbWEuIAoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBGaXggZGVjbGFyYXRpb25zIG9mIFNXSUdfZGVmaW5lX2NsYXNzCgkgICAoTGliL3J1YnkvcnVieWRlYy5zd2cpIGFuZCBTV0lHX1R5cGVRdWVyeQoJICAgKExpYi9jb21tb24uc3dnKS4gVGhhbmtzIHRvIEx5bGUgSm9obnNvbgoJICAgPGxqb2huc29uQHJlc2dlbi5jb20+IGZvciB0aGUgcGF0Y2hlcy4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBVc2UgbG9uZyBpbnN0ZWFkIG9mIHNjbV9iaXRzX3Q7IHRoaXMgbWFrZXMgdGhlCgkgICBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGNvbXBhdGlibGUgd2l0aCBHdWlsZSAxLjMuNAoJICAgYWdhaW4uIFRoYW5rcyB0byBNYXNha2kgRnVrdXNoaW1hIGZvciBwb2ludGluZyB0aGlzIG91dC4KCjYvMTEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBUaGUgZ2VuZXJpYyBJTlNUQUxMIGZpbGUgZnJvbSBhdXRvY29uZiBhZGRlZC4gRmV3IGNoYW5nZXMgdG8gUkVBRE1FIGZpbGUuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIEZpeGVkIHR5cG8gaW4gTWFrZWZpbGUuaW47IHRoYW5rcyB0byBHcmVnIFRyb3hlbAoJICAgPGdkdEBpci5iYm4uY29tPi4gCgo2LzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgbWFrZSBjaGVjayB3b3JrcyBhZ2Fpbi4gRXhhbXBsZXMvR0lGUGxvdCBjb25maWd1cmUgZ2VuZXJhdGVkIGJ5CgkgICB0b3AgbGV2ZWwgYXV0b2NvbmYgbm93LgoKNi8wOC8yMDAxOiBta29lcHBlCgkgICBBbm90aGVyIGJ1aWxkIGNoYW5nZTogVGhlIG5ldyBzY3JpcHQgYXV0b2dlbi5zaCBydW5zCgkgICBhdXRvY29uZiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMuICBUaGUgdG9wLWxldmVsCgkgICBjb25maWd1cmUgYWxzbyBjb25maWd1cmVzIGluIEV4YW1wbGVzL0dJRlBsb3QuCgo2LzA3LzIwMDE6IG1rb2VwcGUKCSAgIE1hZGUgdGhlIE1ha2VmaWxlIHdvcmsgd2l0aCBub24tR05VIG1ha2UgYWdhaW4uCgo2LzA3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIENsYXNzL3N0cnVjdCBtZW1iZXJzIHRoYXQgYXJlIGFycmF5cyBvZiBwb2ludGVycyB0byBjbGFzc2VzL3N0cnVjdHMgLQoJICAgU2hhZG93IGNsYXNzJ3MgZ2V0L3NldCBhY2Nlc3NvcnMgbm93IHVzZSBKYXZhIGNsYXNzZXMgaW5zdGVhZCBvZiBsb25ncyAocG9pbnRlcnMpLgoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIHdpbGwgbm93IGNsZWFuIHVwIG1lbW9yeSBpZiBmdW5jdGlvbiByZXR1cm4gdHlwZSAKCSAgIGlzIGEgY2xhc3Mvc3RydWN0LgoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMuCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIE5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBhbGxvd3MgZm9yCgkgICBhdHRhY2hpbmcgYSBzdWZmaXggdG8gdGhlIHN3aWcgYmluYXJ5IGFuZCB0aGUgc3dpZyBydW50aW1lCgkgICBsaWJyYXJpZXMuICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICAic3dpZwoJICAgLXN3aWdsaWIiIHdvcmtzIGFnYWluLiAgSWYgaW52b2tlZCB3aXRoIHRoZSBuZXcgb3B0aW9uCgkgICAiLWxkZmxhZ3MiLCBTV0lHIHByaW50cyBhIGxpbmUgb2YgbGlua2VyIGZsYWdzIG5lZWRlZCB0bwoJICAgbGluayB3aXRoIHRoZSBydW50aW1lIGxpYnJhcnkgb2YgdGhlIHNlbGVjdGVkIGxhbmd1YWdlCgkgICBtb2R1bGUuIAoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIGdzd2lnX2xpc3RfcCBpcyBhbiBpbnQsIG5vdCBhIFNDTS4gIFRoaXMgdHlwbwoJICAgY2F1c2VkIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuIEluIElOUFVUIGFuZCBCT1RIIHR5cGVtYXBzCgkgICBnZW5lcmF0ZWQgYnkgdGhlIFNJTVBMRV9NQVAgbWFjcm8sIHVzZSB0aGUgU0NNX1RPX0MKCSAgIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBHdWlsZSB0byBDIChyYXRoZXIgdGhhbiBDX1RPX1NDTSkuCgkgICBVc2Ugc2NtX2ludHByaW50IHRvIHByaW50IHBvaW50ZXJzIChyYXRoZXIgdGhhbgoJICAgc3ByaW50ZikuIEFsbG93IHVzaW5nICItbGlua2FnZSIgaW5zdGVhZCBvZiAiLUxpbmthZ2UiLiAKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gTW9kcyBmb3IgdXNpbmcgaW5oZXJpdGVkIGMrKyBjbGFzc2VzIGZyb20gSmF2YQoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCBjbGFzcyBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcwoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBkZXN0cnVjdG9yIChfZGVsZXRlKCkpIHdhcyBub3QgYXdhcmUgb2YgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgbm90IGtub3cgYWJvdXQgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgZXh0ZW5kIGV2ZW4gd2hlbiB0aGUgYmFzZWNsYXNzIHdhcyBub3Qga25vd24gdG8gc3dpZwoJICAgW0phdmFdIHNvbWV0aW1lcyBlbnVtLWRlY2xhcmF0aW9ucyBvY2N1cmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzMvMDAgIDogdHRuCiAgICAgICAgICBBZGRlZCBpbnN0cnVjdGlvbnMgZm9yIG1haW50YWluZXJzIGluIEV4YW1wbGVzL1JFQURNRSBvbiBob3cKICAgICAgICAgIHRvIG1ha2UgZXhhbXBsZXMgYWxzbyBiZSB1c2VmdWwgaW4gdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICAgQWxzbywgIm1ha2UgY2hlY2siIG5vdyB1c2VzIC4vTGliIGJ5IHZpYSBlbnYgdmFyIGBTV0lHX0xJQicuCiAgICAgICAgICBUaGlzIGlzIG92ZXJyaWRhYmxlIGxpa2Ugc286CiAgICAgICAgICAgICBtYWtlIGNoay1zd2lnbGliPS9teS9leHBlcmltZW50YWwvc3dpZy9MaWIgY2hlY2sKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAkdHlwZW1hcCB2YXJpYWJsZSB0byB0eXBlbWFwcy4gIFRoaXMgZ2V0cyByZXBsYWNlZCB3aXRoCiAgICAgICAgICBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlbWFwIHRoYXQgaXMgYXBwbGllZC4gIEZlYXR1cmUKICAgICAgICAgIHJlcXVlc3QgZnJvbSByc2Fsei4KCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBFeHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdmlydHVhbAogICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIHR3byBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgQSgpIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNsYXNzIEIoKSA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgU3dpZyBub3cgd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGlzCgogICAgICAgICAgICAgICAgQV9mb28oQSAqYSkgewogICAgICAgICAgICAgICAgICAgIGEtPmZvbygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGFuZCB1c2UgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGJvdGggQV9mb28oKSBhbmQgQl9mb28oKS4KICAgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgaWYgYm90aCBtZXRob2RzIGFyZSBkZWNsYXJlZAogICAgICAgICAgYXMgdmlydHVhbCBhbmQgYm90aCB0YWtlIGlkZW50aWNhbCBwYXJhbWV0ZXJzLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlc3RvcmVkIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAgZm9yIHNldHRpbmcgc3RydWN0dXJlIG1lbWJlcnMuCiAgICAgICAgICBVbmxpa2UgdGhlIG9sZCB2ZXJzaW9uLCB0aGUgbmV3IHZlcnNpb24gaXMgZXhwYW5kZWQgaW5saW5lIGluIHRoZQogICAgICAgICAgd3JhcHBlciBmdW5jdGlvbiBhbGxvd2luZyBhY2Nlc3MgdG8gc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBpbnRlcm5hbHMgKGEgc29tZXRpbWVzIHJlcXVlc3RlZCBmZWF0dXJlKS4gVGhlICJtZW1iZXJvdXQiIHR5cGVtYXAKICAgICAgICAgIGlzIGdvbmUuIFVzZSB0aGUgIm91dCIgdHlwZW1hcHMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBzZXQgbWV0aG9kcyBubyBsb25nZXIgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIG1lbWJlci4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBub3cgZ2V0cyBzZXQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgdm9pZCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgIGYtPnggPSB4OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiBTV0lHMS4xIGl0IHVzZWQgdG8gYmUgdGhpczoKCiAgICAgICAgICAgICAgaW50IEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYtPnggPSB4KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGR1ZSB0byB0aGUgY29tcGxleGl0eSBjcmVhdGVkIGJ5IHRyeWluZwogICAgICAgICAgdG8gZG8gdGhpcyB3aXRoIG1vcmUgZXhvdGljIGRhdGF0eXBlcyBzdWNoIGFzIGFycmF5cy4gIEl0IGFsc28KICAgICAgICAgIGNvbXBsaWNhdGVzIGlubGluaW5nIGFuZCBoYW5kbGluZyBvZiB0aGUgIm1lbWJlcmluIiB0eXBlbWFwLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgcHRyY2FzdCgpIGFuZCBwdHJtYXAoKSBmdW5jdGlvbnMgZnJvbSB0aGUKICAgICAgICAgIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBPbGQgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG5ldyB0eXBlIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKm5hbWUpIGFkZGVkLgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHRoZSB0eXBlIGluZm8gc3RydWN0dXJlCiAgICAgICAgICB0aGF0IGlzIHVzZWQgZm9yIHR5cGUtY2hlY2tpbmcuICBJdCB3b3JrcyB3aXRoIGVpdGhlciB0aGUKICAgICAgICAgIG5pY2UgQyBuYW1lIG9yIG1hbmdsZWQgdmVyc2lvbiBvZiBhIGRhdGF0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJpbnQgKiIpOwogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJfcF9pbnQiKTsKCiAgICAgICAgICBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IHNvbWUKICAgICAgICAgIGV4b3RpYyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZQogICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlIG9iamVjdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IGRpcmVjdGl2ZSAldHlwZXMoKSBhZGRlZC4gIFRoaXMgaXMgdXNlZCB0bwogICAgICAgICAgZXhwbGljaXRseSBsaXN0IGRhdGF0eXBlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZS1jaGVja2luZyBjb2RlLiBOb3JtYWxseSBpdCBpcyBuZXZlcgogICAgICAgICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGJ1dCBzb21ldGltZXMgYWR2YW5jZWQgZXh0ZW5zaW9ucwogICAgICAgICAgKHN1Y2ggYXMgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5KSBtYXkgbmVlZCB0byBtYW51YWxseQogICAgICAgICAgYWRkIHR5cGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzAwIDogYmVhemxleQogICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygc3RyaW5nIGFycmF5IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCiAgICAgICAgICBhIGdsb2JhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSAiY2hhciBuYW1lWzY0XSIgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgbWFuYWdlZCBhcyBhIDY0IGNoYXJhY3RlciBzdHJpbmcuICBQcmV2aW91c2x5IHRoaXMgZGlkbid0CiAgICAgICAgICB3b3JrIGF0IGFsbCBvciByZXF1aXJlZCB0aGUgdXNlIG9mIGEgc3BlY2lhbCB0eXBlbWFwLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFIChUY2wsIFBlcmwsIFB5dGhvbikgKioqCgo4LzMxLzAwIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCBgY2hlY2stYysrLWV4YW1wbGVzJywgd2hpY2ggdXNlcyBuZXcKCSAgZmlsZXMgdW5kZXIgRXhhbXBsZXMvQysrIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuICBOb3cgIm1ha2UKCSAgY2hlY2siIGFsc28gZG9lcyAibWFrZSBjaGVjay1jKystZXhhbXBsZXMiLiAgQWxzbywgZXhwYW5kZWQKCSAgYWN0aW9ucyBpbiBgY2hlY2stZ2lmcGxvdC1leGFtcGxlJyBhbmQgYGNoZWNrLWFsaXZlbmVzcycuCgo4LzMwLzAwIDogbWtvZXBwZQoJICBNYWpvciBjbGVhbi11cCBpbiB0aGUgR3VpbGUgbW9kdWxlLiBBZGRlZCB0eXBlbWFwLWRyaXZlbgoJICBkb2N1bWVudGF0aW9uIHN5c3RlbS4gQ2hhbmdlZCB0byBoYW5kbGUgbW9yZSB0aGFuIDEwCgkgIGFyZ3MuIFVwZGF0ZWQgYW5kIGV4dGVuZGVkIGV4YW1wbGVzLgoJICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVpbnNlcnQgZGlyZWN0aXZlIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBpbnRvIGEgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IHdyYXBwZXIgZmlsZS4gIFRoaXMgaXMgb25seSBpbnRlbmRlZAogICAgICAgICAgZm9yIHVzZSBieSB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXb3JrcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXJzKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChydW50aW1lKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydCh3cmFwcGVycykgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChpbml0KSAgICAgImZpbGUuc3dnIjsKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVydW50aW1lIGRpcmVjdGl2ZSB3aGljaCBpbmNsdWRlcyBjb2RlIGludG8gdGhlIHJ1bnRpbWUKICAgICAgICAgIHBvcnRpb24gb2YgdGhlIHdyYXBwZXIgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVydW50aW1lICV7CiAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgaW50ZXJuYWwgcnVudGltZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgVGhlcmUgaXMgbm8gcHJhY3RpY2FsIHJlYXNvbiBmb3Igb3JkaW5hcnkgdXNlcnMgdG8gdXNlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgKGFsbW9zdCBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHVzaW5nICV7IC4uLiAlfQogICAgICAgICAgaW5zdGVhZCkuICAgSG93ZXZlciwgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzIG1heSB3YW50IHRvCiAgICAgICAgICB1c2UgdGhpcyBpbiBsYW5ndWFnZSBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZyBsaXRlcmFscyBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICIkdGFyZ2V0ID0gU3ZJVigkc291cmNlKTsiOwoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWx5IGNvbXBpbGUgZXhwZXJpbWVudGFsIGNvZGUgd2l0aCAtLWVuYWJsZS1leHBlcmltZW50CgkgIGNvbmZpZ3VyZSBmbGFnLgoJICBGaXggLmN2c2lnbm9yZSB0byBpZ25vcmUgY29uZmlncnVlICYgeWFjYyBnZW5lcmF0ZWQgZmlsZXMKCjEvMjgvMDAgOiBsb2ljCgkgIEFwcGx5IGF1dG9tYWtlIGV2ZXJ5d2hlcmUKCSAgS2VlcCBjb25maWd1cmUgc2NyaXB0cyBzbyB0aGF0IHBlb3BsZSBhcmUgbm90ICpmb3JjZWQqIHRvIGF1dG9jb25mCiAgICAgICAgICBLZWVwIHNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHlhY2Mgc28gdGhhdCBjb21waWxhdGlvbiB3aXRob3V0IHlhY2MKCSAgaXMgcG9zc2libGUuCgkgIFNvdXJjZS9MUGFyc2UvY3NjYW5uZXIuYzogY2hhbmdlIGx5YWNjLmggaW50byBwYXJzZXIuaCB0byBwbGVhc2UKCSAgZGVmYXVsdCB5YWNjIGdlbmVyYXRpb24gcnVsZXMuCgkgIFVzZSBBQ19DT05GSUdfU1VCRElSUyBpbiBjb25maWd1cmUuaW4gaW5zdGVhZCBvZiBoYW5kIG1hZGUgc2NyaXB0LgoJICBVcGRhdGUgYWxsIHJlbGV2YW50IC5jdnNpZ25vcmUgdG8gaW5jbHVkZSAuZGVwcwoJICBGaXhlZCBtaXNzaW5nIDsgbGluZSAxMzYgU291cmNlL1N3aWcvc3dpZy5oCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBudW1iZXIgb2YgbWlub3IgZW5kLW9mLWZpbGUgcGFyc2luZyBwcm9ibGVtcyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtZnJlZXplIG9wdGlvbiB0aGF0IGZvcmNlcyBTV0lHIHRvIGZyZWV6ZSB1cG9uIGV4aXQuCiAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIGRlYnVnZ2luZyB0b29sIHNvIHRoYXQgSSBjYW4gbW9yZQogICAgICAgICAgZWFzaWx5IGV4YW1pbmUgU1dJRydzIG1lbW9yeSBmb290cHJpbnQuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gZ3VpbGUgbW9kdWxlIGZvciBzdXBwb3J0aW5nIG9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGlldGVyIEJhcm9uLgoKMS8xMy8wMCA6IGxvaWMKCSAgQWRkZWQgLmN2c2lnbm9yZSwgRXhhbXBsZXMvLmN2c2lnbm9yZSwgU291cmNlL0RPSC9Eb2gvLmN2c2lnbm9yZQoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogRml4ZWQgLUkgaGFuZGxpbmcgYnVnCgkgIFNvdXJjZS9Nb2R1bGVzMS4xL2phdmEuY3h4OiBmaXhlZCBjaGFyKiAtPiBjb25zdCBjaGFyKiB3YXJuaW5ncyB0aGF0IGFyZQoJICBlcnJvcnMgd2hlbiBjb21waWxpbmcgd2l0aCBnY2MtMi45NS4yCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBjYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIGZvciBTdHJpbmdfcmVwbGFjZQoJICB0b2tlbiBhbmQgcmVwIHNob3VsZCByZWFsbHkgYmUgY29uc3QuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgSGFyY28ncyBKYXZhIG1vZHVsZXMuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmV2b2tlZCB0aGUgJWlmZGVmLCAlaWZuZGVmLCAlZW5kaWYsICVpZiwgJWVsaWYsIGFuZCAlZWxzZQogICAgICAgICAgZGlyZWN0aXZlcy4gIFRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGFzIFNXSUcgbm93IGhhcyBhIHJlYWwKICAgICAgICAgIHByZXByb2Nlc3Nvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vdmVkIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVsZXMgZnJvbSB0aGUgU1dJRyBkaXJlY3RvcnkKICAgICAgICAgIHRvIHRoZSBNb2R1bGVzIGRpcmVjdG9yeSAod2hlcmUgdGhleSByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdG8gYmVnaW4gd2l0aCkuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXN0YXQgb3B0aW9uIGZvciBwcmludGluZyBzdGF0aXN0aWNzLiBUaGUKICAgICAgICAgIHN0YXRpc3RpY3MgcmVwb3J0aW5nIHdhcyBpbmFkZXF1YXRlIGFuZCBtb3N0bHkgYnJva2VuCiAgICAgICAgICBhbnl3YXkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtdCBvcHRpb24gZm9yIHJlYWRpbmcgYSB0eXBlbWFwIGZpbGUuICBNb3JlCiAgICAgICAgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gIEp1c3QgaW5jbHVkZSB0eXBlbWFwcyBhdCB0aGUgdG9wCiAgICAgICAgICBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAlY2hlY2tvdXQgZGlyZWN0aXZlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLWNpIG9wdGlvbiBmb3IgZmlsZSBjaGVja2luLiAgIFRvbyBwcm9ibGVtYXRpYwogICAgICAgICAgdG8gaW1wbGVtZW50LiAgUHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgcHV0IHlvdXIgU1dJRyBsaWJyYXJ5CiAgICAgICAgICB1bmRlciBDVlMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWxldGVkIHRoZSBMQVRFWCBtb2R1bGUuICBTb3JyeS4uLiBEaWRuJ3Qga25vdyBhbnlvbmUKICAgICAgICAgIHdobyB3YXMgdXNpbmcgaXQuICBCZXNpZGVzLCBJJ20gbG9va2luZyB0byBzaW1wbGlmeQogICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24gbW9kdWxlIHRvIHVzZSBhIC50eHQKICAgICAgICAgIHN1ZmZpeCBmb3IgaXRzIG91dHB1dCBmaWxlIGluc3RlYWQgb2YgLmRvYy4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgbG9uZy1sb3N0IFNXSUcgcHJlcHJvY2Vzc29yIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAgICAgICAgIEl0IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBSYXcgcHJlcHJvY2Vzc2VkIG91dHB1dAogICAgICAgICAgY2FuIGJlIHZpZXdlZCB1c2luZyBzd2lnIC1FIGZpbGUuaS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5IGFuZCBkam1pdGNoZQogICAgICAgICAgQ29tcGxldGVseSByZW9yZ2FuaXplZCB0aGUgU1dJRyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCiAgICAgICAgICBiYXNpYyBvcmdhbml6YXRpb24gaXMgbm93OgoKICAgICAgICAgICAgICAgIFNvdXJjZS8gICAgICAgICBTV0lHIHNvdXJjZSBjb2RlCiAgICAgICAgICAgICAgICBMaWIvICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIChzd2lnX2xpYikKICAgICAgICAgICAgICAgIERvYy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICBFeGFtcGxlcy8gICAgICAgRXhhbXBsZXMKCiAgICAgICAgICBNb3JlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgoKMTIvMDgvOTk6IExvaWMgRGFjaGFyeSAobG9pY0BzZW5nYS5vcmcpCgkgIEVuaGFuY2VkIHBhY2thZ2UgaGFuZGxpbmcgZm9yIHBlcmw1IGFuZCBjKysuCgoJICBXaXRoIG5ldyBvcHRpb24gLWhpZGUgRm9vOjpCYXIsIGV2ZXJ5IHBlcmw1IG9iamVjdCAoRnJvYikgaXMKCSAgcXVhbGlmaWVkIGJ5IEZvbzo6QmFyOjpGcm9iLiBUaGUgcGFja2FnZSBuYW1lIGlzIHNvbGVseSB1c2VkCgkgIHRvIGVuY2Fwc3VsYXRlIEMvQysrIHdyYXBwZXJzIG91dHB1dCBpbiA8bW9kdWxlPl93cmFwLmMgYW5kIHRoZQoJICBjb3JyZXNwb25kaW5nIHBlcmwgcGFja2FnZSBpbiA8bW9kdWxlPi5wbS4gTm90ZSB0aGF0IGEgcGFja2FnZQoJICBuYW1lIG1heSBjb250YWluIDo6IChGcm9iOjpOaXR6KSBhbmQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUKCSAgcGFja2FnZSBuYW1lIHByb3ZpZGVkIGJ5IC1oaWRlIChGb286OkJhcjo6RnJvYjo6Tml0eikuCgoJICBJbiAqX3dyYXAuYywgU1dJR19pbml0IG1hY3JvIGlzIHVzZWQuIFdhcyBwcmV2aW91c2x5IGRlZmluZWQKCSAgYnV0IG5vdCB1c2VkIGFuZCBzaW1wbGlmaWVzIGNvZGUuCgoJICBBZGRlZCB0eXBlbWFwKHBlcmw1LHBlcmw1aW4pIGFuZCB0eXBlbWFwKHBlcmw1LHBlcmw1b3V0KSB0aGF0CgkgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHR5cGVtYXAocGVybDUsaW4pIGFuZCB0eXBlbWFwKHBlcmw1LG91dCkKCSAgYnV0IGNvbnRhaW4gcGVybCBjb2RlIGFuZCBhcHBsaWVzIHRvIHdyYXBwZXJzIGdlbmVyYXRlZCBieQoJICAtc2hhZG93LgoKCSAgTGFja2luZyBwcm9wZXIgcmVncmVzc2lvbiB0ZXN0cyBJIHVzZWQKCSAgRXhhbXBsZXMvcGVybDUve2MrKyxjb25zdHJhaW50LGRlZmFyZyxleGNlcHQsCgkgIGdyYXBoL2dyYXBoWzEyMzRdLG11bHRpbmhlcml0LG5lc3RlZCxzaGFkb3csc2ltcGxlLHRyZWUsCgkgIHR5cGVtYXBzL3thcmd2LGFyZ3YyLGFycmF5bWVtYmVyLGRhdGFiYXNlLGZpbGUsaWdub3JlLGludGVnZXIsCgkgIG91dHB1dCxwYXNzcmVmLHJlZmVyZW5jZSxyZXR1cm59fS8uIEkgcmFuIHN3aWcgd2l0aCBhbmQgd2l0aG91dAoJICB0aGUgcGF0Y2hlcywgZGlmZiB0aGUgZ2VuZXJhdGVkc291cmNlcywgcnVuIHRoZSAucGwgZmlsZXMKCSAgYW5kIGNoZWNrZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLiBJbiBhbGwgdGhvc2UgZXhhbXBsZXMKCSAgSSBoYWQgbm8gZXJyb3IuCgoxMS8yMS85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gcHJvdmlkZSBmdWxsIHZhcmlhYmxlIGxpbmtpbmcgY2FwYWJpbGl0aWVzCiAgICAgICAgICB0byBhbGwgZGF0YXR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICB3ZXJlIGNyZWF0ZWQgZm9yIGRhdGF0eXBlcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVGNsX0xpbmtWYXIoKSBmdW5jdGlvbi4KICAgICAgICAgIE5vdywgd2Ugc2ltcGx5IHVzZSB2YXJpYWJsZSB0cmFjZXMgdG8gc3VwcG9ydCBldmVyeXRoaW5nLiBUaGlzIG1heQogICAgICAgICAgYnJlYWsgc2NyaXB0cyB0aGF0IHJlbHkgdXBvbiB0aGUgb2xkZXIgYmVoYXZpb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzk5OiBBZGRlZCBzbGlnaHQgdHdlYWsgdG8gd3JhcHBlciBnZW5lcmF0b3IgdG8gY29sbGVjdCBsb2NhbCB2YXJpYWJsZXMKICAgICAgICAgIG9mIHNpbWlsYXIgdHlwZS4gIFByb2R1Y2VzIHNvbWV3aGF0IG1vcmUgY29tcGFjdCB3cmFwcGVyIGNvZGUuCgoxMS8yMC85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gdXNlIFNXSUdfR2V0QXJncygpIHRvIHBhcnNlCiAgICAgICAgICBhcmd1bWVudHMuICAgIFRoaXMgaXMgYSB0ZWNobmlxdWUgYm9ycm93ZWQgZnJvbSBQeXRob24gaW4gd2hpY2gKICAgICAgICAgIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHVzaW5nIGEgZm9ybWF0IHN0cmluZyBjb252ZW50aW9uIHNpbWlsaWFyCiAgICAgICAgICB0byBmcHJpbnRmKCkuICAgVGhpcyByZXN1bHRzIGluIGEgKnN1YnN0YW50aWFsKiByZWR1Y3Rpb24gaW4gdGhlCiAgICAgICAgICBzaXplIG9mIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIHdpdGggb25seSBhIG1vZGVzdCBydW50aW1lIG92ZXJoZWFkCiAgICAgICAgICBpbiBnb2luZyB0aHJvdWdoIHRoZSBleHRyYSBjb252ZXJzaW9uIGZ1bmN0aW9uLgoKMTEvMTMvOTk6IENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgY2xhc3Mvc3RydWN0dXJlIGdlbmVyYXRpb24gY29kZSBmb3IgdGhlCiAgICAgICAgICBUY2wgbW9kdWxlLiAgTm93LCBhIHNtYWxsIHNldCBvZiBydW50aW1lIGZ1bmN0aW9ucyBhcmUgdXNlZAogICAgICAgICAgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgY2xhc3NlcyAoaW5zdGVhZCBvZiBhCiAgICAgICAgICBtYXNzaXZlIGFtb3VudCBvZiBydW50aW1lIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGZvciBlYWNoIGNsYXNzKS4KICAgICAgICAgIENsYXNzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHNpbXBseSBlbmNvZGVkIGluIGEgc2VyaWVzIG9mCiAgICAgICAgICBzdGF0aWMgdGFibGVzLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpIVUdFKiByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLS1lc3BlY2lhbGx5IGZvciBDKysuCgoxMS8xMy85OTogUmVtb3ZlZCB0aGUgLXRjbCAoVGNsIDcueCkgbW9kdWxlLiAgVGNsIDguMCBpcyBub3cgc2V2ZXJhbAogICAgICAgICAgeWVhcnMgb2xkIGFuZCB0aGUgZGVmYWN0byBzdGFuZGFyZC0tbm8gcmVhbCByZWFzb24gdG8ga2VlcAogICAgICAgICAgc3VwcG9ydGluZyB0aGUgb2xkIHZlcnNpb24gYXQgdGhpcyBwb2ludC4KCjExLzEzLzk5OiBDbGVhbmVkIHVwIC1jIG9wdGlvbiBmb3IgUHl0aG9uIG1vZHVsZS4gIFRoZSBweWV4cC5zd2cgZmlsZQogICAgICAgICAgaXMgbm93IGdvbmUuCgoxMS8xMy85OTogRml4ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHRvIHdvcmsgYmV0dGVyIHdpdGggc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9uIFdpbmRvd3MuICBTdGF0aWMgbGlua2luZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIGJ5IGRlZmluaW5nCiAgICAgICAgICB0aGUgLURTVEFUSUNfTElOSyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBbGJlcnRvIEZvbnNlY2EuCgoxMS81Lzk5IDogRml4ZWQgYW4gb2JzY3VyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHJlbGF0ZWQgdG8gdGhlIGdlbmVyYXRpb24KICAgICAgICAgIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgIEJ1ZyByZXBvcnRlZCBieSBCcmFkIENsZW1lbnRzLgoKMTEvNS85OSA6IEZpeGVkIGEgZmV3IG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBwdXJpZnkuCgoxMS81Lzk5IDogT2ZmaWNpYWxseSBkZXByZWNhdGVkIHRoZSAtaHRjbCwgLWh0aywgYW5kIC1wbHVnaW4gb3B0aW9ucwogICAgICAgICAgZnJvbSB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxMC8yNi85OTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgZnJvbSBweXRob24vdHlwZW1hcHMuaS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBLZWl0aCBEYXZpZHNvbi4KCjgvMTYvOTkgOiBBZGRlZCBfV0lOMzIgc3ltYm9sIHRvIGxpYnJhcmllcyB0byBiZXR0ZXIgc3VwcG9ydCBXaW5kb3dzLgoKOC8xNi85OSA6IERlcHJlY2F0ZWQgdGhlIFBlcmw0IG1vZHVsZS4gICBJdCBpcyBubyBsb25nZXIgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgICBkaXN0cmlidXRpb24gYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJbiB0aGUgZW50aXJlIDMgeWVhcnMgU1dJRwogICAgICAgICAgaGFzIGJlZW4gYXJvdW5kIEkgbmV2ZXIgcmVjZWl2ZWQgYSBzaW5nbGUgY29tbWVudCBhYm91dCBpdCBzbyBJJ20KICAgICAgICAgIGFzc3VtaW5nIG5vIG9uZSB3aWxsIG1pc3MgaXQuLi4KCjgvMTYvOTkgOiBNb2RpZmllZCB0aGUgdHlwZS1jaGVja2luZyBjb2RlIHRvIHJlZ2lzdGVyIHR5cGUgbWFwcGluZ3MgdXNpbmcgYQogICAgICAgICAgdGFibGUgaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBTV0lHX1JlZ2lzdGVyTWFwcGluZygpLiAgVGhpcwogICAgICAgICAgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNvbWV3aGF0LgoKOC8xNS85OSA6IENsZWFuZWQgdXAgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2luZyBjb2RlIGluIHRoZSBUY2wgbW9kdWxlLgoKOC8xNS85OSA6IE1hbnkgY2hhbmdlcyB0byB0aGUgbGlicmFyaWVzIHRvIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMuCgo4LzEzLzk5IDogRWxpbWluYXRlZCBDKysgY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBleHRlcm4gIkMiIGxpbmthZ2UuCgo4LzEzLzk5IDogU29tZSBjbGVhbnVwIG9mIFB5dGhvbiAuc3dnIGZpbGVzIHRvIGJldHRlciBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICBvbiBXaW5kb3dzLgoKOC8xMy85OSA6IE1vZGlmaWVkIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZSB0byBhdHRhY2ggcHJhZ21hcyBkZWNsYXJlZCBpbnNpZGUKICAgICAgICAgIGEgY2xhc3MgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgJXByYWdtYShweXRob24pIGFkZHRvbWV0aG9kID0gImluc2VydDpwcmludCBgaGVsbG8gd29ybGQnIgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgTW9zdCBwZW9wbGUgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBob3cgdGhpcyB3b3Jrcy4gIEZvciBwZW9wbGUKICAgICAgICAgIHdyaXRpbmcgYmFja2VuZCBtb2R1bGVzLCBjbGFzcy1iYXNlZCBwcmFnbWFzIHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBsYW5nLT5jcHBfb3Blbl9jbGFzcygpICAgICAgICAgICAgIC8vIE9wZW4gYSBjbGFzcwogICAgICAgICAgICAgIGxhbmctPmNwcF9wcmFnbWEoKSAgICAgICAgICAgICAgICAgLy8gU3VwcGx5IHByYWdtYXMKICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgbWVtYmVycwoKICAgICAgICAgICAgICBsYW5nLT5jcHBfY2xvc2VfY2xhc3MoKSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcwoKICAgICAgICAgIEFsbCBvZiB0aGUgcHJhZ21hcyBhcmUgcGFzc2VkIGZpcnN0IHNpbmNlIHRoZXkgbWlnaHQgYmUgdXNlZCB0bwogICAgICAgICAgYWZmZWN0IHRoZSBjb2RlIGdlbmVyYXRpb24gb2Ygb3RoZXIgbWVtYmVycy4gICBQbGVhc2Ugc2VlCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZSBmb3IgYW4gZXhhbXBsZS4gICBQYXRjaGVzIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMy85OSA6IFBhdGNoIHRvIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byBlbGltaW5hdGUgaWdub3JlZAogICAgICAgICAgZXhjZXB0aW9uIGVycm9ycyBpbiBkZXN0cnVjdG9ycy4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMS85OSA6IE1pbm9yIHBhdGNoIHRvIHN3aWdfbGliL3B5dGhvbi9zd2lncHRyLnN3ZyAgKGFkZGVkIFNXSUdTVEFUSUMKICAgICAgICAgIGRlY2xhcmF0aW9uKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEx5bGUgSm9obnNvbi4KCjgvMTEvOTkgOiBBZGRlZCBGSVJTVEtFWS9ORVhUS0VZIG1ldGhvZHMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjgvMTEvOTkgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgcmV0dXJuZWQKICAgICAgICAgIGFuZCBwYXNzZWQgYXMgJ05vbmUuJyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4KCjgvMTAvOTkgOiBGaXhlZCBtaXNzaW5nICdpbnQnIHNwZWNpZmllcnMgaW4gdmFyaW91cyBwbGFjZXMuCgo4LzEwLzk5IDogQWRkZWQgV2luZG93cyBtYWtlZmlsZSBmb3IgUnVudGltZSBsaWJyYXJpZXMuICBDb250cmlidXRlZAogICAgICAgICAgYnkgQm9iIFRlY2hlbnRpbi4KCjgvMTAvOTkgOiBGaXhlZCBtaW5vciBwcm9ibGVtIGluIFB5dGhvbiBydW50aW1lIG1ha2VmaWxlIGludHJvZHVjZWQKICAgICAgICAgIGJ5IGtleXdvcmQgYXJndW1lbnRzLgoKOC84Lzk5ICA6IENoYW5nZWQgJHRhcmdldCBvZiBwZXJsNShvdXQpIHR5cGVtYXAgZnJvbSBTVCgwKSB0bwogICAgICAgICAgU1QoYXJndmkpLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiBGaXhlZCBidWcgaW4gdHlwZW1hcCBjaGVja2luZyByZWxhdGVkIHRvIHRoZSBBTlkga2V5d29yZAogICAgICAgICAgaW4gYXJyYXlzIGFuZCBpZ25vcmVkIGFyZ3VtZW50cy4gIEVycm9yIHJlcG9ydGVkIGJ5CiAgICAgICAgICBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6ICVlbmFibGVkb2MgYW5kICVkaXNhYmxlZG9jIGRpcmVjdGl2ZXMgY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICBpbnNpZGUgY2xhc3Mvc3RydWN0dXJlIGRlZmluaXRpb25zLiAgIEhvd2V2ZXIsIG5vIGNoZWNrCiAgICAgICAgICBpcyBtYWRlIHRvIHNlZSBpZiB0aGV5IGFyZSBiYWxhbmNlZCAoaS5lLiwgYSAlZGlzYWJsZWRvYwogICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBhIG1hdGNoaW5nCiAgICAgICAgICAlZW5hYmxlZG9jIGluIHRoZSBzYW1lIGNsYXNzKS4KCjgvOC85OSAgOiBLZXl3b3JkIGFyZ3VtZW50IGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgbW9kdWxlLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhjaGFyICpiYXIsIGludCBzcGFtLCBkb3VibGUgeCk7CgogICAgICAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcwoKICAgICAgICAgICAgICAgZm9vKHggPSAzLjQsIGJhcj0iaGVsbG8iLCBzcGFtPTQyKQoKICAgICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHJ1biBTV0lHIHdpdGggdGhlICcta2V5d29yZCcgY29tbWFuZAogICAgICAgICAgbGluZSBvcHRpb24uICAgIE1peGluZyBrZXl3b3JkIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgc2hvdWxkIHdvcmsgYXMgd2VsbC4gICBVbm5hbWVkIGFyZ3VtZW50cyBhcmUgYXNzaWduZWQgbmFtZXMKICAgICAgICAgIHN1Y2ggYXMgImFyZzEiLCAiYXJnMiIsIGV0Yy4uLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgRnVuY3Rpb25zIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIHN1Y2ggYXMKICAgICAgICAgIGJhcihpbnQgKk9VVFBVVCwgaW50ICpPVVRQVVQpIHdpbGwgbGlrZWx5IGNhdXNlIHByb2JsZW1hdGljCiAgICAgICAgICB3cmFwcGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLiAgIFRvIGZpeCB0aGlzLCAgdXNlIGRpZmZlcmVudAogICAgICAgICAgbmFtZXMgb3IgdXNlICVhcHBseSB0byBtYXAgdHlwZW1hcHMgdG8gYWx0ZXJuYXRlIG5hbWVzLgoKOC84Lzk5ICA6IEhhbmRsaW5nIG9mIHRoZSAndGhpcycgcG9pbnRlciBoYXMgYmVlbiBjaGFuZ2VkIGluIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBQcmV2aW91c2x5LCBkZXJlZmVyZW5jaW5nIG9mICcudGhpcycgb2NjdXJlZCBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBzaGFkb3cgY2xhc3MgaXRzZWxmLiAgIE5vdywgdGhpcyBzdGVwIG9jY3VycyBpbiB0aGUgQwogICAgICAgICAgd3JhcHBlcnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgICBTV0lHX0dldFB0ck9iaihQeU9iamVjdCAqLCB2b2lkICoqcHRyLCBjaGFyICp0eXBlKQoKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHBvaW50ZXIKICAgICAgICAgIG9yIGEgc2hhZG93IGNsYXNzIGluc3RhbmNlIHdpdGggYSAnLnRoaXMnIGF0dHJpYnV0ZSBvZgogICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZS4gIFRoaXMgY2hhbmdlIGFsbG93cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIDEuICBUaGUgcmVhbCBzaGFkb3cgY2xhc3MgaW5zdGFuY2UgZm9yIGFuIG9iamVjdCBpcwogICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgQyB3cmFwcGVycyB3aGVyZSBpdCBjYW4gYmUgZXhhbWluZWQvbW9kaWZpZWQKICAgICAgICAgICAgICBieSB0eXBlbWFwcy4KCiAgICAgICAgICAyLiAgSGFuZGxpbmcgb2YgZGVmYXVsdC9rZXl3b3JkIGFyZ3VtZW50cyBpcyBub3cgZ3JlYXRseQogICAgICAgICAgICAgIHNpbXBsaWZpZWQuCgogICAgICAgICAgMy4gIFRoZSBQeXRob24gd3JhcHBlciBjb2RlIGlzIG11Y2ggbW9yZSBzaW1wbGUuCgogICAgICAgICAgUGx1cywgaXQgZWxpbWluYXRlZCBtb3JlIHRoYW4gMzAwIGxpbmVzIG9mIEMrKyBjb2RlIGluIHRoZQogICAgICAgICAgUHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAqKiogQ0FWRUFUIDogVGhpcyByZXF1aXJlcyB0aGUgYWJzdHJhY3Qgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgIEl0IHNob3VsZCB3b3JrIHdpdGggUHl0aG9uIDEuNCwgYnV0IHByb2JhYmx5IG5vdGhpbmcgb2xkZXIKICAgICAgICAgIHRoYW4gdGhhdC4KCgo4LzgvOTkgIDogRml4ZWQgaGFuZGxpbmcgb2YgImNvbnN0IiBhbmQgcG9pbnRlcnMgaW4gY2xhc3Nlcy4gIEluIHBhcnRpY3VsYXIsCiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcwoKICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBjb25zdCBpbnQgICppcHRyOwogICAgICAgICAgfQoKICAgICAgICAgIGFyZSBoYW5kbGVkIGFzIGFzc2lnbmFibGUgdmFyaWFibGVzIGFzIG9wcG9zZWQgdG8gY29uc3RhbnQKICAgICAgICAgIHZhbHVlcyAodGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBpbiBDL0MrKykuICAgTm90ZToKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzICJjaGFyICpjb25zdCBtc2ciIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KICAgICAgICAgIENvbnN0YW50cyBkZWNsYXJlZCBhdCB0aGUgZ2xvYmFsIGxldmVsIHVzaW5nIGNvbnN0IGFyZSBhbHNvCiAgICAgICAgICBicm9rZW4gKGJlY2F1c2UgSSBoYXZlIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdGhhdCByZWx5IHVwb24KICAgICAgICAgIHRoaXMgYmVoYXZpb3IpLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0CiAgICAgICAgICBtaXN0YWtlbmx5IHRyZWF0ICdjb25zdCBjaGFyIConIHR5cGVzIGFzIGNvbnN0YW50IHZhbHVlcy4KCjgvOC85OSAgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHN1cHBvcnQgYml0LWZpZWxkcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19rZXl3b3JkIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfZXh0ZXJuICA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyAgOiAxOwogICAgICAgICAgfSBmbGFnczsKCiAgICAgICAgICBCaXQtZmllbGRzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gaW50ZWdlciB0eXBlcyBhbmQgdGhlaXIKICAgICAgICAgIGFyZSBvdGhlciByZXN0cmljdGlvbnMuICBTV0lHIHBlcmZvcm1zIG5vIHN1Y2ggdHlwZS1jaGVja2luZwogICAgICAgICAgKGFsdGhvdWdoIHRoZSBDIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvYmxlbXMgd2hlbiBpdCB0cmllcyB0bwogICAgICAgICAgY29tcGlsZSB0aGUgd3JhcHBlciBjb2RlKS4KCjgvOC85OSAgOiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlIG9mICRiYXNldHlwZSBzdWJzdGl0dXRpb24gaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgJXR5cGVtYXAocHl0aG9uLCBhcmdvdXQpIHNwYW0qKiBPVVRQVVR7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgY2hhciogYSA9ICIkYmFzZXR5cGVfcCI7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICB9CgogICAgICAgICAgKFBhdGNoIHN1Z2dlc3RlZCBieSBOYXRoYW4gRHVuZmllbGQpLgoKNi8yMi85OSA6IE1hZGUgYSB2ZXJ5IHNsaWdodCB0d2VhayB0byB0aGUgUGVybDUgc2hhZG93IGNsYXNzCiAgICAgICAgICBjb2RlIHRoYXQgYWxsb3dzIHR5cGVtYXBzIHRvIGFsdGVyIHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgb2Ygb2JqZWN0cyAodG8gc3VwcG9ydCBwb2x5bW9ycGhpYyB0eXBlcykuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgRHJha2UgRGllZHJpY2guCgo0LzgvOTkgIDogRml4ZWQgbnVsbCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsIG1vZHVsZS4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjMvMTcvOTkgOiBGaXhlZCBidWcgaW4gcGVybDVwdHIuc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR3JlZyBBbmRlcnNvbi4KCjIvMjcvOTkgOiBFbGltaW5hdGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIFN3aWcgcnVucyBvbgogICAgICAgICAgZW1wdHkgZmlsZXMuCgoyLzI3Lzk5IDogQWRkZWQgcGF0Y2ggdG8gR3VpbGUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB1bnVzZWQKICAgICAgICAgIHZhcmlhYmxlcy4gICBDb250cmlidXRlZCBieSBNaWtlIFNpbW9ucy4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgcmV0dXJuaW5nIHJlZmVyZW5jZXMuCgoyLzI3Lzk5IDogRml4ZWQgUnVudGltZS9NYWtlZmlsZS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pa2UgUm9tYmVyZy4KCjIvMjcvOTkgOiBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyB0byB0aGUgdHlwZS1jaGVja2VyLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAtZXhwb3J0YWxsIHN3aXRjaCBhbmQgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIGluIFBlcmw1IG1vZHVsZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjIvMjcvOTkgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgdG8gcmVjb2duaXplICd1bmRlZicgYXMgYSBOVUxMIGNoYXIgKi4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgUGVybDUgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIG5ld2VyIHZlcnNpb25zIG9mCiAgICAgICAgICBBY3RpdmVTdGF0ZSBQZXJsIGZvciBXaW4zMi4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgaW5jbHVkZSBvcmRlciBvZiBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgIC1JIG9wdGlvbi4KCjIvNS85OC0gOiBEYXZlIGZpbmlzaGVzIGhpcyBkaXNzZXJ0YXRpb24sIGdvZXMgam9iIGh1bnRpbmcsIG1vdmVzIHRvCjIvNS85OSAgICBDaGljYWdvIGFuZCBnZW5lcmFsbHkgdGhyYXNoZXMgYWJvdXQuCgpWZXJzaW9uIDEuMSBQYXRjaCA1IChGZWJydWFyeSA1LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLzQvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2hlbiBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgbG9jYXRpb25zIGFyZSBzcGVjaWZpZWQgKC0td2l0aC10Y2xpbmNsLCBldGMuLi4pLgoKMi8yLzk4ICA6IEZpeGVkIG5hbWUtY2xhc2ggYnVnIHJlbGF0ZWQgdG8gdGhlIHN3aXRjaCB0byBDIG1hY3JvcyBmb3IgYWNjZXNzb3IKICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoZSBuZXcgc2NoZW1lIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG9iamVjdHMKICAgICAgICAgIHdpdGggbWVtYmVycyBzdWNoIGFzICdvYmonLCAndmFsJywgZXRjLi4uICAgRml4ZWQgdGhlIGJ1ZyBieQogICAgICAgICAgYXBwZW5kaW5nIHRoZSB3b3JkICdzd2lnJyB0byBtYWNybyBhcmd1bWVudCBuYW1lcy4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjIvMi85OCAgOiBTbGlnaHQgZml4IHRvIHRoZSBQZXJsNSBtb2R1bGUgdG8gZWxpbWluYXRlIHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgIGFib3V0ICd2YXJuYW1lIHVzZWQgb25seSBvbmNlIDogcG9zc2libGUgdHlwbycuICBGaXgKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMS85Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsIDUgbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBjb25zdGFudHMgYW5kIHNoYWRvdyBjbGFzc2VzLgoKMS85Lzk4ICA6IEZpeGVkIGxpbmtpbmcgYnVnIHdpdGggUHl0aG9uIDEuNSBlbWJlZC5pIGxpYnJhcnkgZmlsZS4KClZlcnNpb24gMS4xIFBhdGNoIDQgKEphbnVhcnkgNCwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS80Lzk4ICA6IENoYW5nZWQgc3RydWN0dXJlZCBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHRvIGJlIG1vcmUgZnJpZW5kbHkKICAgICAgICAgIHRvIEJvcmxhbmQgQysrLgoKMS80Lzk4ICA6IEFkZGVkIHRoZSBmdW5jdGlvbiBNYWtlZmlsZS53aW4uYmMgZm9yIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMKICAgICAgICAgIHVuZGVyIEJvcmxhbmQgNS4yLgoKMS80Lzk4ICA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBlcmw1IG1vZHVsZSBhbmQgQysrIGNvbXBpbGF0aW9uLiAgVGhlCiAgICAgICAgICA8bWF0aC5oPiBsaWJyYXJ5IGlzIG5vdyBpbmNsdWRlZCBiZWZvcmUgYW55IFBlcmwgaGVhZGVycwogICAgICAgICAgYmVjYXVzZSBQZXJsIHRoZSBleHRlcm4gIkMiIGxpbmthZ2Ugb2YgbWF0aC5oIHNjcmV3cyBhbG90CiAgICAgICAgICBvZiB0aGluZ3MgdXAgKGVzcGVjaWFsbHkgb24gV2luZG93cykuCgoxLzIvOTggIDogQ2hhbmdlIHRvIHRoZSBQeXRob24gbW9kdWxlIHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGNvbnN0YW50cwogICAgICAgICAgY3JlYXRlZCBieSBDKysgY2xhc3NlcywgaW5oZXJpdGFuY2UsIGFuZCBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzCiAgICAgICAgICBtb2RpZmljYXRpb24gbWF5IGludHJvZHVjZSBhIGZldyBzbGlnaHQgaW5jb21wYXRpYmlsaXRpZXMgaWYKICAgICAgICAgIHlvdSBhdHRlbXB0IHRvIHVzZSB0aGUgbm9uLXNoYWRvdyBjbGFzcyBpbnRlcmZhY2Ugd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMgZW5hYmxlZC4gICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMS8yLzk4ICA6IFN1cHBvcnQgZm9yIFRjbCA4LjAgbmFtZXNwYWNlcyBoYXMgYmVlbiBhZGRlZC4gICBUaGlzICpyZXBsYWNlcyoKICAgICAgICAgIHRoZSBvcmlnaW5hbCBTV0lHIG1lY2hhbmlzbSB0aGF0IGFzc3VtZWQgW2luY3IgVGNsXSBuYW1lc3BhY2VzLgogICAgICAgICAgVG8gdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBydW4gU1dJRyB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9ucwoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlICBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIGEgbmFtZXNwYWNlIHRoYXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgIHRoZSBtb2R1bGUgbmFtZQoKICAgICAgICAgICAgIHN3aWcgLXRjbCAtbmFtZXNwYWNlIC1wcmVmaXggYmFyIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIG5hbWVzcGFjZSAnYmFyJwoKICAgICAgICAgIFRoZSB1c2Ugb2YgbmFtZXNwYWNlcyBpcyBuZXcgaW4gVGNsIDguMC4gIEhvd2V2ZXIsIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGdlbmVyYXRlZCBieSBTV0lHIHdpbGwgc3RpbGwgd29yayB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBUY2wgbmV3ZXIKICAgICAgICAgIHRoYW4gYW5kIGluY2x1ZGluZyBUY2wgNy4zL1RrMy42IGV2ZW4gaWYgdGhlIC1uYW1lc3BhY2Ugb3B0aW9uIGlzCiAgICAgICAgICB1c2VkLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyB0aGF0IHJlbGllZCBvbiB0aGUKICAgICAgICAgIC1wcmVmaXggYW5kIC1uYW1lc3BhY2Ugb3B0aW9ucy4KCjEvMi85OCAgOiBBZGRlZCB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyB0byB0aGUgVGNsIHdyYXBwZXIgY29kZQoKICAgICAgICAgICAgICAgICBTV0lHX25hbWUgICAgICAtIE5hbWUgb2YgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgICAgICAgU1dJR19wcmVmaXggICAgLSBQcmVmaXgvbmFtZXNwYWNlIGFwcGVuZGVkIHRvIGNvbW1hbmQgbmFtZXMKICAgICAgICAgICAgICAgICBTV0lHX25hbWVzcGFjZSAtIE5hbWUgb2YgdGhlIG5hbWVzcGFjZQoKICAgICAgICAgIFNXSUcgbGlicmFyeSB3cml0ZXJzIGNhbiB1c2UgdGhlc2UgdG8gdGhlaXIgYWR2YW50YWdlcy4KCjEvMi85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsOCBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIHBvaW50ZXIgY29uc3RhbnRzICh0aGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIHdhcyBtaXNzaW5nIGZyb20KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUpLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBjb25zdGhhc2guaSBsaWJyYXJ5IGZpbGUgdG8gdGhlIFRjbCBhbmQgVGNsOCBtb2R1bGVzLgoKMS8xLzk4ICA6IENoYW5nZWQgYW5kIGNsZWFuZWQgdXAgdGhlIFB5dGhvbiB0eXBlbWFwcy5pIGZpbGUuICAgVGhlIGZvbGxvd2luZwogICAgICAgICAgc2lnbmlmaWNhbnQgY2hhbmdlcyB3ZXJlIG1hZGUgOgoKICAgICAgICAgICAgICAgIDEuICBUaGUgT1VUUFVUIHR5cGVtYXAgbm93IHJldHVybnMgUHl0aG9uIHR1cGxlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgbGlzdHMuICAgTGlzdHMgY2FuIGJlIHJldHVybmVkIGFzIGJlZm9yZSBieSB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICBMX09VVFBVVCB0eXBlLiAgICBJZiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgICAgICAgICBpcyBuZWVkZWQsIHJ1biBTV0lHIHdpdGggdGhlIC1ET1VUUFVUX0xJU1Qgb3B0aW9uLgoKICAgICAgICAgICAgICAgIDIuICBUaGUgQk9USCB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gSU5PVVQuICBGb3IgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSwgdGhlICJCT1RIIiBtZXRob2Qgc3RpbGwgZXhpc3RzIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgMy4gIE91dHB1dCB0eXBlbWFwcyBub3cgZ2VuZXJhdGUgbGVzcyBjb2RlIHRoYW4gYmVmb3JlLgoKICAgICAgICAgIENoYW5nZXMgdG8gdHlwZW1hcHMuaSBtYXkgYnJlYWsgZXhpc3RpbmcgUHl0aG9uIHNjcmlwdHMgdGhhdCBhc3N1bWUKICAgICAgICAgIG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhIGxpc3QuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzMxLzk3OiBGaXhlZCBsb25nIG92ZXJkdWUgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdGluZyBzY3JpcHRzIGFuZCBjZXJ0YWluCiAgICAgICAgICBtYWtlZmlsZXMgdGhhdCByZXF1aXJlZCB0aGUgdXNlIG9mIHRoZSBiYXNoIHNoZWxsLiAgIEV2ZXJ5dGhpbmcgc2hvdWxkCiAgICAgICAgICB3b3JrIHByb3Blcmx5IHdpdGggdGhlIHN0YW5kYXJkIEJvdXJuZSBzaGVsbCAoc2gpIG5vdy4KCjEyLzMxLzk3OiBNb2RpZmllZCB0eXBlbWFwcyB0byBhbGxvdyAkYmFzZXR5cGUgYXMgYSB2YWxpZCBsb2NhbCB2YXJpYWJsZS4KICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBhbGwgc29ydHMgb2YgYml6YXJyZSBoYWNraXNoIHR5cGVtYXBzIHRoYXQKICAgICAgICAgIGRvIGNvb2wgdGhpbmdzLiAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERvbWluaXF1ZSBEdW1vbnQuCgoxMi8zMS85NzogU3dpdGNoZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGdlbmVyYXRlZCBmb3IgbWVtYmVyIGRhdGEgdG8KICAgICAgICAgIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyAoZXhjZXB0IGluIGNhc2VzIGludm9sdmluZyB0eXBlbWFwcwogICAgICAgICAgb3IgY2hhciAqKS4KCjEyLzMxLzk3OiBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIEMrKyBtZW1iZXIgZGF0YSBpbnZvbHZpbmcgcmVmZXJlbmNlcy4KCjEyLzMxLzk3OiBDaGFuZ2VkIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgQysrIG1lbWJlciBmdW5jdGlvbnMgdG8KICAgICAgICAgIHByZXByb2Nlc3NvciBtYWNyb3MuICAgVGhpcyBjbGVhbnMgdXAgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgYW5kIHJlc3VsdHMgaW4gZmV3ZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCgoxMi8zMS85NzogQ2hhbmdlZCB0aGUgZGVmYXVsdCBDIGNvbnN0cnVjdG9yIHRvIHVzZSBjYWxsb2MoKSBpbnN0ZWFkCiAgICAgICAgICBvZiBtYWxsb2MoKQoKMTIvMzAvOTc6IENoYW5nZWQgdGhlIGNyZWF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgUGVybDUgbW9kdWxlLgogICAgICAgICAgRm9yIGFsbCBwcmFjdGljYWwgcHVycG9zZXMsIHRoZXkgc2hvdWxkIHdvcmsgaW4gZXhhY3RseSB0aGUKICAgICAgICAgIHNhbWUgd2F5IGFzIGJlZm9yZSBleGNlcHQgdGhhdCB0aGV5IG5vdyByZXF1aXJlIG11Y2ggbGVzcwogICAgICAgICAgd3JhcHBlciBjb2RlLiAgIE1vZHVsZXMgY29udGFpbmluZyBsYXJnZSBudW1iZXJzIG9mCiAgICAgICAgICBjb25zdGFudHMgbWF5IHNlZSBncmVhdGVyIHRoYW4gYSA1MCUgcmVkdWN0aW9uIGluIHdyYXBwZXIKICAgICAgICAgIGNvZGUgc2l6ZS4KCjEyLzMwLzk3OiBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byBiZSBtb3JlIGludGVsbGlnZW50IGFib3V0IHRoZQogICAgICAgICAgY3JlYXRpb24gb2YgY29uc3RhbnRzLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIHJlZHVuZGFudAogICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgdGhlIHNpemUgb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHJlZHVjZWQuICAgKE1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pLgoKMTIvMjkvOTc6IEZpeGVkIGEgYnVnIGluIEMrKyBjb2RlIGdlbmVyYXRpb24gcmVsYXRlZCB0byBtZW1iZXIgZnVuY3Rpb25zLAogICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMsIGFuZCByZWZlcmVuY2VzLgoKMTIvMjkvOTc6IEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgZmV3IG1ha2VmaWxlcyB0byBzdXBwb3J0IFB5dGhvbiAxLjUKCjEyLzI5Lzk3OiBBZGRlZCAnZW1iZWQxNS5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgICAgICAgIHN0YXRpY2x5IGxpbmsgdmVyc2lvbnMgb2YgUHl0aG9uIDEuNS4gICAgVG8gbWFrZSBpdCB0aGUgZGVmYXVsdCwKICAgICAgICAgIHNpbXBseSBjb3B5ICdzd2lnX2xpYi9weXRob24vZW1iZWQxNS5pJyB0byAnc3dpZ19saWIvcHl0aG9uL2VtYmVkLmknCgpWZXJzaW9uIDEuMSBQYXRjaCAzIChOb3ZlbWJlciAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2l0aCBzaGFkb3cgY2xhc3NlcyBhbmQKICAgICAgICAgIHN0YXRpYyBjbGFzcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gY2xhc3MgaW5zdGFuY2VzLgogICAgICAgICAgTm90ZSA6IFRoZSBmaXggZm9yIHRoaXMgYnVnIHJlcXVpcmVzIGEgc2xpZ2h0IHJlc3RydWN0dXJpbmcgb2YKICAgICAgICAgIG9mIHRoZSAucG0gZmlsZXMgY3JlYXRlZCBieSBTV0lHLgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2wvVGNsOCBtb2R1bGVzIHJlbGF0ZWQgdG8gdmFyaWFibGUgbGlua2luZwogICAgICAgICAgb2YgY2hhcmFjdGVyIGFycmF5cy4gIElmIHlvdSBkZWNsYXJlZCBhIGdsb2JhbCB2YXJpYWJsZSAnY2hhciBmb29bMTBdJywKICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIHdvdWxkIGVpdGhlciBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdAogICAgICAgICAgaW1tZWRpYXRlbHkgdXBvbiBsb2FkaW5nIG9yIHdlaXJkIG1lbW9yeSBjb3JydXB0aW9uIGVsc2V3aGVyZS4KICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZCBhbHRob3VnaCBjaGFyYWN0ZXIgYXJyYXlzIGNhbiBvbmx5IGJlCiAgICAgICAgICByZWFkLW9ubHkuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgdGhhdCBjYXVzZWQgaXQgdG8KICAgICAgICAgIGZhaWwgaWYgZmlsZXMgd2VyZSBpbXBvcnRlZCBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4KICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgoKMTEvMjMvOTc6IEZpeGVkIGluY29ycmVjdCBkaWFnbm9zdGljIG1lc3NhZ2UgaW4gdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24KICAgICAgICAgIG1vZHVsZS4KCjExLzIzLzk3OiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgLW8gb3B0aW9uIHdoZW4gdXNlZCB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gSWYgLW8gd2FzIHVzZWQgdG8gc3BlY2lmeSBib3RoIHRoZSBwYXRobmFtZSBhbmQgZmlsZW5hbWUKICAgICAgICAgIG9mIFNXSUcncyBvdXRwdXQgc3VjaCBhcwoKICAgICAgICAgICAgICAgICBzd2lnIC1vIC9ob21lL3N3aWcvd3JhcHBlci5jIC1zaGFkb3cgLXBlcmw1IGZvby5pCgogICAgICAgICAgVGhlIHdyYXBwZXIgY29kZSB3b3VsZCBiZSBwbGFjZWQgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLW8sCiAgICAgICAgICBidXQgdGhlIC5wbSBmaWxlIGFuZCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSBTV0lHIHdhcyBydW4uICAgTm93LCB0aGVzZSBmaWxlcyBhcmUgcGxhY2VkCiAgICAgICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIC1vIG9wdGlvbi4KICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAgTWFjaW50b3NoLgoKMTEvMjMvOTc6IEFkZGVkIGEgJ3RoaXMoKScgbWV0aG9kIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIHJldHVybiB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUgZnJvbSBhIHNoYWRvdwogICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBhcyBhIHRpZWQgaGFzaC4gICBUbyB1c2UganVzdAogICAgICAgICAgaW52b2tlIGFzIGEgbWV0aG9kIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICRsID0gbmV3IExpc3Q7ICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICRwdHIgPSAkbC0+dGhpcygpOyAgICMgR2V0IHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZQoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsIDggcG9pbnRlci5pIGxpYnJhcnkgZmlsZSAod2hpY2ggd2FzIGNvbXBsZXRlbHkKICAgICAgICAgIGJyb2tlbiBpbiAxLjFwMikuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIFBlcmw1IHR5cGUtY2hlY2tlciB0byBmaXggYSBmZXcgcHJvYmxlbXMKICAgICAgICAgIHdpdGggZ2xvYmFsIHZhcmlhYmxlcyBvZiBwb2ludGVyIHR5cGVzIGFuZCB0byBhbGxvdwogICAgICAgICAgdGllZCBoYXNoZXMgdG8gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aXRoIG5vcm1hbAogICAgICAgICAgcG9pbnRlciB2YWx1ZXMuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWVjaGFuaXNtIHRvIGFsbG93IG91dHB1dAogICAgICAgICAgdHlwZW1hcHMgb2YgdHlwZSAndm9pZCcuICAgVGhlc2Ugd2VyZSBpZ25vcmVkIHByZXZpb3VzbHksCiAgICAgICAgICBidXQgbm93IGlmIHlvdSBzcGVjaWZ5LAoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGxhbmcsb3V0KSB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2b2lkIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIG9yIGFzc2lnbiBhIHJldHVybiB2YWx1ZSB0byB0aGUgZnVuY3Rpb24uCgoxMS8yMy85NzogRml4ZWQgcHJvY2Vzc2luZyBvZiAnYm9vbCcgZGF0YXR5cGVzIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMTEvMjMvOTc6IEZpeGVkIG1pbm9yIHBhcnNpbmcgZXJyb3Igd2l0aCBDKysgaW5pdGlhbGl6ZXJzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgQigpIDogQSgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2w4IG1vZHVsZSBzbyB0aGF0IEMgZnVuY3Rpb25zIHRoYXQgY2FsbCBiYWNrIGludG8KICAgICAgICAgIFRjbCBkb24ndCBjb3JydXB0IHRoZSByZXR1cm4gcmVzdWx0IG9iamVjdCAoU1dJRyB3YXMgZ2F0aGVyaW5nCiAgICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0b28gZWFybHkgd2hpY2ggbGVhZHMgdG8gcHJvYmxlbXMgaWYgc3Vic2VxdWVudAogICAgICAgICAgVGNsIGNhbGxzIGFyZSBtYWRlKS4KCjExLzIzLzk3OiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gdGhlIFB5dGhvbiBtb2R1bGUgd2hlbiB0d28gb3IKICAgICAgICAgIG1vcmUgb3V0cHV0IHBhcmFtZXRlcnMgd2VyZSB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudHMgb2YgYQogICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVpbmNsdWRlIHR5cGVtYXBzLmkKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKk9VVFBVVCwgZG91YmxlICpPVVRQVVQsIGRvdWJsZSBhKTsKCiAgICAgICAgICBQcmV2aW91c2x5LCBkb2luZyB0aGlzIHJlc3VsdGVkIGluIHRoZSBjcmVhdGlvbiBvZiBhbgogICAgICAgICAgZXh0cmFuZW91cyBjb21tYSBpbiB0aGUgb3V0cHV0LCByZXN1bHRpbmcgaW4gYSBDIHN5bnRheCBlcnJvci4KCjExLzIyLzk3OiBGaXhlZCBhIGJ1ZyB3aGVuIHRlbXBsYXRlIGhhbmRsaW5nIHRoYXQgd2FzIHN0cmlwcGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICBhcm91bmQgbmVzdGVkIHRlbXBsYXRlcy4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIEZvbzxCYXI8ZG91YmxlPiA+CgogICAgICAgICAgd2FzIGdldHRpbmcgbXVuZ2VkIGludG8gRm9vPEJhcj4+IHdoaWNoIGlzIGEgc3ludGF4IGVycm9yIGluCiAgICAgICAgICBpbiB0aGUgQysrIGNvbXBpbGVyLgoKMTEvMjIvOTc6IEZpeGVkIGJ1Z3MgaW4gdGhlIEJvcmxhbmQgQysrIG1ha2VmaWxlcy4KCjExLzIyLzk3OiBGaXhlZCBtZW1vcnkgY29ycnVwdGlvbiBidWcgd2hlbiBwcm9jZXNzaW5nIGludGVnZXIKICAgICAgICAgIGFyZ3VtZW50cyBpbiBUY2w4IG1vZHVsZS4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUnVudGltZS9NYWtlZmlsZSByZWxhdGVkIHRvIFRjbCA4LgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE5vIGxvbmdlciBnZW5lcmF0ZXMgYSBwZXJsIHN5bnRheCBlcnJvci4KCjExLzkvOTcgOiBDaGFuZ2VkIGEgc3RybmNweSgpIHRvIHN0cmNweSgpIGluIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tlci4KICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluCiAgICAgICAgICB0eXBlLWNoZWNraW5nLgoKMTAvMjkvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMgYW5kCiAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKFZlY3RvciBhLCBWZWN0b3IgYiA9IGQpOwoKICAgICAgICAgIHNob3VsZCBub3cgd29yayBwcm9wZXJseS4KClZlcnNpb24gMS4xIFBhdGNoIDIgKFNlcHRlbWJlciA0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KOS80Lzk3ICA6IEZpeGVkIHByb2JsZW0gd2l0aCBoYW5kbGluZyBvZiB2aXJ0dWFsIGZ1bmN0aW9ucyB0aGF0CiAgICAgICAgICB3YXMgaW50cm9kdWNlZCBieSBzb21lIGNoYW5nZXMgaW4gdGhlIEMrKyBtb2R1bGUuCgpWZXJzaW9uIDEuMSBQYXRjaCAxIChBdWd1c3QgMjcsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjgvMjYvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBhbmQgcnVuLXRpbWUgYnVncyB3aXRoIFRjbCA4LjAgZmluYWwuCgo4LzIxLzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIGFycmF5cyBhcHBlYXJpbmcgYXMgYXJndW1lbnRzCiAgICAgICAgICB0byBDKysgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBCYXIoaW50IGFbMjBdWzIwXSk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgIFRoZXJlIGlzIHN0aWxsIGEgYnVnIHVzaW5nIGFycmF5cyB3aXRoIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGhvd2V2ZXIuCgo4LzIwLzk3IDogRml4ZWQgYSBidWcgd2l0aCBnZW5lcmF0aW5nIHRoZSBjb2RlIGZvciBhZGRlZCBtZXRob2RzCiAgICAgICAgICBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjgvMTkvOTcgOiBNb2RpZmllZCB0aGUgdHlwZW1hcHBlciB0byBzdWJzdGl0dXRlIHRoZSAnJGFyZycgdmFsdWUKICAgICAgICAgIHdoZW4gZGVjbGFyaW5nIGxvY2FsIHZhcmlhYmxlcy4gICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogKGRvdWJsZSB0ZW1wXyRhcmcpIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIGFwcGxpZWQgdG8gYSByZWFsIGZ1bmN0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyA6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqYSwgZG91YmxlICpiLCBkb3VibGUgKnJlc3VsdCk7CgogICAgICAgICAgdGhyZWUgbG9jYWwgdmFyaWFibGVzIHdpbGwgYmUgY3JlYXRlZCBhcyBmb2xsb3dzIDoKCiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYTsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9iOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3Jlc3VsdDsKCiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd3JpdGluZyBtdWx0aXBsZSB0eXBlbWFwcyB0aGF0IG5lZWQKICAgICAgICAgIHRvIGFjY2VzcyB0aGUgc2FtZSBsb2NhbCB2YXJpYWJsZXMuCgoKNy8yNy85NyA6IEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyB3aXRoIHRoZSAlYXBwbHkgZGlyZWN0aXZlIGFuZCBhcnJheXMuCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRlY2xhcmF0aW9ucyBzaG91bGQgbm93IHdvcmsgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbQU5ZXSB7IFJlYWwgW0FOWV0gfTsKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSBbNF0geyBkb3VibGUgWzEwXSB9OwoKICAgICAgICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIGFwcGx5IGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIHsgUmVhbCB9OwoKICAgICAgICAgIHNob3VsZCBub3cgd29yay0tZXZlbiBpZiBhcnJheXMgaW52b2x2aW5nIGRvdWJsZXMgYW5kIFJlYWxzIGFyZQogICAgICAgICAgdXNlZCBsYXRlci4KCjcvMjcvOTcgOiBDaGFuZ2VkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAiQXJyYXkgWCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gWSIgdG8KICAgICAgICAgIG9ubHkgYXBwZWFyIGlmIHJ1bm5pbmcgU1dJRyBpbiB2ZXJib3NlIG1vZGUuCgo3LzI3Lzk3IDogQWRkZWQgdGhlIHZhcmlhYmxlcyAkcGFybW5hbWUgYW5kICRiYXNlbWFuZ2xlIHRvIHRoZSB0eXBlbWFwCiAgICAgICAgICBnZW5lcmF0b3IuICAgICRwYXJtbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQKICAgICAgICAgIHdoZW4gdGhlIHR5cGVtYXAgd2FzIG1hdGNoZWQuICBJdCBtYXkgYmUgIiIgaWYgbm8gcGFyYW1ldGVyCiAgICAgICAgICB3YXMgdXNlZC4gICAkYmFzZW1hbmdsZSBpcyBhIG1hbmdsZWQgdmVyc2lvbiBvZiB0aGUgYmFzZQogICAgICAgICAgZGF0YXR5cGUuICAgIFNvbWV0aW1lcyB1c2VkIGZvciBhcnJheSBoYW5kbGluZy4KCjcvMjcvOTcgOiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiBvdXRwdXQgYXJndW1lbnRzIHdpdGggUHl0aG9uIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgT3JpZ2luYWxseSwgaWYgYSBmdW5jdGlvbiByZXR1cm5lZCBhbiBvYmplY3QgJ0ZvbycsIHRoZSBzaGFkb3cgY2xhc3MKICAgICAgICAgIG1lY2hhbmlzbSB3b3VsZCBjcmVhdGUgY29kZSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGb29QdHIoc2hhZG93Yy5yZXR1cm5fZm9vKCkpCiAgICAgICAgICAgICAgICAgICAgICB2YWwudGhpcyA9IDEKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0eXBlbWFwcyBhbGxvdyBhIHVzZXIgdG8gcmVkZWZpbmUKICAgICAgICAgIHRoZSBvdXRwdXQgYmVoYXZpb3Igb2YgYSBmdW5jdGlvbi0tYXMgYSByZXN1bHQsIHdlIGNhbiBubyBsb25nZXIKICAgICAgICAgIG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZSByZXR1cm4gdHlwZSBiZWluZyBhIHBvaW50ZXIgb3IKICAgICAgICAgIGV2ZW4gYmVpbmcgYSBzaW5nbGUgdmFsdWUgZm9yIHRoYXQgbWF0dGVyIChpdCBjb3VsZCBiZSBhIGxpc3QsCiAgICAgICAgICB0dXBsZSwgZXRjLi4uKS4gICBJZiBTV0lHIGRldGVjdHMgdGhlIHVzZSBvZiBvdXRwdXQgdHlwZW1hcHMKICAgICAgICAgIChlaXRoZXIgIm91dCIgb3IgImFyZ291dCIpIGl0IHJldHVybnMgdGhlIHJlc3VsdCB1bm1vZGlmaWVkIGxpa2UKICAgICAgICAgIHRoaXMgOgoKICAgICAgICAgICAgICAgIGRlZiByZXR1cm5fZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzaGFkb3djLnJldHVybl9mb28oKQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gZmlndXJlIG91dCB3aGF0IHRvIGRvCiAgICAgICAgICB3aXRoIHRoZSByZXR1cm4gdmFsdWUgKGluY2x1ZGluZyB0aGUgcG9zc2liaWxpdHkgb2YgY29udmVydGluZyBpdAogICAgICAgICAgaW50byBhIFB5dGhvbiBjbGFzcykuCgo3LzI2Lzk3IDogRml4ZWQgYSBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlcyBsaWtlICd1bnNpZ25lZCBsb25nIGludCcsCiAgICAgICAgICAndW5zaWduZWQgc2hvcnQgaW50JywgZXRjLi4uCgo3LzI0Lzk3IDogTWlub3IgYnVnIGZpeCB0byBUY2wgOCBtb2R1bGUgdG8gcGFyc2UgZW51bXMgcHJvcGVybHkuICBBbHNvCiAgICAgICAgICBmaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIHByb2JsZW0gaW4gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgIChwYXRjaCBjb250cmlidXRlZCBieSBIZW5yeSBSb3dsZXkuCgo3LzI0Lzk3IDogQWRkZWQgUHl0aG9uLXR1cGxlIHR5cGVtYXBzIGNvbnRyaWJ1dGVkIGJ5IFJvYmluIER1bm4uCgo3LzI0Lzk3IDogSW5jb3Jwb3JhdGVkIHNvbWUgY2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZSBpbiBzdXBwb3J0IG9mCiAgICAgICAgICBNYXJrIEhhbW1vbmQncyBDT00gc3VwcG9ydC4gIEknbSBub3QgZW50aXJlbHkgc3VyZSB0aGV5CiAgICAgICAgICB3b3JrIHlldCBob3dldmVyLiAgTmVlZHMgZG9jdW1lbnRhdGlvbiBhbmQgdGVzdGluZy4KCjcvMjQvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyB3aGVuIHN0cnVjdHVyZXMgaGFkIGFycmF5IG1lbWJlcnMKICAgICAgICAgIGFuZCB0eXBlbWFwcyB3ZXJlIHVzZWQuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcmluKSBkb3VibGUgWzIwXVsyMF0gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhIGRvdWJsZSBbMjBdWzIwXSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhWzIwXVsyMF07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIE9yaWdpbmFsbHksIHRoaXMgd291bGQgZ2VuZXJhdGUgYSBjb21waWxlci10eXBlIGVycm9yIHdoZW4KICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2FzIGNvbXBpbGVkLiAgIE5vdywgYSBoZWxwZXIgZnVuY3Rpb24gbGlrZQogICAgICAgICAgdGhpcyBpcyBnZW5lcmF0ZWQgOgoKICAgICAgICAgICAgICAgIGRvdWJsZSAqRm9vX2Ffc2V0KEZvbyAqYSwgZG91YmxlIHZhbFsyMF1bMjBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gbWVtYmVyaW4gdHlwZW1hcCBoZXJlIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUgKikgdmFsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgb25lIGNhbiBhc3N1bWUgdGhhdCB0aGUgc291cmNlIHZhcmlhYmxlCiAgICAgICAgICBpcyBhbiBhcnJheSBvZiB0aGUgKnNhbWUqIHR5cGUgYXMgdGhlIHN0cnVjdHVyZSBtZW1iZXIuIFRoaXMKICAgICAgICAgIG1heSBicmVhayBzb21lIGNvZGVzIHRoYXQgbWFuYWdlZCB0byB3b3JrIGFyb3VuZCB0aGUgYXJyYXkgYnVnLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzEzLzk3IDogRml4ZWQgYnVnIGluIFBlcmw1IG1vZHVsZSB3aGVuIHVzaW5nIEMgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0CiAgICAgICAgICBhcmUgcG9pbnRlcnMuICBXaGVuIHVzZWQgaW4gZnVuY3Rpb24gY2FsbHMgYW5kIG90aGVyIG9wZXJhdGlvbnMsCiAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgd291bGQgYmUgaW52YWxpZC0tLWNhdXNpbmcgY29yZQogICAgICAgICAgZHVtcHMgYW5kIG90aGVyIHByb2JsZW1zLiAgU1dJRyBpbXBsZW1lbnRzIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgIHVzaW5nIFBlcmwgbWFnaWMgdmFyaWFibGVzLiAgQXMgaXQgdHVybnMgb3V0LCB0aGUgZXJyb3IKICAgICAgICAgIHdhcyBjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcG9pbnRlci1leHRyYWN0aW9uIGNvZGUKICAgICAgICAgIHdhcyBzb21laG93IGJ5cGFzc2luZyB0aGUgcHJvY2VkdXJlIHVzZWQgdG8gcmVzb2x2ZSBtYWdpY2FsCiAgICAgICAgICB2YXJpYWJsZXMgKGhlbmNlLCBsZWF2aW5nIHRoZSB2YWx1ZSB1bmRlZmluZWQpLiAgVG8gZml4CiAgICAgICAgICB0aGUgcHJvYmxlbSwgU1dJRyBub3cgZXhwbGljaXRseSByZXNvbHZlcyBtYWdpYyBiZWZvcmUKICAgICAgICAgIGV4dHJhY3RpbmcgcG9pbnRlciB2YWx1ZXMuCgo3LzEyLzk3IDogRWxpbWluYXRlZCB0aGUgbGFzdCByZW1uYW50cyBvZiBmcmVlKCkgYW5kIG1hbGxvYygpIGZyb20KICAgICAgICAgIHRoZSBTV0lHIGNvbXBpbGVyLgoKNy8xMi85NyA6IEZpeGVkIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzIGFuZAogICAgICAgICAgdGVtcG9yYXJ5IHZhcmlhYmxlcyBvZiBhcnJheXMuICAgIEFsc28gbWFkZSBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgIFNXSUcgdG8gaGFuZGxlIHR5cGVtYXBzIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV0gKGRvdWJsZSB0ZW1wWyRkaW0wXSkgewoJCSAgICAgIC4uLiBzdG9yZSBkYXRhIGluIHRlbXBbJGRpbTBdIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3Qgb25seSBkb2VzIHRoaXMgdHlwZW1hcCBtYXRjaCBhbnkgZG91YmxlIFtdIGFycmF5LCBpdAogICAgICAgICAgY3JlYXRlcyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggcHJlY2lzZWx5IHRoZSByaWdodCBkaW1lbnNpb25zLgogICAgICAgICAgKGllLiAkZGltMCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZWFsIG51bWJlciBvZiBkaW1lbnNpb25zKS4KICAgICAgICAgIE9mIGNvdXJzZSwgb2ZmIHRoZSByZWNvcmQsIHRoaXMgd2lsbCBiZSBhIHdheSB0byBhZGQgbW9yZQogICAgICAgICAgZnVuY3Rpb25hbGl0eSB0byB0aGUgdHlwZW1hcHMuaSBsaWJyYXJpZXMuCgo3LzkvOTcgIDogRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIFBlcmw1LCBzdGF0aWMgbGlua2luZywgYW5kIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFdoZW4gc3RhdGljYWxseSBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMgdG9nZXRoZXIsIHdyaXRlCiAgICAgICAgICBhIHRvcC1sZXZlbCBpbnRlcmZhY2UgZmlsZSBsaWtlIHRoaXMgd2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICB1c2VkIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb28sIGJhciwgZ2xvYjsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBzaGFkb3cgY2xhc3NlcyBhcmUgdXNlZCwgdGhlIG1vZHVsZSBuYW1lcyBoYXZlIGFuIGV4dHJhICdjJwogICAgICAgICAgYXBwZW5kZWQgc28gaXQgc2hvdWxkIHJlYWQgYXMgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvb2MsIGJhcmMsIGdsb2JjOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcywgY29uc2lkZXIgdXNpbmcgdGhlIFNXSUcgcnVudGltZQogICAgICAgICAgbGlicmFyeS4KCjcvOC85NyAgOiBJbmNvcnBvcmF0ZWQgZml4ZWQgdmVyc2lvbnMgb2YgdGhlIEJvcmxhbmQgQysrIE1ha2VmaWxlcy4KCjcvOC85NyAgOiBGaXJzdCBjdXQgYXQgdHJ5aW5nIHRvIGVsaW1pbmF0ZSBleGNlc3NpdmUgY29tcGlsZXIgd2FybmluZ3MuCiAgICAgICAgICBBcyBpdCB0dXJucyBvdXQsIGFsb3Qgb2Ygd2FybmluZ3MgZ28gYXdheSBpZiB5b3UganVzdCBtYWtlCiAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICBjbGllbnREYXRhID0gY2xpZW50RGF0YTsKCiAgICAgICAgICBpbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZS4gIE1vc3QgY29tcGlsZXJzIHNob3VsZCBqdXN0CiAgICAgICAgICBpZ25vcmUgdGhpcyBjb2RlIChhdCBsZWFzdCB3b3VsZCBjYW4gaG9wZSkuCgo3LzgvOTcgIDogRml4ZWQgYml6YXJyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggdHlwZW1hcHMgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgSW4gc29tZSBjYXNlcywgdHlwZW1hcHMgY29udGFpbmluZyBwcmludGYgZm9ybWF0dGluZyBzdHJpbmdzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKG1lbWJlcm91dCkgaW50ICogewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsNDIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgZ2VuZXJhdGUgY29tcGxldGVseSBib2d1cyBjb2RlIHdpdGggZ2FyYmFnZSByZXBsYWNpbmcKICAgICAgICAgIHRoZSAnJWQnLiAgIENhdXNlZCBieSBvbmUgZmF1bHR5IHVzZSBvZiBwcmludGYgKHdhc24ndCBhYmxlIHRvIGZpbmQKICAgICAgICAgIGFueSBvdGhlciBvY2N1cmVuY2VzKS4KCjcvNy85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdpdGggbm9uLW1lbWJlcgogICAgICAgICAgZnVuY3Rpb25zIHRoYXQgYXJlIHJldHVybmluZyBtb3JlIHRoYW4gb25lIHZhbHVlLgoKNy83Lzk3ICA6IEluY29ycG9yYXRlZCBtb2RpZmljYXRpb25zIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggR3VpbGUgMS4yLgogICAgICAgICAgU3RpbGwgbmVlZCB0byB0ZXN0IGl0IG91dCwgYnV0IGl0IGlzIHJ1bW9yZWQgdG8gd29yay4KCjcvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byBvdXRwdXQgYXJndW1lbnRzIGFuZCBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgICBJZiBhbiBvdXRwdXQgYXJndW1lbnQgaXMgZGV0ZWN0ZWQsIFNXSUcgYXNzdW1lcwogICAgICAgICAgdGhhdCB0aGUgcmVzdWx0IGlzIGEgbGlzdCBhbmQgaGFuZGxlcyBpdCBhcHByb3ByaWF0ZWx5LgogICAgICAgICAgSWYgdGhlIG5vcm1hbCByZXR1cm4gdHlwZSBvZiBhbiBmdW5jdGlvbiBpcyBhbiBvYmplY3QsCiAgICAgICAgICBpdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgc2hhZG93IGNsYXNzIGFzIGJlZm9yZSwgYnV0CiAgICAgICAgICB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYQogICAgICAgICAgbGlzdC4gICoqKiBOT1RFIDogVGhpcyBiZWhhdmlvciBoYXMgYmVlbiBzdWJzZXF1ZW50bHkgY2hhbmdlZCAqKioKCjYvMjkvOTcgOiBDaGFuZ2VkIEVYUE9SVCB0byBTV0lHRVhQT1JUIGluIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgIFNob3VsZCBwcm92aWRlIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cy4KCjYvMjkvOTcgOiBNb2RpZmllZCBQeXRob24gc2hhZG93IGNsYXNzZXMgc28gdGhhdCBvdXRwdXQgYXJndW1lbnRzCiAgICAgICAgICB3b3JrIGNvcnJlY3RseSAod2hlbiB0eXBlbWFwcyBhcmUgdXNlZCkuCgpWZXJzaW9uIDEuMSAoSnVuZSAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzI0Lzk3IDogRml4ZWQgT2JqZWN0aXZlLUMgY29uc3RydWN0b3IgYnVnIHdoZW4gd29ya2luZyB3aXRoIFBlcmw1CiAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4KCjYvMjMvOTcgOiBGaXhlZCBzb21lIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCBPYmplY3RpdmUtQy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIG5vdyA6CgogICAgICAgICAgICAgICAtIGZvbyA6IChpbnQpIGEgd2l0aDogKGludCkgYjsKCjYvMjIvOTcgOiBBZGRlZCBTV0lHIFJ1bnRpbWUgbGlicmFyeS4gICBUaGlzIGxpYnJhcnkgY29udGFpbnMKICAgICAgICAgIHRoZSBTV0lHIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucwogICAgICAgICAgdGhhdCBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gZXZlcnkgbW9kdWxlLiAgQnkgdXNpbmcKICAgICAgICAgIHRoZSBsaWJyYXJ5LCBpdCBpcyBlYXNpZXIgdG8gd29yayB3aXRoIG11bHRpcGxlIFNXSUcKICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIG1pbm9yIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byBzdGF0aWMgbGlua2luZwogICAgICAgICAgb2YgbXVsdGlwbGUgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIFdoZW4gdXNlZCB3aXRoCiAgICAgICAgICBQZXJsNSBzaGFkb3cgY2xhc3NlcywgdGhpcyBnZW5lcmF0ZXMgYSAncmVxdWlyZScgc3RhdGVtZW50CiAgICAgICAgICB0byBsb2FkIGluIGV4dGVybmFsIG1vZHVsZXMuCgo2LzIyLzk3IDogQWRkZWQgLXN3aWdsaWIgb3B0aW9uLiAgVGhpcyBwcmludHMgb3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeSBhbmQgZXhpdHMuICBUaGlzIG9wdGlvbiBpcyBvbmx5IHJlYWxseSB1c2VmdWwgdG8KICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG9vbHMgdGhhdCBhcmUgbG9va2luZyBmb3IgU1dJRyBhbmQgaXRzIGxpYnJhcnkKICAgICAgICAgIGxvY2F0aW9uIChlLmcuIGF1dG9jb25mLCBjb25maWd1cmUsIGV0Yy4uLikuCgo2LzIxLzk3IDogRml4ZWQgZXhwb3J0IGJ1ZyB3aXRoIFBlcmw1LjAwNCBvbiBXaW5kb3dzLU5ULgoKNi8yMC85NyA6IE1pbm9yIGNoYW5nZSB0byBjb2RlIGdlbmVyYXRpb24gb2YgY2xhc3Mvc3RydWN0dXJlIG1lbWJlcnMgaW4KICAgICAgICAgIG9yZGVyIHRvIHdvcmsgYmV0dGVyIHdpdGggdHlwZW1hcHMuIFNob3VsZCBoYXZlIG5vIG5vdGljYWJsZQogICAgICAgICAgaW1wYWN0IG9uIGV4aXN0aW5nIFNXSUcgbW9kdWxlcy4KCjYvMTkvOTcgOiBBZGRlZCAtdCBvcHRpb24uIFRoaXMgYWxsb3dzIFNXSUcgdG8gbG9hZCBhIHR5cGVtYXAgZmlsZSBiZWZvcmUKICAgICAgICAgIHByb2Nlc3NpbmcgYW55IGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtdCB0eXBlbWFwcy5pIC1weXRob24gZXhhbXBsZS5pCgogICAgICAgICAgQXQgbW9zdCwgb25seSBvbmUgdHlwZW1hcCBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBtYW5uZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE4Lzk3IDogTmVlZCBhIE1ha2VmaWxlIGZhc3Q/IFR5cGUKCiAgICAgICAgICAgICAgICAgc3dpZyBbLXRjbCwgLXBlcmw1LCAtcHl0aG9uXSAtY28gTWFrZWZpbGUKCiAgICAgICAgICBhbmQgeW91IHdpbGwgZ2V0IGEgTWFrZWZpbGUgc3BlY2lmaWMgdG8gdGhhdCB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICBZb3UganVzdCBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgeW91J3JlCiAgICAgICAgICByZWFkeSB0byBydW4uCgo2LzE4Lzk3IDogQ29tcGxldGVkIHRoZSAtY2kgb3B0aW9uLiAgVGhpcyBvcHRpb24gY2hlY2tzIGEgZmlsZSBpbnRvIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5LiAgIEl0IHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYQogICAgICAgICAgbGFuZ3VhZ2Ugb3B0aW9uLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICBzd2lnIC10Y2wgLWNpIGZvb2Jhci5pCgogICAgICAgICAgQ2hlY2tzIHRoZSBmaWxlIGZvb2Jhci5pIGludG8gdGhlIFRjbCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LgogICAgICAgICAgSW4gb3JkZXIgdG8gY2hlY2sgYSBmaWxlIGludG8gdGhlIGdlbmVyYWwgbGlicmFyeSAoYWNjZXNzaWJsZQogICAgICAgICAgdG8gYWxsIGxhbmd1YWdlcyBtb2R1bGVzKSwgZG8gdGhlIGZvbGxvd2luZwoKICAgICAgICAgICAgICAgICAgc3dpZyAtY2kgLW8gLi4vZm9vYmFyLmkgZm9vYmFyLmkKCiAgICAgICAgICAoQWRtaXR0ZWRseSB0aGlzIGxvb2tzIGEgbGl0dGxlIHN0cmFuZ2UgYnV0IGlzIHVuYXZvaWRhYmxlKS4KICAgICAgICAgIFRoZSBjaGVjay1pbiBvcHRpb24gaXMgcHJpbWFyaWx5IGRlc2lnbmVkIGZvciBTV0lHIG1haW50ZW5hbmNlCiAgICAgICAgICBhbmQgbGlicmFyeSBkZXZlbG9wbWVudC4gVGhlIGNvbW1hbmQgd2lsbCBmYWlsIGlmIHRoZSB1c2VyIGRvZXMKICAgICAgICAgIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gdG8gdGhlIFNXSUcgbGlicmFyeS4gIFRoaXJkIHBhcnR5IGxpYnJhcnkKICAgICAgICAgIGV4dGVuc2lvbnMgY2FuIGVhc2lseSBpbnN0YWxsIHRoZW1zZWx2ZXMgYnkgc2ltcGx5IHByb3ZpZGluZwogICAgICAgICAgYSBzaGVsbCBzY3JpcHQgdGhhdCB1c2VzICdzd2lnIC1jaScgdG8gaW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgIGxpYnJhcnkgZmlsZXMuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGtub3cgd2hlcmUgdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgaXMgbG9jYXRlZCBpZiB5b3UgdXNlIHRoaXMgbWVjaGFuaXNtLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNi85NyA6IEZpeGVkIGEgYnVnIGluIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdoZW4gJW5hbWUoKSB3YXMgYXBwbGllZAogICAgICAgICAgdG8gYSBjbGFzcyBkZWZpbml0aW9uLiAgIFVuZm9ydHVuYXRlbHksIGZpeGluZyB0aGUgYnVnIHJlcXVpcmVkCiAgICAgICAgICBhIGNoYW5nZSBpbiB0aGUgTGFuZ3VhZ2UgQyBBUEkgYnkgYWRkaW5nIGFuIGV4dHJhIGFyZ3VtZW50IHRvCiAgICAgICAgICB0aGUgTGFuZ3VhZ2U6OmNwcF9jbGFzc19kZWNsKCkgZnVuY3Rpb24uICBUaGlzIG1heSBicmVhawogICAgICAgICAgU1dJRyBDKysgZXh0ZW5zaW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi8xNS85NyA6IEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGlmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgJW1vZHVsZSBkaXJlY3RpdmUgb3IgLW1vZHVsZSBvcHRpb24uCgo2LzE1Lzk3IDogRml4ZWQgbGluZSBudW1iZXIgYnVnIHdoZW4gcmVwb3J0aW5nIGVycm9ycyBmb3IgdW5kZWZpbmVkCiAgICAgICAgICBiYXNlIGNsYXNzZXMuCgo2LzE1Lzk3IDogQWRkZWQgbmV3ICVyZW5hbWUgZGlyZWN0aXZlLiAgVGhpcyBhbGxvd3MgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24KICAgICAgICAgIG9mIGEgcmVuYW1pbmcuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVyZW5hbWUgT2xkTmFtZSBOZXdOYW1lOwoKICAgICAgICAgICAgICAgICAuLi4uIGxhdGVyIC4uLgogICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7CgogICAgICAgICAgVW5saWtlICVuYW1lLCAlcmVuYW1lIHdpbGwgcmVuYW1lIGFueSBvY2N1cmVuY2Ugb2YgdGhlIG9sZCBuYW1lLgogICAgICAgICAgVGhpcyBhcHBsaWVzIHRvIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzcyBtZW1iZXJzIGFuZCBzbyBmb3J0aC4KICAgICAgICAgIFRoZXJlIGlzIG5vIHdheSB0byBkaXNhYmxlICVyZW5hbWUgb25jZSBzZXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGUKICAgICAgICAgIG5hbWUgYnkgcmVkZWNsYXJpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE1Lzk3IDogSW1wcm92ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgc28gdGhhdCBpdAogICAgICAgICAgY291bGQgYmUgdXNlZCB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIDoKCiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNXSUcKICAgICAgICAgICAgICAgICAgICAlbmFtZShOZXdOYW1lKQogICAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7Cgo2LzE1Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gcmV0dXJuIGRhdGF0eXBlLiAgSW4gdGhpcyBjYXNlLAogICAgICAgICAgU1dJRyBhc3N1bWVzIGEgcmV0dXJuIHR5cGUgb2YgJ2ludCcuCgo2LzExLzk3IDogSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGluIHRoZSBwYXJzZXIuICBJdCBzaG91bGQgYmUgYSBsaXR0bGUKICAgICAgICAgIGxlc3Mgc2Vuc2l0aXZlIHRvIGVycm9ycyB0aGF0IG9jY3VyIGluc2lkZSBjbGFzcyBkZWZpbml0aW9ucwogICAgICAgICAgbm93LiAgQWxzbyByZXBvcnRzIGVycm9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCgo2LzExLzk3IDogTWFkZSAnJCcgYSBsZWdhbCBzeW1ib2wgaW4gaWRlbnRpZmllcnMuICBUaGlzIGlzIHRvIHN1cHBvcnQKICAgICAgICAgIHNvbWUgT2JqZWN0aXZlLUMgbGlicmFyaWVzLiAgU29tZSBjb21waWxlcnMgKHN1Y2ggYXMgZ2NjKSBtYXkgYWxzbwogICAgICAgICAgYWxsb3cgaWRlbnRpZmllcnMgdG8gY29udGFpbiBhICQgaW4gQy9DKysgY29kZSBhcyB3ZWxsICh0aGlzIGlzCiAgICAgICAgICBhbiBvYnNjdXJlIGZlYXR1cmUgb2YgQykuIFdoZW4gJyQnIGFwcGVhcnMgaW4gaWRlbnRpZmllciwgU1dJRwogICAgICAgICAgcmVtYXBzIGl0IHRvIHRoZSBzdHJpbmcgJ19TXycgd2hlbiBjcmVhdGluZyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBmdW5jdGlvbi4gVGh1cyBhIGZ1bmN0aW9uICdmb28kYmFyJyB3b3VsZCBiZSBjYWxsZWQgJ2Zvb19TX2JhcicuCgo2LzExLzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB3aXRoIF9fcmVwcl9fIG1ldGhvZC4gIElmCiAgICAgICAgICBzdXBwbGllZCBieSB0aGUgdXNlciwgaXQgd2FzIGlnbm9yZWQsIGJ1dCBub3cgaXQgc2hvdWxkIHdvcmsuCgo2LzkvOTcgIDogRml4ZWQgdGhlIFRjbCA4LjAgbW9kdWxlIHRvIHdvcmsgd2l0aCBUY2wgOC4wYjEuICAgU1dJRyBpcyBubwogICAgICAgICAgbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCAqYW55KiBhbHBoYSByZWxlYXNlIG9mIFRjbCA4LjAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvNy85NyAgOiBQdXQgYSBtYXhpbWFsIGVycm9yIGNvdW50IGluIChjdXJyZW50bHkgc2V0IHRvIDIwKS4gU1dJRyB3aWxsIGJhaWwgb3V0CiAgICAgICAgICBpZiBpdCBnZW5lcmF0ZXMgbW9yZSBlcnJvcnMgdGhhbiB0aGlzICh1c2VmdWwgZm9yIHByZXZlbnRpbmcgU1dJRwogICAgICAgICAgZnJvbSBwcmludGluZyA0MDAwIHN5bnRheCBlcnJvcnMgd2hlbiBpdCBnZXRzIGNvbmZ1c2VkKS4KCjYvNy85NyAgOiBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBwYXJzaW5nIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCgo2LzcvOTcgIDogTWlub3IgY2hhbmdlIHRvIFBlcmw1IG1vZHVsZS4gIEMrKyBzdGF0aWMgZnVuY3Rpb25zIGFyZSBub3cKICAgICAgICAgIHB1dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZWlyIGNsYXNzIHdoZW4gdXNpbmcgc2hhZG93IGNsYXNzZXMuCgo2LzcvOTcgIDogQ2VudHJhbGl6ZWQgdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMsIG1lbWJlcnMsIHdyYXBwZXJzIGV0Yy4uLiBCeQogICAgICAgICAgY2VudHJhbGl6aW5nIHRoZSBuYW1pbmcgc2NoZW1lLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFrZQogICAgICAgICAgc29tZSBtdWx0aS1maWxlIG9wdGltaXphdGlvbnMuICBBbHNvLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8KICAgICAgICAgIGNoYW5nZSBTV0lHJ3MgbmFtaW5nIHNjaGVtZSAocGVyaGFwcyBhIG5ldyBmZWF0dXJlIHRvIGJlIGFkZGVkCiAgICAgICAgICBsYXRlcikuCgo2LzIvOTcgIDogQWRkZWQgJ2FyZ2luaXQnIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBhc3NpZ24gaW5pdGlhbCB2YWx1ZXMKICAgICAgICAgIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIERvaW5nIHNvIG1ha2VzIGl0IHNvbWV3aGF0IGVhc2llciB0byBkZXRlY3QKICAgICAgICAgIGltcHJvcGVyIGFyZ3VtZW50IHBhc3Npbmcgd2hlbiB3b3JraW5nIHdpdGggb3RoZXIgdHlwZW1hcHMuCgo2LzIvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHJlYWQtb25seSB2YXJpYWJsZXMgd2VyZSBpbmhlcml0ZWQKICAgICAgICAgIGludG8gb3RoZXIgY2xhc3Nlcy4gIFVuZGVyIGluaGVyaXRhbmNlLCB0aGUgdmFyaWFibGVzIHdvdWxkCiAgICAgICAgICBiZWNvbWUgd3JpdGFibGUsIGJ1dCB0aGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQuCgo1LzMwLzk3IDogQW4gZW1wdHkgJW5hbWUoKSBkaXJlY3RpdmUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgb3Igc3VwcG9ydGVkLgogICAgICAgICAgVGhpcyBkaXJlY3RpdmUgd2FzIG9yaWdpbmFsbHkgdXNlZCB0byBzdHJpcCB0aGUgcHJlZml4CiAgICAgICAgICBvZmYgb2YgYSBjbGFzcyBvciBzdHJ1Y3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5ldmVyIHJlYWxseQogICAgICAgICAgc2VlbWVkIHRvIHdvcmsgcmlnaHQgYW5kIGl0IGNvbXBsaWNhdGVkIHRoZSBDKysgY29kZSBnZW5lcmF0b3IKICAgICAgICAgIHNpZ25pZmljYW50bHkuICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwgbm8gb25lIHVzZXMgaXQsIHNvIGl0CiAgICAgICAgICBpcyBub3cgaGlzdG9yeS4gICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS8yOC85NyA6IEZpeGVkIGEgcGFyc2luZyBidWcgd2l0aCAjZGVmaW5lIGFuZCBDKysgY29tbWVudHMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBub3cgd29yayBwcm9wZXJseSA6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBDT05TVCAgIDQgICAgIC8vIEEgQ29tbWVudAoKNS8yOC85NyA6IE1hZGUgc29tZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFNXSUcgU3RyaW5nIGNsYXNzLgogICAgICAgICAgKG9ubHkgYWZmZWN0cyB0aGUgU1dJRyBjb21waWxlciBpdHNlbGYpLgoKNS8yOC85NyA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc2tpcCB0ZW1wbGF0ZSBkZWZpbml0aW9ucyBhbmQgaXNzdWUgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLgoKNS8yOC85NyA6IFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgYWRkZWQgKGllLiB0ZW1wbGF0ZXMpLgogICAgICAgICAgVHlwZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIFNXSUcgY29tcGlsZXIKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28odmVjdG9yPGNvbXBsZXg+ICphLCB2ZWN0b3I8ZG91YmxlPiAqYik7CgogICAgICAgICAgV2hlbiB1c2VkLCB0aGUgZW50aXJlIG5hbWUgJ3ZlY3Rvcjxjb21wbGV4PicgYmVjb21lcyB0aGUgbmFtZQogICAgICAgICAgb2YgdGhlIGRhdGF0eXBlLiAgICAgIER1ZSB0byBzcGFjZSBsaW1pdGF0aW9ucyBpbiBkYXRhdHlwZQogICAgICAgICAgcmVwcmVzZW50YXRpb25zLCB0aGUgbmFtZSBzaG91bGQgbm90IGV4Y2VlZCA5NiBjaGFyYWN0ZXJzLgoKICAgICAgICAgIE5vdGUgOiBUaGlzIGlzIG9ubHkgcGFydCBvZiB3aGF0IGlzIG5lZWRlZCBmb3IgdGVtcGxhdGUgc3VwcG9ydC4KICAgICAgICAgIFRlbXBsYXRlIGNsYXNzIGRlZmluaXRpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSBTV0lHLgoKICAgICAgICAgIFRoZSB0ZW1wbGF0ZSBub3RhdGlvbiBhYm92ZSBtYXkgYWxzbyBiZSB1c2VkIHdoZW4gc3BlY2lmeWluZwogICAgICAgICAgT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzI0Lzk3IDogRmlyc3QgY3V0IGF0IE9iamVjdGl2ZS1DIHN1cHBvcnQgYWRkZWQuICAgQXMgaXQgdHVybnMgb3V0LCBhbG1vc3QKICAgICAgICAgIGV2ZXJ5dGhpbmcgY2FuIGJlIGhhbmRsZWQgd2l0aCBvbmx5IGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8KICAgICAgICAgIHRoZSBDKysgbW9kdWxlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yMy85NyA6IEZpeGVkIHJlcGVhdGVkIGRlZmluaXRpb24gYnVnIGluIG11bHRpcGxlIGluaGVyaXRhbmNlIGhhbmRsaW5nCiAgICAgICAgICB3aGVuIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIChpZS4KICAgICAgICAgIHRoZSBldmlsIGRpYW1vbmQpLgoKNS8yMS85NyA6IEZpeGVkIHJhdGhlciBlbWJhcnJhc3NpbmcgdHlwbyB0aGF0IHdvcmtlZCBpdHMgd2F5IGludG8gdGhlCiAgICAgICAgICBUZXN0cy9CdWlsZCBkaXJlY3RvcnkuCgo1LzE5Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIG5hdGl2ZSBtZXRob2RzIGFuZAogICAgICAgICAgc2hhZG93IGNsYXNzZXMgd2l0aCBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMuCgo1LzE5Lzk3IDogTW9kaWZpZWQgdGhlICVhcHBseSBkaXJlY3RpdmUgc2xpZ2h0bHkgc28gdGhhdCBpdCB3b3VsZCB3b3JrCiAgICAgICAgICB3aXRoIHBvaW50ZXJzIGEgbGl0dGxlIGJldHRlci4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IHVuc2lnbmVkIGxvbmcgeyBEV09SRCB9OwoKICAgICAgICAgIEFwcGxpZXMgKmFsbCogdHlwZW1hcHMgYXNzb2NpYXRlZCB3aXRoICJ1bnNpZ25lZCBsb25nIiB0bwogICAgICAgICAgIkRXT1JEIi4gICBUaGlzIG5vdyBpbmNsdWRlcyBwb2ludGVycyB0byB0aGUgdHdvIGRhdGF0eXBlcy4KICAgICAgICAgIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgYXBwbGllZCB0byAidW5zaWduZWQgbG9uZyAqKiIgd291bGQKICAgICAgICAgIGFsc28gYmUgYXBwbGllZCB0byBhbnkgb2NjdXJyZW5jZSBvZiAiRFdPUkQgKioiIGFzIHdlbGwuCgo1LzE5Lzk3IDogRml4ZWQgYW4gb3duZXJzaGlwIGFzc2lnbm1lbnQgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgY2xhc3MgbWVtYmVycyB3ZXJlIHJldHVybmluZyBuZXcgb2JqZWN0cyBiZWxvbmdpbmcgdG8KICAgICAgICAgIGRpZmZlcmVudCBjbGFzc2VzLgoKNS8xNy85NyA6IEFkZGVkIGEgZmV3IG1vcmUgdHlwZW1hcCB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICAgICAkbmFtZSAgICAgICAgICAtIE5hbWUgb2YgZnVuY3Rpb24vdmFyaWFibGUvbWVtYmVyCiAgICAgICAgICAgICAgICAgICRiYXNldHlwZSAgICAgIC0gQmFzZSBkYXRhdHlwZSAodHlwZSB3aXRob3V0IHBvaW50ZXJzKQogICAgICAgICAgICAgICAgICAkYXJnbnVtICAgICAgICAtIEFyZ3VtZW50IG51bWJlcgoKNS8xNi85NyA6IEZpeGVkIGVtYmFycmFzc2luZyB1bmRlcnNjb3JlIGVycm9yIGluIGxvY2FsIHZhcmlhYmxlCiAgICAgICAgICBhbGxvY2F0b3IuCgo1LzE2Lzk3IDogRml4ZWQgbmFtZXNwYWNlIGNsYXNoIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzCiAgICAgICAgICB3aGVuIGNyZWF0aW5nIGFycmF5cyBhcyBuZXcgbG9jYWwgdmFyaWFibGVzLgoKNS8xNS85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIGluaGVyaXRhbmNlIG9mIGFkZGVkIG1ldGhvZHMgYWNyb3NzCiAgICAgICAgICBtdWx0aXBsZSBmaWxlcy4gICBTV0lHIG5vdyB1c2VzIG5hbWVzIG9mIGJhc2UgY2xhc3NlcwogICAgICAgICAgd2hlbiBnZW5lcmF0aW5nIHN1Y2ggZnVuY3Rpb25zLgoKNS8xNC85NyA6IEZpbmlzaGVkIHN1cHBvcnQgZm9yIGRlZmF1bHQgdHlwZW1hcHMuICBQcmltYXJpbHkgdXNlZAogICAgICAgICAgaW50ZXJuYWxseSwgdGhleSBjYW4gYmUgdXNlZCB0byBtYXRjaCB0aGUgYmFzaWMKICAgICAgICAgIGJ1aWx0LWluIGRhdGF0eXBlcyB1c2VkIGluc2lkZSBvZiBTV0lHLiAgIFlvdSBjYW4KICAgICAgICAgIHNwZWNpZnkgdGhlbSBpbiBpbnRlcmZhY2UgZmlsZXMgYXMgd2VsbCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gYXRvaSgkdGFyZ2V0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFVubGlrZSBub3JtYWwgdHlwZW1hcHMsIHRoaXMgZGVmYXVsdCBtYXAgd2lsbCBnZXQgYXBwbGllZAogICAgICAgICAgdG8gKmFsbCogaW50ZWdlciBkYXRhdHlwZXMgZW5jb3VudGVyZWQsIGluY2x1ZGluZyB0aG9zZQogICAgICAgICAgcmVuYW1lZCB3aXRoIHR5cGVkZWYsIGV0Yy4uLgoKNS8xMy85NyA6IEZpeGVkIHN1YnN0cmluZyBidWcgaW4gdHlwZSBjaGVja2VyLgoKNS8xMi85NyA6IEZpeGVkIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIHdoZW4gZGVjbGFyaW5nIGxvY2FsCiAgICAgICAgICB2YXJpYWJsZXMgb2Ygc3RydWN0dXJlcy4KClZlcnNpb24gMS4xIEJldGE2IChNYXkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNS85Lzk3ICA6IEZpeGVkIGJpemFycmUgTlVMTCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBtb2R1bGUuCgo1LzgvOTcgIDogRml4ZWQgbXlzdGVyaW91cyBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBydW5uaW5nIFNXSUcgb24gYW4KICAgICAgICAgIGVtcHR5IGZpbGUuCgo1LzcvOTcgIDogVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgbm93IHJlcGxhY2UgdGhlIHNwZWNpYWwgc3ltYm9sICIkY2xlYW51cCIKICAgICAgICAgIHdpdGggdGhlIGNsZWFudXAgY29kZSBzcGVjaWZpZWQgd2l0aCB0aGUgImZyZWVhcmciIHR5cGVtYXAuCiAgICAgICAgICBUaGlzIGNoYW5nZSBuZWVkZWQgdG8gcHJvcGVybHkgbWFuYWdlIG1lbW9yeSBhbmQgZXhjZXB0aW9ucy4KCjUvNS85NyAgOiBBZGRlZCB0aGUgJ3R5cGVtYXBzLmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgY29udGFpbnMgYQogICAgICAgICAgdmFyaWV0eSBvZiBjb21tb24gdHlwZW1hcHMgZm9yIGlucHV0IHZhbHVlcywgcG9pbnRlcnMsCiAgICAgICAgICBhbmQgc28gb24uCgo1LzUvOTcgIDogQ2hhbmdlZCBiZWhhdmlvciBvZiAiYXJnb3V0IiB0eXBlbWFwIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICBPbGQgdmVyc2lvbnMgYXV0b21hdGljYWxseSB0dXJuZWQgdGhlIHJlc3VsdCBpbnRvIGEKICAgICAgICAgIFB5dGhvbiBsaXN0LiAgVGhlIG5ldyB2ZXJzaW9uIGRvZXMgbm90aGluZywgbGVhdmluZyB0aGUKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHVwIHRvIHRoZSB1c2VyLiAgVGhpcyBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5CiAgICAgICAgICBidXQgbWF5IGJyZWFrIG9sZGVyIGNvZGVzIHRoYXQgcmVseSBvbiB0eXBlbWFwcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uIG9mCiAgICAgICAgICAiYXJnb3V0IiBhbmQgImlnbm9yZSIgdHlwZW1hcHMuCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgdGhhdCB3b3VsZCBnZW5lcmF0ZSBpbmNvcnJlY3QgY29kZQogICAgICAgICAgaWYgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgImlnbm9yZWQiLgoKNS80Lzk3ICA6IEFkZGVkICVhcHBseSBhbmQgJWNsZWFyIGRpcmVjdGl2ZXMuICAgVGhlc2UgZm9ybSBhIGhpZ2hlciBsZXZlbAogICAgICAgICAgaW50ZXJmYWNlIHRvIHRoZSB0eXBlbWFwIG1lY2hhbmlzbS4gIEluIGEgbnV0c2hlbGwsIHRoZXkKICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgcHJvY2Vzc2luZyBvZiB2YXJpb3VzIGRhdGF0eXBlcyB3aXRob3V0CiAgICAgICAgICBldmVyIGhhdmluZyB0byB3cml0ZSBhIHR5cGVtYXAuICBTZWUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbgogICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gICoqIE5FVyBGRUFUVVJFICoqCgo1LzQvOTcgIDogQWRkZWQgYSBsb2NhbCB2YXJpYWJsZSBleHRlbnNpb24gdG8gdGhlIHR5cGVtYXAgaGFuZGxlci4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKihkb3VibGUgdGVtcCkgewoJCSAgICAgICAgdGVtcCA9IGF0b2YoJHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSAmdGVtcDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCAndGVtcCcgaXMgYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cwogICAgICAgICAgaW4gdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uIChub3QganVzdCB0aGUgdHlwZW1hcAogICAgICAgICAgY29kZSkuICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBiZXR0ZXIgc3VwcG9ydCBmb3IKICAgICAgICAgIGNlcnRhaW4gdHlwZXMgb2YgYXJndW1lbnQgaGFuZGxpbmcgYW5kIGFsc28gbWFrZXMgaXQKICAgICAgICAgIHBvc3NpYmxlIHRvIHdyaXRlIHRocmVhZC1zYWZlIHR5cGVtYXBzLiAgQW55IG51bWJlcgogICAgICAgICAgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBieSBzdXBwbHlpbmcgYSBjb21tYQogICAgICAgICAgc2VwYXJhdGVkIGxpc3QuICAgTG9jYWwgdmFyaWFibGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlCiAgICAgICAgICB1bmlxdWUsIGV2ZW4gaWYgdGhlIHNhbWUgdHlwZW1hcCBpcyBhcHBsaWVkIG1hbnkgdGltZXMKICAgICAgICAgIGluIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgICAgICAgICAqKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBQZXJsNCBvciBHdWlsZSBtb2R1bGVzLgoKNS8yLzk3ICA6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJWlmZGVmLCAlZW5kaWYsICVpZiwgZXRjLi4uICAoVGhlc2UgYXJlCiAgICAgICAgICBTV0lHIGVxdWl2YWxlbnRzIG9mIHRoZSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgIGNhbiBwYXNzIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKS4KCjUvMi85NyAgOiBGaXhlZCBtYWpvciAoYnV0IHN1YnRsZSkgYnVnIGluIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIKICAgICAgICAgIHJlbGF0ZWQgdG8gc2VhcmNoaW5nIGFuZCB0eXBlLWNoZWNraW5nIGZvciBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICBUbyBtYWtlIGEgbG9uZyBzdG9yeSBzaG9ydCwgaWYgeW91IGhhZCB0d28gY2xhc3NlcyBuYW1lZAogICAgICAgICAgIkZvbyIgYW5kICJGb29PYmplY3QiIHRoZSB0eXBlIGNoZWNrZXIgd291bGQgc29tZXRpbWVzCiAgICAgICAgICBnZXQgY29uZnVzZWQgYW5kIGJlIHVuYWJsZSB0byBsb2NhdGUgIkZvbyIgaW4gYW4gaW50ZXJuYWwKICAgICAgICAgIHRhYmxlLgoKNS8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgLWNvIG9wdGlvbi4KCjQvMjQvOTcgOiBQb2ludGVyIGxpYnJhcnkgYWRkZWQgdG8gdGhlIFNXSUcgbGlicmFyeS4KCjQvMTkvOTcgOiBBZGRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICAgVGhpcyBpcyBhICJoaW50IiB0aGF0IGNhbiBiZSB1c2VkCiAgICAgICAgICB0byB0ZWxsIFNXSUcgdGhhdCBhIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IEZvbyAqY3JlYXRlX2ZvbygpOwoKICAgICAgICAgIFRoaXMgdGVsbHMgU1dJRyB0aGF0IGNyZWF0ZV9mb28oKSBpcyBjcmVhdGluZyBhIG5ldyBvYmplY3QKICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGl0LiAgIE1hbnkgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkKICAgICAgICAgIGNob29zZSB0byBpZ25vcmUgdGhlIGhpbnQsIGJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywKICAgICAgICAgIHRoZSAlbmV3IGlzIHVzZWQgdG8gaGFuZGxlIHByb3BlciBvd25lcnNoaXAgb2Ygb2JqZWN0cy4KCiAgICAgICAgICAlbmV3IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5ncy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgY2hhciAqY3JlYXRlX3N0cmluZygpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHdpbGwgYXV0b21hdGljYWxseSBjbGVhbnVwCiAgICAgICAgICB0aGUgcmV0dXJuZWQgc3RyaW5nLS1lbGltaW5hdGluZyBtZW1vcnkgbGVha3MuCiAgICAgICAgICAqKiBORVcgRkVBVFVSRSAqKgoKNC8xOS85NyA6IEFkZGVkIGEgbmV3IHR5cGVtYXAgIm5ld2ZyZWUiLiAgIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICAgICAgICB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgbWV0aG9kIGJ5IHdoaWNoCiAgICAgICAgICBhIG5ldyBvYmplY3QgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBpcyBkZWxldGVkLgoKNC8xOS85NyA6IFRoZSBzeW1ib2wgIl9fY3BsdXNwbHVzIiBpcyBub3cgZGVmaW5lZCBpbiB0aGUgU1dJRyBpbnRlcnByZXRlcgogICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggdGhlIC1jKysgb3B0aW9uLgoKNC8xNy85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIHdoZW4gdXNlZCBpbnNpZGUgdGhlCiAgICAgICAgICAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgo0LzE1Lzk3IDogQWRkZWQgYSBzcGVjaWFsIHR5cGVtYXAgc3ltYm9sIFBSRVZJT1VTIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIHJlc3RvcmUgYSBwcmV2aW91cyB0eXBlbWFwLiBGb3IgZXhhbXBsZSA6CgoJICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgKiA9IFBSRVZJT1VTOwoKICAgICAgICAgIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgaW4gbGlicmFyeSBmaWxlcy4KCjQvMTMvOTcgOiBBZGRlZCAlcHJhZ21hIGRpcmVjdGl2ZSBmb3IgUGVybDUgbW9kdWxlLiAgIFR3byBuZXcgcHJhZ21hcyBhcmUKICAgICAgICAgIGF2YWlsYWJsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGNvZGUgPSAic3RyaW5nIgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiZmlsZS5wbCIKCiAgICAgICAgICBCb3RoIGluc2VydCBjb2RlIGludG8gdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4gIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY3VzdG9taXplIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuCgo0LzEzLzk3IDogU2Nhbm5lciBtb2RpZmllZCB0byBvbmx5IHJlY29nbml6ZSBDKysga2V5d29yZHMgd2hlbiB0aGUgLWMrKwogICAgICAgICAgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQyBwcm9ncmFtcwogICAgICAgICAgdGhhdCBtYWtlIHVzZSBvZiB0aGVzZSBrZXl3b3JkcyBmb3IgaWRlbnRpZmllcnMuCiAgICAgICAgICBTV0lHIG1heSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgcnVuIHdpdGggdGhlIC1jKysgb3B0aW9uIHdoZW4KICAgICAgICAgIGNvbXBpbGluZyBDKysgY29kZSAodGhpcyB3YXMgYWxsb3dlZCwgYnV0IG5vdCByZWNvbW1lbmRlZCBpbgogICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMpLiAqKlBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkqKgoKNC8xMS85NyA6IEZpeGVkIGEgcmF0aGVyIG5hc3R5IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gdXNpbmcKICAgICAgICAgIHZhcmlhYmxlIGxpbmtpbmcgd2l0aCBjb21wbGV4IGRhdGF0eXBlcyBhbmQgcG9pbnRlcnMuICAgT24gVW5peCwKICAgICAgICAgIGNvZGUgd291bGQgd29yayAoc29tZWhvdyksIGJ1dCB3b3VsZCBjYXVzZSBhbiBhY2Nlc3MgdmlvbGF0aW9uCiAgICAgICAgICB1bmRlciBXaW5kb3dzLU5ULiAgVGhlIGZpeCBzaG91bGQgY29ycmVjdCB0aGUgcHJvYmxlbSwKICAgICAgICAgIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSBwcm9ibGVtIHVzaW5nIGdsb2JhbCB2YXJpYWJsZXMgb2YKICAgICAgICAgIGNvbXBsZXggZGF0YXR5cGVzIGluIGNvbmp1bmN0aW9uIHdpdGggc2hhZG93IGNsYXNzZXMuICBGb3J0dW5hdGVseSwKICAgICAgICAgIHRoaXMgc29ydCBvZiB0aGluZyBzZWVtcyB0byBiZSByZWxhdGl2ZWx5IHJhcmUgKGNvbnNpZGVyaW5nCiAgICAgICAgICB0aGF0IHRoZSBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBtb3JlIHRoYW4gYSB5ZWFyIC0geWlrZXMhKS4KCjQvMTEvOTcgOiBGaXhlZCBiaXphcnJlIGNvbnN0YW50IGV2YWx1YXRpb24gYnVnIGluIFBlcmw1IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MtTlQuCgo0LzgvOTcgIDogQnVnIHdoZW4gdXNpbmcgZGVmYXVsdCBhcmd1bWVudHMgYW5kIEMrKyByZWZlcmVuY2VzIGZpeGVkLgoKNC84Lzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIGluIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcyByZWxhdGVkIHRvCiAgICAgICAgICB1c2luZyBjbGFzcyByZW5hbWluZyAoYXBwbHlpbmcgdGhlICVuYW1lIGRpcmVjdGl2ZSB0byBhIGNsYXNzCiAgICAgICAgICBkZWZpbml0aW9uKSBhbmQgc2hhZG93IGNsYXNzZXMuCgo0LzcvOTcgIDogRml4ZWQgbWlub3IgYnVncyBpbiBzd2lncHRyLnN3ZywgdGNsOHB0ci5zd2csIGFuZCBwZXJsNXB0ci5zd2cgdG8KICAgICAgICAgIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB3ZWlyZCBkYXRhdHlwZXMgYXJlIHBhc3NlZC4KCjMvMjkvOTcgOiAnTWFrZWZpbGUud2luJyBhZGRlZC4gICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZXhhbXBsZXMKICAgICAgICAgIGluIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdW5kZXIgV2luZG93cyBOVC85NS4KCjMvMjcvOTcgOiBGaXhlcyB0byBTV0lHJ3MgZXJyb3IgcmV0dXJuIGNvZGVzLiAgIFNXSUcgbm93IHJldHVybnMgbm9uLXplcm8KICAgICAgICAgIGV4aXQgY29kZXMgZm9yIGNlcnRhaW4ga2luZHMgb2YgZXJyb3JzICh3aGljaCBtYWtlcyBpdCBtb3JlCiAgICAgICAgICBmcmllbmRseSB0byBtYWtlZmlsZXMpLiAgICAgQW4gb3ZlcmhhdWwgb2YgdGhlIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICBpcyBvbiB0aGUgdG8tZG8gbGlzdCBhbmQgd2lsbCBwcm9iYWJseSBzaG93IHVwIGluIGEgbGF0ZXIgcmVsZWFzZS4KCjMvMjUvOTcgOiBCdWcgZml4LiAgImZyZWVhcmciIGFuZCAiYXJnb3V0IiB0eXBlbWFwcyBoYXZlIGJlZW4gZml4ZWQgaW4KICAgICAgICAgIHRoZSBQZXJsNSBtb2R1bGUuICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycwogICAgICAgICAgYW5kIGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXJzIHNoYXJlZCB0aGUgc2FtZSBtZW1vcnkgc3BhY2UtLWNhdXNpbmcKICAgICAgICAgIGFsbCBzb3J0cyBvZiBuYXN0eSBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBwYXNzIHBlcmwgdmFsdWVzIGJ5CiAgICAgICAgICByZWZlcmVuY2UuICAgU1dJRyBub3cgaW50ZXJuYWxseSBtYWtlcyBhICJjb3B5IiAod2hpY2ggaXMgcmVhbGx5CiAgICAgICAgICBqdXN0IGEgcG9pbnRlcikgb2YgYWZmZWN0ZWQgcGFyYW1ldGVycyBhbmQgdXNlcyB0aGF0LiAgIFRoaXMKICAgICAgICAgIGlzIGRvbmUgdHJhbnNwYXJlbnRseSBzbyB0aGVyZSBpcyBubyBub3RpY2FibGUgaW1wYWN0IG9uIGFueQogICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gICBUaGlzIGNoYW5nZSBpcyBwcm9iYWJseSBvbmx5IG5vdGljYWJsZQogICAgICAgICAgdG8gZXhwZXJ0IHVzZXJzLgoKMy8yNS85NyA6IEFkZGVkIHR5cGUtY2hlY2sgdG8gdmVyYm9zZSBhbmQgc3RhdCBtb2RlLiAgU1dJRyB3aWxsIG5vdyBnZW5lcmF0ZSBhIGxpc3QKICAgICAgICAgIG9mIGFsbCBkYXRhdHlwZXMgdGhhdCB3ZXJlIHVzZWQgYnV0IHVuZGVmaW5lZCAodXNlZnVsIGZvciB0cmFja2luZwogICAgICAgICAgZG93biB3ZWlyZCBidWdzKS4gICBUaGlzIGlzIGVuYWJsZWQgd2l0aCB0aGUgLXYgb3B0aW9uICh3aGljaAogICAgICAgICAgaXMgbm93IG9mZmljaWFsbHkga25vd24gYXMgIm92ZXJseSB2ZXJib3NlIiBtb2RlKSBvciB0aGUgLXN0YXQgb3B0aW9uLgoKMy8yNS85NyA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNlciB0byBtYWtlIGluY2x1ZGUgZ3VhcmRzIHdvcmsgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICNpZm5kZWYgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICNkZWZpbmUgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vYmFyLmkKICAgICAgICAgICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKCjMvMjQvOTcgOiAlY2hlY2tvdXQgZGlyZWN0aXZlIGFkZGVkLiAgIFRoaXMgYWxsb3dzIGFuIGludGVyZmFjZSBmaWxlIHRvCiAgICAgICAgICBleHRyYWN0IGZpbGVzIGZyb20gdGhlIFNXSUcgbGlicmFyeSBhbmQgcGxhY2UgdGhlbSBpbiB0aGUKICAgICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCBzY3JpcHRzIGFuZAogICAgICAgICAgb3RoZXIgaGVscGVyIGNvZGUgdGhhdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggbGlicmFyeSBmaWxlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAlY2hlY2tvdXQgYXJyYXkudGNsCgogICAgICAgICAgV2lsbCBsb29rIGZvciBhIGZpbGUgImFycmF5LnRjbCIgaW4gdGhlIGxpYnJhcnkgYW5kIGNvcHkgaXQKICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gICAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlCiAgICAgICAgICBkaXJlY3RvcnksIHRoaXMgZGlyZWN0aXZlIGRvZXMgbm90aGluZyAoaXQgd2lsbCBub3Qgb3ZlcndyaXRlIGFuCiAgICAgICAgICBleGlzdGluZyBmaWxlKS4gIFRoaXMgb25seSBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBmb3Igbm93LgoKMy8yNC85NyA6IFNXSUcgd2lsbCBub3cgbG9vayBpbiB0aGUgU1dJRyBMaWJyYXJ5IGZvciBhIGZpbGUgaWYgaXQgY2FuJ3QKICAgICAgICAgIGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQXMgYSByZXN1bHQsIGl0IGlzIGVhc3kgdG8KICAgICAgICAgIG1ha2UgbW9kdWxlcyBmcm9tIFNXSUcgbGlicmFyeSBmaWxlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgIHdhbnQgdG8gbWFrZSBhIFB5dGhvbiBtb2R1bGUgZnJvbSB0aGUgU1dJRyB0aW1lcnMgbGlicmFyeSwganVzdAogICAgICAgICAgdHlwZSB0aGlzIGluIGFueSBkaXJlY3RvcnkgOgoKICAgICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiB0aW1lcnMuaQoKICAgICAgICAgIFlvdSB3aWxsIGdldCB0aGUgZmlsZXMgdGltZXJzX3dyYXAuYyBhbmQgdGltZXJzX3dyYXAuZG9jIGluCiAgICAgICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCB5b3UgY2FuIG5vdyBjb21waWxlLiAgIFRoZSBmaWxlCiAgICAgICAgICByZW1haW5zIGluIHRoZSBTV0lHIGxpYnJhcnkgKGFsdGhvdWdoIHlvdSBjYW4gY2hlY2sgaXQgb3V0CiAgICAgICAgICB1c2luZyB0aGUgLWNvIG9wdGlvbikuICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogLWNvIG9wdGlvbiBhZGRlZCB0byBTV0lHIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIHRoZSBTV0lHIGxpYnJhcnkuCiAgICAgICAgICBXaGVuIHVzZWQsIHRoaXMgaW5zdHJ1Y3RzIFNXSUcgdG8gY2hlY2sgb3V0IGEgbGlicmFyeSBmaWxlIGFuZAogICAgICAgICAgcGxhY2UgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIHVuaXggPiBzd2lnIC1jbyBhcnJheS5pCiAgICAgICAgICAgICAgICBhcnJheS5pIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgICAgICAgdW5peCA+CgogICAgICAgICAgT25jZSBpbiB5b3VyIGRpcmVjdG9yeSB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZmlsZSB0byBzdWl0IHlvdXIKICAgICAgICAgIHBhcnRpY3VsYXIgcHVycG9zZXMuICBUaGUgY2hlY2tvdXQgb3B0aW9uIG1ha2VzIGl0IGVhc3kgdG8KICAgICAgICAgIGdyYWIgbGlicmFyeSBmaWxlcyB3aXRob3V0IGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIFNXSUcKICAgICAgICAgIGluc3RhbGxhdGlvbiwgYnV0IGl0IGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQKICAgICAgICAgIGluY2x1ZGluZyBzY3JpcHRzLCBDIGNvZGUsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIGZpbGVzCiAgICAgICAgICBpbiB0aGUgbGlicmFyeS4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgcHV0IGEgY29vbCBzY3JpcHQKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5IGFuZCBjaGVjayBpdCBvdXQgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQuCiAgICAgICAgICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogI3ByYWdtYSBleHBvcnQgZGlyZWN0aXZlcyBhZGRlZCB0byBUY2wgb3V0cHV0IGZvciBjb21waWxpbmcKICAgICAgICAgIHNoYXJlZCBsaWJyYXJpZXMgb24gdGhlIE1hYy4KCjMvMjQvOTcgOiBNaW5vciBjaGFuZ2VzIHRvIHdpc2guaSBhbmQgdGNsc2guaSBsaWJyYXJ5IGZpbGVzIHRvIHByb3ZpZGUKICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBNYWNpbnRvc2guCgozLzE5Lzk3IDogU1dJRydzIHBvbGljeSB0b3dhcmRzIE5VTEwgcG9pbnRlcnMgaGFzIGJlZW4gcmVsYXhlZC4gIFRoZQogICAgICAgICAgcG9saWN5IG9mIHJlcXVpcmluZyBhIHNwZWNpYWwgY29tcGlsZXIgZGlyZWN0aXZlIC1EQUxMT1dfTlVMTAogICAgICAgICAgdG8gdXNlIE5VTEwgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIFdoaWxlIHRoaXMgbWF5CiAgICAgICAgICBzZWVtICJ1bnNhZmUiLCBpdCB0dXJucyBvdXQgdGhhdCB5b3UgY2FuIHVzZSBhICJjaGVjayIKICAgICAgICAgIHR5cGVtYXAgdG8gYWNoaWV2ZSBzb21lIHNhZmV0eS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIE5vZGUgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk5VTEwgUG9pbnRlcnMgbm90IGFsbG93ZWQuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBwcmV2ZW50cyBhbnkgTlVMTCB2YWx1ZSBvZiBhICJOb2RlICoiIHBvaW50ZXIgdG8gYmUKICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uLiAgIChJIHRoaW5rIHRoaXMgaXMgbXVjaCBjbGVhbmVyCiAgICAgICAgICB0aGFuIHRoZSBvbGQgLURBTExPV19OVUxMIGhhY2sgYW55d2F5cykuCgozLzE5Lzk3IDogRml4ZWQgcG9pbnRlciBoYW5kbGluZyBlcnJvcnMgaW4gUGVybDUgbW9kdWxlLiAgTW9kdWxlcyBubwogICAgICAgICAgbG9uZ2VyIGNvcmUgZHVtcCB3aGVuIGEgUGVybCByZWZlcmVuY2UgaXMgaW5hZHZlcnRlbnRseQogICAgICAgICAgcGFzc2VkIGluIGFzIGEgQyBwb2ludGVyLgoKMy8xOC85NyA6IEFkZGVkIGEgImNoZWNrIiB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlCiAgICAgICAgICB2YWxpZGl0eSBvZiBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIGludCBwb3NpbnQgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIkFyZ3VtZW50IGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIiKTsKICAgICAgICAgICAgICAgIH0KCjMvMTgvOTcgOiBBZGRlZCBhbiAkYXJnIHZhcmlhYmxlIHRvIFRjbCB0eXBlbWFwcy4gICBUaGlzIG1ha2VzIGl0IGVhc2llcgogICAgICAgICAgdG8gcmV0dXJuIGFyZ3VtZW50IHZhbHVlcyBieSAicmVmZXJlbmNlIi4KCjMvMTgvOTcgOiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBDKysgcmVmZXJlbmNlcyBhbmQKICAgICAgICAgIHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgozLzE4Lzk3IDogRml4ZWQgYSBmZXcgZ2xpdGNoZXMgaW4gdGhlIHR5cGVtYXAgbW9kdWxlIHdpdGggcmVzcGVjdCB0bwogICAgICAgICAgY2hhaW5pbmcuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAgJGluICAgICAgICAgICAgICAgIC8vIEluc2VydHMgcHJleGlzdGluZyB0eXBlbWFwCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWNlaXZlZCBhICVkXG4iLCAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGFsbG93ZWQgZm9yIHF1aXRlIHNvbWUgdGltZSwgYnV0IGRpZG4ndCB3b3JrCiAgICAgICAgICBpZiBubyBleGlzdGluZyB0eXBlbWFwIHdhcyBkZWZpbmVkLiAgTm93LCBpdCBzdGlsbCBkb2Vzbid0CiAgICAgICAgICB3b3JrIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgaXMgZGVmaW5lZCwgYnV0IGl0IGlzc3VlcyBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuICAgVGhlcmUgaXMgc29tZSBzdXBwb3J0IHVzaW5nIGRlZmF1bHQgdHlwZW1hcHMsCiAgICAgICAgICBidXQgbm9uZSBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB0YWtlIGFkdmFudGFnZSBvZiBpdC4gIFRoaXMKICAgICAgICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUuCgpWZXJzaW9uIDEuMWI1IFBhdGNoIDEgKE1hcmNoIDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xNi85NyA6IEZpeGVkIHJlZmVyZW5jZXMgYnVnIHdpdGggQysrIGNvZGUgZ2VuZXJhdGlvbi4KCjMvMTYvOTcgOiBGaXhlZCBpbml0aWFsaXphdGlvbiBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIHRoYXQKICAgICAgICAgIHdhcyBjYXVzaW5nIHdlaXJkIHByb2JsZW1zLgoKMy8xNi85NyA6IEZpeGVkIGZhdGFsIGJ1ZyB3aXRoIC1jIG9wdGlvbiBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvMTMvOTcgOiBGaXhlZCBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGludm9sdmluZyB0aGUgJXRleHQgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgc29ydGluZy4gSW4gdGhlIG9sZCBzeXN0ZW0sICV0ZXh0IGVudHJpZXMgd291bGQgZmxvYXQgdG8gdGhlCiAgICAgICAgICB0b3Agb2YgYSBzZWN0aW9uIGJlY2F1c2UgdGhleSB3ZXJlICJuYW1lbGVzcyIuICAgTm93IHRoZXkgYXJlCiAgICAgICAgICBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gYW5kIHdpbGwgc3RheSBpbiB0aGUgcHJvcGVyCiAgICAgICAgICBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZW50cnkuCgpWZXJzaW9uIDEuMWI1IChNYXJjaCAxMiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzExLzk3IDogRml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBUY2wvVGsgOC4wYTIuCiAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZICoqKiBTV0lHIG5vIGxvbmdlciB3b3JrcyB3aXRoIFRjbC9UayA4LjBhMS4KCjMvMTAvOTcgOiBGaXhlZCBidWcgd2l0aCBpZ25vcmVkIGFyZ3VtZW50cyBhbmQgQysrIG1lbWJlciBmdW5jdGlvbnMgaW4KICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlLgoKMy85Lzk3ICA6IFBhcnNpbmcgYnVncyB3aXRoIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBhbmQgcHJpdmF0ZWx5CiAgICAgICAgICBkZWNsYXJlZCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgZml4ZWQuCgozLzkvOTcgIDogRml4ZWQgYSBmZXcgbWlub3IgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2l0aCBDKysgY2xhc3NlcyBhbmQKICAgICAgICAgIGNvbnN0cnVjdG9ycy4gICBJbiBzb21lIGNhc2VzLCB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZQogICAgICAgICAgd291bGQgbm90IGNvbXBpbGUgcHJvcGVybHkuICAgU1dJRyBub3cgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgICB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQuCgozLzgvOTcgIDogQWRkZWQgYSAtbCBvcHRpb24gdG8gU1dJRyB0aGF0IGFsbG93cyBhZGRpdGlvbmFsIFNXSUcgbGlicmFyeSBmaWxlcwogICAgICAgICAgdG8gYmUgZ3JhYmJlZCB3aXRob3V0IGhhdmluZyB0aGVtIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRoZSBpbnRlcmZhY2UgZmlsZSBjbGVhbiBhbmQgbW92ZSBjZXJ0YWluCiAgICAgICAgICBvcHRpb25zIGludG8gYSBNYWtlZmlsZS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgIHN3aWcgLXRjbCBleGFtcGxlLmkgICAgICAgICAgICAgICMgIEJ1aWxkIGEgbm9ybWFsIFRjbCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC10Y2wgLWx3aXNoLmkgZXhhbXBsZS5pICAgICAjICBCdWlsZCBpdCBhcyBhIHdpc2ggZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgYnkgaW5jbHVkaW5nIHRoZSAnd2lzaC5pJyBmaWxlLgoKICAgICAgICAgICAgICBzd2lnIC1weXRob24gZXhhbXBsZS5pICAgICAgICAgICAjIEJ1aWxkIGEgZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtbGVtYmVkLmkgZXhhbXBsZS5pICMgQnVpbGQgYSBzdGF0aWMgZXh0ZW5zaW9uCgogICAgICAgICAgVGhlc2Uga2luZHMgb2Ygb3B0aW9ucyBjb3VsZCBwcmV2aW91c2x5IGJlIGFjY29tcGxpc2hlZCB3aXRoCiAgICAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgI2lmZGVmIFNUQVRJQwogICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgZW1iZWQuaQogICAgICAgICAgICAgICAgICAgI2VuZGlmCgozLzgvOTcgIDogSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gR3VpbGUgbW9kdWxlIHRvIHVzZSB0aGUgbmV3IGdoIGludGVyZmFjZQogICAgICAgICAgaW4gRlNGIEd1aWxlIDEuMC4gICAgVGhlIG9sZGVyIGdzY20gaW50ZXJmYWNlIHVzZWQgaW4gQ3lnbnVzCiAgICAgICAgICBHdWlsZSByZWxlYXNlcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IFNXSUcuCgozLzgvOTcgIDogQ2xlYW5lZCB1cCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiBleGFtcGxlLiAgIEl0IHNob3VsZCB3b3JrIHdpdGgKICAgICAgICAgIHZlcnNpb24gMS4xIG9mIHRoZSBwbHVnaW4gbm93LgoKMy84Lzk3ICA6IEFkZGVkIGJldHRlciBhcnJheSBzdXBwb3J0IHRvIHRoZSB0eXBlbWFwIG1vZHVsZS4gIFRoZSBrZXl3b3JkCiAgICAgICAgICBBTlkgY2FuIG5vdyBiZSB1c2VkIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyB3aWxsIG1hdGNoIGFueSBzaW5nbGUtZGltZW5zaW9uYWwgZG91YmxlIGFycmF5LiAgIFRoZSBhcnJheQogICAgICAgICAgZGltZW5zaW9uIGlzIHBhc3NlZCBpbiB0aGUgdmFyaWFibGVzICRkaW0wLCAkZGltMSwgLi4uICRkaW05LiAgRm9yCiAgICAgICAgICBleGFtcGxlIDoKCgkJICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldW0FOWV1bQU5ZXSB7CgkJCXByaW50ZigiUmVjZWl2ZWQgYSBkb3VibGVbJWRdWyVkXVslZF1cbiIsJGRpbTAsJGRpbTEsJGRpbTIpOwoJICAgICAgICAgICAgfQoKICAgICAgICAgIEFueSB0eXBlbWFwIGludm9sdmluZyBhIHNwZWNpZmljIGFycmF5IGRpbWVuc2lvbiB3aWxsIG92ZXJyaWRlIGFueQogICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlIEFOWSB0YWcuICBUaHVzLCBhICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFs1XVs0XVtBTlldIHt9CiAgICAgICAgICB3b3VsZCBvdmVycmlkZSBhIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0uICBIb3dldmVyLCBvdmVydXNlIG9mIHRoZSBBTlkKICAgICAgICAgIHRhZyBpbiBhcnJheXMgb2YgaGlnaC1kaW1lbnNpb25zIG1heSBub3Qgd29yayBhcyB5b3UgZXhwZWN0IGR1ZSB0bwogICAgICAgICAgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZSB1c2VkLiBGb3IgZXhhbXBsZSwgd2hpY2ggb2YgdGhlIGZvbGxvd2luZwogICAgICAgICAgdHlwZW1hcHMgaGFzIHByZWNlZGVuY2U/CgogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXVs1XSB7fSAgICAgLy8gQXZvaWQgdGhpcyEKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgWzVdW0FOWV0ge30KCjMvNy85NyAgOiBGaXhlZCBhIG51bWJlciBvZiBidWdzIHJlbGF0ZWQgdG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgaGFuZGxpbmcuCiAgICAgICAgICBUeXBlZGVmcyBpbnZvbHZpbmcgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG5vdyB3b3JrcyBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIE1BVFJJWFs0XVs0XTsKCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGRvdWJsZSBmb28oTUFUUklYIGEpOwoKICAgICAgICAgIFR5cGVjYXN0aW5nIG9mIHBvaW50ZXJzIGludG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGlzIG5vdwogICAgICAgICAgaW1wbGVtZW50ZWQgcHJvcGVybHkgd2hlbiBtYWtpbmcgQy9DKysgZnVuY3Rpb24gY2FsbHMuCgozLzYvOTcgIDogRml4ZWQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJ1ZyBpbiB0aGUgVGNsIE9iamVjdC1vcmllbnRlZAogICAgICAgICAgaW50ZXJmYWNlLiAgV2VsbCwgYWN0dWFsbHksIGRpZG4ndCBmaXggaXQgYnV0IGlzc3VlZCBhCiAgICAgICAgICBUY2wgZXJyb3IgaW5zdGVhZC4gICBUaGUgYnVnIHdvdWxkIG1hbmlmZXN0IGl0c2VsZiBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XSAgICAgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0gICMgTWFrZSAkbSBpbnRvIGFuIG9iamVjdCBhc3N1bWluZyAkbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgcG9pbnRlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTaW5jZSAkbSA9PSAkbCwgJGwgZ2V0cyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoc2luY2UgaXRzIHRoZSBzYW1lIGNvbW1hbmQgbmFtZSkKICAgICAgICAgICAgICAgICAlICRtIGluc2VydCBGb28KICAgICAgICAgICAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgICAgICAgIyBOb3RlIDogdGhlIGxpc3Qgbm8gbG9uZ2VyIGV4aXN0cyEKCiAgICAgICAgICBOb3csIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVkZWZpbmluZyB0aGUgY29tbWFuZC4KICAgICAgICAgIEFzIGluIDoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0KICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXQogICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzIQoKICAgICAgICAgIFVzZSBjYXRjaHt9IHRvIGlnbm9yZSB0aGUgZXJyb3IuCgozLzMvOTcgIDogQmV0dGVyIHN1cHBvcnQgZm9yIGVudW1zIGFkZGVkLiAgIERhdGF0eXBlcyBvZiAnZW51bSBNeUVudW0nCiAgICAgICAgICBhbmQgdHlwZWRlZnMgc3VjaCBhcyAndHlwZWRlZiBlbnVtIE15RW51bSBGb287JyBub3cgd29yay4KCjMvMy85NyAgOiBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICBpbnQgYSxiOwogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyhpbnQgaSkgOiBhKDApLCBiKGkpLCBCYXIoaSwwKSB7IH07CiAgICAgICAgICAgICAgIH07CgozLzMvOTcgIDogTW9kaWZpZWQgcGFyc2VyIHRvIGlnbm9yZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpIHRocm93KFgsWSk7CgozLzMvOTcgIDogQWRkZWQgJWltcG9ydCBkaXJlY3RpdmUuICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAlZXh0ZXJuCiAgICAgICAgICBleGNlcHQgaXQgdGVsbHMgdGhlIGxhbmd1YWdlIG1vZHVsZSB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICBjb21pbmcgZnJvbSBhIHNlcGFyYXRlIG1vZHVsZS4gICBUaGlzIGlzIHVzdWFsbHkgb25seQogICAgICAgICAgbmVlZGVkIHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLgoKMy8yLzk3ICA6IENoYW5nZWQgcG9pbnRlciB0eXBlLWNoZWNrZXIgdG8gYmUgc2lnbmlmaWNhbnRseSBtb3JlCiAgICAgICAgICBlZmZpY2llbnQgd2hlbiB3b3JraW5nIHdpdGggZGVyaXZlZCBkYXRhdHlwZXMuICBUaGlzCiAgICAgICAgICBoYXMgYmVlbiBhY2NvbXBsaXNoZWQgYnkgc3RvcmluZyB0eXBlLW1hcHBpbmdzIGluIHNvcnRlZAogICAgICAgICAgb3JkZXIsIHVzaW5nIGJpbmFyeSBzZWFyY2ggc2NoZW1lcywgYW5kIGNhY2hpbmcgcmVjZW50bHkKICAgICAgICAgIHVzZWQgZGF0YXR5cGVzLiAgIEZvciBTV0lHIGdlbmVyYXRlZCBDKysgbW9kdWxlcyB0aGF0CiAgICAgICAgICBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb24gY2FsbHMgd2l0aCBkZXJpdmVkIHR5cGVzLAogICAgICAgICAgdGhpcyBjb3VsZCByZXN1bHQgaW4gc3BlZWR1cHMgb2YgYmV0d2VlbiAxMDAgYW5kIDUwMDAwIHBlcmNlbnQuCiAgICAgICAgICBIb3dldmVyLCBkdWUgdG8gdGhlIHJlcXVpcmVkIHNvcnRpbmcgb3BlcmF0aW9uLCBtb2R1bGUKICAgICAgICAgIGxvYWRpbmcgdGltZSBtYXkgaW5jcmVhc2VkIHNsaWdodGx5IHdoZW4gdGhlcmUgYXJlIGxvdHMgb2YKICAgICAgICAgIGRhdGF0eXBlcy4KCjMvMi85NyAgOiBGaXhlZCBzb21lIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIFB5dGhvbgogICAgICAgICAgZW1iZWQuaSBsaWJyYXJ5IGZpbGVzLgoKMi8yNy85NyA6IFNsaWdodCBjaGFuZ2UgdG8gQysrIGNvZGUgZ2VuZXJhdGlvbiB0byB1c2UgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgIHdoZW4gcmV0dXJuaW5nIGNvbXBsZXggZGF0YSB0eXBlIGJ5IHZhbHVlLgoKMi8yNi85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHdpdGggLWMgb3B0aW9uLgoKMi8yNi85NyA6IFNsaWdodCB0d2VhayBvZiBwYXJzZXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bWVyYXRpb25zCiAgICAgICAgICBzdWNoIGFzCgogICAgICAgICAgICAgICAgZW51bSBWYWx1ZSAoQUxFLCBTVE9VVCwgTEFHRVIsIH07CgoyLzI1Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBUY2wgbW9kdWxlIHdoZW4gdXNpbmcgdGhlCiAgICAgICAgICAlbmFtZSgpIGRpcmVjdGl2ZSBvbiBhIGNsYXNzbmFtZS4KCjIvMjUvOTcgOiBGaW5pc2hlZCBjb2RlLXNpemUgb3B0aW1pemF0aW9uIG9mIEMrKyBjb2RlIGdlbmVyYXRpb24gd2l0aAogICAgICAgICAgaW5oZXJpdGFuY2Ugb2YgYXR0cmlidXRlcy4gICAgSW5oZXJpdGVkIGF0dHJpYnV0ZXMgbm93CiAgICAgICAgICBvbmx5IGdlbmVyYXRlIG9uZSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgcmUtdXNlZAogICAgICAgICAgaW4gYW55IGRlcml2ZWQgY2xhc3Nlcy4gICBUaGlzIGNvdWxkIHByb3ZpZGUgYmlnIGNvZGUKICAgICAgICAgIHNpemUgaW1wcm92ZW1lbnRzIGluIHNvbWUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMuCgoyLzI1Lzk3IDogUGVybDUgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgYm90aCB0aGUgVW5peCBhbmQgV2luZG93cwogICAgICAgICAgdmVyc2lvbnMuICBUaGUgd2luZG93cyB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZQogICAgICAgICAgQWN0aXZld2FyZSBwb3J0IG9mIFBlcmwgNS4wMDMgcnVubmluZyB1bmRlciBXaW5kb3dzIDk1LgogICAgICAgICAgVGhlIEMgc291cmNlIGdlbmVyYXRlZCBieSBTV0lHIHNob3VsZCBjb21waWxlIHdpdGhvdXQKICAgICAgICAgIG1vZGlmaWNhdGlvbiB1bmRlciBib3RoIHZlcnNpb25zIG9mIFBlcmwsIGJ1dCBpcyBub3cKICAgICAgICAgIGV2ZW4gbW9yZSBoaWRlb3VzIHRoYW4gYmVmb3JlLgoKMi8yNS85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBzY29wZSByZXNvbHV0aW9uIG9wZXJhdGlvbiB0bwogICAgICAgICAgYXBwZWFyIGluIGV4cHJlc3Npb25zIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBhcyBpbiA6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IGEgPSAgQmFyOjpkZWZ2YWx1ZSk7CgoyLzI1Lzk3IDogRml4ZWQgYnVnIHdoZW4gcmVzb2x2aW5nIHN5bWJvbHMgaW5zaWRlIEMrKyBjbGFzc2VzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZW51bSBWYWx1ZSB7QUxFLCBTVE9VVCwgTEFHRVJ9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB2b2lkIGRlZmFyZyhWYWx1ZSB2ID0gU1RPVVQpOwoKICAgICAgICAgICAgICB9OwoKMi8yNC85NyA6IEZpeGVkIGJ1ZyB3aXRoIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjIvMjMvOTcgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHRvIGJlIGJldHRlciBiZWhhdmVkIHVuZGVyIFdpbmRvd3MKCiAgICAgICAgICAgIC0gIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBub3cgcHJvcGVybHkgZXhwb3J0ZWQuCiAgICAgICAgICAgICAgIEl0IHNob3VsZCBub3QgYmUgbmVjY2Vzc2FyeSB0byBleHBsaWNpdGx5IGV4cG9ydCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIHlvdXJzZWxmLgoKICAgICAgICAgICAgLSAgQml6YXJyZSBjb21waWxhdGlvbiBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyCiAgICAgICAgICAgICAgIGNvZGUgYXMgQU5TSSBDIHVuZGVyIFZpc3VhbCBDKysgNC54IGZpeGVkLgoKICAgICAgICAgICAgLSAgVGVzdGVkIHdpdGggYm90aCB0aGUgc3RvY2sgUHl0aG9uLTEuNCBkaXN0cmlidXRpb24gYW5kIFB5dGhvbndpbgogICAgICAgICAgICAgICBydW5uaW5nIHVuZGVyIFdpbjk1LgoKMi8xOS85NyA6IEZpeGVkIHR5cGVkZWYgaGFuZGxpbmcgYnVnIGluIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMi8xOS85NyA6IEFkZGVkIGV4Y2VwdGlvbiBzdXBwb3J0LiAgVG8gdXNlIGl0LCBkbyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgJWV4Y2VwdChsYW5nKSB7CiAgICAgICAgICAgICAgICAgIC4uLiB0cnkgcGFydCBvZiB0aGUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgLi4uIGNhdGNoIHBhcnQgb2YgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAkZnVuY3Rpb24gaXMgYSBTV0lHIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKICAgICAgICAgIGFjdHVhbCBDL0MrKyBmdW5jdGlvbiBjYWxsIGluIGEgd3JhcHBlciBmdW5jdGlvbi4gIFRodXMsCiAgICAgICAgICBhIHJlYWwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICVleGNlcHQocGVybDUpIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNoYXIgKiYgc3opIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcHJvY2VzcyBhbiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvYWsoIlVua25vd24gZXhjZXB0aW9uLiBCYWlsaW5nIG91dC4uLiIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CgoyLzE5Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgbWFuYWdpbmcgZ2VuZXJpYyBjb2RlIGZyYWdtZW50cyAobmVlZGVkCiAgICAgICAgICBmb3IgZXhjZXB0aW9ucykuCgoyLzE5Lzk3IDogRml4ZWQgc29tZSByZWFsbHkgb2JzY3VyZSB0eXBlbWFwIHNjb3BpbmcgYnVncyBpbiB0aGUgQysrCiAgICAgICAgICBoYW5kbGVyLgoKMi8xOC85NyA6IENsZWFuZWQgdXAgcGVybG1haW4uaSBmaWxlIGJ5IHJlbW92aW5nIHNvbWUgcHJvYmxlbWF0aWMsCiAgICAgICAgICBidXQgc2VlbWluZ2x5IHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9ucy4KCjIvMTgvOTcgOiBPcHRpbWl6ZWQgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9ucyB1bmRlciBpbmhlcml0YW5jZS4KICAgICAgICAgIFNXSUcgY2FuIG5vdyB1c2Ugd3JhcHBlciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBhCiAgICAgICAgICBiYXNlIGNsYXNzIGluc3RlYWQgb2YgcmVnZW5lcmF0aW5nIHdyYXBwZXJzIGZvcgogICAgICAgICAgdGhlIHNhbWUgZnVuY3Rpb25zIGluIGEgZGVyaXZlZCBjbGFzcy4gICAgVGhpcyBjb3VsZAogICAgICAgICAgbWFrZSBhIGRyYXN0aWMgcmVkdWN0aW9uIGluIHdyYXBwZXIgY29kZSBzaXplIGZvciBDKysKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGRlZXAgaW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYW5kCiAgICAgICAgICBsb3RzIG9mIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBBZGRpdGlvbmFsIG1ldGhvZHMgc3BlY2lmaWVkIHdpdGggJWFkZG1ldGhvZHMgY2FuIG5vdwogICAgICAgICAgYmUgaW5oZXJpdGVkIGFsb25nIHdpdGggbm9ybWFsIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgoKMi8xOC85NyA6IE1pbm9yIGludGVybmFsIGZpeGVzIHRvIG1ha2UgU1dJRydzIHN0cmluZyBoYW5kbGluZyBhIGxpdHRsZQogICAgICAgICAgc2FmZXIuCgoyLzE2Lzk3IDogTW92ZWQgc29tZSBjb2RlIGdlbmVyYXRpb24gb2YgVGNsIHNoYWRvdyBjbGFzc2VzIHRvCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLgoKMi8xNi85NyA6IEZpeGVkIGRvY3VtZW50YXRpb24gZXJyb3Igb2YgJy1jb25maWd1cmUnIG1ldGhvZCBpbgogICAgICAgICAgVGNsIG1vZHVsZXMuCgoyLzE2Lzk3IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHNsaWdodGx5IHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICB0byB1c2UgUGVybCByZWZlcmVuY2VzLgoKMi8xMi85NyA6IEZpeGVkIGFyZ3VtZW50IGNoZWNraW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGJ5CiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyAoZnVuY3Rpb24gY2FsbHMgd2l0aCB0b28gbWFueQogICAgICAgICAgYXJndW1lbnRzIHdvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkKS4gIEZ1bmN0aW9ucyBub3cKICAgICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIEMgdmVyc2lvbgogICAgICAgICAgKHdpdGggcG9zc2liaWxpdHkgb2YgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIHN0aWxsIHN1cHBvcnRlZCkuCgoyLzEyLzk3IDogRml4ZWQgZGVmYXVsdCBhcmd1bWVudCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGdlbmVyYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMgaW52b2x2aW5nIGRlZmF1bHQKICAgICAgICAgIGFyZ3VtZW50cyBvZiBjb21wbGV4IGRhdGF0eXBlcy4KCjIvMTIvOTcgOiBGaXhlZCB0eXBlbWFwIHNjb3BpbmcgcHJvYmxlbXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBnZXQgYSBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZG91YmxlIGJhcihkb3VibGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIG5ldyBnZXQgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGFwcGx5IHRoZSBzZWNvbmQgdHlwZW1hcCB0byBhbGwgZnVuY3Rpb25zIGluIEZvbwogICAgICAgICAgZHVlIHRvIGRlbGF5ZWQgZ2VuZXJhdGlvbiBvZiBDKysgd3JhcHBlciBjb2RlIChjbGVhcmx5IHRoaXMKICAgICAgICAgIGlzIG5vdCB0aGUgZGVzaXJlZCBlZmZlY3QpLiAgIFByb2JsZW0gaGFzIGJlZW4gZml4ZWQgYnkKICAgICAgICAgIGFzc2lnbmluZyB1bmlxdWUgbnVtZXJpY2FsIGlkZW50aWZpZXJzIHRvIGV2ZXJ5IGRhdGF0eXBlIGluCiAgICAgICAgICBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgcmVjb3JkaW5nIHRoZSAicmFuZ2Ugb2YgZWZmZWN0IiBvZiBlYWNoCiAgICAgICAgICB0eXBlbWFwLgoKMi8xMS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yICJpZ25vcmUiIGFuZCAiZGVmYXVsdCIgdHlwZW1hcHMuICBPbmx5IHVzZQogICAgICAgICAgaWYgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KCjIvOS85NyAgOiBBZGRlZCBhdXRvbWF0aWMgY3JlYXRpb24gb2YgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IKICAgICAgICAgIEMgc3RydWN0cyBhbmQgQysrIGNsYXNzZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhbnkgc29ydCBvZgogICAgICAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgYnkKICAgICAgICAgIHJ1bm5pbmcgU1dJRyB3aXRoIHRoZSAnLW1ha2VfZGVmYXVsdCcgb3B0aW9uIG9yIGJ5IGluc2VydGluZwogICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW50byBhbiBpbnRlcmZhY2UgZmlsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEgbWFrZV9kZWZhdWx0CgogICAgICAgICAgVGhlIGZvbGxvd2luZyBwcmFnbWEgZGlzYWJsZXMgYXV0b21hdGljIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24KCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0CgoyLzkvOTcgIDogQWRkZWQgLW1ha2VfZGVmYXVsdCBvcHRpb24gZm9yIHByb2R1Y2luZyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGZvciBjbGFzc2VzIHdpdGhvdXQgdGhlbS4KCjIvOS85NyAgOiBDaGFuZ2VkIHRoZSBzeW50YXggb2YgdGhlIFNXSUcgJXByYWdtYSBkaXJlY3RpdmUgdG8KICAgICAgICAgICVwcmFnbWEgb3B0aW9uPXZhbHVlIG9yICVwcmFnbWEobGFuZykgb3B0aW9uPXZhbHVlLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWFrZXMgdGhlIHN5bnRheCBhIGxpdHRsZSBtb3JlIGNvbnNpc3RlbnQKICAgICAgICAgIGJldHdlZW4gZ2VuZXJhbCBwcmFnbWFzIGFuZCBsYW5ndWFnZS1zcGVjaWZpYyBwcmFnbWFzLgogICAgICAgICAgVGhlIG9sZCBzeW50YXggc3RpbGwgd29ya3MsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIHBoYXNlZAogICAgICAgICAgb3V0IChhIHdhcm5pbmcgbWVzc2FnZSBpcyBjdXJyZW50bHkgcHJpbnRlZCkuCgoyLzkvOTcgIDogSW1wcm92ZWQgVGNsIHN1cHBvcnQgb2YgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBvZgogICAgICAgICAgc3RydWN0dXJlcywgY2xhc3NlcywgYW5kIHVuaW9ucy4KCjIvOS85NyAgOiBGaXhlZCBDKysgY29tcGlsYXRpb24gcHJvYmxlbSBpbiBQeXRob24gJ2VtYmVkLmknIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBtaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBwZXJsbWFpbi5pIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gcmV0dXJuIGFuIEF0dHJpYnV0ZUVycm9yIHdoZW4KICAgICAgICAgIHVuZGVmaW5lZCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCAob2xkZXIgdmVyc2lvbnMgcmV0dXJuZWQKICAgICAgICAgIGEgTmFtZUVycm9yKS4KCjIvOS85NyAgOiBGaXhlZCBidWcgd2hlbiAlYWRkbWV0aG9kcyBpcyB1c2VkIGFmdGVyIGEgY2xhc3MgZGVmaW5pdGlvbiB3aG9zZQogICAgICAgICAgbGFzdCBzZWN0aW9uIGlzIHByb3RlY3RlZCBvciBwcml2YXRlLgoKMi84Lzk3ICA6IE1hZGUgc2xpZ2h0IGNoYW5nZXMgaW4gaW5jbHVkZSBmaWxlIHByb2Nlc3NpbmcgdG8gc3VwcG9ydAogICAgICAgICAgdGhlIE1hY2ludG9zaC4KCjIvOC85NyAgOiBFeHRlbmRlZCBzd2lnbWFpbi5jeHggdG8gcHJvdmlkZSBhIHJ1ZGltZW50YXJ5IE1hY2ludG9zaCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCdzIGEgcmVhbGx5IGJhZCBpbnRlcmZhY2UsIGJ1dCB3b3JrcyB1bnRpbCBzb21ldGhpbmcgYmV0dGVyCiAgICAgICAgICBpcyB3cml0dGVuLgoKMS8yOS85NyA6IEZpeGVkIHR5cGUtY2FzdGluZyBidWcgaW50cm9kdWNlZCBieSAxLjFiNCB3aGVuIHNldHRpbmcvZ2V0dGluZyB0aGUKICAgICAgICAgIHZhbHVlIG9mIGdsb2JhbCB2YXJpYWJsZXMgaW52b2x2aW5nIGNvbXBsZXggZGF0YSB0eXBlcy4KCjEvMjkvOTcgOiBSZW1vdmVkIGVycm9uZW91cyB3aGl0ZSBzcGFjZSBiZWZvcmUgYW4gI2VuZGlmIGluIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgYnkgdGhlIFB5dGhvbiBtb2R1bGUgKHdhcyBjYXVzaW5nIGVycm9ycyBvbiBERUMgQWxwaGEgY29tcGlsZXJzKS4KCjEvMjYvOTcgOiBGaXhlZCBlcnJvcnMgd2hlbiB1c2luZyBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cyBpbiBQeXRob24gc2hhZG93CgkgIHNoYWRvdyBjbGFzc2VzLgoKMS8yMy85NyA6IEZpeGVkIGJ1ZyB3aXRoIG5lc3RlZCAlZXh0ZXJuIGRlY2xhcmF0aW9ucy4KCjEvMjEvOTcgOiBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiBpbnZvbHZpbmcgY29uc3QgZGF0YXR5cGVzLgoKMS8yMS85NyA6IFNvbWV3aGF0IG9ic2N1cmUsIGJ1dCBzZXJpb3VzIGJ1ZyB3aXRoIGhhdmluZyBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgIG9mIHR5cGVkZWZzIGZpeGVkLiAgRm9yIGV4YW1wbGUgOgoKCQl0eXBlZGVmIGNoYXIgKlN0cmluZzsKICAgICAgICAgICAgICAgIHR5cGVkZWYgU3RyaW5nICBOYW1lOwoKVmVyc2lvbiAxLjEgQmV0YTQgKEphbnVhcnkgMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IFNXSUcgMS4xYjMgY3Jhc2hlZCBhbmQgYnVybmVkIHNob3J0bHkgYWZ0ZXIgdGFrZSBvZmYgZHVlCnRvIGEgZmV3IG1ham9yIHJ1bi10aW1lIHByb2JsZW1zIHRoYXQgc3VyZmFjZWQgYWZ0ZXIgcmVsZWFzZS4KVGhpcyByZWxlYXNlIHNob3VsZCBmaXggbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhvc2UgcHJvYmxlbXMuCgoxLzE2Lzk3IDogRml4ZWQgbWFqb3IgbWVtb3J5IG1hbmFnZW1lbnQgYnVnIG9uIExpbnV4CgoxLzE0Lzk3IDogRml4ZWQgYnVnIGluIGZ1bmN0aW9ucyByZXR1cm5pbmcgY29uc3RhbnQgQysrIHJlZmVyZW5jZXMuCgoxLzE0Lzk3IDogTW9kaWZpZWQgQysrIG1vZHVsZSB0byBoYW5kbGUgZGF0YXR5cGVzIGJldHRlci4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgYSAqc2luZ2xlKiBzY29wZSByZXNvbHV0aW9uCiAgICAgICAgICBvcGVyYXRvciBpbiBkYXRhdHlwZXMuICBJZSA6IEZvbzo6YmFyLiAgIFNXSUcgZG9lc24ndAogICAgICAgICAgeWV0IGhhbmRsZSBuZXN0ZWQgY2xhc3Nlcywgc28gdGhpcyBzaG91bGQgYmUKICAgICAgICAgIHN1ZmZpY2llbnQgZm9yIG5vdy4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgdHlwZWRlZiBpbnNpZGUgYSBDKysgY2xhc3MuCgoxLzE0Lzk3IDogRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIGRhdGF0eXBlcyBkZWZpbmVkIGluc2lkZQogICAgICAgICAgYSBDKysgY2xhc3MuICBTV0lHIHdhcyBub3QgZ2VuZXJhdGluZyBjb3JyZWN0IGNvZGUsCiAgICAgICAgICBidXQgYSBuZXcgc2NvcGluZyBtZWNoYW5pc20gYW5kIG1ldGhvZCBmb3IgaGFuZGxpbmcKICAgICAgICAgIGRhdGF0eXBlcyBpbnNpZGUgYSBDKysgY2xhc3MgaGF2ZSBiZWVuIGFkZGVkLgoKMS8xNC85NyA6IENoYW5nZWQgZW51bWVyYXRpb25zIHRvIHVzZSB0aGUgdmFsdWUgbmFtZSBpbnN0ZWFkCiAgICAgICAgICBvZiBhbnkgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgICBmaWxlLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBhIGxpdHRsZSBtb3JlIGZyaWVuZGx5IHRvCiAgICAgICAgICBDKysgY29tcGlsZXJzLgoKMS8xNC85NyA6IFJlbW92ZWQgdHlwZWRlZiBidWcgdGhhdCBtYWRlIGFsbCBlbnVtZXJhdGlvbnMKICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdHlwZSBjaGVja2VyIChzaW5jZQogICAgICAgICAgaXQgZ2VuZXJhdGVkIGFsb3Qgb2YgdW5uZWNlc3NhcnkgY29kZSkuCgpWZXJzaW9uIDEuMSBCZXRhMyAoSmFudWFyeSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCk5vdGUgOiBBICpodWdlKiBudW1iZXIgb2YgY2hhbmdlcyByZWxhdGVkIHRvIG9uZ29pbmcgbW9kaWZpY2F0aW9ucy4KCjEuICBTdXBwb3J0IGZvciBDKysgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYWRkZWQuCgoyLiAgVHlwZW1hcHMgYWRkZWQuCgozLiAgU29tZSBzdXBwb3J0IGZvciBuZXN0ZWQgc3RydWN0dXJlIGRlZmluaXRpb25zIGFkZGVkLgoKNC4gIERlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcgYWRkZWQuCgo1LiAgLWMgb3B0aW9uIGFkZGVkIGZvciBidWlsZGluZyBiYXJlIHdyYXBwZXIgY29kZSBtb2R1bGVzLgoKNi4gIFJld3JvdGUgUG9pbnRlciB0eXBlLWNoZWNraW5nIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UKICAgIGNvcnJlY3RseS4KCjcuICBUY2wgOC4wIG1vZHVsZSBhZGRlZC4KCjguICBQZXJsNCBhbmQgR3VpbGUgbW9kdWxlcyByZXN1cnJlY3RlZCBmcm9tIHRoZSBkZWFkICh3ZWxsLCB0aGV5CiAgICBhdCBsZWFzdCB3b3JrIGFnYWluKS4KCjkuICBOZXcgT2JqZWN0IE9yaWVudGVkIFRjbCBpbnRlcmZhY2UgYWRkZWQuCgoxMC4gQnVnIGZpeGVzIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMTEuIENsZWFuZWQgdXAgbWFueSBvZiB0aGUgaW50ZXJuYWwgbW9kdWxlcyBvZiB0aGUgcGFyc2VyLgoKMTIuIFRvbnMgb2YgZXhhbXBsZXMgYW5kIHRlc3RpbmcgbW9kdWxlcyBhZGRlZC4KCjEzLiBGaXhlZCBidWdzIHJlbGF0ZWQgdG8gdXNlIG9mICJjb25zdCIgcmV0dXJuIHZhbHVlcy4KCjE0LiBGaXhlZCBidWcgd2l0aCBDKysgbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMTUuIENoYW5nZWQgU1dJRyBjb25maWd1cmF0aW9uIHNjcmlwdC4KClZlcnNpb24gMS4xIEJldGEyIChEZWNlbWJlciAzLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCiAgIGludm9sdmVkIGFyZSB0b28gbnVtZXJvdXMgdG8gbWVudGlvbi4gIEJhc2ljYWxseSwgdGFrZSBldmVyeXRoaW5nCiAgIHlvdSBrbmV3IGFib3V0IHRoZSBvbGQgc3lzdGVtLCB0aHJvdyB0aGVtIG91dCwgYW5kIHJlYWQgdGhlCiAgIGZpbGUgRG9jL2RvYy5wcy4KCjIuIExpbWl0ZWQgc3VwcG9ydCBmb3IgI2lmIGRlZmluZWQoKSBhZGRlZC4KCjMuIFR5cGUgY2FzdHMgYXJlIG5vdyBhbGxvd2VkIGluIGNvbnN0YW50IGV4cHJlc3Npb25zLiAgaWUKCiAgICAgICAgICNkZWZpbmUgIEEgICAoaW50KSAzCgo0LiBBZGRlZCBzdXBwb3J0IGZvciB0eXBlZGVmIGxpc3RzLiAgRm9yIGV4YW1wbGUgOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgICAgZG91YmxlIHgseSx6OwogICAgICAgIH0gVmVjdG9yLCAqVmVjdG9yUHRyOwoKNS4gTmV3IFNXSUcgZGlyZWN0aXZlcyAocmVsYXRlZCB0byBkb2N1bWVudGF0aW9uIHN5c3RlbSkKCgklc3R5bGUKCSVsb2NhbHN0eWxlCgklc3Vic2VjdGlvbgoJJXN1YnN1YnNlY3Rpb24KCjYuIFJlb3JnYW5pemVkIHRoZSBDKysgaGFuZGxpbmcgYW5kIG1hZGUgaXQgYSBsaXR0bGUgZWFzaWVyIHRvCiAgIHdvcmsgd2l0aCBpbnRlcm5hbGx5LgoKNy4gIEZpeGVkIHByb2JsZW0gd2l0aCBpbmhlcml0aW5nIGRhdGEgbWVtYmVycyBpbiBQeXRob24KICAgIHNoYWRvdyBjbGFzc2VzLgoKOC4gIEZpeGVkIHN5bWJvbCB0YWJsZSBwcm9ibGVtcyB3aXRoIHNoYWRvdyBjbGFzc2VzIGluIGJvdGgKICAgIFB5dGhvbiBhbmQgUGVybC4KCjkuICBGaXhlZCBhbm5veWluZyBzZWdtZW50YXRpb24gZmF1bHQgYnVnIGluIHdyYXBwZXIgY29kZQogICAgZ2VuZXJhdGVkIGZvciBQZXJsNS4KCjEwLiBGaXhlZCBidWcgd2l0aCAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuICBOb3cgaXQgY2FuIGJlIHBsYWNlZAogICAgYW55d2hlcmUgaW4gYSBjbGFzcy4KCjExLiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQgdG8gdGhlIFNXSUcgc2VsZi10ZXN0LiAgIERvY3VtZW50YXRpb24KICAgIHRlc3RzIGFyZSBub3cgcGVyZm9ybWVkIGFsb25nIHdpdGggb3RoZXIgdGhpbmdzLgoKMTIuIFJlb3JnYW5pemVkIHRoZSBTV0lHIGxpYnJhcnkgYSBsaXR0bGUgYml0IGFuZCBzZXQgaXQgdXAgdG8KICAgIHNlbGYtZG9jdW1lbnQgaXRzZWxmIHVzaW5nIFNXSUcuCgoxMy4gTG90cyBhbmQgbG90cyBvZiBtaW5vciBidWcgZml4ZXMgKG1vc3RseSBvYnNjdXJlLCBidXQgYnVncwogICAgbm9uZXRoZWxlc3MpLgoKClZlcnNpb24gMS4xIEJldGExIChPY3RvYmVyIDMwLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuIEFkZGVkIG5ldyAlZXh0ZXJuIGRpcmVjdGl2ZSBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgZmlsZXMKCjIuIFBlcmw1IHNoYWRvdyBjbGFzc2VzIGFkZGVkCgozLiBSZXdyb3RlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHRvIHdvcmsgYmV0dGVyCgo0LiBBZGRlZCAnYm9vbCcgZGF0YXR5cGUKCjUuICV7LCV9IGJsb2NrIGlzIG5vdyBvcHRpb25hbC4KCjYuIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBtb2R1bGUKCjcuIFJld3JvdGUgYWxsIG9mIHRoZSBTV0lHIHRlc3RzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUKICAgKGFuZCBsZXNzIHNjYXJ5KS4KCjguIFJld3JvdGUgcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcgdG8gYmUgbW9yZSBtZW1vcnkKICAgZWZmaWNpZW50IGFuZCBmbGV4aWJsZS4KCjkuIENoYW5nZWQgcGFyc2VyIHRvIGlnbm9yZSAnc3RhdGljJyBkZWNsYXJhdGlvbnMuCgoxMC4gSW5pdGlhbGl6ZXJzIGFyZSBub3cgaWdub3JlZC4gIEZvciBleGFtcGxlIDoKCglzdHJ1Y3QgRm9vQmFyIGEgPSB7Myw0LDV9OwoKMTEuIFNvbWV3aGF0IGJldHRlciBwYXJzaW5nIG9mIGFycmF5cyAoYWx0aG91Z2ggaXQncwogICAgdXN1YWxseSBqdXN0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugbm93KS4KCjEyLiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMuCgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAzMSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gRml4ZWQgbWlub3IgYnVnIGluIEMrKyBtb2R1bGUKCjIuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBwb2ludGVyIHR5cGUtY2hlY2tlciB3aGVuIHVzaW5nCiAgIC1EQUxMT1dfTlVMTC4KCjMuIEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yayB3aXRoIFB5dGhvbiAxLjRiZXRhMwoKNC4gQ2hhbmdlZCBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGhvdXQKICAgeWFjYyBvciBiaXNvbi4KClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMjgsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgQ2hhbmdlZCBwYXJzZXIgdG8gc3VwcG9ydCBtb3JlIEMvQysrIGRhdGF0eXBlcyAod2VsbCwKICAgIG1vcmUgdmFyaWFudHMpLiAgIFR5cGVzIGxpa2UgInVuc2lnbmVkIiwgInNob3J0IGludCIsCiAgICAibG9uZyBpbnQiLCBldGMuLi4gbm93IHdvcmsuCgoyLiAgInVuaW9ucyIgYWRkZWQgdG8gcGFyc2VyLgoKMy4gIFVzZSBvZiAidHlwZWRlZiIgYXMgaW4gOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgZG91YmxlIHgseSx6OwoJfSBWZWN0b3I7CgogICAgTm93IHdvcmtzIGNvcnJlY3RseS4gICBUaGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBpcyB1c2VkIGFzCiAgICB0aGUgc3RydWN0dXJlIG5hbWUuCgo0LiAgQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYsICNlbHNlLCAjZW5kaWYsIGV0Yy4uLgogICAgYWRkZWQuCgo1LiAgTmV3ICVkaXNhYmxlZG9jLCAlZW5hYmxlZG9jIGRpcmVjdGl2ZXMgYWxsb3cgZG9jdW1lbnRhdGlvbgogICAgdG8gc2VsZWN0aXZlbHkgYmUgZGlzYWJsZWQgZm9yIGNlcnRhaW4gcGFydHMgb2YgYSB3cmFwcGVyCiAgICBmaWxlLgoKNi4gIE5ldyBQeXRob24gbW9kdWxlIHN1cHBvcnRzIGJldHRlciB2YXJpYWJsZSBsaW5raW5nLCBjb25zdGFudHMsCiAgICBhbmQgc2hhZG93IGNsYXNzZXMuCgo3LiAgUGVybDUgbW9kdWxlIGltcHJvdmVkIHdpdGggYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBYUwogICAgYW5kIHhzdWJwcC4gICBTV0lHIHBvaW50ZXJzIGFuZCBub3cgY3JlYXRlZCBzbyB0aGF0IHRoZXkKICAgIGFyZSBjb21wYXRpYmxlIHdpdGggeHN1YnBwIHBvaW50ZXJzLgoKOC4gIFN1cHBvcnQgZm9yIFtpbmNyIFRjbF0gbmFtZXNwYWNlcyBhZGRlZCB0byBUY2wgbW9kdWxlLgoKOS4gICVwcmFnbWEgZGlyZWN0aXZlIGFkZGVkLgoKMTAuICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBhZGRlZC4KCjExLiAlbmF0aXZlIGRpcmVjdGl2ZSBhZGRlZCB0byBhbGxvdyBwcmUtZXhpc3Rpbmcgd3JhcHBlciBmdW5jdGlvbnMKICAgIHRvIGJlIHVzZWQuCgoxMi4gV3JvdGUgY29uZmlndXJlIHNjcmlwdCBmb3IgU1dJRyBpbnN0YWxsYXRpb24uCgoxMy4gRnVuY3Rpb24gcG9pbnRlcnMgbm93IGFsbG93ZWQgd2l0aCB0eXBlZGVmIHN0YXRlbWVudHMuCgoxNC4gJXR5cGVkZWYgbW9kaWZpZWQgdG8gaW5zZXJ0IGEgY29ycmVzcG9uZGluZyBDIHR5cGVkZWYgaW50bwogICAgdGhlIG91dHB1dCBmaWxlLgoKMTUuIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBDKysgcmVmZXJlbmNlcy4KCjE2LiBOZXcgU3RyaW5nIGFuZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3NlcyBhZGQgdG8gbWFrZSBnZW5lcmF0aW5nCiAgICB3cmFwcGVyIGNvZGUgZWFzaWVyLgoKMTcuIEZpeGVkIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZyB0byBlbGltaW5hdGUgY29yZSBkdW1wcwogICAgYW5kIHRvIGFsbG93IGhlbHAgbWVzc2FnZXMuCgoxOC4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzIHRvIGFsbW9zdCBhbGwgY29kZSBtb2R1bGVzCgoKVmVyc2lvbiAxLjAgQmV0YSAzIChQYXRjaCAxKSBKdWx5IDE3LCAxOTk2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4wIEZpbmFsIGlzIG5vdCBxdWl0ZSByZWFkeSB5ZXQsIGJ1dCB0aGlzIHJlbGVhc2UgZml4ZXMgYQpudW1iZXIgb2YgaW1tZWRpYXRlIHByb2JsZW1zIDoKCjEuICBDb21waWxlciBlcnJvcnMgd2hlbiB1c2luZyAtc3RyaWN0IDEgdHlwZSBjaGVja2luZyBoYXZlIGJlZW4gZml4ZWQuCgoyLiAgUG9pbnRlciB0eXBlIGNoZWNrZXIgbm93IHJlY29nbml6ZXMgcG9pbnRlcnMgb2YgdGhlIGZvcm0KICAgIF8wX1R5cGUgY29ycmVjdGx5LgoKMy4gIEEgZmV3IG1pbm9yIGZpeGVzIHdlcmUgbWFkZSBpbiB0aGUgTWFrZWZpbGUKClZlcnNpb24gMS4wIEJldGEgMyAoSnVuZSAxNCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCgpUaGVyZSBhcmUgbG90cyBvZiBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSA6CgoxLiAgU1dJRyBpcyBub3cgaW52b2tlZCB1c2luZyB0aGUgInN3aWciIGNvbW1hbmQgaW5zdGVhZCBvZiAid3JhcCIuCiAgICBIZXksIHN3aWcgc291bmRzIGNvb2xlci4KCjIuICBUaGUgU1dJR19MSUIgZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHNldCB0byBjaGFuZ2UgdGhlCiAgICBsb2NhdGlvbiB3aGVyZSBTV0lHIGxvb2tzIGZvciBsaWJyYXJ5IGZpbGVzLgoKMy4gIEMrKyBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiAgIFlvdSBzaG91bGQgdXNlIHRoZSAtYysrIG9wdGlvbgogICAgdG8gZW5hYmxlIGl0LgoKNC4gIFRoZSAlaW5pdCBkaXJlY3RpdmUgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlICVtb2R1bGUgZGlyZWN0aXZlLgogICAgJW1vZHVsZSBjb25zdHJ1Y3RzIGEgdmFsaWQgbmFtZSBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICBmb3Igd2hhdGV2ZXIgdGFyZ2V0IGxhbmd1YWdlIHlvdSdyZSB1c2luZyAoYWN0dWFsbHkgdGhpcyBtYWtlcwogICAgU1dJRyBmaWxlcyBhIGxpdHRsZSBjbGVhbmVyKS4gIFRoZSBvbGQgJWluaXQgZGlyZWN0aXZlIHN0aWxsIHdvcmtzLgoKNS4gIFRoZSBzeW50YXggb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBoYXMgYmVlbiBjaGFuZ2VkLiAgIFVzZSBvZiB0aGUKICAgIG9sZCBvbmUgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlLCBidXQgbWF5IHN0aWxsIHdvcmsuCgo2LiAgVG8gc3VwcG9ydCBUY2wvVGsgb24gbm9uLXVuaXggcGxhdGZvcm1zLCBTV0lHIGltcG9ydHMgYSBmaWxlIGNhbGxlZAogICAgc3dpZ3RjbC5jZmcgZnJvbSB0aGUgJChTV0lHX0xJQikvdGNsIGRpcmVjdG9yeS4gICBJIGRvbid0IGhhdmUgYWNjZXNzCiAgICB0byBhbiBOVCBtYWNoaW5lLCBidXQgdGhpcyBmaWxlIGlzIHN1cHBvc2VkbHkgYWxsb3dzIFNXSUcgdG8KICAgIHByb2R1Y2Ugd3JhcHBlciBjb2RlIHRoYXQgY29tcGlsZXMgb24gYm90aCBVTklYIGFuZCBub24gVU5JWCBtYWNoaW5lcy4KICAgIElmIHRoaXMgZG9lc24ndCB3b3JrLCB5b3UnbGwgaGF2ZSB0byBlZGl0IHRoZSBmaWxlIHN3aWd0Y2wuY2ZnLiBQbGVhc2UKICAgIGxldCBtZSBrbm93IGlmIHRoaXMgZG9lc24ndCB3b3JrIHNvIEkgY2FuIHVwZGF0ZSB0aGUgZmlsZSBhcwogICAgbmVjZXNzYXJ5LgoKNy4gIFRoZSBTV0lHIHJ1bi10aW1lIHR5cGVjaGVja2VyIGhhcyBiZWVuIGltcHJvdmVkLiAgICBZb3UgY2FuIGFsc28KICAgIG5vdyByZWRlZmluZSBob3cgaXQgd29ya3MgYnkgc3VwcGx5aW5nIGEgZmlsZSBjYWxsZWQgInN3aWdwdHIuY2ZnIgogICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHlvdXIgU1dJRyBpbnRlcmZhY2UgZmlsZXMuICAgQnkgZGVmYXVsdCwKICAgIFNXSUcgcmVhZHMgdGhpcyBmaWxlIGZyb20gJChTV0lHX0xJQikvY29uZmlnLgoKOC4gIFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiBjaGFuZ2VkIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyA6CgoJLSAgRG9jdW1lbnRhdGlvbiBvcmRlciBpcyBwcmludGVkIGluIGludGVyZmFjZSBmaWxlIG9yZGVyIGJ5CiAgICAgICAgICAgZGVmYXVsdC4gICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHB1dHRpbmcgYW4gJWFscGhhCiAgICAgICAgICAgZGlyZWN0aXZlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAtICBZb3UgY2FuIHN1cHBseSBhZGRpdGlvbmFsIGRvY3VtZW50YXRpb24gdGV4dCB1c2luZwoKICAgICAgICAgICAldGV4dCAleyBwdXQgeW91ciB0ZXh0IGhlcmUgJX0KCiAgICAgICAgLSAgQSBmZXcgbWlub3IgYnVncyB3ZXJlIGZpeGVkLgoKOS4gIEEgZmV3IGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgaGFuZGxpbmcgb2YgY29tbWFuZCBsaW5lCiAgICBvcHRpb25zIChidXQgaXQncyBzdGlsbCBub3QgZmluaXNoZWQpLgoKMTAuICBMb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyBpbiBtb3N0IG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIGhhdmUgYmVlbgogICAgIG1hZGUuCgoxMS4gRmlsZW5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIDguMyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGEgU1dJRwogICAgcG9ydCB0byBub24tdW5peCBwbGF0Zm9ybXMgKHdvcmsgaW4gcHJvZ3Jlc3MpLgoKMTIuIEMrKyBmaWxlIHN1ZmZpeCBpcyBub3cgLmN4eCAoZm9yIHNhbWUgcmVhc29uKS4KCjEzLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGdyYWRlZCBzaWduaWZpY2FudGx5IGFuZCBpcyBub3cKICAgIGFyb3VuZCAxMDAgcGFnZXMuICAgIEkgYWRkZWQgbmV3IGV4YW1wbGVzIGFuZCBhIHNlY3Rpb24gb24KICAgIEMrKy4gIFRoZSBkb2N1bWVudGF0aW9uIG5vdyBpbmNsdWRlcyBhIFRhYmxlIG9mIENvbnRlbnRzLgoKMTQuIFRoZSBTV0lHIEV4YW1wbGVzIGRpcmVjdG9yeSBpcyBzdGlsbCB3b2VmdWxseSBzcGFyc2UsIGJ1dCBpcwogICAgZ2V0dGluZyBiZXR0ZXIuCgpTcGVjaWFsIG5vdGljZSBhYm91dCBDKysKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRoaXMgaXMgdGhlIGZpcnN0IHZlcnNpb24gb2YgU1dJRyB0byBzdXBwb3J0IEMrKyBwYXJzaW5nLiAgQ3VycmVudGx5CnRoZSBDKysgaXMgZmFyIGZyb20gY29tcGxldGUsIGJ1dCBzZWVtcyB0byB3b3JrIGZvciBzaW1wbGUgY2FzZXMuCk5vIHdvcmsgaGFzIGJlZW4gZG9uZSB0byBhZGQgc3BlY2lhbCBDKysgcHJvY2Vzc2luZyB0byBhbnkgb2YKdGhlIHRhcmdldCBsYW5ndWFnZXMuICAgU2VlIHRoZSB1c2VyIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBob3cKQysrIGlzIGhhbmRsZWQuICAgSWYgeW91IGZpbmQgcHJvYmxlbXMgd2l0aCB0aGUgQysrIGltcGxlbWVudGF0aW9uLApwbGVhc2UgbGV0IG1lIGtub3cuICBFeHBlY3QgbWFqb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgYXJlYS4KCk5vdGUgOiBJIGhhdmUgb25seSBzdWNjZXNzZnVsbHkgdXNlZCBTV0lHIGFuZCBDKysgd2l0aCBUY2wgYW5kClB5dGhvbi4KCk5vdGljZSBhYm91dCBWZXJzaW9uIDEuMEZpbmFsCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpWZXJzaW9uIDEuMEIzIGlzIHRoZSBsYXN0IEJldGEgcmVsZWFzZSBiZWZvcmUgdmVyc2lvbiAxLjAgRmluYWwgaXMKcmVsZWFzZWQuICBJIGhhdmUgZnJvemVuIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBpbiB2ZXJzaW9uIDEuMAphbmQgd2lsbCBvbmx5IGZpeCBidWdzIGFzIHRoZXkgc2hvdyB1cC4gIFdvcmsgb24gU1dJRyB2ZXJzaW9uIDIuMCBpcwphbHJlYWR5IGluIHByb2dyZXNzLCBidXQgaXMgZ29pbmcgdG8gcmVzdWx0IGluIHJhdGhlciBzaWduaWZpY2FudApjaGFuZ2VzIHRvIFNXSUcncyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGhvcGVmdWxseSBmb3IgdGhlIGJldHRlcikuICBObwphbnRpY2lwYXRlZCBkYXRlIGZvciB2ZXJzaW9uIDIuMCBpcyBzZXQsIGJ1dCBpZiB5b3UndmUgZ290IGFuIGlkZWEsCmxldCBtZSBrbm93LgoKVmVyc2lvbiAxLjAgQmV0YSAyIChBcHJpbCAyNiwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhpcyByZWxlYXNlIGlzIGlkZW50aWNhbCB0byBCZXRhMSBleGNlcHQgYSBmZXcgbWlub3IgYnVncyBhcmUKZml4ZWQgYW5kIHRoZSBTV0lHIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNS9UayA0LjEuCkEgdGNsNy41IGV4YW1wbGVzIGRpcmVjdG9yeSBpcyBub3cgaW5jbHVkZWQuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBNYWtlZmlsZSB0aGF0IGRpZG4ndCBpbnN0YWxsIHRoZSBsaWJyYXJpZXMKICBjb3JyZWN0bHkuCgotIFNXSUcgTGlicmFyeSBmaWxlcyBhcmUgbm93IHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUgYW5kIFRrIDQuMS4KCi0gTWlub3IgYnVnIGZpeGVzIGluIG90aGVyIG1vZHVsZXMuCgoKVmVyc2lvbiAxLjAgQmV0YSAxICAoQXByaWwgMTAsIDE5OTYpLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=