IE9wZW5TU0wgQ0hBTkdFUwogX19fX19fX19fX19fX19fCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42IGFuZCAwLjkuNyAgW3h4IFhYWCAyMDAwXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMgdG8gaGFuZGxlIHNpZ24sIHZlcmlmeSwgZGlnZXN0LCBwYWNrIGFuZAogICAgIHVucGFjayBvcGVyYXRpb25zIGluIHRlcm1zIG9mIEFTTjFfSVRFTS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgT0NTUCBzdHJ1Y3R1cmVzLCB0aGVzZSBmb2xsb3cgdGhlCiAgICAgc2FtZSBjb252ZW50aW9ucyBhcyBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19hZGQxX2kyZCgpLiBUaGlzIGF1dG9tYXRpY2FsbHkgZW5jb2RlcyBhbmQKICAgICBhZGRzIGFuIGV4dGVuc2lvbi4gSXRzIGJlaGF2aW91ciBjYW4gYmUgY3VzdG9taXNlZCB3aXRoIHZhcmlvdXMKICAgICBmbGFncyB0byBhcHBlbmQsIHJlcGxhY2Ugb3IgZGVsZXRlLiBWYXJpb3VzIHdyYXBwZXJzIGFkZGVkIGZvcgogICAgIGNlcnRpZmNhdGVzIGFuZCBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0byBhdm9pZCBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIEFTTjEgcHJpbnQgcm91dGluZSB3aGVuCiAgICAgYW4gZXh0ZW5zaW9uIGNhbm5vdCBiZSBwYXJzZWQuIENvcnJlY3QgYSB0eXBvIGluIHRoZQogICAgIE9DU1BfU0VSVklDRUxPQyBleHRlbnNpb24uIFRpZHkgdXAgcHJpbnQgT0NTUCBmb3JtYXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5jcmVhc2UgczItPndidWYgYWxsb2NhdGlvbiBieSBvbmUgYnl0ZSBpbiBzc2wyX25ldyAoc3NsL3MyX2xpYi5jKS4KICAgICBPdGhlcndpc2UgZG9fc3NsX3dyaXRlIChzc2wvczJfcGt0LmMpIHdpbGwgd3JpdGUgYmV5b25kIGJ1ZmZlciBsaW1pdHMKICAgICB3aGVuIHdyaXRpbmcgYSAzMjc2NyBieXRlIHJlY29yZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEVyaWMgRGF5IDxlZGF5QGNvbmNlbnRyaWMubmV0Pl0KCiAgKikgSW4gUlNBX2VheV9wdWJsaWNfe2VuLGVkfWNyeXB0IGFuZCBSU0FfZWF5X21vZF9leHAgKHJzYV9lYXkuYyksCiAgICAgb2J0YWluIGxvY2sgQ1JZUFRPX0xPQ0tfUlNBIGJlZm9yZSBzZXR0aW5nIHJzYS0+X21ldGhvZF9tb2Rfe24scCxxfS4KCiAgICAgKFJTQSBvYmplY3RzIGhhdmUgYSByZWZlcmVuY2UgY291bnQgYWNjZXNzIHRvIHdoaWNoIGlzIHByb3RlY3RlZAogICAgIGJ5IENSWVBUT19MT0NLX1JTQSBbc2VlIHJzYV9saWIuYywgczNfc3J2ci5jLCBzc2xfY2VydC5jLCBzc2xfcnNhLmNdLAogICAgIHNvIHRoZXkgYXJlIG1lYW50IHRvIGJlIHNoYXJlZCBiZXR3ZWVuIHRocmVhZHMuKQogICAgIFtCb2RvIE1vZWxsZXIsIEdlb2ZmIFRob3JwZTsgb3JpZ2luYWwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgIlJlZGRpZSwgU3RldmVuIiA8U3RldmVuLlJlZGRpZUBjYS5jb20+XQoKICAqKSBNYWtlIG1rZGVmLnBsIHBhcnNlIHNvbWUgb2YgdGhlIEFTTjEgbWFjcm9zIGFuZCBhZGQgYXByb3ByaWF0ZQogICAgIGVudHJpZXMgZm9yIHZhcmlhYmxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBkZWFkbG9jayBpbiBDUllQVE9fbWVtX2xlYWtzKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gYXBwcy9vcGVuc3NsLmMgZm9yIGRldGVjdGluZyBsb2NraW5nCiAgICAgcHJvYmxlbXM6IEFzIHRoZSBwcm9ncmFtIGlzIHNpbmdsZS10aHJlYWRlZCwgYWxsIHdlIGhhdmUKICAgICB0byBkbyBpcyByZWdpc3RlciBhIGxvY2tpbmcgY2FsbGJhY2sgdXNpbmcgYW4gYXJyYXkgZm9yCiAgICAgc3RvcmluZyB3aGljaCBsb2NrcyBhcmUgY3VycmVudGx5IGhlbGQgYnkgdGhlIHByb2dyYW0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGEgbG9jayBhcm91bmQgdGhlIGNhbGwgdG8gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoKSBpbgogICAgIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX2lkeCgpLCB3aGljaCBpcyB1c2VkIGluCiAgICAgc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKCkgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZQogICAgIGR1cmluZyBUTFMvU1NMIGhhbmRzaGFrZXMgc28gdGhhdCB0aHJlYWQtc2FmZXR5IGlzIGVzc2VudGlhbC4KICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgZXhfZGF0YSBkZXNpZ24gaXMgbm90IGF0IGFsbCBzdWl0ZWQKICAgICBmb3IgbXVsdGktdGhyZWFkZWQgdXNlLCBzbyBpdCBwcm9iYWJseSBzaG91bGQgYmUgYWJvbGlzaGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIEJyb2FkY29tICJ1YnNlYyIgRU5HSU5FIHRvIE9wZW5TU0wuCiAgICAgW0Jyb2FkY29tLCB0d2Vha2VkIGFuZCBpbnRlZ3JhdGVkIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgTW92ZSBjb21tb24gZXh0ZW5zaW9uIHByaW50aW5nIGNvZGUgdG8gbmV3IGZ1bmN0aW9uCiAgICAgWDUwOVYzX3ByaW50X2V4dGVuc2lvbnMoKS4gUmVvcmdhbmlzZSBPQ1NQIHByaW50IHJvdXRpbmVzIGFuZAogICAgIGltcGxlbWVudCBzb21lIG5lZWRlZCBPQ1NQIEFTTjEgZnVuY3Rpb25zLiBBZGQgT0NTUCBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X3NpZ25hdHVyZV9wcmludCgpIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBpbiBzb21lCiAgICAgcHJpbnQgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc3BlY2lhbCBtZWFuaW5nIHdoZW4gU0VUIE9GIGFuZCBTRVFVRU5DRSBPRiBmbGFncyBhcmUgYm90aAogICAgIHNldCAodGhpcyB3YXMgdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lIGFzIFNFVCBPRiBwcmV2aW91c2x5KS4gVGhpcwogICAgIGlzIHVzZWQgdG8gcmVvcmRlciB0aGUgU1RBQ0sgcmVwcmVzZW50aW5nIHRoZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggdGhlCiAgICAgZW5jb2RpbmcuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdldCByb3VuZCBhIHByb2JsZW0gd2hlcmUgYSBQS0NTNwogICAgIHN0cnVjdHVyZSB3aGljaCB3YXMgc2lnbmVkIGNvdWxkIG5vdCBiZSB2ZXJpZmllZCBiZWNhdXNlIHRoZSBTVEFDSwogICAgIG9yZGVyIGRpZCBub3QgcmVmbGVjdCB0aGUgZW5jb2RlZCBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudCB0aGUgT0NTUCBBU04xIG1vZHVsZSB1c2luZyB0aGUgbmV3IGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIHRoZSBYNTA5VjMgY29kZSB0byBwZXJtaXQgdGhlIHVzZSBvZiBhbiBBU04xX0lURU0gc3RydWN0dXJlCiAgICAgZm9yIGl0cyBBU04xIG9wZXJhdGlvbnMuIFRoZSBvbGQgc3R5bGUgZnVuY3Rpb24gcG9pbnRlcnMgc3RpbGwgZXhpc3QKICAgICBmb3Igbm93IGJ1dCB0aGV5IHdpbGwgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIHJlcGxhY2VtZW50IEFTTjEgY29kZSBmcm9tIHRoZSBBU04xIGJyYW5jaC4gVGhpcyBhbG1vc3QKICAgICBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSBvbGQgQVNOMSBmdW5jdGlvbmFsaXR5IHdpdGggYSB0YWJsZSBkcml2ZW4KICAgICBlbmNvZGVyIGFuZCBkZWNvZGVyIHdoaWNoIGludGVycHJldHMgYW4gQVNOMV9JVEVNIHN0cnVjdHVyZSBkZXNjcmliaW5nCiAgICAgdGhlIEFTTjEgbW9kdWxlLiBDb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIEFTTjEgQVBJIChpMmQsZDJpKSBpcwogICAgIGxhcmdlbHkgbWFpbnRhaW5lZC4gQWxtb3N0IGFsbCBvZiB0aGUgb2xkIGFzbjFfbWFjLmggbWFjcm8gYmFzZWQgQVNOMQogICAgIGhhcyBhbHNvIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgQk5fbW9kX2V4cF9yZWNwIHNvIHRoYXQgbmVnYXRpdmUgbW9kdWxpIGFyZSB0b2xlcmF0ZWQKICAgICAodGhlIHNpZ24gaXMgaWdub3JlZCkuICBTaW1pbGFybHksIGlnbm9yZSB0aGUgc2lnbiBpbiBCTl9NT05UX0NUWF9zZXQKICAgICBzbyB0aGF0IEJOX21vZF9leHBfbW9udCBhbmQgQk5fbW9kX2V4cF9tb250X3dvcmQgd29yawogICAgIGZvciBuZWdhdGl2ZSBtb2R1bGkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX3VhZGQgYW5kIEJOX3VzdWI6IEFsd2F5cyByZXR1cm4gbm9uLW5lZ2F0aXZlIHJlc3VsdHMgaW5zdGVhZAogICAgIG9mIG5vdCB0b3VjaGluZyB0aGUgcmVzdWx0J3Mgc2lnbiBiaXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQk5fZGl2IGJ1Z2ZpeDogSWYgdGhlIHJlc3VsdCBpcyAwLCB0aGUgc2lnbiAocmVzLT5uZWcpIG11c3Qgbm90IGJlCiAgICAgc2V0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZWQgdGhlIExIQVNIIGNvZGUgdG8gdXNlIHByb3RvdHlwZXMgZm9yIGNhbGxiYWNrcywgYW5kIGNyZWF0ZWQKICAgICBtYWNyb3MgdG8gZGVjbGFyZSBhbmQgaW1wbGVtZW50IHRoaW4gKG9wdGlvbmFsbHkgc3RhdGljKSBmdW5jdGlvbnMKICAgICB0aGF0IHByb3ZpZGUgdHlwZS1zYWZldHkgYW5kIGF2b2lkIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdGluZyBmb3IgdGhlCiAgICAgdHlwZS1zcGVjaWZpYyBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVXNlIGJldHRlciB0ZXN0IHBhdHRlcm5zIGluIGJudGVzdC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkZWQgS2VyYmVyb3MgQ2lwaGVyIFN1aXRlcyB0byBiZSB1c2VkIHdpdGggVExTLCBhcyB3cml0dGVuIGluCiAgICAgUkZDIDI3MTIuCiAgICAgW1ZlZXJzIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+LCB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSByYW5kX3dpbi5jIGZpeCBmb3IgQm9ybGFuZCBDLgogICAgIFtVbGYgTfZsbGVyXQogCiAgKikgQk5fcnNoaWZ0IGJ1Z2ZpeCBmb3IgbiA9PSAwLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlZm9ybWF0IHRoZSBGQVEgc28gdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgYW5kIGFuc3dlcnMgY2FuIGJlIGRpdmlkZWQKICAgICBpbiBzZWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHN1YmplY3QuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSGF2ZSB0aGUgemxpYiBjb21wcmVzc2lvbiBjb2RlIGxvYWQgWkxJQi5ETEwgZHluYW1pY2FsbHkgdW5kZXIKICAgICBXaW5kb3dzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2Rfc3FydCBmb3IgY29tcHV0aW5nIHNxdWFyZSByb290cyBtb2R1bG8gYSBwcmltZQogICAgICh1c2luZyB0aGUgcHJvYmFiaWxpc3RpYyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gdW5sZXNzCiAgICAgcCA9PSAzIChtb2QgNCkgIG9yICBwID09IDUgKG1vZCA4KSwgIHdoaWNoIGFyZSBjYXNlcyB0aGF0IGNhbgogICAgIGJlIGhhbmRsZWQgZGV0ZXJtaW5pc3RpY2FsbHkpLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBTdG9yZSB2ZXJpZnlfcmVzdWx0IHdpdGhpbiBTU0xfU0VTU0lPTiBhbHNvIGZvciBjbGllbnQgc2lkZSB0bwogICAgIGF2b2lkIHBvdGVudGlhbCBzZWN1cml0eSBob2xlLiAoUmUtdXNlZCBzZXNzaW9ucyBvbiB0aGUgY2xpZW50IHNpZGUKICAgICBhbHdheXMgcmVzdWx0ZWQgaW4gdmVyaWZ5X3Jlc3VsdD09WDUwOV9WX09LLCBub3QgdXNpbmcgdGhlIG9yaWdpbmFsCiAgICAgcmVzdWx0IG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFrZSBCTl9tb2RfaW52ZXJzZSBmYXN0ZXIgYnkgZXhwbGljaXRseSBoYW5kbGluZyBzbWFsbCBxdW90aWVudHMKICAgICBpbiB0aGUgRXVjbGlkIGxvb3AuIChTcGVlZCBnYWluIGFib3V0IDIwJSBmb3Igc21hbGwgbW9kdWxpIFsyNTYgb3IKICAgICA1MTIgYml0c10sIGFib3V0IDMwJSBmb3IgbGFyZ2VyIG9uZXMgWzEwMjQgb3IgMjA0OCBiaXRzXS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNzbDNfcGVuZGluZzogSWYgdGhlIHJlY29yZCBpbiBzLT5zMy0+cnJlYyBpcyBub3Qgb2YgdHlwZQogICAgIFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSwgcmV0dXJuIDAuCiAgICAgU2ltaWxhcmx5LCBjaGFuZ2Ugc3NsMl9wZW5kaW5nIHRvIHJldHVybiAwIGlmIFNTTF9pbl9pbml0KHMpIGlzIHRydWUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFNTTF9wZWVrOgogICAgIEJvdGggc3NsMl9wZWVrIGFuZCBzc2wzX3BlZWssIHdoaWNoIHdlcmUgdG90YWxseSBicm9rZW4gaW4gZWFybGllcgogICAgIHJlbGVhc2VzLCBoYXZlIGJlZW4gcmUtaW1wbGVtZW50ZWQgYnkgcmVuYW1pbmcgdGhlIHByZXZpb3VzCiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHNzbDJfcmVhZCBhbmQgc3NsM19yZWFkIHRvIHNzbDJfcmVhZF9pbnRlcm5hbAogICAgIGFuZCBzc2wzX3JlYWRfaW50ZXJuYWwsIHJlc3BlY3RpdmVseSwgYW5kIGFkZGluZyAncGVlaycgcGFyYW1ldGVycwogICAgIHRvIHRoZW0uICBUaGUgbmV3IHNzbFsyM11fe3JlYWQscGVla30gZnVuY3Rpb25zIGFyZSBjYWxscyB0bwogICAgIHNzbFsyM11fcmVhZF9pbnRlcm5hbCB3aXRoIHRoZSAncGVlaycgZmxhZyBzZXQgYXBwcm9wcmlhdGVseS4KICAgICBBICdwZWVrJyBwYXJhbWV0ZXIgaGFzIGFsc28gYmVlbiBhZGRlZCB0byBzc2wzX3JlYWRfYnl0ZXMsIHdoaWNoCiAgICAgZG9lcyB0aGUgYWN0dWFsIHdvcmsgZm9yIHNzbDNfcmVhZF9pbnRlcm5hbC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fa3JvbmVja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9nY2Qgc28gdGhhdCBpdCB3b3JrcyBvbiBuZWdhdGl2ZSBpbnB1dHM7IHRoZSByZXN1bHQgaXMKICAgICBwb3NpdGl2ZSB1bmxlc3MgYm90aCBwYXJhbWV0ZXJzIGFyZSB6ZXJvLgogICAgIFByZXZpb3VzbHkgc29tZXRoaW5nIHJlYXNvbmFibHkgY2xvc2UgdG8gYW4gaW5maW5pdGUgbG9vcCB3YXMKICAgICBwb3NzaWJsZSBiZWNhdXNlIG51bWJlcnMgY291bGQgYmUgZ3Jvd2luZyBpbnN0ZWFkIG9mIHNocmlua2luZwogICAgIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFdWNsaWQncyBhbGdvcml0aG0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX2lzX3dvcmQoKSBhbmQgQk5faXNfb25lKCkgbWFjcm9zIHRvIHRha2UgaW50byBhY2NvdW50IHRoZQogICAgIHNpZ24gb2YgdGhlIG51bWJlciBpbiBxdWVzdGlvbi4KCiAgICAgRml4IEJOX2lzX3dvcmQoYSx3KSB0byB3b3JrIGNvcnJlY3RseSBmb3IgdyA9PSAwLgoKICAgICBUaGUgb2xkIEJOX2lzX3dvcmQoYSx3KSBtYWNybyBpcyBub3cgY2FsbGVkIEJOX2Fic19pc193b3JkKGEsdykKICAgICBiZWNhdXNlIGl0cyB0ZXN0IGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiAnYScgZXF1YWxzICd3Jy4KICAgICBOb3RlIHRoYXQgQk5fYWJzX2lzX3dvcmQgZG9lcyAqbm90KiBoYW5kbGUgdyA9PSAwIHJlbGlhYmx5OwogICAgIGl0IGV4aXN0cyBtb3N0bHkgZm9yIHVzZSBpbiB0aGUgaW1wbGVtZW50YXRpb25zIG9mIEJOX2lzX3plcm8oKSwKICAgICBCTl9pc19vbmUoKSwgYW5kIEJOX2lzX3dvcmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsaXNlICJleF9kYXRhIiBtZW1iZXIgb2YgUlNBL0RTQS9ESCBzdHJ1Y3R1cmVzIHByaW9yIHRvIGNhbGxpbmcKICAgICB0aGUgbWV0aG9kLXNwZWNpZmljICJpbml0KCkiIGhhbmRsZXIuIEFsc28gY2xlYW4gdXAgZXhfZGF0YSBhZnRlcgogICAgIGNhbGxpbmcgdGhlIG1ldGhvZC1zcGVjaWZpYyAiZmluaXNoKCkiIGhhbmRsZXIuIFByZXZpb3VzbHksIHRoaXMgd2FzCiAgICAgaGFwcGVuaW5nIHRoZSBvdGhlciB3YXkgcm91bmQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3N3YXAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIEJOX25ubW9kIGluc3RlYWQgb2YgQk5fbW9kIGluIGNyeXB0by9ibi9ibl9leHAuYyBzbyB0aGF0CiAgICAgdGhlIGV4cG9uZW50aWF0aW9uIGZ1bmN0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gcHJvZHVjZSByZWFzb25hYmxlCiAgICAgcmVzdWx0cyBvbiBuZWdhdGl2ZSBpbnB1dHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIEJOX21vZF9tdWwgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBub24tbmVnYXRpdmUuCiAgICAgUHJldmlvdXNseSwgaXQgY291bGQgYmUgbmVnYXRpdmUgaWYgb25lIG9mIHRoZSBmYWN0b3JzIHdhcyBuZWdhdGl2ZTsKICAgICBJIGRvbid0IHRoaW5rIGFueW9uZSByZWFsbHkgd2FudGVkIHRoYXQgYmVoYXZpb3VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgQk5fbW9kXy4uLiBmdW5jdGlvbnMgaW50byBuZXcgZmlsZSBjcnlwdG8vYm4vYm5fbW9kLmMKICAgICAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX2V4cC5jLAogICAgIGFuZCBCTl9tb2RfbXVsX3JlY2lwcm9jYWwsIHdoaWNoIHN0YXlzIGluIGNyeXB0by9ibi9ibl9yZWNwLmMpCiAgICAgYW5kIGFkZCBuZXcgZnVuY3Rpb25zOgoKICAgICAgICAgIEJOX25ubW9kCiAgICAgICAgICBCTl9tb2Rfc3FyCiAgICAgICAgICBCTl9tb2RfYWRkCiAgICAgICAgICBCTl9tb2RfYWRkX3F1aWNrCiAgICAgICAgICBCTl9tb2Rfc3ViCiAgICAgICAgICBCTl9tb2Rfc3ViX3F1aWNrCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MQogICAgICAgICAgQk5fbW9kX2xzaGlmdDFfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQKICAgICAgICAgIEJOX21vZF9sc2hpZnRfcXVpY2sKCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBnZW5lcmF0ZSBub24tbmVnYXRpdmUgcmVzdWx0cy4KCiAgICAgQk5fbm5tb2Qgb3RoZXJ3aXNlIGlzIGxpa2UgQk5fbW9kIChpZiBCTl9tb2QgY29tcHV0ZXMgYSByZW1haW5kZXIgIHIKICAgICBzdWNoIHRoYXQgIHxtfCA8IHIgPCAwLCAgQk5fbm5tb2Qgd2lsbCBvdXRwdXQgIHJlbSArIHxtfCAgaW5zdGVhZCkuCgogICAgIEJOX21vZF9YWFhfcXVpY2sociwgYSwgW2IsXSBtKSBnZW5lcmF0ZXMgdGhlIHNhbWUgcmVzdWx0IGFzCiAgICAgQk5fbW9kX1hYWChyLCBhLCBbYixdIG0sIGN0eCksIGJ1dCByZXF1aXJlcyB0aGF0ICBhICBbYW5kICBiXQogICAgIGJlIHJlZHVjZWQgbW9kdWxvICBtLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluICdvcGVuc3NsIHBhc3N3ZCcsIHZlcmlmeSBwYXNzd29yZHMgcmVhZCBmcm9tIHRoZSB0ZXJtaW5hbAogICAgIHVubGVzcyB0aGUgJy1zYWx0JyBvcHRpb24gaXMgdXNlZCAod2hpY2ggdXN1YWxseSBtZWFucyB0aGF0CiAgICAgdmVyaWZpY2F0aW9uIHdvdWxkIGp1c3Qgd2FzdGUgdXNlcidzIHRpbWUgc2luY2UgdGhlIHJlc3VsdGluZwogICAgIGhhc2ggaXMgZ29pbmcgdG8gYmUgY29tcGFyZWQgd2l0aCBzb21lIGdpdmVuIHBhc3N3b3JkIGhhc2gpCiAgICAgb3IgdGhlIG5ldyAnLW5vdmVyaWZ5JyBvcHRpb24gaXMgdXNlZC4KCiAgICAgVGhpcyBpcyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLCBidXQgaXQgZG9lcyBub3QgYWZmZWN0CiAgICAgbm9uLWludGVyYWN0aXZlIHVzZSBvZiAnb3BlbnNzbCBwYXNzd2QnIChwYXNzd29yZHMgb24gdGhlIGNvbW1hbmQKICAgICBsaW5lLCAnLXN0ZGluJyBvcHRpb24sICctaW4gLi4uJyBvcHRpb24pIGFuZCB0aHVzIHNob3VsZCBub3QKICAgICBjYXVzZSBhbnkgcHJvYmxlbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIFJTQXJlZiwgc2luY2UgdGhlcmUncyBubyBtb3JlIG5lZWQgZm9yIGl0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluY3JlYXNlIEJOX0NUWF9OVU0gKHRoZSBudW1iZXIgb2YgQklHTlVNcyBpbiBhIEJOX0NUWCkgdG8gMTYuCiAgICAgVGhlIHByZXZpb3VzIHZhbHVlLCAxMiwgd2FzIG5vdCBhbHdheXMgc3VmZmljaWVudCBmb3IgQk5fbW9kX2V4cCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgRFNPIGxvYWQgYWxvbmcgYSBwYXRoIGdpdmVuIHRocm91Z2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAoU0hMSUJfUEFUSCkgd2l0aCBzaGxfbG9hZCgpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBFTkdJTkUgY29kZSBhcyBhIHJlc3VsdCBvZiBCSUdOVU0gY29uc3RpZmljYXRpb24uCiAgICAgQWxzbyBjb25zdGlmeSB0aGUgUlNBIGNvZGUgYW5kIG1vc3QgdGhpbmdzIHJlbGF0ZWQgdG8gaXQuICBJbiBhCiAgICAgZmV3IHBsYWNlcywgbW9zdCBub3RhYmxlIGluIHRoZSBkZXB0aCBvZiB0aGUgQVNOLjEgY29kZSwgdWdseQogICAgIGNhc3RzIGJhY2sgdG8gbm9uLWNvbnN0IHdlcmUgcmVxdWlyZWQgKHRvIGJlIHNvbHZlZCBhdCBhIGxhdGVyCiAgICAgdGltZSkKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHNvIHRoZSBvcGVuc3NsIGFwcGxpY2F0aW9uIGhhcyBhbGwgZW5naW5lcyBsb2FkZWQgYnkgZGVmYXVsdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25zdGlmeSB0aGUgQklHTlVNIHJvdXRpbmVzIGEgbGl0dGxlIG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBzdXJlIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBnZXQgdGhlIGludGVybmFsIG5hbWUgZW5naW5lIHdpdGgKICAgICB0aGUgZnVsbCB2ZXJzaW9uIG51bWJlciBhbmQgbm90IGp1c3QgMC4gIFRoaXMgc2hvdWxkIG1hcmsgdGhlCiAgICAgc2hhcmVkIGxpYnJhcmllcyBhcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4gIE9mIGNvdXJzZSwgdGhpcyBzaG91bGQKICAgICBiZSBjaGFuZ2VkIGFnYWluIHdoZW4gd2UgY2FuIGd1YXJhbnRlZSBiYWNrd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgoJRU5HSU5FX2xvYWRfY3N3aWZ0KCkKCUVOR0lORV9sb2FkX2NoaWwoKQoJRU5HSU5FX2xvYWRfYXRhbGxhKCkKCUVOR0lORV9sb2FkX251cm9uKCkKCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpCgogICAgIFRoYXQgd2F5LCBhbiBhcHBsaWNhdGlvbiBjYW4gaXRzZWxmIGNob29zZSBpZiBleHRlcm5hbCBlbmdpbmVzIHRoYXQKICAgICBhcmUgYnVpbHQtaW4gaW4gT3BlblNTTCBzaGFsbCBldmVyIGJlIHVzZWQgb3Igbm90LiAgVGhlIGJlbmVmaXQgaXMKICAgICB0aGF0IGFwcGxpY2F0aW9ucyB3b24ndCBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGxpYmRsIG9yIG90aGVyIGRzbwogICAgIGxpYnJhcmllcyB1bmxlc3MgaXQncyByZWFsbHkgbmVlZGVkLgoKICAgICBDaGFuZ2VkICdvcGVuc3NsIGVuZ2luZScgdG8gbG9hZCBhbGwgZW5naW5lcyBvbiBkZW1hbmQuCiAgICAgQ2hhbmdlZCB0aGUgZW5naW5lIGhlYWRlciBmaWxlcyB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24gb2Ygc29tZQogICAgIGRlY2xhcmF0aW9ucyAodGhleSBkaWZmZXJlZCEpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopICdvcGVuc3NsIGVuZ2luZScgY2FuIG5vdyBsaXN0IGNhcGFiaWxpdGllcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluICdvcGVuc3NsIGVuZ2luZScuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV2ZXIgY2FsbCBsb2FkX2RoX3BhcmFtKE5VTEwpIGluIHNfc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBlbmdpbmUgYXBwbGljYXRpb24uICBJdCBjYW4gY3VycmVudGx5IGxpc3QgZW5naW5lcyBieSBuYW1lIGFuZAogICAgIGlkZW50aXR5LCBhbmQgdGVzdCBpZiB0aGV5IGFyZSBhY3R1YWxseSBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgSXJpeC4KICAgICBbQWxiZXJ0IENoaW4tQS1Zb3VuZyA8Y2hpbmFAdGhld3JpdHRlbndvcmQuY29tPl0KCiAgKikgSW1wcm92ZSBSUE0gc3BlY2lmaWNhdGlvbiBmaWxlIGJ5IGZvcmNpbmcgc3ltYm9saWMgbGlua2luZyBhbmQgbWFraW5nCiAgICAgc3VyZSB0aGUgaW5zdGFsbGVkIGRvY3VtZW50YXRpb24gaXMgYWxzbyBvd25lZCBieSByb290LnJvb3QuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIEFkZCBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBidWlsZCBvbiBMaW51eCBvbiBib3RoIGJpZy1lbmRpYW4gYW5kCiAgICAgbGl0dGxlLWVuZGlhbiBNSVBTLgogICAgIFtSYWxmIEJhZWNobGUgPHJhbGZAdW5pLWtvYmxlbnouZGU+XQoKICAqKSBHaXZlIHRoZSBPcGVuU1NMIGFwcGxpY2F0aW9ucyBtb3JlIHBvc3NpYmlsaXRpZXMgdG8gbWFrZSB1c2Ugb2YKICAgICBrZXlzIChwdWJsaWMgYXMgd2VsbCBhcyBwcml2YXRlKSBoYW5kbGVkIGJ5IGVuZ2luZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIE9DU1AgY29kZSB0aGF0IGNvbWVzIGZyb20gQ2VydENvLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBWTVMgc3VwcG9ydCBmb3IgdGhlIFJpam5kYWVsIGNvZGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgdW50ZXN0ZWQgc3VwcG9ydCBmb3IgTnVyb24gY3J5cHRvIGFjY2VsZXJhdG9yLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgY3J5cHRvZ3JhcGhpYyBkZXZpY2VzLiAgVGhpcyBjb2RlIHdhcwogICAgIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBhcyB0aGUgImVuZ2luZSIgYnJhbmNoLgogICAgIFtHZW9mZiBUaG9ycGUsIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3b3JrIHRoZSBmaWxlbmFtZS10cmFuc2xhdGlvbiBpbiB0aGUgRFNPIGNvZGUuIEl0IGlzIG5vdyBwb3NzaWJsZSB0bwogICAgIGhhdmUgZmFyIGdyZWF0ZXIgY29udHJvbCBvdmVyIGhvdyBhICJuYW1lIiBpcyB0dXJuZWQgaW50byBhIGZpbGVuYW1lCiAgICAgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpbmcgZW52aXJvbm1lbnQgYW5kIGFueSBvZGRpdGllcyBhYm91dCB0aGUKICAgICBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcnkgZmlsZW5hbWVzIG9uIGVhY2ggc3lzdGVtLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFN1cHBvcnQgdGhyZWFkcyBvbiBGcmVlQlNELWVsZiBpbiBDb25maWd1cmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBIUC1VWAogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3IgU0hBMSBhc3NlbWJseSBwcm9ibGVtIHdpdGggTUFTTTogaXQgcHJvZHVjZXMKICAgICB3YXJuaW5ncyBhYm91dCBjb3JydXB0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdoZW4gYXNzZW1ibGluZwogICAgIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgb3ZlcmxhcHBpbmcKICAgICBvZiB0d28gc2VjdGlvbnMuCiAgICAgW0Jlcm5kIE1hdHRoZXMgPG1haW5idWdAY2Vsb2NvbS5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgTkNPTkYgY2hhbmdlcy4KICAgICBOQ09ORl9nZXRfbnVtYmVyKCkgaGFzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFsbC4gIEFzIGEgcmVwbGFjZW1lbnQsCiAgICAgTkNPTkZfZ2V0X251bWJlcl9lKCkgaXMgZGVmaW5lZCAoX2UgZm9yICJlcnJvciBjaGVja2luZyIpIGFuZCBpcwogICAgIHByb21vdGVkIHN0cm9uZ2x5LiAgVGhlIG9sZCBOQ09ORl9nZXRfbnVtYmVyIGlzIGtlcHQgYXJvdW5kIGZvcgogICAgIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgIE1ha2UgaXQgcG9zc2libGUgZm9yIG1ldGhvZHMgdG8gbG9hZCBmcm9tIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgQklPLAogICAgIGJ5IHByb3ZpZGluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBpcyBnaXZlbiBhIG5hbWUgaW5zdGVhZCBvZiBhIEJJTy4KICAgICBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIGxvYWQgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gYW4KICAgICBMREFQIHNlcnZlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggdHlwbyBpbiBnZXRfY2VydF9ieV9zdWJqZWN0KCkgaW4gYnlfZGlyLmMKICAgICBbSmVhbi1NYXJjIERlc3BlcnJpZXIgPGplYW4tbWFyYy5kZXNwZXJyaWVyQGNlcnRwbHVzLmNvbT5dCgogICopIFJld29yayB0aGUgc3lzdGVtIHRvIGdlbmVyYXRlIHNoYXJlZCBsaWJyYXJpZXM6CgogICAgIC0gTWFrZSBub3RlIG9mIHRoZSBleHBlY3RlZCBleHRlbnNpb24gZm9yIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFuZAogICAgICAgaWYgdGhlcmUgaXMgYSBuZWVkIGZvciBzeW1ib2xpYyBsaW5rcyBmcm9tIGZvciBleGFtcGxlIGxpYmNyeXB0by5zby4wCiAgICAgICB0byBsaWJjcnlwdG8uc28uMC45LjcuICBUaGVyZSBpcyBleHRlbmRlZCBpbmZvIGluIENvbmZpZ3VyZSBmb3IKICAgICAgIHRoYXQuCgogICAgIC0gTWFrZSBhcyBmZXcgcmVidWlsZHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYXMgcG9zc2libGUuCgogICAgIC0gU3RpbGwgYXZvaWQgbGlua2luZyB0aGUgT3BlblNTTCBwcm9ncmFtcyB3aXRoIHRoZSBzaGFyZWQgbGlicmFyaWVzLgoKICAgICAtIFdoZW4gaW5zdGFsbGluZywgaW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBzZXBhcmF0ZWx5IGZyb20gdGhlCiAgICAgICBzdGF0aWMgb25lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIG5vbiBibG9ja2luZyBhY2NlcHQgQklPcy4gQWRkZWQgbmV3IEkvTyBzcGVjaWFsIHJlYXNvbgogICAgIEJJT19SUl9BQ0NFUFQgdG8gY292ZXIgdGhpcyBjYXNlLiBQcmV2aW91c2x5IHVzZSBvZiBhY2NlcHQgQklPcwogICAgIHdpdGggbm9uIGJsb2NraW5nIEkvTyB3YXMgbm90IHBvc3NpYmxlIGJlY2F1c2Ugbm8gcmV0cnkgY29kZSB3YXMKICAgICBpbXBsZW1lbnRlZC4gQWxzbyBhZGRlZCBuZXcgU1NMIGNvZGUgU1NMX1dBTlRfQUNDRVBUIHRvIGNvdmVyCiAgICAgdGhpcyBjYXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHRoZSBiZWdpbm5pbmdzIG9mIFJpam5kYWVsIHN1cHBvcnQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBmb3IgYnVnIGluIERpcmVjdG9yeVN0cmluZyBtYXNrIHNldHRpbmcuIEFkZCBzdXBwb3J0IGZvcgogICAgIFg1MDlfTkFNRV9wcmludF9leCgpIGluICdyZXEnIGFuZCBYNTA5X3ByaW50X2V4KCkgZnVuY3Rpb24KICAgICB0byBhbGxvdyBjZXJ0aWZpY2F0ZSBwcmludGluZyB0byBtb3JlIGNvbnRyb2xsYWJsZSwgYWRkaXRpb25hbAogICAgICdjZXJ0b3B0JyBvcHRpb24gdG8gJ3g1MDknIHRvIGFsbG93IG5ldyBwcmludGluZyBvcHRpb25zIHRvIGJlCiAgICAgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIG9sZCBFQVkgTUQ1IGhhY2sgZnJvbSBlX29zLmguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQgbWFjcm8gdG8gYWN0dWFsbHkgdXNlIGl0cyBhcmd1bWVudC4KCiAgICAgQ29weSBTU0xfQ1RYJ3MgcmVhZF9haGVhZCBmbGFnIHRvIFNTTCBvYmplY3QgZGlyZWN0bHkgaW4gU1NMX25ldwogICAgIGFuZCBub3QgaW4gU1NMX2NsZWFyIGJlY2F1c2UgdGhlIGxhdHRlciBpcyBhbHNvIHVzZWQgYnkgdGhlCiAgICAgYWNjZXB0L2Nvbm5lY3QgZnVuY3Rpb25zOyBwcmV2aW91c2x5LCB0aGUgc2V0dGluZ3MgbWFkZSBieQogICAgIFNTTF9zZXRfcmVhZF9haGVhZCB3b3VsZCBiZSBsb3N0IGR1cmluZyB0aGUgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW1zIHJlcG9ydGVkIGJ5IEFuZGVycyBHZXJ0eiA8Z2VydHpAZXBhY3Quc2U+XSAgICAgCgogICopIENvcnJlY3QgdXRpbC9ta2RlZi5wbCB0byBiZSBzZWxlY3RpdmUgYWJvdXQgZGlzYWJsZWQgYWxnb3JpdGhtcy4KICAgICBQcmV2aW91c2x5LCBpdCB3b3VsZCBjcmVhdGUgZW50cmllcyBmb3IgZGlzYWJsZWVkIGFsZ29yaXRobXMgbm8KICAgICBtYXR0ZXIgd2hhdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNWEgYW5kIDAuOS42ICBbMjQgU2VwIDIwMDBdCgogICopIEluIHNzbDIzX2dldF9jbGllbnRfaGVsbG8sIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBmYWNlZAogICAgIHdpdGggYW4gaW5pdGlhbCBTU0wgMy4wL1RMUyByZWNvcmQgdGhhdCBpcyB0b28gc21hbGwgdG8gY29udGFpbiB0aGUKICAgICBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIENsaWVudEhlbGxvIG1lc3NhZ2UsIGkuZS4gY2xpZW50X3ZlcnNpb24uCiAgICAgKE5vdGUgdGhhdCB0aGlzIGlzIGEgcGF0aG9sb2dpYyBjYXNlIHRoYXQgcHJvYmFibHkgaGFzIG5ldmVyIGhhcHBlbmVkCiAgICAgaW4gcmVhbCBsaWZlLikgIFRoZSBwcmV2aW91cyBhcHByb2FjaCB3YXMgdG8gdXNlIHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGZyb20gdGhlIHJlY29yZCBoZWFkZXIgYXMgYSBzdWJzdGl0dXRlOyBidXQgb3VyIHByb3RvY29sIGNob2ljZQogICAgIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoYXQgb25lIGJlY2F1c2UgaXQgaXMgbm90IGF1dGhlbnRpY2F0ZWQKICAgICBieSB0aGUgRmluaXNoZWQgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW9yZSByb2J1c3QgcmFuZG9tbmVzcyBnYXRoZXJpbmcgZnVuY3Rpb25zIGZvciBXaW5kb3dzLgogICAgIFtKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+XQoKICAqKSBGb3IgY29tcGF0aWJpbGl0eSByZWFzb25zIGlmIHRoZSBmbGFnIFg1MDlfVl9GTEFHX0lTU1VFUl9DSEVDSyBpcwogICAgIG5vdCBzZXQgdGhlbiB3ZSBkb24ndCBzZXR1cCB0aGUgZXJyb3IgY29kZSBmb3IgaXNzdWVyIGNoZWNrIGVycm9ycwogICAgIHRvIGF2b2lkIHBvc3NpYmx5IG92ZXJ3cml0aW5nIG90aGVyIGVycm9ycyB3aGljaCB0aGUgY2FsbGJhY2sgZG9lcwogICAgIGhhbmRsZS4gSWYgYW4gYXBwbGljYXRpb24gZG9lcyBzZXQgdGhlIGZsYWcgdGhlbiB3ZSBhc3N1bWUgaXQga25vd3MKICAgICB3aGF0IGl0IGlzIGRvaW5nIGFuZCBjYW4gaGFuZGxlIHRoZSBuZXcgaW5mb3JtYXRpb25hbCBjb2RlcwogICAgIGFwcHJvcHJpYXRlbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBhIG5hc3R5IGJ1ZyBpbiBBU04xX1RZUEUgaGFuZGxpbmcuIEFTTjFfVFlQRSBpcyB1c2VkIGZvcgogICAgIGEgZ2VuZXJhbCAiQU5ZIiB0eXBlLCBhcyBzdWNoIGl0IHNob3VsZCBiZSBhYmxlIHRvIGRlY29kZSBhbnl0aGluZwogICAgIGluY2x1ZGluZyB0YWdnZWQgdHlwZXMuIEhvd2V2ZXIgaXQgZGlkbid0IGNoZWNrIHRoZSBjbGFzcyBzbyBpdCB3b3VsZAogICAgIHdyb25nbHkgaW50ZXJwcmV0IHRhZ2dlZCB0eXBlcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgdW5pdmVyc2FsCiAgICAgY291bnRlcnBhcnQgYW5kIHVua25vd24gdHlwZXMgd2VyZSBqdXN0IHJlamVjdGVkLiBDaGFuZ2VkIHNvIHRoYXQgdGhlCiAgICAgdGFnZ2VkIGFuZCB1bmtub3duIHR5cGVzIGFyZSBoYW5kbGVkIGluIHRoZSBzYW1lIHdheSBhcyBhIFNFUVVFTkNFOgogICAgIHRoYXQgaXMgdGhlIGVuY29kaW5nIGlzIHN0b3JlZCBpbnRhY3QuIFRoZXJlIGlzIGFsc28gYSBuZXcgdHlwZQogICAgICJWX0FTTjFfT1RIRVIiIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgY2xhc3MgaXMgbm90IHVuaXZlcnNhbCwgaW4gdGhpcwogICAgIGNhc2Ugd2UgaGF2ZSBubyBpZGVhIHdoYXQgdGhlIGFjdHVhbCB0eXBlIGlzIHNvIHdlIGp1c3QgbHVtcCB0aGVtIGFsbAogICAgIHRvZ2V0aGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE9uIFZNUywgc3Rkb3V0IG1heSB2ZXJ5IHdlbGwgbGVhZCB0byBhIGZpbGUgdGhhdCBpcyB3cml0dGVuIHRvCiAgICAgaW4gYSByZWNvcmQtb3JpZW50ZWQgZmFzaGlvbi4gIFRoYXQgbWVhbnMgdGhhdCBldmVyeSB3cml0ZSgpIHdpbGwKICAgICB3cml0ZSBhIHNlcGFyYXRlIHJlY29yZCwgd2hpY2ggd2lsbCBiZSByZWFkIHNlcGFyYXRlbHkgYnkgdGhlCiAgICAgcHJvZ3JhbXMgdHJ5aW5nIHRvIHJlYWQgZnJvbSBpdC4gIFRoaXMgY2FuIGJlIHZlcnkgY29uZnVzaW5nLgoKICAgICBUaGUgc29sdXRpb24gaXMgdG8gcHV0IGEgQklPIGZpbHRlciBpbiB0aGUgd2F5IHRoYXQgd2lsbCBidWZmZXIKICAgICB0ZXh0IHVudGlsIGEgbGluZWZlZWQgaXMgcmVhY2hlZCwgYW5kIHRoZW4gd3JpdGUgZXZlcnl0aGluZyBhCiAgICAgbGluZSBhdCBhIHRpbWUsIHNvIGV2ZXJ5IHJlY29yZCB3cml0dGVuIHdpbGwgYmUgYW4gYWN0dWFsIGxpbmUsCiAgICAgbm90IGNodW5rcyBvZiBsaW5lcyBhbmQgbm90ICh1c3VhbGx5IGRvZXNuJ3QgaGFwcGVuLCBidXQgSSd2ZQogICAgIHNlZW4gaXQgb25jZSkgc2V2ZXJhbCBsaW5lcyBpbiBvbmUgcmVjb3JkLiAgQklPX2ZfbGluZWJ1ZmZlcigpIGlzCiAgICAgdGhlIGFuc3dlci4KCiAgICAgQ3VycmVudGx5LCBpdCdzIGEgVk1TLW9ubHkgbWV0aG9kLCBiZWNhdXNlIHRoYXQncyB3aGVyZSBpdCBoYXMKICAgICBiZWVuIHRlc3RlZCB3ZWxsIGVub3VnaC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgJ29wdGltaXplZCcgc3F1YXJpbmcgdmFyaWFudCBpbiBCTl9tb2RfbXVsX21vbnRnb21lcnksCiAgICAgaXQgY2FuIHJldHVybiBpbmNvcnJlY3QgcmVzdWx0cy4KICAgICAoTm90ZTogVGhlIGJ1Z2d5IHZhcmlhbnQgd2FzIG5vdCBlbmFibGVkIGluIE9wZW5TU0wgMC45LjVhLAogICAgIGJ1dCBpdCB3YXMgaW4gMC45LjYtYmV0YVsxMl0uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgdGhlIGNoZWNrIGZvciBjb250ZW50IGJlaW5nIHByZXNlbnQgd2hlbiB2ZXJpZnlpbmcgZGV0YWNoZWQKICAgICBzaWduYXR1cmVzIGluIHBrN19zbWltZS5jLiBTb21lIHZlcnNpb25zIG9mIE5ldHNjYXBlICh3cm9uZ2x5KQogICAgIGluY2x1ZGUgemVybyBsZW5ndGggY29udGVudCB3aGVuIHNpZ25pbmcgbWVzc2FnZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEJJT19zaHV0ZG93bl93ciBtYWNybywgd2hpY2ggaW52b2tlcyB0aGUgQklPX0NfU0hVVERPV05fV1IKICAgICBCSU9fY3RybCAoZm9yIEJJTyBwYWlycykuCiAgICAgW0JvZG8gTfZsbGVyXQoKICAqKSBBZGQgRFNPIG1ldGhvZCBmb3IgVk1TLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJ1ZyBmaXg6IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gY291bGQgcHJvZHVjZSByZXN1bHRzIHdpdGggdGhlCiAgICAgd3Jvbmcgc2lnbi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIFJQTSBzcGVjaWZpY2F0aW9uIG9wZW5zc2wuc3BlYyBhbmQgbW9kaWZ5IGl0IHRvIGJ1aWxkIHRocmVlCiAgICAgcGFja2FnZXMuICBUaGUgZGVmYXVsdCBwYWNrYWdlIGNvbnRhaW5zIGFwcGxpY2F0aW9ucywgYXBwbGljYXRpb24KICAgICBkb2N1bWVudGF0aW9uIGFuZCBydW4tdGltZSBsaWJyYXJpZXMuICBUaGUgZGV2ZWwgcGFja2FnZSBjb250YWlucwogICAgIGluY2x1ZGUgZmlsZXMsIHN0YXRpYyBsaWJyYXJpZXMgYW5kIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24uICBUaGUKICAgICBkb2MgcGFja2FnZSBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlIGRvYyBkaXJlY3RvcnkuICBUaGUgb3JpZ2luYWwKICAgICBvcGVuc3NsLnNwZWMgd2FzIHByb3ZpZGVkIGJ5IERhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KICAgICAKICAqKSBBZGQgYSBsYXJnZSBudW1iZXIgb2YgZG9jdW1lbnRhdGlvbiBmaWxlcyBmb3IgbWFueSBTU0wgcm91dGluZXMuCiAgICAgW0x1dHogSmFlbmlja2UgPEx1dHouSmFlbmlja2VAYWV0LlRVLUNvdHRidXMuREU+XQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBTb255IE5ld3MgNC4KICAgICBbTkFLQUpJIEhpcm95dWtpIDxuYWthamlAdHV0cnAudHV0LmFjLmpwPl0KCiAgKikgRG9uJ3Qgc2V0IHRoZSB0d28gbW9zdCBzaWduaWZpY2FudCBiaXRzIHRvIG9uZSB3aGVuIGdlbmVyYXRpbmcgYQogICAgIHJhbmRvbSBudW1iZXIgPCBxIGluIHRoZSBEU0EgbGlicmFyeS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IFNTTCBBUEkgbW9kZSAnU1NMX01PREVfQVVUT19SRVRSWScuICBUaGlzIGRpc2FibGVzIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHRoYXQgU1NMX3JlYWQgbWF5IHJlc3VsdCBpbiBTU0xfRVJST1JfV0FOVF9SRUFEIChldmVuIGlmCiAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlzIGJsb2NraW5nKSBpZiBhIGhhbmRzaGFrZSB0b29rIHBsYWNlLgogICAgIChUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbmVlZGVkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIHNfY2xpZW50CiAgICAgYW5kIHNfc2VydmVyIHRoYXQgdXNlIHNlbGVjdCgpIHRvIGRldGVybWluZSB3aGVuIHRvIHVzZSBTU0xfcmVhZDsKICAgICBidXQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGtub3cgaW4gYWR2YW5jZSB3aGVuIHRvIGV4cGVjdCBkYXRhLCBpdAogICAgIGp1c3QgbWFrZXMgdGhpbmdzIG1vcmUgY29tcGxpY2F0ZWQuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSQU5EX2VnZF9ieXRlcygpLCB3aGljaCBnaXZlcyBjb250cm9sIG92ZXIgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAgZnJvbSBFR0QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIGZldyBtb3JlIEVCQ0RJQyBjb25kaXRpb25hbHMgdGhhdCBtYWtlIGByZXEnIGFuZCBgeDUwOScKICAgICB3b3JrIGJldHRlciBvbiBzdWNoIHN5c3RlbXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBBZGQgdHdvIGRlbW8gcHJvZ3JhbXMgZm9yIFBLQ1MxMl9wYXJzZSgpIGFuZCBQS0NTMTJfY3JlYXRlKCkuCiAgICAgVXBkYXRlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IGNvcGllcyB0aGUgZnJpZW5kbHlOYW1lIGFuZCB0aGUKICAgICBrZXlpZCB0byB0aGUgY2VydGlmaWNhdGVzIGF1eCBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWcgaW4gUEtDUzdfdmVyaWZ5KCkgd2hpY2ggY2F1c2VkIGFuIGluZmluaXRlIGxvb3AKICAgICBpZiB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZSBzaWduYXR1cmUuCiAgICAgW1N2ZW4gVXN6cGVsa2F0IDxzdUBjZWxvY29tLmRlPl0KCiAgKikgTWFqb3IgY2hhbmdlIGluIHV0aWwvbWtkZWYucGwgdG8gaW5jbHVkZSBleHRyYSBpbmZvcm1hdGlvbgogICAgIGFib3V0IGVhY2ggc3ltYm9sLCBhcyB3ZWxsIGFzIHByZXNlbnRpZyB2YXJpYWJsZXMgYXMgd2VsbAogICAgIGFzIGZ1bmN0aW9ucy4gIFRoaXMgY2hhbmdlIG1lYW5zIHRoYXQgdGhlcmUncyBuIG1vcmUgbmVlZAogICAgIHRvIHJlYnVpbGQgdGhlIC5udW0gZmlsZXMgd2hlbiBzb21lIGFsZ29yaXRobXMgYXJlIGV4Y2x1ZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFsbG93IHRoZSB2ZXJpZnkgdGltZSB0byBiZSBzZXQgYnkgYW4gYXBwbGljYXRpb24sCiAgICAgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAKICAqKSBQaGFzZSAyIHZlcmlmeSBjb2RlIHJlb3JnYW5pc2F0aW9uLiBUaGUgY2VydGlmaWNhdGUKICAgICB2ZXJpZnkgY29kZSBub3cgbG9va3MgdXAgYW4gaXNzdWVyIGNlcnRpZmljYXRlIGJ5IGEKICAgICBudW1iZXIgb2YgY3JpdGVyaWE6IHN1YmplY3QgbmFtZSwgYXV0aG9yaXR5IGtleSBpZAogICAgIGFuZCBrZXkgdXNhZ2UuIEl0IGFsc28gdmVyaWZpZXMgc2VsZiBzaWduZWQgY2VydGlmaWNhdGVzCiAgICAgYnkgdGhlIHNhbWUgY3JpdGVyaWEuIFRoZSBtYWluIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMKICAgICBYNTA5X2NoZWNrX2lzc3VlZCgpIHdoaWNoIHBlcmZvcm1zIHRoZXNlIGNoZWNrcy4KIAogICAgIExvdCBvZiBjaGFuZ2VzIHdlcmUgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHN1cHBvcnQgdGhpcwogICAgIHdpdGhvdXQgY29tcGxldGVseSByZXdyaXRpbmcgdGhlIGxvb2t1cCBjb2RlLgogCiAgICAgQXV0aG9yaXR5IGFuZCBzdWJqZWN0IGtleSBpZGVudGlmaWVyIGFyZSBub3cgY2FjaGVkLgogCiAgICAgVGhlIExIQVNIICdjZXJ0cycgaXMgWDUwOV9TVE9SRSBoYXMgbm93IGJlZW4gcmVwbGFjZWQKICAgICBieSBhIFNUQUNLX09GKFg1MDlfT0JKRUNUKS4gVGhpcyBpcyBtYWlubHkgYmVjYXVzZSBhbgogICAgIExIQVNIIGNhbid0IHN0b3JlIG9yIHJldHJpZXZlIG11bHRpcGxlIG9iamVjdHMgd2l0aAogICAgIHRoZSBzYW1lIGhhc2ggdmFsdWUuCgogICAgIEFzIGEgcmVzdWx0IHZhcmlvdXMgZnVuY3Rpb25zICh3aGljaCB3ZXJlIGFsbCBpbnRlcm5hbAogICAgIHVzZSBvbmx5KSBoYXZlIGNoYW5nZWQgdG8gaGFuZGxlIHRoZSBuZXcgWDUwOV9TVE9SRQogICAgIHN0cnVjdHVyZS4gVGhpcyB3aWxsIGJyZWFrIGFueXRoaW5nIHRoYXQgbWVzc2VkIHJvdW5kCiAgICAgd2l0aCBYNTA5X1NUT1JFIGludGVybmFsbHkuCiAKICAgICBUaGUgZnVuY3Rpb25zIFg1MDlfU1RPUkVfYWRkX2NlcnQoKSBub3cgY2hlY2tzIGZvciBhbgogICAgIGV4YWN0IG1hdGNoLCByYXRoZXIgdGhhbiBqdXN0IHN1YmplY3QgbmFtZS4KIAogICAgIFRoZSBYNTA5X1NUT1JFIEFQSSBkb2Vzbid0IGRpcmVjdGx5IHN1cHBvcnQgdGhlIHJldHJpZXZhbAogICAgIG9mIG11bHRpcGxlIGNlcnRpZmljYXRlcyBtYXRjaGluZyBhIGdpdmVuIGNyaXRlcmlhLCBob3dldmVyCiAgICAgdGhpcyBjYW4gYmUgd29ya2VkIHJvdW5kIGJ5IHBlcmZvcm1pbmcgYSBsb29rdXAgZmlyc3QKICAgICAod2hpY2ggd2lsbCBmaWxsIHRoZSBjYWNoZSB3aXRoIGNhbmRpZGF0ZSBjZXJ0aWZpY2F0ZXMpCiAgICAgYW5kIHRoZW4gZXhhbWluaW5nIHRoZSBjYWNoZSBmb3IgbWF0Y2hlcy4gVGhpcyBpcyBwcm9iYWJseQogICAgIHRoZSBiZXN0IHdlIGNhbiBkbyB3aXRob3V0IHRocm93aW5nIG91dCBYNTA5X0xPT0tVUAogICAgIGVudGlyZWx5IChtYXliZSBsYXRlci4uLikuCiAKICAgICBUaGUgWDUwOV9WRVJJRllfQ1RYIHN0cnVjdHVyZSBoYXMgYmVlbiBlbmhhbmNlZCBjb25zaWRlcmFibHkuCiAKICAgICBBbGwgY2VydGlmaWNhdGUgbG9va3VwIG9wZXJhdGlvbnMgbm93IGdvIHZpYSBhIGdldF9pc3N1ZXIoKQogICAgIGNhbGxiYWNrLiBBbHRob3VnaCB0aGlzIGN1cnJlbnRseSB1c2VzIGFuIFg1MDlfU1RPUkUgaXQKICAgICBjYW4gYmUgcmVwbGFjZWQgYnkgY3VzdG9tIGxvb2t1cHMuIFRoaXMgaXMgYSBzaW1wbGUgd2F5CiAgICAgdG8gYnlwYXNzIHRoZSBYNTA5X1NUT1JFIGhhY2tlcnkgbmVjZXNzYXJ5IHRvIG1ha2UgdGhpcwogICAgIHdvcmsgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBtb3JlIGVmZmljaWVudCB0ZWNobmlxdWVzCiAgICAgaW4gZnV0dXJlLiBBIHZlcnkgc2ltcGxlIHZlcnNpb24gd2hpY2ggdXNlcyBhIHNpbXBsZQogICAgIFNUQUNLIGZvciBpdHMgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBzdG9yZSBpcyBhbHNvIHByb3ZpZGVkCiAgICAgdXNpbmcgWDUwOV9TVE9SRV9DVFhfdHJ1c3RlZF9zdGFjaygpLgogCiAgICAgVGhlIHZlcmlmeV9jYigpIGFuZCB2ZXJpZnkoKSBjYWxsYmFja3Mgbm93IGhhdmUgZXF1aXZhbGVudHMKICAgICBpbiB0aGUgWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlLgogCiAgICAgWDUwOV9TVE9SRV9DVFggYWxzbyBoYXMgYSAnZmxhZ3MnIGZpZWxkIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgdG8gY3VzdG9taXNlIHRoZSB2ZXJpZnkgYmVoYXZpb3VyLgogICAgIFtTdGV2ZSBIZW5zb25dCiAKICAqKSBBZGQgbmV3IFBLQ1MjNyBzaWduaW5nIG9wdGlvbiBQS0NTN19OT1NNSU1FQ0FQIHdoaWNoIAogICAgIGV4Y2x1ZGVzIFMvTUlNRSBjYXBhYmlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBhIGNlcnRpZmljYXRlIHJlcXVlc3QgaXMgcmVhZCBpbiBrZWVwIGEgY29weSBvZiB0aGUKICAgICBvcmlnaW5hbCBlbmNvZGluZyBvZiB0aGUgc2lnbmVkIGRhdGEgYW5kIHVzZSBpdCB3aGVuIG91dHB1dGluZwogICAgIGFnYWluLiBTaWduYXR1cmVzIHRoZW4gdXNlIHRoZSBvcmlnaW5hbCBlbmNvZGluZyByYXRoZXIgdGhhbgogICAgIGEgZGVjb2RlZCwgZW5jb2RlZCB2ZXJzaW9uIHdoaWNoIG1heSBjYXVzZSBwcm9ibGVtcyBpZiB0aGUKICAgICByZXF1ZXN0IGlzIGltcHJvcGVybHkgZW5jb2RlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBCSU9fcHV0cyBpbXBsZW1lbnRhdGlvbnMsIGNhbGwKICAgICBidWZmZXJfd3JpdGUoYiwgLi4uKSBkaXJlY3RseSBpbiBidWZmZXJfcHV0cyBpbnN0ZWFkIG9mIGNhbGxpbmcKICAgICBCSU9fd3JpdGUoYiwgLi4uKS4KCiAgICAgSW4gQklPX3B1dHMsIGluY3JlbWVudCBiLT5udW1fd3JpdGUgYXMgaW4gQklPX3dyaXRlLgogICAgIFtQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcl0KCiAgKikgRml4IEJOX211bF93b3JkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgd29yZCBpcyAwLiAoV2UgaGF2ZSB0byB1c2UKICAgICBCTl96ZXJvLCB3ZSBtYXkgbm90IHJldHVybiBhIEJJR05VTSB3aXRoIGFuIGFycmF5IGNvbnNpc3Rpbmcgb2YKICAgICB3b3JkcyBzZXQgdG8gemVyby4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgY2FsbGluZyBhYm9ydCgpIGZyb20gd2l0aGluIHRoZSBsaWJyYXJ5IHdoZW4gcHJvYmxlbXMgYXJlCiAgICAgZGV0ZWN0ZWQsIGV4Y2VwdCBpZiBwcmVwcm9jZXNzb3Igc3ltYm9scyBoYXZlIGJlZW4gZGVmaW5lZAogICAgIChzdWNoIGFzIFJFRl9DSEVDSywgQk5fREVCVUcgZXRjLikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wZW5zc2wgYXBwbGljYXRpb24gJ3JzYXV0bCcuIFRoaXMgdXRpbGl0eSBjYW4gYmUKICAgICB1c2VkIGZvciBsb3cgbGV2ZWwgUlNBIG9wZXJhdGlvbnMuIERFUiBwdWJsaWMga2V5CiAgICAgQklPL2ZwIHJvdXRpbmVzIGFsc28gYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBlbnRyeSBhbmQgcGF0Y2hlcyBmb3IgY29tcGlsaW5nIG9uIFFOWCA0LgogICAgIFtBbmRyZWFzIFNjaG5laWRlciA8YW5kcmVhc0BkczMuZXRlY2guZmgtaGFtYnVyZy5kZT5dCgogICopIEEgZGVtbyBzdGF0ZS1tYWNoaW5lIGltcGxlbWVudGF0aW9uIHdhcyBzcG9uc29yZWQgYnkKICAgICBOdXJvbiAoaHR0cDovL3d3dy5udXJvbi5jb20vKSBhbmQgaXMgbm93IGF2YWlsYWJsZSBpbgogICAgIGRlbW9zL3N0YXRlX21hY2hpbmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBvcHRpb25zIGFkZGVkIHRvIHRoZSAnZGdzdCcgdXRpbGl0eSBmb3Igc2lnbmF0dXJlCiAgICAgZ2VuZXJhdGlvbiBhbmQgdmVyaWZpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVucmVjb2duaXplZCBQS0NTIzcgY29udGVudCB0eXBlcyBhcmUgbm93IGhhbmRsZWQgdmlhIGEKICAgICBjYXRjaCBhbGwgQVNOMV9UWVBFIHN0cnVjdHVyZS4gVGhpcyBhbGxvd3MgdW5zdXBwb3J0ZWQKICAgICB0eXBlcyB0byBiZSBzdG9yZWQgYXMgYSAiYmxvYiIgYW5kIGFuIGFwcGxpY2F0aW9uIGNhbgogICAgIGVuY29kZSBhbmQgZGVjb2RlIGl0IG1hbnVhbGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB2YXJpb3VzIHNpZ25lZC91bnNpZ25lZCBpc3N1ZXMgdG8gbWFrZSBhX3N0cmV4LmMKICAgICBjb21waWxlIHVuZGVyIFZDKysuCiAgICAgW09zY2FyIEphY29ic3NvbiA8b3NjYXIuamFjb2Jzc29uQGNlbG9jb20uY29tPl0KCiAgKikgQVNOMSBmaXhlcy4gaTJkX0FTTjFfT0JKRUNUIHdhcyBub3QgcmV0dXJuaW5nIHRoZSBjb3JyZWN0CiAgICAgbGVuZ3RoIGlmIHBhc3NlZCBhIGJ1ZmZlci4gQVNOMV9JTlRFR0VSX3RvX0JOIGZhaWxlZAogICAgIGlmIHBhc3NlZCBhIE5VTEwgQk4gYW5kIGl0cyBhcmd1bWVudCB3YXMgbmVnYXRpdmUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgU3ZlbiBIZWliZXJnIDxzdmVuQHRhcnR1LmN5YmVyLmVlPl0KCiAgKikgTW9kaWZpY2F0aW9uIHRvIFBLQ1MjNyBlbmNvZGluZyByb3V0aW5lcyB0byBvdXRwdXQgZGVmaW5pdGUKICAgICBsZW5ndGggZW5jb2RpbmcuIFNpbmNlIGN1cnJlbnRseSB0aGUgd2hvbGUgc3RydWN0dXJlcyBhcmUgaW4KICAgICBtZW1vcnkgdGhlcmUncyBub3QgcmVhbCBwb2ludCBpbiB1c2luZyBpbmRlZmluaXRlIGxlbmd0aCAKICAgICBjb25zdHJ1Y3RlZCBlbmNvZGluZy4gSG93ZXZlciBpZiBPcGVuU1NMIGlzIGNvbXBpbGVkIHdpdGgKICAgICB0aGUgZmxhZyBQS0NTN19JTkRFRklOSVRFX0VOQ09ESU5HIHRoZSBvbGQgZm9ybSBpcyB1c2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIEJJT192cHJpbnRmKCkgYW5kIEJJT192c25wcmludGYoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCBtb3JlIHByZWZpeGVzIHRvIHBhcnNlIGZvciBpbiB0aGUgdGhlIHN0cmluZ3Mgd3JpdHRlbgogICAgIHRocm91Z2ggYSBsb2dnaW5nIGJpbywgdG8gY292ZXIgYWxsIHRoZSBsZXZlbHMgdGhhdCBhcmUgYXZhaWxhYmxlCiAgICAgdGhyb3VnaCBzeXNsb2cuICBUaGUgcHJlZml4ZXMgYXJlIG5vdzoKCglQQU5JQywgRU1FUkcsIEVNUgk9PglMT0dfRU1FUkcKCUFMRVJULCBBTFIJCT0+CUxPR19BTEVSVAoJQ1JJVCwgQ1JJCQk9PglMT0dfQ1JJVAoJRVJST1IsIEVSUgkJPT4JTE9HX0VSUgoJV0FSTklORywgV0FSTiwgV0FSCT0+CUxPR19XQVJOSU5HCglOT1RJQ0UsIE5PVEUsIE5PVAk9PglMT0dfTk9USUNFCglJTkZPLCBJTkYJCT0+CUxPR19JTkZPCglERUJVRywgREJHCQk9PglMT0dfREVCVUcKCiAgICAgYW5kIGFzIGJlZm9yZSwgaWYgbm9uZSBvZiB0aG9zZSBwcmVmaXhlcyBhcmUgcHJlc2VudCBhdCB0aGUKICAgICBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgTE9HX0VSUiBpcyBjaG9zZW4uCgogICAgIE9uIFdpbjMyLCB0aGUgTE9HXyogbGV2ZWxzIGFyZSBtYXBwZWQgYWNjb3JkaW5nIHRvIHRoaXM6CgoJTE9HX0VNRVJHLCBMT0dfQUxFUlQsIExPR19DUklULCBMT0dfRVJSCT0+IEVWRU5UTE9HX0VSUk9SX1RZUEUKCUxPR19XQVJOSU5HCQkJCT0+IEVWRU5UTE9HX1dBUk5JTkdfVFlQRQoJTE9HX05PVElDRSwgTE9HX0lORk8sIExPR19ERUJVRwkJPT4gRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRQoKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWRlIGl0IHBvc3NpYmxlIHRvIHJlY29uZmlndXJlIHdpdGgganVzdCB0aGUgY29uZmlndXJhdGlvbgogICAgIGFyZ3VtZW50ICJyZWNvbmYiIG9yICJyZWNvbmZpZ3VyZSIuICBUaGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgIGFyZSBzdG9yZWQgaW4gTWFrZWZpbGUuc3NsIGluIHRoZSB2YXJpYWJsZSBDT05GSUdVUkVfQVJHUywKICAgICBhbmQgYXJlIHJldHJpZXZlZCBmcm9tIHRoZXJlIHdoZW4gcmVjb25maWd1cmluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNRDQgaW1wbGVtZW50ZWQuCiAgICAgW0Fzc2FyIFdlc3Rlcmx1bmQgPGFzc2FyQHNpY3Muc2U+LCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgYXJndW1lbnRzIC1DQWZpbGUgYW5kIC1DQXBhdGggdG8gdGhlIHBrY3MxMiB1dGlsaXR5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBvYmpfZGF0LnBsIHNjcmlwdCB3YXMgbWVzc2luZyB1cCB0aGUgc29ydGluZyBvZiBvYmplY3QKICAgICBuYW1lcy4gVGhlIHJlYXNvbiB3YXMgdGhhdCBpdCBjb21wYXJlZCB0aGUgcXVvdGVkIHZlcnNpb24KICAgICBvZiBzdHJpbmdzIGFzIGEgcmVzdWx0ICJPQ1NQIiA+ICJPQ1NQIFNpZ25pbmciIGJlY2F1c2UKICAgICAiID4gU1BBQ0UuIENoYW5nZWQgc2NyaXB0IHRvIHN0b3JlIHVucXVvdGVkIHZlcnNpb25zIG9mCiAgICAgbmFtZXMgYW5kIGFkZCBxdW90ZXMgb24gb3V0cHV0LiBJdCB3YXMgYWxzbyBvbWl0dGluZyBzb21lCiAgICAgbmFtZXMgZnJvbSB0aGUgbG9va3VwIHRhYmxlIGlmIHRoZXkgd2VyZSBnaXZlbiBhIGRlZmF1bHQKICAgICB2YWx1ZSAodGhhdCBpcyBpZiBTTiBpcyBtaXNzaW5nIGl0IGlzIGdpdmVuIHRoZSBzYW1lCiAgICAgdmFsdWUgYXMgTE4gYW5kIHZpY2UgdmVyc2EpLCB0aGVzZSBhcmUgbm93IGFkZGVkIG9uIHRoZQogICAgIGdyb3VuZHMgdGhhdCBpZiBhbiBvYmplY3QgaGFzIGEgbmFtZSB3ZSBzaG91bGQgYmUgYWJsZSB0bwogICAgIGxvb2sgaXQgdXAuIEZpbmFsbHkgYWRkZWQgd2FybmluZyBvdXRwdXQgd2hlbiBkdXBsaWNhdGUKICAgICBzaG9ydCBvciBsb25nIG5hbWVzIGFyZSBmb3VuZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIG5lZWRlZCBmb3IgVGFuZGVtIE5TSy4KICAgICBbU2NvdHQgVXJvZmYgPHNjb3R0QHh5cHJvLmNvbT5dCgogICopIEZpeCBTU0wgMi4wIHJvbGxiYWNrIGNoZWNraW5nOiBEdWUgdG8gYW4gb2ZmLWJ5LW9uZSBlcnJvciBpbgogICAgIFJTQV9wYWRkaW5nX2NoZWNrX1NTTHYyMygpLCBzcGVjaWFsIHBhZGRpbmcgd2FzIG5ldmVyIGRldGVjdGVkCiAgICAgYW5kIHRodXMgdGhlIFNTTCAzLjAvVExTIDEuMCBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IHByb3RvY29sCiAgICAgdmVyc2lvbiByb2xsYmFjayBhdHRhY2tzIHdhcyBub3QgZWZmZWN0aXZlLgoKICAgICBJbiBzMjNfY2xudC5jLCBkb24ndCB1c2Ugc3BlY2lhbCByb2xsYmFjay1hdHRhY2sgZGV0ZWN0aW9uIHBhZGRpbmcKICAgICAoUlNBX1NTTFYyM19QQURESU5HKSBpZiBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlCiAgICAgY2xpZW50OyBzaW1pbGFybHksIGluIHMyM19zcnZyLmMsIGRvbid0IGRvIHRoZSByb2xsYmFjayBjaGVjayBpZgogICAgIFNTTCAyLjAgaXMgdGhlIG9ubHkgcHJvdG9jb2wgZW5hYmxlZCBpbiB0aGUgc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gZ2V0IGhleGR1bXBzIG9mIHVucHJpbnRhYmxlIGRhdGEgd2l0aCAnb3BlbnNzbAogICAgIGFzbjFwYXJzZScuICBCeSBpbXBsaWNhdGlvbiwgdGhlIGZ1bmN0aW9ucyBBU04xX3BhcnNlX2R1bXAoKSBhbmQKICAgICBCSU9fZHVtcF9pbmRlbnQoKSBhcmUgYWRkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9ucyBBU04xX1NUUklOR19wcmludF9leCgpIGFuZCBYNTA5X05BTUVfcHJpbnRfZXgoKQogICAgIHRoZXNlIHByaW50IG91dCBzdHJpbmdzIGFuZCBuYW1lIHN0cnVjdHVyZXMgYmFzZWQgb24gdmFyaW91cwogICAgIGZsYWdzIGluY2x1ZGluZyBSRkMyMjUzIHN1cHBvcnQgYW5kIHByb3BlciBoYW5kbGluZyBvZgogICAgIG11bHRpYnl0ZSBjaGFyYWN0ZXJzLiBBZGRlZCBvcHRpb25zIHRvIHRoZSAneDUwOScgdXRpbGl0eSAKICAgICB0byBhbGxvdyB0aGUgdmFyaW91cyBmbGFncyB0byBiZSBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBmaXhlcyB0byB1c2UgQVNOMV9USU1FIGluc3RlYWQgb2YgQVNOMV9VVENUSU1FLgogICAgIEFsc28gY2hhbmdlIHRoZSBmdW5jdGlvbnMgWDUwOV9jbXBfY3VycmVudF90aW1lKCkgYW5kCiAgICAgWDUwOV9nbXRpbWVfYWRqKCkgd29yayB3aXRoIGFuIEFTTjFfVElNRSBzdHJ1Y3R1cmUsCiAgICAgdGhpcyB3aWxsIGVuYWJsZSBjZXJ0aWZpY2F0ZXMgdXNpbmcgR2VuZXJhbGl6ZWRUaW1lIGluIHZhbGlkaXR5CiAgICAgZGF0ZXMgdG8gYmUgY2hlY2tlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBORUdfUFVCS0VZX0JVRyBjb2RlICh3aGljaCB0b2xlcmF0ZXMgaW52YWxpZAogICAgIG5lZ2F0aXZlIHB1YmxpYyBrZXkgZW5jb2RpbmdzKSBvbiBieSBkZWZhdWx0LAogICAgIE5PX05FR19QVUJLRVlfQlVHIGNhbiBiZSBzZXQgdG8gZGlzYWJsZSBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gYzJpX0FTTjFfT0JKRUNUKCkgd2hpY2ggYWN0cyBvbiBBU04xX09CSkVDVAogICAgIGNvbnRlbnQgb2N0ZXRzLiBBbiBpMmNfQVNOMV9PQkpFQ1QgaXMgdW5uZWNlc3NhcnkgYmVjYXVzZQogICAgIHRoZSBlbmNvZGluZyBjYW4gYmUgdHJpdmlhbGx5IG9idGFpbmVkIGZyb20gdGhlIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBjcnlwdG8vZXJyLmMgbG9ja2luZyBidWdmaXg6IFVzZSB3cml0ZSBsb2NrcyAoQ1JZUFRPX3dfW3VuXWxvY2spLAogICAgIG5vdCByZWFkIGxvY2tzIChDUllQVE9fcl9bdW5dbG9jaykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQSBmaXJzdCBhdHRlbXB0IGF0IGNyZWF0aW5nIG9mZmljaWFsIHN1cHBvcnQgZm9yIHNoYXJlZAogICAgIGxpYnJhcmllcyB0aHJvdWdoIGNvbmZpZ3VyYXRpb24uICBJJ3ZlIGtlcHQgaXQgc28gdGhlCiAgICAgZGVmYXVsdCBpcyBzdGF0aWMgbGlicmFyaWVzIG9ubHksIGFuZCB0aGUgT3BlblNTTCBwcm9ncmFtcwogICAgIGFyZSBhbHdheXMgc3RhdGljYWxseSBsaW5rZWQgZm9yIG5vdywgYnV0IHRoZXJlIGFyZQogICAgIHByZXBhcmF0aW9ucyBmb3IgZHluYW1pYyBsaW5raW5nIGluIHBsYWNlLgogICAgIFRoaXMgaGFzIGJlZW4gdGVzdGVkIG9uIExpbnV4IGFuZCBUcnVlNjQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmFuZG9tbmVzcyBwb2xsaW5nIGZ1bmN0aW9uIGZvciBXaW45eCwgYXMgZGVzY3JpYmVkIGluOgogICAgIFBldGVyIEd1dG1hbm4sIFNvZnR3YXJlIEdlbmVyYXRpb24gb2YgUHJhY3RpY2FsbHkgU3Ryb25nCiAgICAgUmFuZG9tIE51bWJlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBzbyBQUk5HIGlzIHNlZWRlZCBpbiByZXEgaWYgdXNpbmcgYW4gYWxyZWFkeSBleGlzdGluZwogICAgIERTQSBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gc21pbWUgYXBwbGljYXRpb24uIC1pbmZvcm0gYW5kIC1vdXRmb3JtCiAgICAgYWxsb3cgYWx0ZXJuYXRpdmUgZm9ybWF0cyBmb3IgdGhlIFMvTUlNRSBtZXNzYWdlIGluY2x1ZGluZwogICAgIFBFTSBhbmQgREVSLiBUaGUgLWNvbnRlbnQgb3B0aW9uIGFsbG93cyB0aGUgY29udGVudCB0byBiZQogICAgIHNwZWNpZmllZCBzZXBhcmF0ZWx5LiBUaGlzIHNob3VsZCBhbGxvdyB0aGluZ3MgbGlrZSBOZXRzY2FwZQogICAgIGZvcm0gc2lnbmluZyBvdXRwdXQgZWFzaWVyIHRvIHZlcmlmeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIEFTTjEgZW5jb2Rpbmcgb2YgdGFncyB1c2luZyB0aGUgJ2xvbmcgZm9ybScuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zLCBpMmNfKiBhbmQgYzJpXyogZm9yIElOVEVHRVIgYW5kIEJJVAogICAgIFNUUklORyB0eXBlcy4gVGhlc2UgY29udmVydCBjb250ZW50IG9jdGV0cyB0byBhbmQgZnJvbSB0aGUKICAgICB1bmRlcmx5aW5nIHR5cGUuIFRoZSBhY3R1YWwgdGFnIGFuZCBsZW5ndGggb2N0ZXRzIGFyZQogICAgIGFscmVhZHkgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVhZCBpbiBhbmQgY2hlY2tlZC4gVGhlc2UKICAgICBhcmUgbmVlZGVkIGJlY2F1c2UgYWxsIG90aGVyIHN0cmluZyB0eXBlcyBoYXZlIHZpcnR1YWxseQogICAgIGlkZW50aWNhbCBoYW5kbGluZyBhcGFydCBmcm9tIHRoZSB0YWcuIEJ5IGhhdmluZyB2ZXJzaW9ucwogICAgIG9mIHRoZSBBU04xIGZ1bmN0aW9ucyB0aGF0IGp1c3Qgb3BlcmF0ZSBvbiBjb250ZW50IG9jdGV0cwogICAgIElNUExJQ0lUIHRhZ2dpbmcgY2FuIGJlIGhhbmRsZWQgcHJvcGVybHkuIEl0IGFsc28gYWxsb3dzCiAgICAgdGhlIEFTTjFfRU5VTUVSQVRFRCBjb2RlIHRvIGJlIGN1dCBkb3duIGJlY2F1c2UgQVNOMV9FTlVNRVJBVEVECiAgICAgYW5kIEFTTjFfSU5URUdFUiBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIE9JRCBvYmplY3RzIGFzIGZvbGxvd3M6CgogICAgIC0gTmV3IG9iamVjdCBpZGVudGlmaWVycyBhcmUgaW5zZXJ0ZWQgaW4gb2JqZWN0cy50eHQsIGZvbGxvd2luZwogICAgICAgdGhlIHN5bnRheCBnaXZlbiBpbiBvYmplY3RzLlJFQURNRS4KICAgICAtIG9iamVjdHMucGwgaXMgdXNlZCB0byBwcm9jZXNzIG9ial9tYWMubnVtIGFuZCBjcmVhdGUgYSBuZXcKICAgICAgIG9ial9tYWMuaC4KICAgICAtIG9ial9kYXQucGwgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb2JqX2RhdC5oLCB1c2luZyB0aGUgZGF0YSBpbgogICAgICAgb2JqX21hYy5oLgoKICAgICBUaGlzIGlzIGN1cnJlbnRseSBraW5kIG9mIGEgaGFjaywgYW5kIHRoZSBwZXJsIGNvZGUgaW4gb2JqZWN0cy5wbAogICAgIGlzbid0IHZlcnkgZWxlZ2FudCwgYnV0IGl0IHdvcmtzIGFzIEkgaW50ZW5kZWQuICBUaGUgc2ltcGxlc3Qgd2F5CiAgICAgdG8gY2hlY2sgdGhhdCBpdCB3b3JrZWQgY29ycmVjdGx5IGlzIHRvIGxvb2sgaW4gb2JqX2RhdC5oIGFuZAogICAgIGNoZWNrIHRoZSBhcnJheSBuaWRfb2JqcyBhbmQgbWFrZSBzdXJlIHRoZSBvYmplY3RzIGhhdmVuJ3QgbW92ZWQKICAgICBhcm91bmQgKHRoaXMgaXMgaW1wb3J0YW50ISkuICBBZGRpdGlvbnMgYXJlIE9LLCBhcyB3ZWxsIGFzCiAgICAgY29uc2lzdGVudCBuYW1lIGNoYW5nZXMuIAogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBCU0Qtc3R5bGUgTUQ1LWJhc2VkIHBhc3N3b3JkcyB0byAnb3BlbnNzbCBwYXNzd2QnIChvcHRpb24gJy0xJykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkaXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgJy1yYW5kIGZpbGUnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgVGhlIGdpdmVuIGZpbGUgYWRkcyB0byB3aGF0ZXZlciBoYXMgYWxyZWFkeSBiZWVuIHNlZWRlZCBpbnRvIHRoZQogICAgIHJhbmRvbSBwb29sIHRocm91Z2ggdGhlIFJBTkRGSUxFIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gb3IKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdGhlIGRlZmF1bHQgcmFuZG9tIHN0YXRlIGZpbGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgbWtzdGFjay5wbCBub3cgc29ydHMgZWFjaCBtYWNybyBncm91cCBpbnRvIGxleGljYWwgb3JkZXIuCiAgICAgUHJldmlvdXNseSB0aGUgb3V0cHV0IG9yZGVyIGRlcGVuZGVkIG9uIHRoZSBvcmRlciB0aGUgZmlsZXMKICAgICBhcHBlYXJlZCBpbiB0aGUgZGlyZWN0b3J5LCByZXN1bHRpbmcgaW4gbmVlZGxlc3MgcmV3cml0aW5nCiAgICAgb2Ygc2FmZXN0YWNrLmggLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBhdGNoZXMgdG8gbWFrZSBPcGVuU1NMIGNvbXBpbGUgdW5kZXIgV2luMzIgYWdhaW4uIE1vc3RseQogICAgIHdvcmsgYXJvdW5kcyBmb3IgdGhlIFZDKysgcHJvYmxlbSB0aGF0IGl0IHRyZWF0cyBmdW5jKCkgYXMKICAgICBmdW5jKHZvaWQpLiBBbHNvIHN0cmlwcGVkIG91dCB0aGUgcGFydHMgb2YgbWtkZWYucGwgdGhhdAogICAgIGFkZGVkIGV4dHJhIHR5cGVzYWZlIGZ1bmN0aW9uczogdGhlc2Ugbm8gbG9uZ2VyIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2F0aW9uIG9mIHRoZSBzdGFjayBjb2RlLiBUaGUgbWFjcm9zIGFyZSBub3cgYWxsIAogICAgIGNvbGxlY3RlZCBpbiBzYWZlc3RhY2suaCAuIEVhY2ggbWFjcm8gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZgogICAgIGEgInN0YWNrIG1hY3JvIiBvZiB0aGUgZm9ybSBTS01fPG5hbWU+KHR5cGUsIGEsIGIpLiBUaGUgCiAgICAgREVCVUdfU0FGRVNUQUNLIGlzIG5vdyBoYW5kbGVkIGluIHRlcm1zIG9mIGZ1bmN0aW9uIGNhc3RzLAogICAgIHRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcmV0YWluaW5nIHR5cGUgc2FmZXR5IHdpdGhvdXQgdGhlCiAgICAgdXNlIG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zLiBJZiBERUJVR19TQUZFU1RBQ0sgaXMgbm90IGRlZmluZWQKICAgICB0aGVuIHRoZSBub24gdHlwZXNhZmUgbWFjcm9zIGFyZSB1c2VkIGluc3RlYWQuIEFsc28gbW9kaWZpZWQgdGhlCiAgICAgbWtzdGFjay5wbCBzY3JpcHQgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybS4gTmVlZHMgdGVzdGluZyB0byBzZWUKICAgICBpZiB3aGljaCAoaWYgYW55KSBjb21waWxlcnMgaXQgY2hva2VzIGFuZCBtYXliZSBtYWtlIERFQlVHX1NBRkVTVEFDSwogICAgIHRoZSBkZWZhdWx0IGlmIG5vIG1ham9yIHByb2JsZW1zLiBTaW1pbGFyIGJlaGF2aW91ciBmb3IgQVNOMV9TRVRfT0YKICAgICBhbmQgUEtDUzEyX1NUQUNLX09GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gc29tZSB2ZXJzaW9ucyBvZiBJSVMgdXNlIHRoZSAnTkVUJyBmb3JtIG9mIHByaXZhdGUga2V5IHRoZQogICAgIGtleSBkZXJpdmF0aW9uIGFsZ29yaXRobSBpcyBkaWZmZXJlbnQuIE5vcm1hbGx5IE1ENShwYXNzd29yZCkgaXMKICAgICB1c2VkIGFzIGEgMTI4IGJpdCBSQzQga2V5LiBJbiB0aGUgbW9kaWZpZWQgY2FzZQogICAgIE1ENShNRDUocGFzc3dvcmQpICsgIlNHQ0tFWVNBTFQiKSAgaXMgdXNlZCBpbnN0ZWQuIEFkZGVkIHNvbWUKICAgICBuZXcgZnVuY3Rpb25zIGkyZF9SU0FfTkVUKCksIGQyaV9SU0FfTkVUKCkgZXRjIHdoaWNoIGFyZSB0aGUgc2FtZQogICAgIGFzIHRoZSBvbGQgTmV0c2NhcGVfUlNBIGZ1bmN0aW9ucyBleGNlcHQgdGhleSBoYXZlIGFuIGFkZGl0aW9uYWwKICAgICAnc2dja2V5JyBwYXJhbWV0ZXIgd2hpY2ggdXNlcyB0aGUgbW9kaWZpZWQgYWxnb3JpdGhtLiBBbHNvIGFkZGVkCiAgICAgYW4gLXNnY2tleSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZSByc2EgdXRpbGl0eS4gVGhhbmtzIHRvIAogICAgIEFkcmlhbiBQZWNrIDxiZXJ0aWVAbmNpcGhlci5jb20+IGZvciBwb3N0aW5nIGRldGFpbHMgb2YgdGhlIG1vZGlmaWVkCiAgICAgYWxnb3JpdGhtIHRvIG9wZW5zc2wtZGV2LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBldnBfbG9jYWwuaCBtYWNyb3Mgd2VyZSB1c2luZyAnYy4jI2tuYW1lJyB3aGljaCByZXN1bHRlZCBpbgogICAgIGludmFsaWQgZXhwYW5zaW9uIG9uIHNvbWUgc3lzdGVtcyAoU0NPIDUuMC41IGZvciBleGFtcGxlKS4KICAgICBDb3JyZWN0ZWQgdG8gJ2Mua25hbWUnLgogICAgIFtQaGlsbGlwIFBvcmNoIDxyb290QHRoZXBvcmNoLmNvbT5dCgogICopIE5ldyBYNTA5X2dldDFfZW1haWwoKSBhbmQgWDUwOV9SRVFfZ2V0MV9lbWFpbCgpIGZ1bmN0aW9ucyB0aGF0IHJldHVybgogICAgIGEgU1RBQ0sgb2YgZW1haWwgYWRkcmVzc2VzIGZyb20gYSBjZXJ0aWZpY2F0ZSBvciByZXF1ZXN0LCB0aGVzZSBsb29rCiAgICAgaW4gdGhlIHN1YmplY3QgbmFtZSBhbmQgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZSBleHRlbnNpb25zIGFuZCAKICAgICBvbWl0IGFueSBkdXBsaWNhdGUgYWRkcmVzc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlLWltcGxlbWVudCBCTl9tb2RfZXhwMl9tb250IHVzaW5nIGluZGVwZW5kZW50IChhbmQgbGFyZ2VyKSB3aW5kb3dzLgogICAgIFRoaXMgbWFrZXMgRFNBIHZlcmlmaWNhdGlvbiBhYm91dCAyICUgZmFzdGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY3JlYXNlIG1heGltdW0gd2luZG93IHNpemUgaW4gQk5fbW9kX2V4cF8uLi4gdG8gNiBiaXRzIGluc3RlYWQgb2YgNQogICAgIChtZWFuaW5nIHRoYXQgbm93IDJeNSB2YWx1ZXMgd2lsbCBiZSBwcmVjb21wdXRlZCwgd2hpY2ggaXMgb25seSA0IEtCCiAgICAgcGx1cyBvdmVyaGVhZCBmb3IgMTAyNCBiaXQgbW9kdWxpKS4KICAgICBUaGlzIG1ha2VzIGV4cG9uZW50aWF0aW9ucyBhYm91dCAwLjUgJSBmYXN0ZXIgZm9yIDEwMjQgYml0CiAgICAgZXhwb25lbnRzIChhcyBtZWFzdXJlZCBieSAib3BlbnNzbCBzcGVlZCByc2EyMDQ4IikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lIG1lbW9yeSBoYW5kbGluZyBtYWNyb3MgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIKICAgICBzb2Z0d2FyZToKICAgICAgICAgIE1hbGxvYyAgICAgICAgID0+ICBPUEVOU1NMX21hbGxvYwogICAgICAgICAgTWFsbG9jX2xvY2tlZCAgPT4gIE9QRU5TU0xfbWFsbG9jX2xvY2tlZAogICAgICAgICAgUmVhbGxvYyAgICAgICAgPT4gIE9QRU5TU0xfcmVhbGxvYwogICAgICAgICAgRnJlZSAgICAgICAgICAgPT4gIE9QRU5TU0xfZnJlZQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2RfZXhwX21vbnRfd29yZCBmb3Igc21hbGwgYmFzZXMgKHJvdWdobHkgMTUlCiAgICAgZmFzdGVyIHRoYW4gQk5fbW9kX2V4cF9tb250LCBpLmUuIDclIGZvciBhIGZ1bGwgREggZXhjaGFuZ2UpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEN5Z1dpbjMyIHN1cHBvcnQuCiAgICAgW0pvaG4gSmFydmllIDxqamFydmllQG5ld3NndXkuY29tPl0KCiAgKikgVGhlIHR5cGUtc2FmZSBzdGFjayBjb2RlIGhhcyBiZWVuIHJlamlnZ2VkLiBJdCBpcyBub3cgb25seSBjb21waWxlZAogICAgIGluIHdoZW4gT3BlblNTTCBpcyBjb25maWd1cmVkIHdpdGggdGhlIERFQlVHX1NBRkVTVEFDSyBvcHRpb24gYW5kCiAgICAgYnkgZGVmYXVsdCBhbGwgdHlwZS1zcGVjaWZpYyBzdGFjayBmdW5jdGlvbnMgYXJlICIjZGVmaW5lImQgYmFjayB0bwogICAgIHN0YW5kYXJkIHN0YWNrIGZ1bmN0aW9ucy4gVGhpcyByZXN1bHRzIGluIG1vcmUgc3RyZWFtbGluZWQgb3V0cHV0CiAgICAgYnV0IHJldGFpbnMgdGhlIHR5cGUtc2FmZXR5IGNoZWNraW5nIHBvc3NpYmlsaXRpZXMgb2YgdGhlIG9yaWdpbmFsCiAgICAgYXBwcm9hY2guCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGhlIFNUQUNLIGNvZGUgaGFzIGJlZW4gY2xlYW5lZCB1cCwgYW5kIGNlcnRhaW4gdHlwZSBkZWNsYXJhdGlvbnMKICAgICB0aGF0IGRpZG4ndCBtYWtlIGEgbG90IG9mIHNlbnNlIGhhdmUgYmVlbiBicm91Z2h0IGluIGxpbmUuIFRoaXMgaGFzCiAgICAgYWxzbyBpbnZvbHZlZCBhIGNsZWFudXAgb2Ygc29ydHMgaW4gc2FmZXN0YWNrLmggdG8gbW9yZSBjb3JyZWN0bHkKICAgICBtYXAgdHlwZS1zYWZlIHN0YWNrIGZ1bmN0aW9ucyBvbnRvIHRoZWlyIHBsYWluIHN0YWNrIGNvdW50ZXJwYXJ0cy4KICAgICBUaGlzIHdvcmsgaGFzIGFsc28gcmVzdWx0ZWQgaW4gYSB2YXJpZXR5IG9mICJjb25zdCJpZmljYXRpb25zIG9mCiAgICAgbG90cyBvZiB0aGUgY29kZSwgZXNwZWNpYWxseSAiX2NtcCIgb3BlcmF0aW9ucyB3aGljaCBzaG91bGQgbm9ybWFsbHkKICAgICBiZSBwcm90b3R5cGVkIHdpdGggImNvbnN0IiBwYXJhbWV0ZXJzIGFueXdheS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgYnl0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGluIG1kX3JhbmQuYywgJ3N0aXIgdGhlIHBvb2wnCiAgICAgYnkgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgKHdpdGggemVybyBlbnRyb3B5IGNvdW50KS4KICAgICAoVGhlIFBSTkcgc3RhdGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzLCB0aGUgbGFyZ2UgcG9vbCAnc3RhdGUnIGFuZCAnbWQnLAogICAgIHdoZXJlIGFsbCBvZiAnbWQnIGlzIHVzZWQgZWFjaCB0aW1lIHRoZSBQUk5HIGlzIHVzZWQsIGJ1dCAnc3RhdGUnCiAgICAgaXMgdXNlZCBvbmx5IGluZGV4ZWQgYnkgYSBjeWNsaWMgY291bnRlci4gQXMgZW50cm9weSBtYXkgbm90IGJlCiAgICAgd2VsbCBkaXN0cmlidXRlZCBmcm9tIHRoZSBiZWdpbm5pbmcsICdtZCcgaXMgaW1wb3J0YW50IGFzIGEKICAgICBjaGFpbmluZyB2YXJpYWJsZS4gSG93ZXZlciwgdGhlIG91dHB1dCBmdW5jdGlvbiBjaGFpbnMgb25seSBoYWxmCiAgICAgb2YgJ21kJywgaS5lLiA4MCBiaXRzLiAgc3NsZWF5X3JhbmRfYWRkLCBvbiB0aGUgb3RoZXIgaGFuZCwgY2hhaW5zCiAgICAgYWxsIG9mICdtZCcsIGFuZCBzZWVkaW5nIHdpdGggU1RBVEVfU0laRSBkdW1teSBieXRlcyB3aWxsIHJlc3VsdAogICAgIGluIGFsbCBvZiAnc3RhdGUnIGJlaW5nIHJld3JpdHRlbiwgd2l0aCB0aGUgbmV3IHZhbHVlcyBkZXBlbmRpbmcKICAgICBvbiB2aXJ0dWFsbHkgYWxsIG9mICdtZCcuICBUaGlzIG92ZXJjb21lcyB0aGUgODAgYml0IGxpbWl0YXRpb24uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zM19jbG50LmMsIGNhbGwgRVJSX2NsZWFyX2Vycm9yKCkgd2hlbgogICAgIHRoZSBoYW5kc2hha2UgaXMgY29udGludWVkIGFmdGVyIHNzbF92ZXJpZnlfY2VydF9jaGFpbigpOwogICAgIG90aGVyd2lzZSwgaWYgU1NMX1ZFUklGWV9OT05FIGlzIHNldCwgcmVtYWluaW5nIGVycm9yIGNvZGVzCiAgICAgY2FuIGxlYWQgdG8gJ3VuZXhwbGFpbmFibGUnIGNvbm5lY3Rpb24gYWJvcnRzIGxhdGVyLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gdHJhY2tlZCBkb3duIGJ5IEx1dHogSmFlbmlja2VdCgogICopIE1ham9yIEVWUCBBUEkgY2lwaGVyIHJldmlzaW9uLgogICAgIEFkZCBob29rcyBmb3IgZXh0cmEgRVZQIGZlYXR1cmVzLiBUaGlzIGFsbG93cyB2YXJpb3VzIGNpcGhlcgogICAgIHBhcmFtZXRlcnMgdG8gYmUgc2V0IGluIHRoZSBFVlAgaW50ZXJmYWNlLiBTdXBwb3J0IGFkZGVkIGZvciB2YXJpYWJsZQogICAgIGtleSBsZW5ndGggY2lwaGVycyB2aWEgdGhlIEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKCkgZnVuY3Rpb24gYW5kCiAgICAgc2V0dGluZyBvZiBSQzIgYW5kIFJDNSBwYXJhbWV0ZXJzLgoKICAgICBNb2RpZnkgRVZQX09wZW5Jbml0KCkgYW5kIEVWUF9TZWFsSW5pdCgpIHRvIGNvcGUgd2l0aCB2YXJpYWJsZSBrZXkgbGVuZ3RoCiAgICAgY2lwaGVycy4KCiAgICAgUmVtb3ZlIGxvdHMgb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gdGhlIEVWUCBsaWJyYXJ5LiBGb3IgZXhhbXBsZSAqZXZlcnkqCiAgICAgY2lwaGVyIGluaXQoKSBmdW5jdGlvbiBoYW5kbGVzIHRoZSAnaXYnIGluIHRoZSBzYW1lIHdheSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgY2lwaGVyIG1vZGUuIFRoZXkgYWxzbyBhbGwgZG8gbm90aGluZyBpZiB0aGUgJ2tleScgcGFyYW1ldGVyIGlzIE5VTEwgYW5kCiAgICAgZm9yIENGQiBhbmQgT0ZCIG1vZGVzIHRoZXkgemVybyBjdHgtPm51bS4KCiAgICAgTmV3IGZ1bmN0aW9uYWxpdHkgYWxsb3dzIHJlbW92YWwgb2YgUy9NSU1FIGNvZGUgUkMyIGhhY2suCgogICAgIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGhhdmUgdGhlIHNhbWUgZm9ybSBhbmQgc28gY2FuIGJlIGRlY2xhcmVkIGluIHRlcm1zCiAgICAgb2YgbWFjcm9zLgoKICAgICBCeSBzaGlmdGluZyB0aGlzIHRvIHRoZSB0b3AgbGV2ZWwgRVZQX0NpcGhlckluaXQoKSBpdCBjYW4gYmUgcmVtb3ZlZCBmcm9tCiAgICAgYWxsIGluZGl2aWR1YWwgY2lwaGVycy4gSWYgdGhlIGNpcGhlciB3YW50cyB0byBoYW5kbGUgSVZzIG9yIGtleXMKICAgICBkaWZmZXJlbnRseSBpdCBjYW4gc2V0IHRoZSBFVlBfQ0lQSF9DVVNUT01fSVYgb3IgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVAogICAgIGZsYWdzLgoKICAgICBDaGFuZ2UgbG90cyBvZiBmdW5jdGlvbnMgbGlrZSBFVlBfRW5jcnlwdFVwZGF0ZSgpIHRvIG5vdyByZXR1cm4gYQogICAgIHZhbHVlOiBhbHRob3VnaCBzb2Z0d2FyZSB2ZXJzaW9ucyBvZiB0aGUgYWxnb3JpdGhtcyBjYW5ub3QgZmFpbAogICAgIGFueSBpbnN0YWxsZWQgaGFyZHdhcmUgdmVyc2lvbnMgY2FuLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCBTU0xfT1BfVExTX1JPTExCQUNLX0JVRzogSW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgaWYKICAgICB0aGlzIG9wdGlvbiBpcyBzZXQsIHRvbGVyYXRlIGJyb2tlbiBjbGllbnRzIHRoYXQgc2VuZCB0aGUgbmVnb3RpYXRlZAogICAgIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluc3RlYWQgb2YgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCB2ZXJzaW9uCiAgICAgbnVtYmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENhbGwgZGhfdG1wX2NiIChzZXQgYnkgLi4uX1RNUF9ESF9DQikgd2l0aCBjb3JyZWN0ICdpc19leHBvcnQnIGZsYWc7CiAgICAgaS5lLiBub24temVybyBmb3IgZXhwb3J0IGNpcGhlcnN1aXRlcywgemVybyBvdGhlcndpc2UuCiAgICAgUHJldmlvdXMgdmVyc2lvbnMgaGFkIHRoaXMgZmxhZyBpbnZlcnRlZCwgaW5jb25zaXN0ZW50IHdpdGgKICAgICByc2FfdG1wX2NiICguLi5fVE1QX1JTQV9DQikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBBbWl0IENob3ByYV0KCiAgKikgQWRkIG1pc3NpbmcgRFNBIGxpYnJhcnkgdGV4dCBzdHJpbmcuIFdvcmsgYXJvdW5kIGZvciBzb21lIElJUwogICAgIGtleSBmaWxlcyB3aXRoIGludmFsaWQgU0VRVUVOQ0UgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZG9jdW1lbnQgKGRvYy9zdGFuZGFyZHMudHh0KSB0aGF0IGxpc3QgYWxsIGtpbmRzIG9mIHN0YW5kYXJkcwogICAgIGFuZCBzbyBvbiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBPcGVuU1NMLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgY19yZWhhc2ggc2NyaXB0LiBPbGQgdmVyc2lvbiB3b3VsZCBtaXNoYW5kbGUgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB0aGUgc2FtZSBzdWJqZWN0IG5hbWUgaGFzaCBhbmQgd291bGRuJ3QgaGFuZGxlIENSTHMgYXQgYWxsLgogICAgIEFkZGVkIC1maW5nZXJwcmludCBvcHRpb24gdG8gY3JsIHV0aWxpdHksIHRvIHN1cHBvcnQgbmV3IGNfcmVoYXNoCiAgICAgZmVhdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRWxpbWluYXRlIG5vbi1BTlNJIGRlY2xhcmF0aW9ucyBpbiBjcnlwdG8uaCBhbmQgc3RhY2suaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IGZvciBTU0wgc2VydmVyIHB1cnBvc2UgY2hlY2tpbmcuIFNlcnZlciBjaGVja2luZyB3YXMKICAgICByZWplY3RpbmcgY2VydGlmaWNhdGVzIHdoaWNoIGhhZCBleHRlbmRlZCBrZXkgdXNhZ2UgcHJlc2VudAogICAgIGJ1dCBubyBzc2wgY2xpZW50IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgUmVuZSBHcm9zc2VyIDxncm9zc2VyQGhpc29sdXRpb25zLmNvbT5dCgogICopIE1ha2UgUEtDUyMxMiBjb2RlIHdvcmsgd2l0aCBubyBwYXNzd29yZC4gVGhlIFBLQ1MjMTIgc3BlYwogICAgIGlzIGEgbGl0dGxlIHVuY2xlYXIgYWJvdXQgaG93IGEgYmxhbmsgcGFzc3dvcmQgaXMgaGFuZGxlZC4KICAgICBTaW5jZSB0aGUgcGFzc3dvcmQgaW4gZW5jb2RlZCBhcyBhIEJNUFN0cmluZyB3aXRoIHRlcm1pbmF0aW5nCiAgICAgZG91YmxlIE5VTEwgYSB6ZXJvIGxlbmd0aCBwYXNzd29yZCB3b3VsZCBlbmQgdXAgYXMganVzdCB0aGUKICAgICBkb3VibGUgTlVMTC4gSG93ZXZlciBubyBwYXNzd29yZCBhdCBhbGwgaXMgZGlmZmVyZW50IGFuZCBpcwogICAgIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gY29kZS4gTlMKICAgICB0cmVhdHMgYSBibGFuayBwYXNzd29yZCBhcyB6ZXJvIGxlbmd0aC4gTVNJRSB0cmVhdHMgaXQgYXMgbm8KICAgICBwYXNzd29yZCBvbiBleHBvcnQ6IGJ1dCBpdCB3aWxsIHRyeSBib3RoIG9uIGltcG9ydC4gV2Ugbm93IGRvCiAgICAgdGhlIHNhbWU6IFBLQ1MxMl9wYXJzZSgpIHRyaWVzIHplcm8gbGVuZ3RoIGFuZCBubyBwYXNzd29yZCBpZgogICAgIHRoZSBwYXNzd29yZCBpcyBzZXQgdG8gIiIgb3IgTlVMTCAoTlVMTCBpcyBub3cgYSB2YWxpZCBwYXNzd29yZDoKICAgICBpdCB3YXNuJ3QgYmVmb3JlKSBhcyBkb2VzIHRoZSBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4ZXMgaW4gYXBwcy94NTA5LmM6IEF2b2lkIGEgbWVtb3J5IGxlYWs7IGFuZCBkb24ndCB1c2UKICAgICBwZXJyb3Igd2hlbiBQRU1fcmVhZF9iaW9fWDUwOV9SRVEgZmFpbHMsIHRoZSBlcnJvciBtZXNzYWdlIG11c3QKICAgICBiZSBvYnRhaW5lZCBmcm9tIHRoZSBlcnJvciBxdWV1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCAndGhyZWFkX2hhc2gnIG1lbW9yeSBsZWFrIGluIGNyeXB0by9lcnIvZXJyLmMgYnkgZnJlZWluZwogICAgIGl0IGluIEVSUl9yZW1vdmVfc3RhdGUgaWYgYXBwcm9wcmlhdGUsIGFuZCBjaGFuZ2UgRVJSX2dldF9zdGF0ZQogICAgIGFjY29yZGluZ2x5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyAodGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQogICAgIHRocmVhZF9oYXNoIGlzIG5vIGxvbmdlciBjb25zdGFudCBvbmNlIHNldCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4IGZvciBsaW51eC1lbGYgbWFrZWZpbGUub25lLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkgd2lsbCBub3cgY2F1c2UgYSBkZWZhdWx0CiAgICAgUlNBX01FVEhPRCB0byBiZSBjaG9zZW4gaWYgb25lIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeS4KICAgICBQcmV2aW91c2x5IHRoaXMgd2FzIG9ubHkgc2V0IGR1cmluZyBhIGNhbGwgdG8gUlNBX25ldygpCiAgICAgb3IgUlNBX25ld19tZXRob2QoTlVMTCkgbWVhbmluZyBpdCB3YXMgcG9zc2libGUgZm9yCiAgICAgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHRvIHJldHVybiBOVUxMLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZGVkIG5hdGl2ZSBuYW1lIHRyYW5zbGF0aW9uIHRvIHRoZSBleGlzdGluZyBEU08gY29kZQogICAgIHRoYXQgd2lsbCBjb252ZXJ0IChpZiB0aGUgZmxhZyB0byBkbyBzbyBpcyBzZXQpIGZpbGVuYW1lcwogICAgIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBzbWFsbCBhbmQgaGF2ZSBubyBwYXRoIGluZm9ybWF0aW9uCiAgICAgaW50byBhIGNhbm9uaWNhbCBuYXRpdmUgZm9ybS4gRWcuICJibGFoIiBjb252ZXJ0ZWQgdG8KICAgICAibGliYmxhaC5zbyIgb3IgImJsYWguZGxsIiBldGMuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEVSUl9lcnJvcl9zdHJpbmdfbihlLCBidWYsIGxlbikgd2hpY2ggaXMgbGlrZQogICAgIEVSUl9lcnJvcl9zdHJpbmcoZSwgYnVmKSwgYnV0IHdyaXRlcyBhdCBtb3N0ICdsZW4nIGJ5dGVzCiAgICAgaW5jbHVkaW5nIHRoZSAwIHRlcm1pbmF0b3IuICBGb3IgRVJSX2Vycm9yX3N0cmluZ19uLCAnYnVmJwogICAgIG1heSBub3QgYmUgTlVMTC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBDT05GIGxpYnJhcnkgcmV3b3JrZWQgdG8gYmVjb21lIG1vcmUgZ2VuZXJhbC4gIEEgbmV3IENPTkYKICAgICBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGVyICJjbGFzcyIgaXMgaW1wbGVtZW50ZWQgYXMgd2VsbCBhcyBhCiAgICAgbmV3IGZ1bmN0aW9ucyAoTkNPTkZfKiwgZm9yICJOZXcgQ09ORiIpIHRvIGhhbmRsZSBpdC4gIFRoZSBub3cKICAgICBvbGQgQ09ORl8qIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdGhlcmUsIGJ1dCBhcmUgcmVpbXBsZW1lbnRlZCB0bwogICAgIHdvcmsgaW4gdGVybXMgb2YgdGhlIG5ldyBmdW5jdGlvbnMuICBBbHNvLCBhIHNldCBvZiBmdW5jdGlvbnMKICAgICB0byBoYW5kbGUgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpcwogICAgIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKICAgICByZWFkZXIgImNsYXNzZXMiIChJIGNhbiBkZWZpbml0ZWx5IHNlZSBzb21ldGhpbmcgcmVhZGluZyBhCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIGluIFhNTCBmb3JtYXQsIGZvciBleGFtcGxlKSwgY2FsbGVkIF9DT05GXyosCiAgICAgb3IgInRoZSBjb25maWd1cmF0aW9uIHN0b3JhZ2UgQVBJIi4uLgoKICAgICBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkaW5nIGZ1bmN0aW9ucyBhcmU6CgogICAgICAgIE5DT05GX25ldywgTkNPTkZfZnJlZSwgTkNPTkZfbG9hZCwgTkNPTkZfbG9hZF9mcCwgTkNPTkZfbG9hZF9iaW8sCiAgICAgICAgTkNPTkZfZ2V0X3NlY3Rpb24sIE5DT05GX2dldF9zdHJpbmcsIE5DT05GX2dldF9udW1icmUKCiAgICAgICAgTkNPTkZfZGVmYXVsdCwgTkNPTkZfV0lOMzIKCiAgICAgICAgTkNPTkZfZHVtcF9mcCwgTkNPTkZfZHVtcF9iaW8KCiAgICAgTkNPTkZfZGVmYXVsdCBhbmQgTkNPTkZfV0lOMzIgYXJlIG1ldGhvZCAob3IgImNsYXNzIikgY2hvb3NlcnMsCiAgICAgTkNPTkZfbmV3IGNyZWF0ZXMgYSBuZXcgQ09ORiBvYmplY3QuICBUaGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheQogICAgIGFzIG90aGVyIGludGVyZmFjZXMgaW4gT3BlblNTTCwgbGlrZSB0aGUgQklPIGludGVyZmFjZS4KICAgICBOQ09ORl9kdW1wXyogZHVtcCB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLiAgQWxsIG90aGVyIGZ1bmN0aW9ucyB0YWtlIHRoZSBzYW1lCiAgICAgYXJndW1lbnRzIGFzIHRoZSBvbGQgQ09ORl8qIGZ1bmN0aW9ucyB3dGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKICAgICBmaXJzdCB0aGF0IG11c3QgYmUgYSBgQ09ORiAqJyBpbnN0ZWFkIG9mIGEgYExIQVNIIConLgoKICAgICBUbyBtYWtlIGl0IGVhc2VyIHRvIHVzZSB0aGUgbmV3IGNsYXNzZXMgd2l0aCB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMsCiAgICAgdGhlIGZ1bmN0aW9uIENPTkZfc2V0X2RlZmF1bHRfbWV0aG9kIGlzIHByb3ZpZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAnLXRsczEnIG9wdGlvbiB0byAnb3BlbnNzbCBjaXBoZXJzJywgd2hpY2ggd2FzIGFscmVhZHkKICAgICBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYnV0IGhhZCBub3QgYmVlbiBpbXBsZW1lbnRlZC4KICAgICAoVGhpcyBvcHRpb24gaXMgbm90IHlldCByZWFsbHkgdXNlZnVsIGJlY2F1c2UgZXZlbiB0aGUgYWRkaXRpb25hbAogICAgIGV4cGVyaW1lbnRhbCBUTFMgMS4wIGNpcGhlcnMgYXJlIGN1cnJlbnRseSB0cmVhdGVkIGFzIFNTTCAzLjAgY2lwaGVycy4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBEU08gY29kZSBhZGRlZCBpbnRvIGxpYmNyeXB0byBmb3IgbGV0dGluZyBPcGVuU1NMIChhbmQKICAgICBPcGVuU1NMLWJhc2VkIGFwcGxpY2F0aW9ucykgbG9hZCBzaGFyZWQgbGlicmFyaWVzIGFuZCBiaW5kIHRvCiAgICAgdGhlbSBpbiBhIHBvcnRhYmxlIHdheS4KICAgICBbR2VvZmYgVGhvcnBlLCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS41IGFuZCAwLjkuNWEgIFsxIEFwciAyMDAwXQoKICAqKSBNYWtlIHN1cmUgX2xyb3RsIGFuZCBfbHJvdHIgYXJlIG9ubHkgdXNlZCB3aXRoIE1TVkMuCgogICopIFVzZSBsb2NrIENSWVBUT19MT0NLX1JBTkQgY29ycmVjdGx5IGluIHNzbGVheV9yYW5kX3N0YXR1cwogICAgICh0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBSQU5EX3N0YXR1cykuCgogICopIFJlbmFtZSBvcGVuc3NsIHg1MDkgb3B0aW9uICctY3JsZXh0Jywgd2hpY2ggd2FzIGFkZGVkIGluIDAuOS41LAogICAgIHRvICctY2xyZXh0JyAoPSBjbGVhciBleHRlbnNpb25zKSwgYXMgaW50ZW5kZWQgYW5kIGRvY3VtZW50ZWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgaW5jb25zaXN0ZW5jeSBwb2ludGVkIG91dCBieSBNaWNoYWVsIEF0dGlsaQogICAgIDxhdHRpbGlAYW1heG8uY29tPl0KCiAgKikgRml4IGZvciBITUFDLiBJdCB3YXNuJ3QgemVyb2luZyB0aGUgcmVzdCBvZiB0aGUgYmxvY2sgaWYgdGhlIGtleSBsZW5ndGgKICAgICB3YXMgbGFyZ2VyIHRoYW4gdGhlIE1EIGJsb2NrIHNpemUuICAgICAgCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgWW9zdCBXaWxsaWFtIDxZb3N0V0B0Y2UuY29tPl0KCiAgKikgTW9kZXJuaXNlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IHVzZXMgU1RBQ0tfT0YoWDUwOSkgZm9yIGl0cyBjYSBhcmd1bWVudAogICAgIGZpeCBhIGxlYWsgd2hlbiB0aGUgY2EgYXJndW1lbnQgd2FzIHBhc3NlZCBhcyBOVUxMLiBTdG9wIFg1MDlfUFVCS0VZX3NldCgpCiAgICAgdXNpbmcgdGhlIHBhc3NlZCBrZXk6IGlmIHRoZSBwYXNzZWQga2V5IHdhcyBhIHByaXZhdGUga2V5IHRoZSByZXN1bHQKICAgICBvZiBYNTA5X3ByaW50KCksIGZvciBleGFtcGxlLCB3b3VsZCBiZSB0byBwcmludCBvdXQgYWxsIHRoZSBwcml2YXRlIGtleQogICAgIGNvbXBvbmVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgZGVzX3F1YWRfY2tzdW0oKSBieXRlIG9yZGVyIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHRoZSBwcm9ibGVtIGRlc2NyaXB0aW9uIGluIGtyYjQtMC45LjcsIHdoZXJlCiAgICAgIHRoZSBzb2x1dGlvbiBpcyBhdHRyaWJ1dGVkIHRvIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QERFTUVOVElBLk9SRz5dCgogICopIEZpeCBzbyBWX0FTTjFfQVBQX0NIT09TRSB3b3JrcyBhZ2FpbjogaG93ZXZlciBpdHMgdXNlIGlzIHN0cm9uZ2x5CiAgICAgZGlzY291cmFnZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gS29ydmVyIDxicmlhbmtAY3Muc3RhbmZvcmQuZWR1Pl0KCiAgKikgRm9yIGVhc2lseSB0ZXN0aW5nIGluIHNoZWxsIHNjcmlwdHMgd2hldGhlciBzb21lIGNvbW1hbmQKICAgICAnb3BlbnNzbCBYWFgnIGV4aXN0cywgdGhlIG5ldyBwc2V1ZG8tY29tbWFuZCAnb3BlbnNzbCBuby1YWFgnCiAgICAgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwIGlmZiBubyBjb21tYW5kIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGF2YWlsYWJsZS4KICAgICAnbm8tWFhYJyBpcyBwcmludGVkIGluIHRoaXMgY2FzZSwgJ1hYWCcgb3RoZXJ3aXNlLiAgSW4gYm90aCBjYXNlcywKICAgICB0aGUgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCBub3RoaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyLgogICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHdheXMgaWdub3JlZC4KCiAgICAgU2luY2UgZm9yIGVhY2ggY2lwaGVyIHRoZXJlIGlzIGEgY29tbWFuZCBvZiB0aGUgc2FtZSBuYW1lLAogICAgIHRoZSAnbm8tY2lwaGVyJyBjb21waWxhdGlvbiBzd2l0Y2hlcyBjYW4gYmUgdGVzdGVkIHRoaXMgd2F5LgoKICAgICAoJ29wZW5zc2wgbm8tWFhYJyBpcyBub3QgYWJsZSB0byBkZXRlY3QgcHNldWRvLWNvbW1hbmRzIHN1Y2gKICAgICBhcyAncXVpdCcsICdsaXN0LVhYWC1jb21tYW5kcycsIG9yICduby1YWFgnIGl0c2VsZi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRlc3Qgc3VpdGUgc28gdGhhdCAnbWFrZSB0ZXN0JyBzdWNjZWVkcyBpbiAnbm8tcnNhJyBjb25maWd1cmF0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZvciBTU0xfW0NUWF9dc2V0X3RtcF9kaCwgZG9uJ3QgY3JlYXRlIGEgREgga2V5IGlmIFNTTF9PUF9TSU5HTEVfREhfVVNFCiAgICAgaXMgc2V0OyBpdCB3aWxsIGJlIHRocm93biBhd2F5IGFueXdheSBiZWNhdXNlIGVhY2ggaGFuZHNoYWtlIGNyZWF0ZXMKICAgICBpdHMgb3duIGtleS4KICAgICBzc2xfY2VydF9kdXAsIHdoaWNoIGlzIHVzZWQgYnkgU1NMX25ldywgbm93IGNvcGllcyBESCBrZXlzIGluIGFkZGl0aW9uCiAgICAgdG8gcGFyYW1ldGVycyAtLSBpbiBwcmV2aW91cyB2ZXJzaW9ucyAoc2luY2UgT3BlblNTTCAwLjkuMykgdGhlCiAgICAgJ2RlZmF1bHQga2V5JyBmcm9tIFNTTF9DVFhfc2V0X3RtcF9kaCB3b3VsZCBhbHdheXMgYmUgbG9zdCwgbWVhbmluaW5nCiAgICAgeW91IGVmZmVjdGl2bHkgZ290IFNTTF9PUF9TSU5HTEVfREhfVVNFIHdoZW4gdXNpbmcgdGhpcyBtYWNyby4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc19jbGllbnQgb3B0aW9uIC1pZ25fZW9mOiBFT0YgYXQgc3RkaW4gaXMgaWdub3JlZCwgYW5kCiAgICAgJ1EnIGFuZCAnUicgbG9zZSB0aGVpciBzcGVjaWFsIG1lYW5pbmdzIChxdWl0L3JlbmVnb3RpYXRlKS4KICAgICBUaGlzIGlzIHBhcnQgb2Ygd2hhdCAtcXVpZXQgZG9lczsgdW5saWtlIC1xdWlldCwgLWlnbl9lb2YKICAgICBkb2VzIG5vdCBzdXBwcmVzcyBhbnkgb3V0cHV0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBjb21wYXRpYmlsaXR5IG9wdGlvbnMgdG8gdGhlIHB1cnBvc2UgYW5kIHRydXN0IGNvZGUuIFRoZQogICAgIHB1cnBvc2UgWDUwOV9QVVJQT1NFX0FOWSBpcyAiYW55IHB1cnBvc2UiIHdoaWNoIGF1dG9tYXRpY2FsbHkKICAgICBhY2NlcHRzIGEgY2VydGlmaWNhdGUgb3IgQ0EsIHRoaXMgd2FzIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIsCiAgICAgd2l0aCBhbGwgdGhlIGFzc29jaWF0ZWQgc2VjdXJpdHkgaXNzdWVzLgoKICAgICBYNTA5X1RSVVNUX0NPTVBBVCBpcyB0aGUgb2xkIHRydXN0IGJlaGF2aW91cjogb25seSBhbmQKICAgICBhdXRvbWF0aWNhbGx5IHRydXN0IHNlbGYgc2lnbmVkIHJvb3RzIGluIGNlcnRpZmljYXRlIHN0b3JlLiBBCiAgICAgbmV3IHRydXN0IHNldHRpbmcgWDUwOV9UUlVTVF9ERUZBVUxUIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0CiAgICAgYSBwdXJwb3NlIGhhcyBubyBhc3NvY2lhdGVkIHRydXN0IHNldHRpbmcgYW5kIGl0IHNob3VsZCBpbnN0ZWFkCiAgICAgdXNlIHRoZSB2YWx1ZSBpbiB0aGUgZGVmYXVsdCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgUEtDUyM4IERTQSBwcml2YXRlIGtleSBjb2RlIHNvIGl0IGRlY29kZXMga2V5cyBhZ2FpbgogICAgIGFuZCBmaXggYSBtZW1vcnkgbGVhay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB1dGlsL21rZXJyLnBsICh3aGljaCBpbXBsZW1lbnRzICdtYWtlIGVycm9ycycpLCBwcmVzZXJ2ZQogICAgIHJlYXNvbiBzdHJpbmdzIGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIC5jIGZpbGUsIGFzCiAgICAgdGhlIGRlZmF1bHQgdG8gaGF2ZSBvbmx5IGRvd25jYXNlIGxldHRlcnMgKGFuZCBkaWdpdHMpIGluCiAgICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgcmVhc29ucyBjb2RlcyBpcyBub3QgYWx3YXlzIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIEVSUl9sb2FkX0VSUl9zdHJpbmdzKCksIGJ1aWxkIGFuIEVSUl9MSUJfU1lTIGVycm9yIHJlYXNvbiB0YWJsZQogICAgIHVzaW5nIHN0cmVycm9yLiAgUHJldmlvdXNseSwgRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoKSByZXR1cm5lZAogICAgIGxpYnJhcnkgbmFtZXMgYXMgcmVhc29uIHN0cmluZ3MgZm9yIFNZU2VycjsgYnV0IFNZU2VyciBpcyBhIHNwZWNpYWwKICAgICBjYXNlIHdoZXJlIHNtYWxsIG51bWJlcnMgYXJlIGVycm5vIHZhbHVlcywgbm90IGxpYnJhcnkgbnVtYmVycy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgJy1kc2FwYXJhbScgb3B0aW9uIHRvICdvcGVuc3NsIGRocGFyYW0nIGFwcGxpY2F0aW9uLiAgVGhpcwogICAgIGNvbnZlcnRzIERTQSBwYXJhbWV0ZXJzIGludG8gREggcGFyYW1ldGVycy4gKFdoZW4gY3JlYXRpbmcgcGFyYW1ldGVycywKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBpcyB1c2VkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlICdsZW5ndGgnIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGluIEMgY29kZSBnZW5lcmF0ZWQKICAgICBieSAnb3BlbnNzbCBkaHBhcmFtIC1DJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldF9sYWJlbCBpbiBwZXJsYXNtIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQKICAgICBzbyBjb3VsZG4ndCBiZSB1c2VkIGFzIGEgImZpbGUgc2NvcGUiIGZsYWcuIE1vdmVkIHRvIHRoaXJkIGFyZ3VtZW50CiAgICAgd2hpY2ggd2FzIGZyZWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gUEVNX0FTTjFfd3JpdGVfYmlvIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9ucywgdXNlIFJBTkRfcHNldWRvX2J5dGVzCiAgICAgaW5zdGVhZCBvZiBSQU5EX2J5dGVzIGZvciBlbmNyeXB0aW9uIElWcyBhbmQgc2FsdHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSBSQU5EX3N0YXR1cygpIGludG8gUkFORF9NRVRIT0QgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKICAgICBpdCBvbmx5IGZvciBtZF9yYW5kLmMgIE90aGVyd2lzZSByZXBsYWNpbmcgdGhlIFBSTkcgYnkgY2FsbGluZwogICAgIFJBTkRfc2V0X3JhbmRfbWV0aG9kIHdvdWxkIGJlIGltcG9zc2libGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgbGV0IERTQV9nZW5lcmF0ZV9rZXkoKSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGlmIHRoZSByYW5kb20KICAgICBudW1iZXIgZ2VuZXJhdGlvbiBmYWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgJ3JhbmQnIGFwcGxpY2F0aW9uIGZvciBjcmVhdGluZyBwc2V1ZG8tcmFuZG9tIG91dHB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRlZCBjb25maWd1cmF0aW9uIHN1cHBvcnQgZm9yIExpbnV4L0lBNjQKICAgICBbUm9sZiBIYWJlcnJlY2tlciA8cm9sZkBzdXNlLmRlPl0KCiAgKikgQXNzZW1ibGVyIG1vZHVsZSBzdXBwb3J0IGZvciBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBIUFVYIChpbiBzaGxpYi8pLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPiBhbmQgQW5vbnltb3VzXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBTb2xhcmlzIGdjYy4KICAgICBbTHV0eiBCZWhua2UgPGJlaG5rZUB0cnVzdGNlbnRlci5kZT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS40IGFuZCAwLjkuNSAgWzI4IEZlYiAyMDAwXQoKICAqKSBQS0NTN19lbmNyeXB0KCkgd2FzIGFkZGluZyB0ZXh0IE1JTUUgaGVhZGVycyB0d2ljZSBiZWNhdXNlIHRoZXkKICAgICB3ZXJlIGFkZGVkIG1hbnVhbGx5IGFuZCBieSBTTUlNRV9jcmxmX2NvcHkoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBibnRlc3QuYyBkb24ndCBjYWxsIEJOX3JhbmQgd2l0aCB6ZXJvIGJpdHMgYXJndW1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQW5kcmV3IFcuIEdyYXkgPGFncmF5QGljb25zaW5jLmNvbT5dCgogICopIEJOX211bCBidWdmaXg6IEluIGJuX211bF9wYXJ0X3JlY3Vyc2lvbigpIG9ubHkgdGhlIGE+YVtuXSAmJiBiPmJbbl0KICAgICBjYXNlIHdhcyBpbXBsZW1lbnRlZC4gVGhpcyBjYXVzZWQgQk5fZGl2X3JlY3AoKSB0byBmYWlsIG9jY2FzaW9uYWxseS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byB0aGUgc2V0X2xhYmVsKCkgaW4gdGhlIHBlcmwKICAgICBhc3NlbWJseSBsYW5ndWFnZSBidWlsZGVyLiBJZiB0aGlzIGFyZ3VtZW50IGV4aXN0cyBhbmQgaXMgc2V0CiAgICAgdG8gMSBpdCBzaWduYWxzIHRoYXQgdGhlIGFzc2VtYmxlciBzaG91bGQgdXNlIGEgc3ltYm9sIHdob3NlIAogICAgIHNjb3BlIGlzIHRoZSBlbnRpcmUgZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMKICAgICBpcyBuZWVkZWQgd2l0aCBNQVNNIHdoaWNoIHVzZXMgdGhlIGZvcm1hdCBsYWJlbDo6IGZvciB0aGlzIHNjb3BlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFBldGVyIFJ1bmVzdGlnIDxwZXRlckBydW5lc3RpZy5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIEFTTjEgdHlwZXMgc28gdGhleSBhcmUgdHlwZWRlZnMgYnkgZGVmYXVsdC4gQmVmb3JlCiAgICAgYWxtb3N0IGFsbCB0eXBlcyB3ZXJlICNkZWZpbmUnZCB0byBBU04xX1NUUklORyB3aGljaCB3YXMgY2F1c2luZwogICAgIFNUQUNLX09GKCkgcHJvYmxlbXM6IHlvdSBjb3VsZG4ndCBkZWNsYXJlIFNUQUNLX09GKEFTTjFfVVRGOFNUUklORykKICAgICBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbmFtZXMgb2YgbmV3IGZ1bmN0aW9ucyB0byB0aGUgbmV3IGdldDEvZ2V0MCBuYW1pbmcKICAgICBjb252ZW50aW9uOiBBZnRlciAnZ2V0MScsIHRoZSBjYWxsZXIgb3ducyBhIHJlZmVyZW5jZSBjb3VudAogICAgIGFuZCBoYXMgdG8gY2FsbCAuLi5fZnJlZTsgJ2dldDAnIHJldHVybnMgYSBwb2ludGVyIHRvIHNvbWUKICAgICBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IGluY3JlbWVudGluZyByZWZlcmVuY2UgY291bnRlcnMuCiAgICAgKFNvbWUgb2YgdGhlIGV4aXN0aW5nICdnZXQnIGZ1bmN0aW9ucyBpbmNyZW1lbnQgYSByZWZlcmVuY2UKICAgICBjb3VudGVyLCBzb21lIGRvbid0LikKICAgICBTaW1pbGFybHksICdzZXQxJyBhbmQgJ2FkZDEnIGZ1bmN0aW9ucyBpbmNyZWFzZSByZWZlcmVuY2UKICAgICBjb3VudGVycyBvciBkdXBsaWNhdGUgb2JqZWN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHRlbXAgUlNBIGtleSBnZW5lcmF0aW9uIGZhaWx1cmU6CiAgICAgdGhlIGNvZGUgdXNlZCB0byBhc3N1bWUgaXQgYWx3YXlzIHdvcmtlZCBhbmQgY3Jhc2hlZCBvbiBmYWlsdXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gcHJvYmxlbSBpbiBCSU9fcHJpbnRmKCkuCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHB1YmxpYyBkb21haW4gY29kZSBieSBQYXRyaWNrIFBvd2VsbDsgcHJvYmxlbQogICAgICBwb2ludGVkIG91dCBieSBEYXZpZCBTYWNlcmRvdGUgPGRhczMzQGNvcm5lbGwuZWR1Pl0KCiAgKikgU3VwcG9ydCBFR0QgPGh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8+LiAgTmV3IGZ1bmN0aW9ucwogICAgIFJBTkRfZWdkKCkgYW5kIFJBTkRfc3RhdHVzKCkuICBJbiB0aGUgY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uLAogICAgIHRoZSBFR0Qgc29ja2V0IGNhbiBiZSBzcGVjaWZpZWQgbGlrZSBhIHNlZWQgZmlsZSB1c2luZyBSQU5ERklMRQogICAgIG9yIC1yYW5kLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBbGxvdyB0aGUgc3RyaW5nIENFUlRJRklDQVRFIHRvIGJlIHRvbGVyYXRlZCBpbiBQS0NTIzcgc3RydWN0dXJlcy4KICAgICBTb21lIENBcyAoZS5nLiBWZXJpc2lnbikgZGlzdHJpYnV0ZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgU1NMX0FMTE9XX0FESCBjb21waWxlIG9wdGlvbiBhbmQgc2V0IHRoZSBkZWZhdWx0IGNpcGhlcgogICAgIGxpc3QgdG8gZXhjbHVkZSB0aGVtLiBUaGlzIG1lYW5zIHRoYXQgbm8gc3BlY2lhbCBjb21waWxhdGlvbiBvcHRpb24KICAgICBpcyBuZWVkZWQgdG8gdXNlIGFub255bW91cyBESDogaXQganVzdCBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKICAgICBjaXBoZXIgbGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEVWUF9NRF9DVFhfdHlwZSBtYWNybyBzbyBpdHMgbWVhbmluZyBjb25zaXN0ZW50IHdpdGgKICAgICBFVlBfTURfdHlwZS4gVGhlIG9sZCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiBhIG5ldyBtYWNybyBjYWxsZWQKICAgICBFVlBfTURfbWQoKS4gQ2hhbmdlIGNvZGUgdGhhdCB1c2VzIGl0IGFuZCB1cGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSAuLi5fY3RybCBmdW5jdGlvbnMgbm93IGhhdmUgY29ycmVzcG9uZGluZyAuLi5fY2FsbGJhY2tfY3RybCBmdW5jdGlvbnMKICAgICB3aGVyZSB0aGUgJ3ZvaWQgKicgYXJndW1lbnQgaXMgcmVwbGFjZWQgYnkgYSBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50LgogICAgIFByZXZpb3VzbHkgJ3ZvaWQgKicgd2FzIGFidXNlZCB0byBwb2ludCB0byBmdW5jdGlvbnMsIHdoaWNoIHdvcmtzIG9uCiAgICAgbWFueSBwbGF0Zm9ybXMsIGJ1dCBpcyBub3QgY29ycmVjdC4gIEFzIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXN1YWxseQogICAgIGNhbGxlZCBieSBtYWNyb3MgZGVmaW5lZCBpbiBPcGVuU1NMIGhlYWRlciBmaWxlcywgbW9zdCBzb3VyY2UgY29kZQogICAgIHNob3VsZCB3b3JrIHdpdGhvdXQgY2hhbmdlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAod2hpY2ggaXMgY3JlYXRlZCBieSBDb25maWd1cmUpIG5vdyBjb250YWlucwogICAgIHNlY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gb24gLUQuLi4gY29tcGlsZXIgc3dpdGNoZXMgdXNlZCBmb3IKICAgICBjb21waWxpbmcgdGhlIGxpYnJhcnkgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNlZSB0aGVtLiAgVG8gZW5hYmxlCiAgICAgb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBhIHByZS1wcm9jZXNzb3Igc3ltYm9sIE9QRU5TU0xfLi4uX0RFRklORVMKICAgICBtdXN0IGJlIGRlZmluZWQuICBFLmcuLAogICAgICAgICNkZWZpbmUgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUwogICAgICAgICNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CiAgICAgZGVmaW5lcyBhbGwgcGVydGluZW50IE5PXzxhbGdvPiBzeW1ib2xzLCBzdWNoIGFzIE5PX0lERUEsIE5PX1JTQSwgZXRjLgogICAgIFtSaWNoYXJkIExldml0dGUsIFVsZiBhbmQgQm9kbyBN9mxsZXJdCgogICopIEJ1Z2ZpeDogVG9sZXJhdGUgZnJhZ21lbnRhdGlvbiBhbmQgaW50ZXJsZWF2aW5nIGluIHRoZSBTU0wgMy9UTFMKICAgICByZWNvcmQgbGF5ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSAnb3RoZXInIHR5cGUgaW4gY2VydGlmaWNhdGUgYXV4IGluZm8gdG8gYSBTVEFDS19PRgogICAgIFg1MDlfQUxHT1IuIEFsdGhvdWdoIG5vdCBhbiBBbGdvcml0aG1JZGVudGlmaWVyIGFzIHN1Y2ggaXQgaGFzCiAgICAgdGhlIHJlcXVpcmVkIEFTTjEgZm9ybWF0OiBhcmJpdHJhcnkgdHlwZXMgZGV0ZXJtaW5lZCBieSBhbiBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgUEVNX3dyaXRlX1g1MDlfUkVRX05FVygpIGZ1bmN0aW9ucyBhbmQgYSBjb21tYW5kIGxpbmUKICAgICBhcmd1bWVudCB0byAncmVxJy4gVGhpcyBpcyBub3QgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgbmV3ZXIgb3IKICAgICBiZXR0ZXIgdGhhbiBvdGhlcnMgaXQganVzdCB1c2VzIHRoZSB3b3JrICdORVcnIGluIHRoZSBjZXJ0aWZpY2F0ZQogICAgIHJlcXVlc3QgaGVhZGVyIGxpbmVzLiBTb21lIHNvZnR3YXJlIG5lZWRzIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbmlzZSBwYXNzd29yZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzOiBub3cgcGFzc3dvcmRzIGNhbiBiZQogICAgIG9idGFpbmVkIGZyb20gdmFyaW91cyBzb3VyY2VzLiBEZWxldGUgdGhlIFBFTV9jYiBmdW5jdGlvbiBhbmQgbWFrZQogICAgIGl0IHRoZSBkZWZhdWx0IGJlaGF2aW91cjogaS5lLiBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTCBhbmQgdGhlCiAgICAgdXNyZGF0YSBhcmd1bWVudCBpcyBub3QgTlVMTCBpbnRlcnByZXQgaXQgYXMgYSBudWxsIHRlcm1pbmF0ZWQgcGFzcwogICAgIHBocmFzZS4gSWYgdXNyZGF0YSBhbmQgdGhlIGNhbGxiYWNrIGFyZSBOVUxMIHRoZW4gdGhlIHBhc3MgcGhyYXNlCiAgICAgaXMgcHJvbXB0ZWQgZm9yIGFzIHVzdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgQ29tcGFxIEF0YWxsYSBjcnlwdG8gYWNjZWxlcmF0b3IuIElmIGl0IGlzIGluc3RhbGxlZCwKICAgICB0aGUgc3VwcG9ydCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQuIFRoZSByZXN1bHRpbmcgYmluYXJpZXMgd2lsbAogICAgIGF1dG9kZXRlY3QgdGhlIGNhcmQgYW5kIHVzZSBpdCBpZiBwcmVzZW50LgogICAgIFtCZW4gTGF1cmllIGFuZCBDb21wYXEgSW5jLl0KCiAgKikgV29yayBhcm91bmQgZm9yIE5ldHNjYXBlIGhhbmcgYnVnLiBUaGlzIHNlbmRzIGNlcnRpZmljYXRlIHJlcXVlc3QKICAgICBhbmQgc2VydmVyIGRvbmUgaW4gb25lIHJlY29yZC4gU2luY2UgdGhpcyBpcyBwZXJmZWN0bHkgbGVnYWwgaW4gdGhlCiAgICAgU1NML1RMUyBwcm90b2NvbCBpdCBpc24ndCBhICJidWciIG9wdGlvbiBhbmQgaXMgb24gYnkgZGVmYXVsdC4gU2VlCiAgICAgdGhlIGJ1Z3MvU1NMdjMgZW50cnkgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIUC1VWCB0dW5lLXVwOiBuZXcgdW5pZmllZCBjb25maWdzLCBIUCBDIGNvbXBpbGVyIGJ1ZyB3b3JrYXJvdW5kLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgLXJhbmQgYXJndW1lbnQgdG8gc21pbWUgYW5kIHBrY3MxMiBhcHBsaWNhdGlvbnMgYW5kIHJlYWQvd3JpdGUKICAgICBvZiBzZWVkIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3ICdwYXNzd2QnIHRvb2wgZm9yIGNyeXB0KDMpIGFuZCBhcHIxIHBhc3N3b3JkIGhhc2hlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgY29tbWFuZCBsaW5lIHBhc3N3b3JkIG9wdGlvbnMgdG8gdGhlIHJlbWFpbmluZyBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2X3JlY3AoKSBmb3IgbnVtZXJhdG9ycyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mCiAgICAgYml0cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTW9yZSB0ZXN0cyBpbiBibnRlc3QuYywgYW5kIGNoYW5nZWQgdGVzdF9ibiBvdXRwdXQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIC4vY29uZmlnIHJlY29nbml6ZXMgTWFjT1MgWCBub3cuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEJ1ZyBmaXggZm9yIEJOX2RpdigpIHdoZW4gdGhlIGZpcnN0IHdvcmRzIG9mIG51bSBhbmQgZGl2c29yIGFyZQogICAgIGVxdWFsIChpdCBnYXZlIHdyb25nIHJlc3VsdHMgaWYgKHJlbT0objEtcSpkMCkmQk5fTUFTSzIpIDwgZDApLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBicm9rZW4gUEtDUyM4IGZvcm1hdHMsIGFuZCBjb21tYW5kIGxpbmUKICAgICBvcHRpb25zIHRvIHByb2R1Y2UgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEJOX0NUWF9zdGFydCgpLCBCTl9DVFhfZ2V0KCkgYW5kIEJUX0NUWF9lbmQoKSB0bwogICAgIGdldCB0ZW1wb3JhcnkgQklHTlVNcyBmcm9tIGEgQk5fQ1RYLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb3JyZWN0IHJldHVybiB2YWx1ZXMgaW4gQk5fbW9kX2V4cF9tb250KCkgYW5kIEJOX21vZF9leHAyX21vbnQoKQogICAgIGZvciBwID09IDAuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENoYW5nZSB0aGUgU1NMZWF5X2FkZF9hbGxfKigpIGZ1bmN0aW9ucyB0byBPcGVuU1NMX2FkZF9hbGxfKigpIGFuZAogICAgIGluY2x1ZGUgYSAjZGVmaW5lIGZyb20gdGhlIG9sZCBuYW1lIHRvIHRoZSBuZXcuIFRoZSBvcmlnaW5hbCBpbnRlbnQKICAgICB3YXMgdGhhdCBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyBjb3VsZCBmb3IgZXhhbXBsZSBqdXN0IGNhbGwKICAgICBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgdG8ganVzdCBhZGQgY2lwaGVycyB0byB0aGUgdGFibGUgYW5kIG5vdAogICAgIGxpbmsgd2l0aCBkaWdlc3RzLiBUaGlzIG5ldmVyIHdvcmtlZCBiZWNheXNlIFNTTGVheV9hZGRfYWxsX2RpZ2VzdHMoKQogICAgIGFuZCBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgd2VyZSBpbiB0aGUgc2FtZSBzb3VyY2UgZmlsZSBzbyBjYWxsaW5nCiAgICAgb25lIHdvdWxkIGxpbmsgd2l0aCB0aGUgb3RoZXIuIFRoZXkgYXJlIG5vdyBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IC1ub3RleHQgb3B0aW9uIHRvICdjYScgYW5kIGEgLXB1YmtleSBvcHRpb24gdG8gJ3Nwa2FjJy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgYSBsZXNzIHVudXN1YWwgZm9ybSBvZiB0aGUgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0IChpdCB1c2VkCiAgICAgYSBiaW5hcnkgYWxnb3JpdGhtIGZvciBleHBvbmVudGlhdGlvbiBpbnRlZ3JhdGVkIGludG8gdGhlIE1pbGxlci1SYWJpbgogICAgIGxvb3AsIG91ciBzdGFuZGFyZCBtb2RleHAgYWxnb3JpdGhtcyBhcmUgZmFzdGVyKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgRUJDRElDIGNoYXJhY3RlciBzZXQgY29tcGxldGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT5dCgogICopIFNvdXJjZSBjb2RlIGNsZWFudXBzOiB1c2UgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUsIGVsaW1pbmF0ZSBjYXN0cywKICAgICB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqIGluIGxoYXNoLgogICAgIFtVbGYgTfZsbGVyXSAKCiAgKikgQnVnZml4OiBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSB3YXMgbm90IHJlc3RhcnRhYmxlCiAgICAgKHRoZSBzdGF0ZSB3YXMgbm90IGNoYW5nZWQgdG8gU1NMM19TVF9TV19LRVlfRVhDSF9CLCBhbmQgYmVjYXVzZSBvZgogICAgIHRoaXMgdGhlIHNlcnZlciBjb3VsZCBvdmVyd3JpdGUgZXBoZW1lcmFsIGtleXMgdGhhdCB0aGUgY2xpZW50CiAgICAgaGFzIGFscmVhZHkgc2VlbikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBEU0FfaXNfcHJpbWUgaW50byBhIG1hY3JvIHRoYXQgY2FsbHMgQk5faXNfcHJpbWUsCiAgICAgdXNpbmcgNTAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QuCgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIG5vdyB1c2VzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0ICh3aXRoIDUwCiAgICAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYXMgcmVxdWlyZWQgYnkgdGhlIGFwcGVuZGl4CiAgICAgdG8gRklQUyBQVUIgMTg2Wy0xXSkgaW5zdGVhZCBvZiBEU0FfaXNfcHJpbWUuCiAgICAgQXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgaW5jbHVkZXMgdHJpYWwgZGl2aXNpb24sIERTQSBwYXJhbWV0ZXIKICAgICBnZW5lcmF0aW9uIGJlY29tZXMgbXVjaCBmYXN0ZXIuCgogICAgIFRoaXMgaW1wbGllcyBhIGNoYW5nZSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiBEU0FfaXNfcHJpbWUKICAgICBhbmQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZQogICAgIGZvciBlYWNoIHBvc2l0aXZlIHdpdG5lc3MgaW4gdGhlIFJhYmluLU1pbGxlciB0ZXN0LCBub3QganVzdAogICAgIG9jY2FzaW9uYWxseSBpbiB0aGUgaW5uZXIgbG9vcDsgYW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZQogICAgIGNhbGxiYWNrIGZ1bmN0aW9uIG5vdyBwcm92aWRlIGFuIGl0ZXJhdGlvbiBjb3VudCBmb3IgdGhlIG91dGVyCiAgICAgbG9vcCByYXRoZXIgdGhhbiBmb3IgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBvZiB0aGUgaW5uZXIgbG9vcC4KICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBhZGRpdGlvbmFsbHkgY2FuIGNhbGwgdGhlIGNhbGxiYWNrCiAgICAgZnVuY3Rpb24gd2l0aCBhbiAnaXRlcmF0aW9uIGNvdW50JyBvZiAtMSwgbWVhbmluZyB0aGF0IGEKICAgICBjYW5kaWRhdGUgaGFzIHBhc3NlZCB0aGUgdHJpYWwgZGl2aXNpb24gdGVzdCAod2hlbiBxIGlzIGdlbmVyYXRlZCAKICAgICBmcm9tIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHNlZWQsIHRyaWFsIGRpdmlzaW9uIGlzIHNraXBwZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9pc19wcmltZV9mYXN0dGVzdCB0aGF0IG9wdGlvbmFsbHkgZG9lcyB0cmlhbAogICAgIGRpdmlzaW9uIGJlZm9yZSBzdGFydGluZyB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYW5kIGhhcwogICAgIGFuIGFkZGl0aW9uYWwgQk5fQ1RYICogYXJndW1lbnQgKHdoZXJlYXMgQk5faXNfcHJpbWUgYWx3YXlzCiAgICAgaGFzIHRvIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBCTl9DVFgpLgogICAgICdjYWxsYmFjaygxLCAtMSwgY2JfYXJnKScgaXMgY2FsbGVkIHdoZW4gYSBudW1iZXIgaGFzIHBhc3NlZCB0aGUKICAgICB0cmlhbCBkaXZpc2lvbiBzdGFnZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBDUkwgZW5jb2RpbmcuIFRoZSB2YWxpZGl0eSBkYXRlcyB3ZXJlbid0IGJlaW5nIGhhbmRsZWQKICAgICBhcyBBU04xX1RJTUUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1wa2NzMTIgb3B0aW9uIHRvIENBLnBsIHNjcmlwdCB0byB3cml0ZSBvdXQgYSBQS0NTIzEyIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3BzZXVkb19yYW5kKCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENsZWFuIHVwIEJOX21vZF9tdWxfbW9udGdvbWVyeSgpOiByZXBsYWNlIHRoZSBicm9rZW4gKGFuZCB1bnJlYWRhYmxlKQogICAgIGJpZ251bSB2ZXJzaW9uIG9mIEJOX2Zyb21fbW9udGdvbWVyeSgpIHdpdGggdGhlIHdvcmtpbmcgY29kZSBmcm9tCiAgICAgU1NMZWF5IDAuOS4wICh0aGUgd29yZCBiYXNlZCB2ZXJzaW9uIGlzIGZhc3RlciBhbnl3YXkpLCBhbmQgY2xlYW4gdXAKICAgICB0aGUgY29tbWVudHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gczJfY2xudC5jIChmdW5jdGlvbiBnZXRfc2VydmVyX2hlbGxvKSB0aGF0CiAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgc2FtZSBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZSBpbgogICAgIFNTTDIgY2xpZW50cyBpbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSByZXR1cm4gdmFsdWUgb2YgUkFORF9sb2FkX2ZpbGUoKSBubyBsb25nZXIgY291bnRzIGJ5dGVzIG9idGFpbmVkCiAgICAgYnkgc3RhdCgpLiAgUkFORF9sb2FkX2ZpbGUoLi4uLCAtMSkgaXMgbmV3IGFuZCB1c2VzIHRoZSBjb21wbGV0ZSBmaWxlCiAgICAgdG8gc2VlZCB0aGUgUFJORyAocHJldmlvdXNseSBhbiBleHBsaWNpdCBieXRlIGNvdW50IHdhcyByZXF1aXJlZCkuCiAgICAgW1VsZiBN9mxsZXIsIEJvZG8gTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBDUllQVE9fRVhfREFUQSBmdW5jdGlvbnMsIHNvbWUgb2YgdGhlc2UgZGlkbid0IGhhdmUgcHJvdG90eXBlcwogICAgIHVzZWQgKGNoYXIgKikgaW5zdGVhZCBvZiAodm9pZCAqKSBhbmQgaGFkIGNhc3RzIGFsbCBvdmVyIHRoZSBwbGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIEJOX2dlbmVyYXRlX3ByaW1lKCkgcmV0dXJuIE5VTEwgb24gZXJyb3IgaWYgcmV0IT1OVUxMLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSZXRhaW4gc291cmNlIGNvZGUgY29tcGF0aWJpbGl0eSBmb3IgQk5fcHJpbWVfY2hlY2tzIG1hY3JvOgogICAgIEJOX2lzX3ByaW1lKC4uLiwgQk5fcHJpbWVfY2hlY2tzLCAuLi4pIG5vdyB1c2VzCiAgICAgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCiAgICAgUmFiaW4tTWlsbGVyIGl0ZXJhdGlvbnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERpZmZpZS1IZWxsbWFuIHVzZXMgInNhZmUiIHByaW1lczogREhfY2hlY2soKSByZXR1cm4gY29kZSByZW5hbWVkIHRvCiAgICAgREhfQ0hFQ0tfUF9OT1RfU0FGRV9QUklNRS4KICAgICAoQ2hlY2sgaWYgdGhpcyBpcyB0cnVlPyBPcGVuUEdQIGNhbGxzIHRoZW0gInN0cm9uZyIuKQogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNZXJnZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiZGgiIGFuZCAiZ2VuZGgiIHByb2dyYW1zIGludG8gYSBuZXcgcHJvZ3JhbQogICAgICJkaHBhcmFtIi4gVGhlIG9sZCBwcm9ncmFtcyBhcmUgcmV0YWluZWQgZm9yIG5vdyBidXQgd2lsbCBoYW5kbGUgREgga2V5cwogICAgIChpbnN0ZWFkIG9mIHBhcmFtZXRlcnMpIGluIGZ1dHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBjaXBoZXJzLCBzX3NlcnZlciBhbmQgc19jbGllbnQgcHJvZ3JhbXMgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMKICAgICB3aGVuIGEgbmV3IGNpcGhlciBsaXN0IGlzIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBTU0wvVExTIGNpcGhlciBtZWNoYW5pc20gdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgVExTIDU2Yml0CiAgICAgY2lwaGVycy4gQmVmb3JlIHdoZW4gdGhlIDU2Yml0IGNpcGhlcnMgd2VyZSBlbmFibGVkIHRoZSBzb3J0aW5nIHdhcwogICAgIHdyb25nLgoKICAgICBUaGUgc3ludGF4IGZvciB0aGUgY2lwaGVyIHNvcnRpbmcgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBzb3J0aW5nIGJ5CiAgICAgY2lwaGVyLXN0cmVuZ3RoICh1c2luZyB0aGUgc3RyZW5ndGhfYml0cyBoYXJkIGNvZGVkIGluIHRoZSB0YWJsZXMpLgogICAgIFRoZSBuZXcgY29tbWFuZCBpcyAiQFNUUkVOR1RIIiAoc2VlIGFsc28gZG9jL2FwcHMvY2lwaGVycy5wb2QpLgoKICAgICBGaXggYSBidWcgaW4gdGhlIGNpcGhlci1jb21tYW5kIHBhcnNlcjogd2hlbiBzdXBwbHlpbmcgYSBjaXBoZXIgY29tbWFuZAogICAgIHN0cmluZyB3aXRoIGFuICJ1bmRlZmluZWQiIHN5bWJvbCAobmVpdGhlciBjb21tYW5kIG5vciBhbHBoYW51bWVyaWMKICAgICBbQS1aYS16MC05XSwgc3NsX3NldF9jaXBoZXJfbGlzdCB1c2VkIHRvIGhhbmcgaW4gYW4gZW5kbGVzcyBsb29wLiBOb3cKICAgICBhbiBlcnJvciBpcyBmbGFnZ2VkLgoKICAgICBEdWUgdG8gdGhlIHN0cmVuZ3RoLXNvcnRpbmcgZXh0ZW5zaW9uLCB0aGUgY29kZSBvZiB0aGUKICAgICBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgZnVuY3Rpb24gd2FzIGNvbXBsZXRlbHkgcmVhcnJhbmdlZC4gSSBob3BlIHRoYXQKICAgICB0aGUgcmVhZGFiaWxpdHkgd2FzIGFsc28gaW5jcmVhc2VkIDotKQogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgTWlub3IgY2hhbmdlIHRvICd4NTA5JyB1dGlsaXR5LiBUaGUgLUNBY3JlYXRlc2VyaWFsIG9wdGlvbiBub3cgdXNlcyAxCiAgICAgZm9yIHRoZSBmaXJzdCBzZXJpYWwgbnVtYmVyIGFuZCBwbGFjZXMgMiBpbiB0aGUgc2VyaWFsIG51bWJlciBmaWxlLiBUaGlzCiAgICAgYXZvaWRzIHByb2JsZW1zIHdoZW4gdGhlIHJvb3QgQ0EgaXMgY3JlYXRlZCB3aXRoIHNlcmlhbCBudW1iZXIgemVybyBhbmQKICAgICB0aGUgZmlyc3QgdXNlciBjZXJ0aWZpY2F0ZSBoYXMgdGhlIHNhbWUgaXNzdWVyIG5hbWUgYW5kIHNlcmlhbCBudW1iZXIKICAgICBhcyB0aGUgcm9vdCBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMsIGNoYW5nZSB0aGUgJ3JlcScgcHJvZ3JhbSBzbyBpdCB1c2VzCiAgICAgdGhlIG5ldyBjb2RlLiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHVmZi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcy4gVGhlc2UgaGF2ZSBiZWVuIHJlbmFtZWQgZnJvbQogICAgIFg1MDlfKigpIHRvIFg1MDlhdF8qKCkgb24gdGhlIGdyb3VuZHMgdGhhdCB0aGV5IGRvbid0IGhhbmRsZSBYNTA5CiAgICAgc3RydWN0dXJlcyBhbmQgYmVoYXZlIGluIGFuIGFuYWxhZ291cyB3YXkgdG8gdGhlIFg1MDl2MyBmdW5jdGlvbnM6CiAgICAgdGhleSBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ1dCB3cmFwcGVyIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZAogICAgIGluc3RlYWQuCgogICAgIFNvIHdlIGFsc28gbm93IGhhdmUgc29tZSB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlIFg1MDlhdCBmdW5jdGlvbnMKICAgICB3aGVuIHBhc3NlZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gKFRPIERPOiBzaW1pbGFyIHRoaW5ncyBjYW4gYmUgZG9uZSB3aXRoCiAgICAgUEtDUyM3IHNpZ25lZCBhbmQgdW5zaWduZWQgYXR0cmlidXRlcywgUEtDUyMxMiBhdHRyaWJ1dGVzIGFuZCBhIGZldyBvdGhlcgogICAgIHRoaW5ncy4gU29tZSBvZiB0aGVzZSBuZWVkIHNvbWUgZDJpIG9yIGkyZCBhbmQgcHJpbnQgZnVuY3Rpb25hbGl0eQogICAgIGJlY2F1c2UgdGhleSBoYW5kbGUgbW9yZSBjb21wbGV4IHN0cnVjdHVyZXMuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtaXNzaW5nICNpZm5kZWZzIHRoYXQgY2F1c2VkIG1pc3Npbmcgc3ltYm9scyB3aGVuIGJ1aWxkaW5nIGxpYnNzbAogICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkgd2l0aG91dCBSU0EuICBVc2UgI2lmbmRlZiBOT19TU0wyIGluc3RlYWQgb2YKICAgICBOT19SU0EgaW4gc3NsL3MyKi5jLiAKICAgICBbS3JpcyBLZW5uYXdheSA8a3Jpc0BodWIuZnJlZWJzZC5vcmc+LCBtb2RpZmllZCBieSBVbGYgTfZsbGVyXQoKICAqKSBQcmVjYXV0aW9ucyBhZ2FpbnN0IHVzaW5nIHRoZSBQUk5HIHVuaW5pdGlhbGl6ZWQ6IFJBTkRfYnl0ZXMoKSBub3cKICAgICBoYXMgYSByZXR1cm4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHRoZSBxdWFsaXR5IG9mIHRoZSByYW5kb20gZGF0YQogICAgICgxID0gb2ssIDAgPSBub3Qgc2VlZGVkKS4gIEFsc28gYW4gZXJyb3IgaXMgcmVjb3JkZWQgb24gdGhlIHRocmVhZCdzCiAgICAgZXJyb3IgcXVldWUuIE5ldyBmdW5jdGlvbiBSQU5EX3BzZXVkb19ieXRlcygpIGdlbmVyYXRlcyBvdXRwdXQgdGhhdCBpcwogICAgIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGJ1dCBub3QgdW5wcmVkaWN0YWJsZS4gUkFORF9hZGQgaXMgbGlrZQogICAgIFJBTkRfc2VlZCwgYnV0IHRha2VzIGFuIGV4dHJhIGFyZ3VtZW50IGZvciBhbiBlbnRyb3B5IGVzdGltYXRlCiAgICAgKFJBTkRfc2VlZCBhbHdheXMgYXNzdW1lcyBmdWxsIGVudHJvcHkpLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEbyBtb3JlIGl0ZXJhdGlvbnMgb2YgUmFiaW4tTWlsbGVyIHByb2JhYmxlIHByaW1lIHRlc3QgKHNwZWNpZmljYWxseSwKICAgICAzIGZvciAxMDI0LWJpdCBwcmltZXMsIDYgZm9yIDUxMi1iaXQgcHJpbWVzLCAxMiBmb3IgMjU2LWJpdCBwcmltZXMKICAgICBpbnN0ZWFkIG9mIG9ubHkgMiBmb3IgYWxsIGxlbmd0aHM7IHNlZSBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUgZGVmaW5pdGlvbgogICAgIGluIGNyeXB0by9ibi9ibl9wcmltZS5jIGZvciB0aGUgY29tcGxldGUgdGFibGUpLiAgVGhpcyBndWFyYW50ZWVzIGEKICAgICBmYWxzZS1wb3NpdGl2ZSByYXRlIG9mIGF0IG1vc3QgMl4tODAgZm9yIHJhbmRvbSBpbnB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIHNzbDNfcmVhZF9uIChzc2wvczNfcGt0LmMpIGF2b2lkaW5nIGEgY291cGxlIG9mIGJ1Z3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfQ1RYX3JnZXRfY2hhaW4oKSAocmVuYW1lZCB0byBYNTA5X0NUWF9nZXQxX2NoYWluCiAgICAgaW4gdGhlIDAuOS41IHJlbGVhc2UpLCB0aGlzIHJldHVybnMgdGhlIGNoYWluCiAgICAgZnJvbSBhbiBYNTA5X0NUWCBzdHJ1Y3R1cmUgd2l0aCBhIGR1cCBvZiB0aGUgc3RhY2sgYW5kIGFsbAogICAgIHRoZSBYNTA5IHJlZmVyZW5jZSBjb3VudHMgdXBwZWQ6IHNvIHRoZSBzdGFjayB3aWxsIGV4aXN0CiAgICAgYWZ0ZXIgWDUwOV9DVFhfY2xlYW51cCgpIGhhcyBiZWVuIGNhbGxlZC4gTW9kaWZ5IHBrY3MxMi5jCiAgICAgdG8gdXNlIHRoaXMuCgogICAgIEFsc28gbWFrZSBTU0xfU0VTU0lPTl9wcmludCgpIHByaW50IG91dCB0aGUgdmVyaWZ5IHJldHVybgogICAgIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG1hbnBhZ2UgZm9yIHRoZSBwa2NzMTIgY29tbWFuZC4gQWxzbyBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICBiZWhhdmlvdXIgc28gTUFDIGl0ZXJhdGlvbiBjb3VudHMgYXJlIHVzZWQgdW5sZXNzIHRoZSBuZXcKICAgICAtbm9tYWNpdGVyIG9wdGlvbiBpcyB1c2VkLiBUaGlzIGltcHJvdmVzIGZpbGUgc2VjdXJpdHkgYW5kCiAgICAgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBNU0lFICg0LjAgZm9yIGV4YW1wbGUpIG5lZWQgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSG9ub3IgdGhlIG5vLXh4eCBDb25maWd1cmUgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIC5ERUYgZmlsZXMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBQS0NTIzEwIGF0dHJpYnV0ZXMgdG8gZmllbGQgdGFibGU6IGNoYWxsZW5nZVBhc3N3b3JkLCAKICAgICB1bnN0cnVjdHVyZWROYW1lIGFuZCB1bnN0cnVjdHVyZWRBZGRyZXNzLiBUaGVzZSBhcmUgdGFrZW4gZnJvbQogICAgIGRyYWZ0IFBLQ1MjOSB2Mi4wIGJ1dCBhcmUgY29tcGF0aWJsZSB3aXRoIHYxLjIgcHJvdmlkZWQgbm8gCiAgICAgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIGFyZSB1c2VkLgoKICAgICBNb3JlIGNoYW5nZXMgdG8gWDUwOV9BVFRSSUJVVEUgY29kZTogYWxsb3cgdGhlIHNldHRpbmcgb2YgdHlwZXMKICAgICBiYXNlZCBvbiBzdHJpbmdzLiBSZW1vdmUgdGhlICdsb2MnIHBhcmFtZXRlciB3aGVuIGFkZGluZwogICAgIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGVzZSB3aWxsIGJlIGEgU0VUIE9GIGVuY29kaW5nIHdoaWNoIGlzIHNvcnRlZAogICAgIGluIEFTTjEgb3JkZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBjaGFuZ2VzIHRvIHRoZSAncmVxJyB1dGlsaXR5IHRvIGFsbG93IHJlcXVlc3QgZ2VuZXJhdGlvbgogICAgIGF1dG9tYXRpb24uIFRoaXMgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBqdXN0IGdlbmVyYXRlIGEgdGVtcGxhdGUKICAgICBmaWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIGhhdmUgcmVxIGNvbnN0cnVjdCB0aGUKICAgICByZXF1ZXN0LgoKICAgICBJbml0aWFsIHN1cHBvcnQgZm9yIFg1MDlfQVRUUklCVVRFIGhhbmRsaW5nLiBTdGFja3Mgb2YgdGhlc2UgYXJlCiAgICAgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHJlcXVlc3RzIGFuZCBQS0NTIzcKICAgICBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBjdXJyZW50bHkgaGFuZGxlZCBtYW51YWxseSB3aGVyZSBuZWNlc3Nhcnkgd2l0aAogICAgIHNvbWUgcHJpbWl0aXZlIHdyYXBwZXJzIGZvciBQS0NTIzcuIFRoZSBuZXcgZnVuY3Rpb25zIGJlaGF2ZSBpbiBhCiAgICAgbWFubmVyIGFuYWxvZ291cyB0byB0aGUgWDUwOSBleHRlbnNpb24gZnVuY3Rpb25zOiB0aGV5IGFsbG93CiAgICAgYXR0cmlidXRlcyB0byBiZSBsb29rZWQgdXAgYnkgTklEIGFuZCBhZGRlZC4KCiAgICAgTGF0ZXIgc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIFg1MDlWMyBjb2RlIHdvdWxkIGJlIGRlc2lyYWJsZSB0bwogICAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRoZSBlbmNvZGluZywgZGVjb2RpbmcgYW5kIHByaW50aW5nIG9mIHRoZQogICAgIG1vcmUgY29tcGxleCB0eXBlcy4gVGhlIHN0cmluZyB0eXBlcyBsaWtlIGNoYWxsZW5nZVBhc3N3b3JkIGNhbgogICAgIGJlIGhhbmRsZWQgYnkgdGhlIHN0cmluZyB0YWJsZSBmdW5jdGlvbnMuCgogICAgIEFsc28gbW9kaWZpZWQgdGhlIG11bHRpIGJ5dGUgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLiBOb3cgdGhlcmUgaXMKICAgICBhICdnbG9iYWwgbWFzaycgd2hpY2ggbWFza3Mgb3V0IGNlcnRhaW4gdHlwZXMuIFRoZSB0YWJsZSBpdHNlbGYKICAgICBjYW4gdXNlIHRoZSBmbGFnIFNUQUJMRV9OT19NQVNLIHRvIGlnbm9yZSB0aGUgbWFzayBzZXR0aW5nOiB0aGlzCiAgICAgaXMgdXNlZnVsIHdoZW4gZm9yIGV4YW1wbGUgdGhlcmUgaXMgb25seSBvbmUgcGVybWlzc2libGUgdHlwZQogICAgIChhcyBpbiBjb3VudHJ5TmFtZSkgYW5kIHVzaW5nIHRoZSBtYXNrIG1pZ2h0IHJlc3VsdCBpbiBubyB2YWxpZAogICAgIHR5cGVzIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCAnRmluaXNoZWQnIGhhbmRsaW5nLCBhbmQgYWRkIGZ1bmN0aW9ucyBTU0xfZ2V0X2ZpbmlzaGVkIGFuZAogICAgIFNTTF9nZXRfcGVlcl9maW5pc2hlZCB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBsYXRlc3QKICAgICBGaW5pc2hlZCBtZXNzYWdlcyBzZW50IHRvIHRoZSBwZWVyIG9yIGV4cGVjdGVkIGZyb20gdGhlIHBlZXIsCiAgICAgcmVzcGVjdGl2ZWx5LiAgKFNTTF9nZXRfcGVlcl9maW5pc2hlZCBpcyB1c3VhbGx5IHRoZSBGaW5pc2hlZCBtZXNzYWdlCiAgICAgYWN0dWFsbHkgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlciwgb3RoZXJ3aXNlIHRoZSBwcm90b2NvbCB3aWxsIGJlIGFib3J0ZWQuKQoKICAgICBBcyB0aGUgRmluaXNoZWQgbWVzc2FnZSBhcmUgbWVzc2FnZSBkaWdlc3RzIG9mIHRoZSBjb21wbGV0ZSBoYW5kc2hha2UKICAgICAod2l0aCBhIHRvdGFsIG9mIDE5MiBiaXRzIGZvciBUTFMgMS4wIGFuZCBtb3JlIGZvciBTU0wgMy4wKSwgdGhleSBjYW4KICAgICBiZSB1c2VkIGZvciBleHRlcm5hbCBhdXRoZW50aWNhdGlvbiBwcm9jZWR1cmVzIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uCiAgICAgcHJvdmlkZWQgYnkgU1NML1RMUyBpcyBub3QgZGVzaXJlZCBvciBpcyBub3QgZW5vdWdoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEVuaGFuY2VkIHN1cHBvcnQgZm9yIEFscGhhIExpbnV4IGlzIGFkZGVkLiBOb3cgLi9jb25maWcgY2hlY2tzIGlmCiAgICAgdGhlIGhvc3Qgc3VwcG9ydHMgQldYIGV4dGVuc2lvbiBhbmQgaWYgQ29tcGFxIEMgaXMgcHJlc2VudCBvbiB0aGUKICAgICAkUEFUSC4gSnVzdCBleHBsb2l0aW5nIG9mIHRoZSBCV1ggZXh0ZW5zaW9uIHJlc3VsdHMgaW4gMjAtMzAlCiAgICAgcGVyZm9ybWFuY2Uga2ljayBmb3Igc29tZSBhbGdvcml0aG1zLCBlLmcuIERFUyBhbmQgUkM0IHRvIG1lbnRpb24KICAgICBhIGNvdXBsZS4gQ29tcGFxIEMgaW4gdHVybiBnZW5lcmF0ZXMgfjIwJSBmYXN0ZXIgY29kZSBmb3IgTUQ1IGFuZAogICAgIFNIQTEuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciBNUyAiZmFzdCBTR0MiLiBUaGlzIGlzIGFyZ3VhYmx5IGEgdmlvbGF0aW9uIG9mIHRoZQogICAgIFNTTDMvVExTIHByb3RvY29sLiBOZXRzY2FwZSBTR0MgZG9lcyB0d28gaGFuZHNoYWtlczogdGhlIGZpcnN0IHdpdGgKICAgICB3ZWFrIGNyeXB0byBhbmQgYWZ0ZXIgY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlIGlzIFNHQyBhIHNlY29uZCBvbmUKICAgICB3aXRoIHN0cm9uZyBjcnlwdG8uIE1TIFNHQyBzdG9wcyB0aGUgZmlyc3QgaGFuZHNoYWtlIGFmdGVyIHJlY2VpdmluZwogICAgIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgbWVzc2FnZSBhbmQgc2VuZHMgYSBzZWNvbmQgY2xpZW50IGhlbGxvLiBTaW5jZQogICAgIGEgc2VydmVyIHdpbGwgdHlwaWNhbGx5IGRvIGFsbCB0aGUgdGltZSBjb25zdW1pbmcgb3BlcmF0aW9ucyBiZWZvcmUKICAgICBleHBlY3RpbmcgYW55IGZ1cnRoZXIgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50IChzZXJ2ZXIga2V5IGV4Y2hhbmdlCiAgICAgaXMgdGhlIG1vc3QgZXhwZW5zaXZlKSB0aGVyZSBpcyBsaXR0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28uCgogICAgIFRvIGdldCBPcGVuU1NMIHRvIHN1cHBvcnQgTVMgU0dDIHdlIGhhdmUgdG8gcGVybWl0IGEgc2Vjb25kIGNsaWVudAogICAgIGhlbGxvIG1lc3NhZ2UgYWZ0ZXIgd2UgaGF2ZSBzZW50IHNlcnZlciBkb25lLiBJbiBhZGRpdGlvbiB3ZSBoYXZlIHRvCiAgICAgcmVzZXQgdGhlIE1BQyBpZiB3ZSBkbyBnZXQgdGhpcyBzZWNvbmQgY2xpZW50IGhlbGxvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGZ1bmN0aW9uICdkMmlfQXV0b1ByaXZhdGVLZXkoKScgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZGVjaWRlCiAgICAgaWYgYSBERVIgZW5jb2RlZCBwcml2YXRlIGtleSBpcyBSU0Egb3IgRFNBIHRyYWRpdGlvbmFsIGZvcm1hdC4gQ2hhbmdlZAogICAgIGQyaV9Qcml2YXRlS2V5X2JpbygpIHRvIHVzZSBpdC4gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlICJ0cmFkaXRpb25hbCIKICAgICBmb3JtYXQgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkuIE5ld2VyIGNvZGUgc2hvdWxkIHVzZSBQS0NTIzggZm9ybWF0IHdoaWNoCiAgICAgaGFzIHRoZSBrZXkgdHlwZSBlbmNvZGVkIGluIHRoZSBBU04xIHN0cnVjdHVyZS4gQWRkZWQgREVSIHByaXZhdGUga2V5CiAgICAgc3VwcG9ydCB0byBwa2NzOCBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0wgMy9UTFMgMSBzZXJ2ZXJzIG5vdyBkb24ndCByZXF1ZXN0IGNlcnRpZmljYXRlcyB3aGVuIGFuIGFub255bW91cwogICAgIGNpcGhlcnN1aXRlcyBoYXMgYmVlbiBzZWxlY3RlZCAoYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzL1RMUyAxCiAgICAgc3BlY2lmaWNhdGlvbnMpLiAgRXhjZXB0aW9uOiBXaGVuIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQKICAgICBpcyBzZXQsIHdlIGludGVycHJldCB0aGlzIGFzIGEgcmVxdWVzdCB0byB2aW9sYXRlIHRoZSBzcGVjaWZpY2F0aW9uCiAgICAgKHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgYSBoYW5kc2hha2UgZmFpbHVyZSwgYW5kICdjb3JyZWN0JwogICAgIGJlaGF2aW91ciB3b3VsZCByZXN1bHQgaW4gYSBoYW5kc2hha2UgZmFpbHVyZSBhbnl3YXkpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIFNTTF9DVFhfYWRkX3Nlc3Npb24sIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmVzIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCAoZS5nLiB3aGVuIHR3byB0aHJlYWRzCiAgICAgY29uY3VycmVudGx5IG9idGFpbiB0aGVtIGZyb20gYW4gZXh0ZXJuYWwgY2FjaGUpLgogICAgIFRoZSBpbnRlcm5hbCBjYWNoZSBjYW4gaGFuZGxlIG9ubHkgb25lIFNTTF9TRVNTSU9OIHdpdGggYSBnaXZlbiBJRCwKICAgICBzbyBpZiB0aGVyZSdzIGEgY29uZmxpY3QsIHdlIG5vdyB0aHJvdyBvdXQgdGhlIG9sZCBvbmUgdG8gYWNoaWV2ZQogICAgIGNvbnNpc3RlbmN5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBPSURzIGZvciBpZGVhIGFuZCBibG93ZmlzaCBpbiBDQkMgbW9kZS4gVGhpcyB3aWxsIGFsbG93IGJvdGgKICAgICB0byBiZSB1c2VkIGluIFBLQ1MjNSB2Mi4wIGFuZCBTL01JTUUuICBBbHNvIGFkZCBjaGVja2luZyB0bwogICAgIHNvbWUgcm91dGluZXMgdGhhdCB1c2UgY2lwaGVyIE9JRHM6IHNvbWUgY2lwaGVycyBkbyBub3QgaGF2ZSBPSURzCiAgICAgZGVmaW5lZCBhbmQgc28gdGhleSBjYW5ub3QgYmUgdXNlZCBmb3IgUy9NSU1FIGFuZCBQS0NTIzUgdjIuMCBmb3IKICAgICBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNpbXBsaWZ5IHRoZSB0cnVzdCBzZXR0aW5nIHN0cnVjdHVyZSBhbmQgY29kZS4gTm93IHdlIGp1c3QgaGF2ZQogICAgIHR3byBzZXF1ZW5jZXMgb2YgT0lEcyBmb3IgdHJ1c3RlZCBhbmQgcmVqZWN0ZWQgc2V0dGluZ3MuIFRoZXNlIHdpbGwKICAgICB0eXBpY2FsbHkgaGF2ZSB2YWx1ZXMgdGhlIHNhbWUgYXMgdGhlIGV4dGVuZGVkIGtleSB1c2FnZSBleHRlbnNpb24KICAgICBhbmQgYW55IGFwcGxpY2F0aW9uIHNwZWNpZmljIHB1cnBvc2VzLgoKICAgICBUaGUgdHJ1c3QgY2hlY2tpbmcgY29kZSBub3cgaGFzIGEgZGVmYXVsdCBiZWhhdmlvdXI6IGl0IHdpbGwganVzdAogICAgIGNoZWNrIGZvciBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBOSUQgYXMgdGhlIHBhc3NlZCBpZC4gRnVuY3Rpb25zIGNhbgogICAgIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIGVpdGhlciB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb3IgdGhlIGJlaGF2aW91cgogICAgIGZvciBhIGdpdmVuIGlkLiBTU0wgY2xpZW50LCBzZXJ2ZXIgYW5kIGVtYWlsIGFscmVhZHkgaGF2ZSBmdW5jdGlvbnMKICAgICBpbiBwbGFjZSBmb3IgY29tcGF0aWJpbGl0eTogdGhleSBjaGVjayB0aGUgTklEIGFuZCBhbHNvIHJldHVybiAidHJ1c3RlZCIKICAgICBpZiB0aGUgY2VydGlmaWNhdGUgaXMgc2VsZiBzaWduZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGQyaSxpMmQgYmlvL2ZwIGZ1bmN0aW9ucyBmb3IgUHJpdmF0ZUtleTogdGhlc2UgY29udmVydCB0aGUKICAgICB0cmFkaXRpb25hbCBmb3JtYXQgaW50byBhbiBFVlBfUEtFWSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgcGFzc3dvcmQgY2FsbGJhY2sgZnVuY3Rpb24gUEVNX2NiKCkgd2hpY2ggZWl0aGVyIHByb21wdHMgZm9yCiAgICAgYSBwYXNzd29yZCBpZiB1c3JfZGF0YSBpcyBOVUxMIG9yIG90aGVyd2lzZSBhc3N1bWVzIGl0IGlzIGEgbnVsbAogICAgIHRlcm1pbmF0ZWQgcGFzc3dvcmQuIEFsbG93IHBhc3N3b3JkcyB0byBiZSBwYXNzZWQgb24gY29tbWFuZCBsaW5lCiAgICAgZW52aXJvbm1lbnQgb3IgY29uZmlnIGZpbGVzIGluIGEgZmV3IG1vcmUgdXRpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIERFUiBhbmQgUEVNIGZ1bmN0aW9ucyB0byBoYW5kbGUgUEtDUyM4IGZvcm1hdCBwcml2YXRlCiAgICAga2V5cy4gQWRkIHNvbWUgc2hvcnQgbmFtZXMgZm9yIFBLQ1MjOCBQQkUgYWxnb3JpdGhtcyBhbmQgYWxsb3cgdGhlbQogICAgIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciB0aGUgcGtjczggYW5kIHBrY3MxMiB1dGlsaXRpZXMuCiAgICAgVXBkYXRlIGRvY3VtZW50YXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgQVNOMSAiTlVMTCIgdHlwZS4gVGhpcyBjb3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBieSB1c2luZwogICAgIEFTTjFfVFlQRSBidXQgdGhlcmUgd2Fzbid0IGFueSBmdW5jdGlvbiB0aGF0IHdvdWxkIHRyeSB0byByZWFkIGEgTlVMTAogICAgIGFuZCBwcm9kdWNlIGFuIGVycm9yIGlmIGl0IGNvdWxkbid0LiBGb3IgY29tcGF0aWJpbGl0eSB3ZSBhbHNvIGhhdmUKICAgICBBU04xX05VTExfbmV3KCkgYW5kIEFTTjFfTlVMTF9mcmVlKCkgZnVuY3Rpb25zIGJ1dCB0aGVzZSBhcmUgZmFrZWQgYW5kCiAgICAgZG9uJ3QgYWxsb2NhdGUgYW55dGhpbmcgYmVjYXVzZSB0aGV5IGRvbid0IG5lZWQgdG8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBNYWNPUyBpcyBub3cgcHJvdmlkZWQuIEV4YW1pbmUgSU5TVEFMTC5NYWNPUwogICAgIGZvciBkZXRhaWxzLgogICAgIFtBbmR5IFBvbHlha292LCBSb3kgV29vZHMgPHJveUBjZW50aWNzeXN0ZW1zLmNhPl0KCiAgKikgUmVidWlsZCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdXNlZCBieSBPcGVuU1NMIGNvZGUgYW5kCiAgICAgcG9zc2libHkgb3RoZXJzIGFzIHdlbGwuICBUaGUgcHVycG9zZSBpcyB0byBtYWtlIGFuIGludGVyZmFjZSB0aGF0CiAgICAgcHJvdmlkZSBob29rcyBzbyBhbnlvbmUgY2FuIGJ1aWxkIGEgc2VwYXJhdGUgc2V0IG9mIGFsbG9jYXRpb24gYW5kCiAgICAgZGVhbGxvY2F0aW9uIHJvdXRpbmVzIHRvIGJlIHVzZWQgYnkgT3BlblNTTCwgZm9yIGV4YW1wbGUgbWVtb3J5CiAgICAgcG9vbCBpbXBsZW1lbnRhdGlvbnMsIG9yIHNvbWV0aGluZyBlbHNlLCB3aGljaCB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgc2luY2UgTWFsbG9jKCksIFJlYWxsb2MoKSBhbmQgRnJlZSgpIHdlcmUgZGVmaW5lZCBhcyBtYWNyb3MgaGF2aW5nCiAgICAgdGhlIHZhbHVlcyBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUsIHJlc3BlY3RpdmVseSAoZXhjZXB0IGZvciBXaW4zMgogICAgIGNvbXBpbGF0aW9ucykuICBUaGUgc2FtZSBpcyBwcm92aWRlZCBmb3IgbWVtb3J5IGRlYnVnZ2luZyBjb2RlLgogICAgIE9wZW5TU0wgYWxyZWFkeSBjb21lcyB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gZmluZCBtZW1vcnkgbGVha3MsIGJ1dAogICAgIHRoaXMgZ2l2ZXMgcGVvcGxlIGEgY2hhbmNlIHRvIGRlYnVnIG90aGVyIG1lbW9yeSBwcm9ibGVtcy4KCiAgICAgV2l0aCB0aGVzZSBjaGFuZ2VzLCBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zIGFuZCBtYWNyb3MgaGF2ZSBhcHBlYXJlZDoKCiAgICAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKQkgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2dldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkgICAgICAgICBbRl0KICAgICAgIENSWVBUT19kYmdfc2V0X29wdGlvbnMoKQkgICAgICAgICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZGJnX2dldF9vcHRpb25zKCkgICAgICAgICAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkgICAgICAgICAgICAgICBbTV0KCiAgICAgVGhlIG1lbW9yeSBkZWJ1ZyBmdW5jdGlvbnMgYXJlIE5VTEwgYnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBsaWJyYXJ5CiAgICAgaXMgY29tcGlsZWQgd2l0aCBDUllQVE9fTURFQlVHIG9yIGZyaWVuZHMgaXMgZGVmaW5lZC4gIElmIHNvbWVvbmUKICAgICB3YW50cyB0byBkZWJ1ZyBtZW1vcnkgYW55d2F5LCBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAod2hpY2gKICAgICBnaXZlcyB0aGUgc3RhbmRhcmQgZGVidWdnaW5nIGZ1bmN0aW9ucyB0aGF0IGNvbWUgd2l0aCBPcGVuU1NMKSBvcgogICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpICh0ZWxscyBPcGVuU1NMIHRvIHVzZSBmdW5jdGlvbnMKICAgICBwcm92aWRlZCBieSB0aGUgbGlicmFyeSB1c2VyKSBtdXN0IGJlIHVzZWQuICBXaGVuIHRoZSBzdGFuZGFyZAogICAgIGRlYnVnZ2luZyBmdW5jdGlvbnMgYXJlIHVzZWQsIENSWVBUT19kYmdfc2V0X29wdGlvbnMgY2FuIGJlIHVzZWQgdG8KICAgICByZXF1ZXN0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb246CiAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyhWX0NZUlBUT19NREVCVUdfeHh4KSBjb3JyZXNwb25kcyB0byBzZXR0aW5nCiAgICAgdGhlIENSWVBUT19NREVCVUdfeHh4IG1hY3JvIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5LiAgIAoKICAgICBBbHNvLCB0aGluZ3MgbGlrZSBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgd2lsbCBhbHdheXMgZ2l2ZSB0aGUKICAgICBleHBlY3RlZCByZXN1bHQgKHRoZSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBhbGxvY2F0aW9uCiAgICAgYW5kIGRlYWxsb2NhdGlvbikgYXQgYWxsIHRpbWVzLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtIGFuZCBjb21waWxlcgogICAgIG9wdGlvbnMuCgogICAgIFRvIGZpbmlzaCBpdCB1cCwgc29tZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHVzZSBpbiBhbnkgb3RoZXIKICAgICB3YXkgdGhhbiB0aHJvdWdoIG1hY3JvcyBoYXZlIGEgbmV3IEFQSSBhbmQgbmV3IHNlbWFudGljOgoKICAgICAgIENSWVBUT19kYmdfbWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfcmVhbGxvYygpCiAgICAgICBDUllQVE9fZGJnX2ZyZWUoKQoKICAgICBBbGwgbWFjcm9zIG9mIHZhbHVlIGhhdmUgcmV0YWluZWQgdGhlaXIgb2xkIHN5bnRheC4KICAgICBbUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIFNvbWUgUy9NSU1FIGZpeGVzLiBUaGUgT0lEIGZvciBTTUlNRUNhcGFiaWxpdGllcyB3YXMgd3JvbmcsIHRoZQogICAgIG9yZGVyaW5nIG9mIFNNSU1FQ2FwYWJpbGl0aWVzIHdhc24ndCBpbiAic3RyZW5ndGggb3JkZXIiIGFuZCB0aGVyZQogICAgIHdhcyBhIG1pc3NpbmcgTlVMTCBpbiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBmb3IgdGhlIFNIQTEgc2lnbmF0dXJlCiAgICAgYWxnb3JpdGhtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNvbWUgQVNOMSB0eXBlcyB3aXRoIGlsbGVnYWwgemVybyBsZW5ndGggZW5jb2RpbmcgKElOVEVHRVIsCiAgICAgRU5VTUVSQVRFRCBhbmQgT0JKRUNUIElERU5USUZJRVIpIGNob2tlZCB0aGUgQVNOMSByb3V0aW5lcy4KICAgICBbRnJhbnMgSGV5bWFucyA8ZmhleW1hbnNAaXNhc2VydmVyLmJlPiwgbW9kaWZpZWQgYnkgU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZSBpbiBteSBTL01JTUUgbGlicmFyeSBmb3IgT3BlblNTTC4gVGhpcyBwcm92aWRlcyBhIHNpbXBsZQogICAgIFMvTUlNRSBBUEkgb24gdG9wIG9mIHRoZSBQS0NTIzcgY29kZSwgYSBNSU1FIHBhcnNlciAod2l0aCBlbm91Z2gKICAgICBmdW5jdGlvbmFsaXR5IHRvIGhhbmRsZSBtdWx0aXBhcnQvc2lnbmVkIHByb3Blcmx5KSBhbmQgYSB1dGlsaXR5CiAgICAgY2FsbGVkICdzbWltZScgdG8gY2FsbCBhbGwgdGhpcyBzdHVmZi4gVGhpcyBpcyBiYXNlZCBvbiBjb2RlIEkKICAgICBvcmlnaW5hbGx5IHdyb3RlIGZvciBDZWxvIHdobyBoYXZlIGtpbmRseSBhbGxvd2VkIGl0IHRvIGJlCiAgICAgaW5jbHVkZWQgaW4gT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaWFudHMgZGVzX3NldF9rZXlfY2hlY2tlZCBhbmQgZGVzX3NldF9rZXlfdW5jaGVja2VkIG9mCiAgICAgZGVzX3NldF9rZXkgKGFrYSBkZXNfa2V5X3NjaGVkKS4gIEdsb2JhbCB2YXJpYWJsZSBkZXNfY2hlY2tfa2V5CiAgICAgZGVjaWRlcyB3aGljaCBvZiB0aGVzZSBpcyBjYWxsZWQgYnkgZGVzX3NldF9rZXk7IHRoaXMgd2F5CiAgICAgZGVzX2NoZWNrX2tleSBiZWhhdmVzIGFzIGl0IGFsd2F5cyBkaWQsIGJ1dCBhcHBsaWNhdGlvbnMgYW5kCiAgICAgdGhlIGxpYnJhcnkgaXRzZWxmLCB3aGljaCB3YXMgYnVnZ3kgZm9yIGRlc19jaGVja19rZXkgPT0gMSwKICAgICBoYXZlIGEgY2xlYW5lciB3YXkgdG8gcGljayB0aGUgdmVyc2lvbiB0aGV5IG5lZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFBLQ1MxMl9uZXdwYXNzKCkgd2hpY2ggY2hhbmdlcyB0aGUgcGFzc3dvcmQgb2YgYQogICAgIFBLQ1MxMiBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFg1MDlfVFJVU1QgYW5kIFg1MDlfUFVSUE9TRSBzbyBpdCBhbHNvIHVzZXMgYSBzdGF0aWMgYW5kCiAgICAgZHluYW1pYyBtaXguIEluIGJvdGggY2FzZXMgdGhlIGlkcyBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHRoZQogICAgIHRhYmxlLiBBbHNvIG1vZGlmaWVkIHRoZSBYNTA5X1RSVVNUX2FkZCgpIGFuZCBYNTA5X1BVUlBPU0VfYWRkKCkKICAgICBmdW5jdGlvbnMgc28gdGhleSBhY2NlcHQgYSBsaXN0IG9mIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIHRoZQogICAgIGFwcGxpY2F0aW9uIGRvZXNuJ3QgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBYNTA5X1RSVVNUCiAgICAgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgQVNOMV9TVFJJTkdfVEFCTEUgc3R1ZmYgc28gaXQgYWxzbyB1c2VzIGJzZWFyY2ggYW5kIGRvZXNuJ3QKICAgICBuZWVkIGluaXRpYWxpc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIHdheSB0aGUgVjMgZXh0ZW5zaW9uIGNvZGUgbG9va3MgdXAgZXh0ZW5zaW9ucy4gVGhpcyBub3cKICAgICB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSBvYmplY3QgY29kZTogd2UgaGF2ZSBzb21lICJzdGFuZGFyZCIKICAgICBleHRlbnNpb25zIGluIGEgc3RhdGljIHRhYmxlIHdoaWNoIGlzIHNlYXJjaGVkIHdpdGggT0JKX2JzZWFyY2goKQogICAgIGFuZCB0aGUgYXBwbGljYXRpb24gY2FuIGFkZCBkeW5hbWljIG9uZXMgaWYgbmVlZGVkLiBUaGUgZmlsZQogICAgIGNyeXB0by94NTA5djMvZXh0X2RhdC5oIG5vdyBoYXMgdGhlIGluZm86IHRoaXMgZmlsZSBuZWVkcyB0byBiZQogICAgIHVwZGF0ZWQgd2hlbmV2ZXIgYSBuZXcgZXh0ZW5zaW9uIGlzIGFkZGVkIHRvIHRoZSBjb3JlIGNvZGUgYW5kIGtlcHQKICAgICBpbiBleHRfbmlkIG9yZGVyLiBUaGVyZSBpcyBhIHNpbXBsZSBwcm9ncmFtICd0YWJ0ZXN0LmMnIHdoaWNoIGNoZWNrcwogICAgIHRoaXMuIE5ldyBleHRlbnNpb25zIGFyZSBub3QgYWRkZWQgdG9vIG9mdGVuIHNvIHRoaXMgZmlsZSBjYW4gcmVhZGlseQogICAgIGJlIG1haW50YWluZWQgbWFudWFsbHkuCgogICAgIFRoZXJlIGFyZSB0d28gYmlnIGFkdmFudGFnZXMgaW4gZG9pbmcgdGhpbmdzIHRoaXMgd2F5LiBUaGUgZXh0ZW5zaW9ucwogICAgIGNhbiBiZSBsb29rZWQgdXAgaW1tZWRpYXRlbHkgYW5kIG5vIGxvbmdlciBuZWVkIHRvIGJlICJhZGRlZCIgdXNpbmcKICAgICBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKTogdGhpcyBmdW5jdGlvbiBub3cgZG9lcyBub3RoaW5nLgogICAgIFtTaWRlIG5vdGU6IEkgZ2V0ICpsb3RzKiBvZiBlbWFpbCBzYXlpbmcgdGhlIGV4dGVuc2lvbiBjb2RlIGRvZXNuJ3QKICAgICAgd29yayBiZWNhdXNlIHBlb3BsZSBmb3JnZXQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXQogICAgIEFsc28gbm8gZHluYW1pYyBhbGxvY2F0aW9uIGlzIGRvbmUgdW5sZXNzIG5ldyBleHRlbnNpb25zIGFyZSBhZGRlZDoKICAgICBzbyBpZiB3ZSBkb24ndCBhZGQgY3VzdG9tIGV4dGVuc2lvbnMgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsCiAgICAgWDUwOVYzX0VYVF9jbGVhbnVwKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGVuYyB1dGlsaXR5J3Mgc2FsdGluZyBhcyBmb2xsb3dzOiBtYWtlIHNhbHRpbmcgdGhlIGRlZmF1bHQuIEFkZCBhCiAgICAgbWFnaWMgaGVhZGVyLCBzbyB1bnNhbHRlZCBmaWxlcyBmYWlsIGdyYWNlZnVsbHkgaW5zdGVhZCBvZiBqdXN0IGRlY3J5cHRpbmcKICAgICB0byBnYXJiYWdlLiBUaGlzIGlzIGJlY2F1c2Ugbm90IHNhbHRpbmcgaXMgYSBiaWcgc2VjdXJpdHkgaG9sZSwgc28gcGVvcGxlCiAgICAgc2hvdWxkIGJlIGRpc2NvdXJhZ2VkIGZyb20gZG9pbmcgaXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlICd4NTA5JyB1dGlsaXR5LiBJdCBhbGxvd2VkIGEgbWVzc2FnZQogICAgIGRpZ2VzdCB0byBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBidXQgaXQgb25seSB1c2VkIHRoaXMKICAgICBwYXJhbWV0ZXIgd2hlbiBzaWduaW5nIGEgY2VydGlmaWNhdGUuIE1vZGlmaWVkIHNvIGFsbCByZWxldmFudAogICAgIG9wZXJhdGlvbnMgYXJlIGFmZmVjdGVkIGJ5IHRoZSBkaWdlc3QgcGFyYW1ldGVyIGluY2x1ZGluZyB0aGUKICAgICAtZmluZ2VycHJpbnQgYW5kIC14NTA5dG9yZXEgb3B0aW9ucy4gQWxzbyAteDUwOXRvcmVxIGNob2tlZCBpZiBhCiAgICAgRFNBIGtleSB3YXMgdXNlZCBiZWNhdXNlIGl0IGRpZG4ndCBmaXggdGhlIGRpZ2VzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmeSBjb2RlLiBDdXJyZW50bHkgdGVzdHMgdGhlIHVudHJ1c3RlZAogICAgIGNlcnRpZmljYXRlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2UgKHdoaWNoIGlzIHNldAogICAgIHdoZW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZSBpcyBzZXQgdXApIGFuZCBjaGVja3MgdGhlIHBhdGhsZW5ndGguCgogICAgIFRoZXJlIGlzIGEgTk9fQ0hBSU5fVkVSSUZZIGNvbXBpbGF0aW9uIG9wdGlvbiB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyOgogICAgIHRoaXMgaXMgYmVjYXVzZSBpdCB3aWxsIHJlamVjdCBjaGFpbnMgd2l0aCBpbnZhbGlkIGV4dGVuc2lvbnMgd2hlcmVhcwogICAgIGV2ZXJ5IHByZXZpb3VzIHZlcnNpb24gb2YgT3BlblNTTCBhbmQgU1NMZWF5IG1hZGUgbm8gY2hlY2tzIGF0IGFsbC4KCiAgICAgVHJ1c3QgY29kZTogY2hlY2tzIHRoZSByb290IENBIGZvciB0aGUgcmVsZXZhbnQgdHJ1c3Qgc2V0dGluZ3MuIFRydXN0CiAgICAgc2V0dGluZ3MgaGF2ZSBhbiBpbml0aWFsIHZhbHVlIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2U6IGUuZy4KICAgICBpZiB0aGUgdmVyaWZ5IHB1cnBvc2UgaXMgZm9yIFNTTCBjbGllbnQgdXNlIGl0IGV4cGVjdHMgdGhlIENBIHRvIGJlCiAgICAgdHJ1c3RlZCBmb3IgU1NMIGNsaWVudCB1c2UuIEhvd2V2ZXIgdGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgdG8KICAgICBwZXJtaXQgY3VzdG9tIHRydXN0IHNldHRpbmdzOiBvbmUgZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIHRvIG9ubHkgdHJ1c3QKICAgICBjZXJ0aWZpY2F0ZXMgZnJvbSBhIHNwZWNpZmljICJzZWN1cmUiIHNldCBvZiBDQXMuCgogICAgIEFsc28gYWRkZWQgWDUwOV9TVE9SRV9DVFhfbmV3KCkgYW5kIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoKSBmdW5jdGlvbnMKICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgdmVyc2lvbiBwb3J0YWJpbGl0eTogZXNwZWNpYWxseSBzaW5jZSB0aGUKICAgICB2ZXJpZnkgc3RydWN0dXJlIGlzIGxpa2VseSB0byBjaGFuZ2UgbW9yZSBvZnRlbiBub3cuCgogICAgIFNTTCBpbnRlZ3JhdGlvbi4gQWRkIHB1cnBvc2UgYW5kIHRydXN0IHRvIFNTTF9DVFggYW5kIFNTTCBhbmQgZnVuY3Rpb25zCiAgICAgdG8gc2V0IHRoZW0uIElmIG5vdCBzZXQgdGhlbiBhc3N1bWUgU1NMIGNsaWVudHMgd2lsbCB2ZXJpZnkgU1NMIHNlcnZlcnMKICAgICBhbmQgdmljZSB2ZXJzYS4KCiAgICAgVHdvIG5ldyBvcHRpb25zIHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbTogLXVudHJ1c3RlZCBhbGxvd3MgYSBzZXQgb2YKICAgICB1bnRydXN0ZWQgY2VydGlmaWNhdGVzIHRvIGJlIHBhc3NlZCBpbiBhbmQgLXB1cnBvc2Ugd2hpY2ggc2V0cyB0aGUKICAgICBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSBjZXJ0aWZpY2F0ZS4gSWYgYSBwdXJwb3NlIGlzIHNldCB0aGVuIHRoZQogICAgIG5ldyBjaGFpbiB2ZXJpZnkgY29kZSBpcyB1c2VkIHRvIGNoZWNrIGV4dGVuc2lvbiBjb25zaXN0ZW5jeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgYXV0aG9yaXR5IGluZm9ybWF0aW9uIGFjY2VzcyBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFJTQSBhbmQgRFNBIFBFTSByZWFkIHJvdXRpbmVzIHRvIHRyYW5zcGFyZW50bHkgaGFuZGxlCiAgICAgUEtDUyM4IGZvcm1hdCBwcml2YXRlIGtleXMuIE5ldyAqX1BVQktFWV8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZQogICAgIHB1YmxpYyBrZXlzIGluIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBjZXJ0aWZpY2F0ZQogICAgIFN1YmplY3RQdWJsaWNLZXlJbmZvIHN0cnVjdHVyZXMuIFVuZm9ydHVuYXRlbHkgdGhlcmUgd2VyZSBhbHJlYWR5CiAgICAgZnVuY3Rpb25zIGNhbGxlZCAqX1B1YmxpY0tleV8qIHdoaWNoIHVzZWQgdmFyaW91cyBvZGQgZm9ybWF0cyBzbwogICAgIHRoZXNlIGFyZSByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eTogaG93ZXZlciB0aGUgRFNBIHZhcmlhbnRzIHdlcmUKICAgICBuZXZlciBpbiBhIHB1YmxpYyByZWxlYXNlIHNvIHRoZXkgaGF2ZSBiZWVuIGRlbGV0ZWQuIENoYW5nZWQgZHNhL3JzYQogICAgIHV0aWxpdGllcyB0byBoYW5kbGUgdGhlIG5ldyBmb3JtYXQ6IG5vdGUgbm8gcmVsZWFzZXMgZXZlciBoYW5kbGVkIHB1YmxpYwogICAgIGtleXMgc28gd2Ugc2hvdWxkIGJlIE9LLgoKICAgICBUaGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBhdm9pZCB0aGUgc2FtZSBmaWFzY28KICAgICB0aGF0IGRvZ3MgcHJpdmF0ZSBrZXlzOiB0aGVyZSBhcmUgc2V2ZXJhbCBpbmNvbXBhdGlibGUgcHJpdmF0ZSBrZXkKICAgICBmb3JtYXRzIHNvbWUgb2Ygd2hpY2ggYXJlIHN0YW5kYXJkIGFuZCBzb21lIE9wZW5TU0wgc3BlY2lmaWMgYW5kCiAgICAgcmVxdWlyZSB2YXJpb3VzIGV2aWwgaGFja3MgdG8gYWxsb3cgcGFydGlhbCB0cmFuc3BhcmVudCBoYW5kbGluZyBhbmQKICAgICBldmVuIHRoZW4gaXQgZG9lc24ndCB3b3JrIHdpdGggREVSIGZvcm1hdHMuIEdpdmVuIHRoZSBvcHRpb24gYW55dGhpbmcKICAgICBvdGhlciB0aGFuIFBLQ1MjOCBzaG91bGQgYmUgZHVtcGVkOiBidXQgdGhlIG90aGVyIGZvcm1hdHMgaGF2ZSB0bwogICAgIHN0YXkgaW4gdGhlIG5hbWUgb2YgY29tcGF0aWJpbGl0eS4KCiAgICAgV2l0aCBwdWJsaWMga2V5cyBhbmQgdGhlIGJlbmVmaXQgb2YgaGluZHNpZ2h0IG9uZSBzdGFuZGFyZCBmb3JtYXQgCiAgICAgaXMgdXNlZCB3aGljaCB3b3JrcyB3aXRoIEVWUF9QS0VZLCBSU0Egb3IgRFNBIHN0cnVjdHVyZXM6IHRob3VnaAogICAgIGl0IGNsZWFybHkgcmV0dXJucyBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgdGhlIHdyb25nIGtpbmQgb2Yga2V5LgoKICAgICBBZGRlZCBhIC1wdWJrZXkgb3B0aW9uIHRvIHRoZSAneDUwOScgdXRpbGl0eSB0byBvdXRwdXQgdGhlIHB1YmxpYyBrZXkuCiAgICAgQWxzbyByZW5hbWUgdGhlIEVWUF9QS0VZX2dldF8qKCkgdG8gRVZQX1BLRVlfcmdldF8qKCkKICAgICAocmVuYW1lZCB0byBFVlBfUEtFWV9nZXQxXyooKSBpbiB0aGUgT3BlblNTTCAwLjkuNSByZWxlYXNlKSBhbmQgYWRkCiAgICAgRVZQX1BLRVlfcnNldF8qKCkgZnVuY3Rpb25zIChyZW5hbWVkIHRvIEVWUF9QS0VZX3NldDFfKigpKQogICAgIHRoYXQgZG8gdGhlIHNhbWUgYXMgdGhlIEVWUF9QS0VZX2Fzc2lnbl8qKCkgZXhjZXB0IHRoZXkgdXAgdGhlCiAgICAgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBhZGRlZCBrZXkgKHRoZXkgZG9uJ3QgInN3YWxsb3ciIHRoZQogICAgIHN1cHBsaWVkIGtleSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gY3J5cHRvL3g1MDkvYnlfZmlsZS5jIHRoZSBjb2RlIHRvIHJlYWQgaW4gY2VydGlmaWNhdGVzIGFuZAogICAgIENSTHMgd291bGQgZmFpbCBpZiB0aGUgZmlsZSBjb250YWluZWQgbm8gY2VydGlmaWNhdGVzIG9yIG5vIENSTHM6CiAgICAgYWRkZWQgYSBuZXcgZnVuY3Rpb24gdG8gcmVhZCBpbiBib3RoIHR5cGVzIGFuZCByZXR1cm4gdGhlIG51bWJlcgogICAgIHJlYWQ6IHRoaXMgbWVhbnMgdGhhdCBpZiBub25lIGFyZSByZWFkIGl0IHdpbGwgYmUgYW4gZXJyb3IuIFRoZQogICAgIERFUiB2ZXJzaW9ucyBvZiB0aGUgY2VydGlmaWNhdGUgYW5kIENSTCByZWFkZXIgd291bGQgYWx3YXlzIGZhaWwKICAgICBiZWNhdXNlIGl0IGlzbid0IHBvc3NpYmxlIHRvIG1peCBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMgaW4gREVSIGZvcm1hdAogICAgIHdpdGhvdXQgY2hva2luZyBvbmUgb3IgdGhlIG90aGVyIHJvdXRpbmUuIENoYW5nZWQgdGhpcyB0byBqdXN0IHJlYWQKICAgICBhIGNlcnRpZmljYXRlOiB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4gQWxzbyBtb2RpZmllZCB0aGUgY29kZQogICAgIGluIGFwcHMvdmVyaWZ5LmMgdG8gdGFrZSBub3RpY2Ugb2YgcmV0dXJuIGNvZGVzOiBpdCB3YXMgcHJldmlvdXNseQogICAgIGF0dGVtcHRpbmcgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgZnJvbSBOVUxMIHBvaW50ZXJzIGFuZCBpZ25vcmluZwogICAgIGFueSBlcnJvcnM6IHRoaXMgaXMgb25lIHJlYXNvbiB3aHkgdGhlIGNlcnQgYW5kIENSTCByZWFkZXIgc2VlbWVkCiAgICAgdG8gd29yay4gSXQgZG9lc24ndCBjaGVjayByZXR1cm4gY29kZXMgZnJvbSB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZQogICAgIHJvdXRpbmVzOiB0aGVzZSBtYXkgd2VsbCBmYWlsIGlmIHRoZSBjZXJ0aWZpY2F0ZXMgYXJlbid0IGluc3RhbGxlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb2RlIHRvIHN1cHBvcnQgb3RoZXJOYW1lIG9wdGlvbiBpbiBHZW5lcmFsTmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXJzdCB1cGRhdGUgdG8gdmVyaWZ5IGNvZGUuIENoYW5nZSB0aGUgdmVyaWZ5IHV0aWxpdHkKICAgICBzbyBpdCB3YXJucyBpZiBpdCBpcyBwYXNzZWQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZToKICAgICBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgbm9ybWFsIGJlaGF2aW91ci4gWDUwOV92ZXJpZnkKICAgICBoYXMgYmVlbiBtb2RpZmllZCB0byBpdCB3aWxsIG5vdyB2ZXJpZnkgYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlmICpleGFjdGx5KiB0aGUgc2FtZSBjZXJ0aWZpY2F0ZSBhcHBlYXJzCiAgICAgaW4gdGhlIHN0b3JlOiBpdCB3YXMgcHJldmlvdXNseSBpbXBvc3NpYmxlIHRvIHRydXN0IGEKICAgICBzaW5nbGUgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUuIFRoaXMgbWVhbnMgdGhhdDoKICAgICBvcGVuc3NsIHZlcmlmeSBzcy5wZW0KICAgICBub3cgZ2l2ZXMgYSB3YXJuaW5nIGFib3V0IGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgYnV0CiAgICAgb3BlbnNzbCB2ZXJpZnkgLUNBZmlsZSBzcy5wZW0gc3MucGVtCiAgICAgaXMgT0suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIHNlcnZlcnMsIHN0b3JlIHZlcmlmeV9yZXN1bHQgaW4gU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUKICAgICAoYW5kIGFkZCBpdCB0byBleHRlcm5hbCBzZXNzaW9uIHJlcHJlc2VudGF0aW9uKS4KICAgICBUaGlzIGlzIG5lZWRlZCB3aGVuIGNsaWVudCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb25zIGZhaWxzLAogICAgIGJ1dCBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCB2ZXJpZmljYXRpb24gY2FsbGJhY2sgKHNldCBieQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKSBhbGxvd3MgYWNjZXB0aW5nIHRoZSBzZXNzaW9uCiAgICAgYW55d2F5IChpLmUuIGxlYXZlcyB4NTA5X3N0b3JlX2N0eC0+ZXJyb3IgIT0gWDUwOV9WX09LCiAgICAgYnV0IHJldHVybnMgMSk6IFdoZW4gdGhlIHNlc3Npb24gaXMgcmV1c2VkLCB3ZSBoYXZlIHRvIHNldAogICAgIHNzbC0+dmVyaWZ5X3Jlc3VsdCB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB0byBhdm9pZAogICAgIHNlY3VyaXR5IGhvbGVzLgogICAgIFtCb2RvIE1vZWxsZXIsIHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGEgYnVnIGluIHRoZSBuZXcgUEtDUyM3IGNvZGU6IGl0IGRpZG4ndCBjb25zaWRlciB0aGUKICAgICBjYXNlIGluIFBLQ1M3X2RhdGFJbml0KCkgd2hlcmUgdGhlIHNpZ25lZCBQS0NTNyBzdHJ1Y3R1cmUKICAgICBkaWRuJ3QgY29udGFpbiBhbnkgZXhpc3RpbmcgZGF0YSBiZWNhdXNlIGl0IHdhcyBiZWluZyBjcmVhdGVkLgogICAgIFtQby1DaGVuZyBDaGVuIDxwb2NoZW5nQG5zdC5jb20udHc+LCBzbGlnaHRseSBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHNhbHQgdG8gdGhlIGtleSBkZXJpdmF0aW9uIHJvdXRpbmVzIGluIGVuYy5jLiBUaGlzCiAgICAgZm9ybXMgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBmaWxlLiBBbHNvIGFkZCBhCiAgICAgLVMgb3B0aW9uIHRvIGFsbG93IGEgc2FsdCB0byBiZSBpbnB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X2NtcCgpLiBPZGRseSBlbm91Z2ggdGhlcmUgd2Fzbid0IGEgZnVuY3Rpb24KICAgICB0byBjb21wYXJlIHR3byBjZXJ0aWZpY2F0ZXMuIFdlIGRvIHRoaXMgYnkgd29ya2luZyBvdXQgdGhlIFNIQTEKICAgICBoYXNoIGFuZCBjb21wYXJpbmcgdGhhdC4gWDUwOV9jbXAoKSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgdHJ1c3QKICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTF9nZXQxX3Nlc3Npb24oKSBpcyBsaWtlIFNTTF9nZXRfc2Vzc2lvbigpLCBidXQgaW5jcmVtZW50cwogICAgIHRoZSByZWZlcmVuY2UgY291bnQgaW4gdGhlIFNTTF9TRVNTSU9OIHJldHVybmVkLgogICAgIFtHZW9mZiBUaG9ycGUgPGdlb2ZmQGV1LmMyLm5ldD5dCgogICopIEZpeCBmb3IgJ3JlcSc6IGl0IHdhcyBhZGRpbmcgYSBudWxsIHRvIHJlcXVlc3QgYXR0cmlidXRlcy4KICAgICBBbHNvIGNoYW5nZSB0aGUgWDUwOV9MT09LVVAgYW5kIFg1MDlfSU5GTyBjb2RlIHRvIGhhbmRsZQogICAgIGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgNDAgYW5kIDY0IGJpdCBSQzIgYW5kIFJDNCBhbGdvcml0aG1zOiBkb2N1bWVudAogICAgIHRoZSAnZW5jJyBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBtZW1vcnkgbGVhawogICAgIGRldGVjdGluZyBvdXRwdXQsIHRvIGZvcm0gdHJhY2ViYWNrcywgc2hvd2luZyBmcm9tIHdoZXJlIGVhY2gKICAgICBhbGxvY2F0aW9uIHdhcyBvcmlnaW5hdGVkOiBDUllQVE9fcHVzaF9pbmZvKCJjb25zdGFudCBzdHJpbmciKSBhZGRzCiAgICAgdGhlIHN0cmluZyBwbHVzIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0byBhIHBlci10aHJlYWQKICAgICBzdGFjaywgQ1JZUFRPX3BvcF9pbmZvKCkgZG9lcyB0aGUgb2J2aW91cywgQ1JZUFRPX3JlbW92ZV9hbGxfaW5mbygpCiAgICAgaXMgbGlrZSBjYWxsaW5nIENZUlBUT19wb3BfaW5mbygpIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eS4KICAgICBBbHNvIHVwZGF0ZWQgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgdG8gYmUgbXVsdGktdGhyZWFkLXNhZmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIG9wdGlvbnMgLXRleHQgYW5kIC1ub291dCB0byBwa2NzNyB1dGlsaXR5IGFuZCBkZWxldGUgdGhlCiAgICAgZW5jcnlwdGlvbiBvcHRpb25zIHdoaWNoIG5ldmVyIGRpZCBhbnl0aGluZy4gVXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbnMgdG8gc29tZSBvZiB0aGUgdXRpbGl0aWVzIHRvIGFsbG93IHRoZSBwYXNzIHBocmFzZQogICAgIHRvIGJlIGluY2x1ZGVkIG9uIGVpdGhlciB0aGUgY29tbWFuZCBsaW5lIChub3QgcmVjb21tZW5kZWQgb24KICAgICBPU2VzIGxpa2UgVW5peCkgb3IgcmVhZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gVXBkYXRlIHRoZQogICAgIG1hbnBhZ2VzIGFuZCBmaXggYSBmZXcgYnVncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmZXcgbWFucGFnZXMgZm9yIHNvbWUgb2YgdGhlIG9wZW5zc2wgY29tbWFuZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAtcmV2b2tlIG9wdGlvbiBpbiBjYS4gSXQgd2FzIGZyZWVpbmcgdXAgbWVtb3J5IHR3aWNlLAogICAgIGxlYWtpbmcgYW5kIG5vdCBmaW5kaW5nIGFscmVhZHkgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gc3VwcG9ydCBjZXJ0aWZpY2F0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uCiAgICAgVGhpcyBpbnZvbHZlcyB0aGUgdXNlIG9mIFg1MDlfQ0VSVF9BVVggc3RydWN0dXJlIGFuZCBYNTA5X0FVWAogICAgIGZ1bmN0aW9ucy4gQW4gWDUwOV9BVVggZnVuY3Rpb24gc3VjaCBhcyBQRU1fcmVhZF9YNTA5X0FVWCgpCiAgICAgY2FuIHN0aWxsIHJlYWQgaW4gYSBjZXJ0aWZpY2F0ZSBmaWxlIGluIHRoZSB1c3VhbCB3YXkgYnV0IGl0CiAgICAgd2lsbCBhbHNvIHJlYWQgaW4gYW55IGFkZGl0aW9uYWwgImF1eGlsaWFyeSBpbmZvcm1hdGlvbiIuIEJ5CiAgICAgZG9pbmcgdGhpbmdzIHRoaXMgd2F5IGEgZmFpciBkZWdyZWUgb2YgY29tcGF0aWJpbGl0eSBjYW4gYmUKICAgICByZXRhaW5lZDogZXhpc3RpbmcgY2VydGlmaWNhdGVzIGNhbiBoYXZlIHRoaXMgaW5mb3JtYXRpb24gYWRkZWQKICAgICB1c2luZyB0aGUgbmV3ICd4NTA5JyBvcHRpb25zLiAKCiAgICAgQ3VycmVudCBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW5jbHVkZXMgYW4gImFsaWFzIiBhbmQgc29tZSB0cnVzdAogICAgIHNldHRpbmdzLiBUaGUgdHJ1c3Qgc2V0dGluZ3Mgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgaW4gZW5oYW5jZWQKICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gcm91dGluZXM6IGN1cnJlbnRseSBhIGNlcnRpZmljYXRlCiAgICAgY2FuIG9ubHkgYmUgdHJ1c3RlZCBpZiBpdCBpcyBzZWxmIHNpZ25lZCBhbmQgdGhlbiBpdCBpcyB0cnVzdGVkCiAgICAgZm9yIGFsbCBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYXNzZW1ibGVyIGZvciBBbHBoYSAodGVzdGVkIG9ubHkgb24gREVDIE9TRiBub3QgTGludXggb3IgKkJTRCkuCiAgICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgb25lIG9mIHRoZSByZXBsYWNlbWVudCByb3V0aW5lcyBoYWQgbm90IGJlZW4gd29ya2luZwogICAgIHNpbmNlIFNTTGVheSByZWxlYXNlcy4gIEZvciBub3cgdGhlIG9mZmVuZGluZyByb3V0aW5lIGhhcyBiZWVuIHJlcGxhY2VkCiAgICAgd2l0aCBub24tb3B0aW1pc2VkIGFzc2VtYmxlci4gIEV2ZW4gc28sIHRoaXMgbm93IGdpdmVzIGFyb3VuZCA5NSUKICAgICBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgMTAyNCBiaXQgUlNBIHNpZ25zLgogICAgIFtNYXJrIENveF0KCiAgKikgSGFjayB0byBmaXggUEtDUyM3IGRlY3J5cHRpb24gd2hlbiB1c2VkIHdpdGggc29tZSB1bm9ydGhvZG94IFJDMiAKICAgICBoYW5kbGluZy4gTW9zdCBjbGllbnRzIGhhdmUgdGhlIGVmZmVjdGl2ZSBrZXkgc2l6ZSBpbiBiaXRzIGVxdWFsIHRvCiAgICAgdGhlIGtleSBsZW5ndGggaW4gYml0czogc28gYSA0MCBiaXQgUkMyIGtleSB1c2VzIGEgNDAgYml0ICg1IGJ5dGUpIGtleS4KICAgICBBIGZldyBob3dldmVyIGRvbid0IGRvIHRoaXMgYW5kIGluc3RlYWQgdXNlIHRoZSBzaXplIG9mIHRoZSBkZWNyeXB0ZWQga2V5CiAgICAgdG8gZGV0ZXJtaW5lIHRoZSBSQzIga2V5IGxlbmd0aCBhbmQgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lCiAgICAgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoLiBJbiB0aGlzIGNhc2UgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGNhbiBzdGlsbAogICAgIGJlIDQwIGJpdHMgYnV0IHRoZSBrZXkgbGVuZ3RoIGNhbiBiZSAxNjggYml0cyBmb3IgZXhhbXBsZS4gVGhpcyBpcyBmaXhlZAogICAgIGJ5IG1hbnVhbGx5IGZvcmNpbmcgYW4gUkMyIGtleSBpbnRvIHRoZSBFVlBfUEtFWSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUKICAgICBFVlAgY29kZSBjYW4ndCBjdXJyZW50bHkgaGFuZGxlIHVudXN1YWwgUkMyIGtleSBzaXplczogaXQgYWx3YXlzIGFzc3VtZXMKICAgICB0aGUga2V5IGxlbmd0aCBhbmQgZWZmZWN0aXZlIGtleSBsZW5ndGggYXJlIGVxdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgCiAgICAgWDUwOV9OQU1FIHN0cnVjdHVyZXMuIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZG86CiAgICAgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQobm0sICJDTiIsIE1CU1RSSU5HX0FTQywgIlN0ZXZlIiwgLTEsIC0xLCAwKTsKICAgICBhbmQgaGF2ZSBpdCBhdXRvbWF0aWNhbGx5IHdvcmsgb3V0IHRoZSBjb3JyZWN0IGZpZWxkIHR5cGUgYW5kIGZpbGwgaW4KICAgICB0aGUgc3RydWN0dXJlcy4gVGhlIG1vcmUgYWR2ZW50dXJvdXMgY2FuIHRyeToKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgZmllbGQsIE1CU1RSSU5HX1VURjgsIHN0ciwgLTEsIC0xLCAwKTsKICAgICBhbmQgaXQgd2lsbCAoaG9wZWZ1bGx5KSB3b3JrIG91dCB0aGUgY29ycmVjdCBtdWx0aWJ5dGUgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSAncmVxJyB1dGlsaXR5IHRvIHVzZSB0aGUgbmV3IGZpZWxkIGhhbmRsaW5nIGFuZCBtdWx0aWJ5dGUKICAgICBjb3B5IHJvdXRpbmVzLiBCZWZvcmUgdGhlIEROIGZpZWxkIGNyZWF0aW9uIHdhcyBoYW5kbGVkIGluIGFuIGFkIGhvYwogICAgIHdheSBpbiByZXEsIGNhLCBhbmQgeDUwOSB3aGljaCB3YXMgcmF0aGVyIGJyb2tlbiBhbmQgZGlkbid0IHN1cHBvcnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzLiBTaW5jZSBzb21lIHNvZnR3YXJlIGRvZXNuJ3QgaW1wbGVtZW50CiAgICAgQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncyB5ZXQsIHRoZXkgY2FuIGJlIGVuYWJsZWQgdXNpbmcgdGhlIGNvbmZpZyBmaWxlCiAgICAgdXNpbmcgdGhlIGRpcnN0cmluZ190eXBlIG9wdGlvbi4gU2VlIHRoZSBuZXcgY29tbWVudCBpbiB0aGUgZGVmYXVsdAogICAgIG9wZW5zc2wuY25mIGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBjcnlwdG8vcmFuZC9tZF9yYW5kLmMgbW9yZSByb2J1c3Q6CiAgICAgLSBBc3N1cmUgdW5pcXVlIHJhbmRvbSBudW1iZXJzIGFmdGVyIGZvcmsoKS4KICAgICAtIE1ha2Ugc3VyZSB0aGF0IGNvbmN1cnJlbnQgdGhyZWFkcyBhY2Nlc3MgdGhlIGdsb2JhbCBjb3VudGVyIGFuZAogICAgICAgbWQgc2VyaWFsaXphYmx5IHNvIHRoYXQgd2UgbmV2ZXIgbG9zZSBlbnRyb3B5IGluIHRoZW0KICAgICAgIG9yIHVzZSBleGFjdGx5IHRoZSBzYW1lIHN0YXRlIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgICBBY2Nlc3MgdG8gdGhlIGxhcmdlIHN0YXRlIGlzIG5vdCBhbHdheXMgc2VyaWFsaXphYmxlIGJlY2F1c2UKICAgICAgIHRoZSBhZGRpdGlvbmFsIGxvY2tpbmcgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBraWxsZXIsIGFuZAogICAgICAgbWQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZpbGUgYXBwcy9hcHBfcmFuZC5jIHdpdGggY29tbW9ubHkgbmVlZGVkIGZ1bmN0aW9uYWxpdHkKICAgICBmb3IgaGFuZGxpbmcgdGhlIHJhbmRvbSBzZWVkIGZpbGUuCgogICAgIFVzZSB0aGUgcmFuZG9tIHNlZWQgZmlsZSBpbiBzb21lIGFwcGxpY2F0aW9ucyB0aGF0IHByZXZpb3VzbHkgZGlkIG5vdDoKICAgICAgICAgIGNhLAogICAgICAgICAgZHNhcGFyYW0gLWdlbmtleSAod2hpY2ggYWxzbyBpZ25vcmVkIGl0cyAnLXJhbmQnIG9wdGlvbiksIAogICAgICAgICAgc19jbGllbnQsCiAgICAgICAgICBzX3NlcnZlciwKICAgICAgICAgIHg1MDkgKHdoZW4gc2lnbmluZykuCiAgICAgRXhjZXB0IG9uIHN5c3RlbXMgd2l0aCAvZGV2L3VyYW5kb20sIGl0IGlzIGNydWNpYWwgdG8gaGF2ZSBhIHJhbmRvbQogICAgIHNlZWQgZmlsZSBhdCBsZWFzdCBmb3Iga2V5IGNyZWF0aW9uLCBEU0Egc2lnbmluZywgYW5kIGZvciBESCBleGNoYW5nZXM7CiAgICAgZm9yIFJTQSBzaWduYXR1cmVzIHdlIGNvdWxkIGRvIHdpdGhvdXQgb25lLgoKICAgICBnZW5kaCBhbmQgZ2VuZHNhICh1bmxpa2UgZ2VucnNhKSB1c2VkIHRvIHJlYWQgb25seSB0aGUgZmlyc3QgYnl0ZQogICAgIG9mIGVhY2ggZmlsZSBsaXN0ZWQgaW4gdGhlICctcmFuZCcgb3B0aW9uLiAgVGhlIGZ1bmN0aW9uIGFzIHByZXZpb3VzbHkKICAgICBmb3VuZCBpbiBnZW5yc2EgaXMgbm93IGluIGFwcF9yYW5kLmMgYW5kIGlzIHVzZWQgYnkgYWxsIHByb2dyYW1zCiAgICAgdGhhdCBzdXBwb3J0ICctcmFuZCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gUkFORF93cml0ZV9maWxlLCB1c2UgbW9kZSAwNjAwIGZvciBjcmVhdGluZyBmaWxlczsKICAgICBkb24ndCBqdXN0IGNobW9kIHdoZW4gaXQgbWF5IGJlIHRvbyBsYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcG9ydCBhbiBlcnJvciBmcm9tIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMKICAgICB3aGVuIFg1MDlfTE9PS1VQX2xvYWRfZmlsZSBvciBYNTA5X0xPT0tVUF9hZGRfZGlyIGZhaWxlZC4KICAgICBbQmlsbCBQZXJyeV0KCiAgKikgTmV3IGZ1bmN0aW9uIEFTTjFfbWJzdHJpbmdfY29weSgpIHRoaXMgY29waWVzIGEgc3RyaW5nIGluIGVpdGhlcgogICAgIEFTQ0lJLCBVbmljb2RlLCBVbml2ZXJzYWwgKDQgYnl0ZXMgcGVyIGNoYXJhY3Rlcikgb3IgVVRGOCBmb3JtYXQKICAgICBpbnRvIGFuIEFTTjFfU1RSSU5HIHR5cGUuIEEgbWFzayBvZiBwZXJtaXNzaWJsZSB0eXBlcyBpcyBwYXNzZWQKICAgICBhbmQgaXQgY2hvb3NlcyB0aGUgIm1pbmltYWwiIHR5cGUgdG8gdXNlIG9yIGFuIGVycm9yIGlmIG5vdCB0eXBlCiAgICAgaXMgc3VpdGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uIGVxdWl2YWxlbnRzIHRvIHRoZSB2YXJpb3VzIG1hY3JvcyBpbiBhc24xLmguIFRoZSBvbGQKICAgICBtYWNyb3MgYXJlIHJldGFpbmVkIHdpdGggYW4gTV8gcHJlZml4LiBDb2RlIGluc2lkZSB0aGUgbGlicmFyeSBjYW4KICAgICB1c2UgdGhlIE1fIG1hY3Jvcy4gRXh0ZXJuYWwgY29kZSAoaW5jbHVkaW5nIHRoZSBvcGVuc3NsIHV0aWxpdHkpCiAgICAgc2hvdWxkICpOT1QqIGluIG9yZGVyIHRvIGJlICJzaGFyZWQgbGlicmFyeSBmcmllbmRseSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgY2FuIGNoZWNrIGEgY2VydGlmaWNhdGUncyBleHRlbnNpb25zCiAgICAgdG8gc2VlIGlmIGl0IHVzYWJsZSBmb3IgdmFyaW91cyBwdXJwb3NlcyBzdWNoIGFzIFNTTCBjbGllbnQsCiAgICAgc2VydmVyIG9yIFMvTUlNRSBhbmQgQ0FzIG9mIHRoZXNlIHR5cGVzLiBUaGlzIGlzIGN1cnJlbnRseSAKICAgICBWRVJZIEVYUEVSSU1FTlRBTCBidXQgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgZm9yIGNlcnRpZmljYXRlIGNoYWluCiAgICAgdmVyaWZpY2F0aW9uLiBBbHNvIGFkZGVkIGEgLXB1cnBvc2UgZmxhZyB0byB4NTA5IHV0aWxpdHkgdG8KICAgICBwcmludCBvdXQgYWxsIHRoZSBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBDUllQVE9fRVhfREFUQSB0byBYNTA5IGNlcnRpZmljYXRlIHN0cnVjdHVyZSBhbmQgYXNzb2NpYXRlZAogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgWDUwOVYzX3tYNTA5LENSTCxSRVZPS0VEfV9nZXRfZDJpKCkgZnVuY3Rpb25zLiBUaGVzZSB3aWxsIHNlYXJjaAogICAgIGZvciwgb2J0YWluIGFuZCBkZWNvZGUgYW5kIGV4dGVuc2lvbiBhbmQgb2J0YWluIGl0cyBjcml0aWNhbCBmbGFnLgogICAgIFRoaXMgYWxsb3dzIGFsbCB0aGUgbmVjZXNzYXJ5IGV4dGVuc2lvbiBjb2RlIHRvIGJlIGhhbmRsZWQgaW4gYQogICAgIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJDNCB0dW5lLXVwIGZlYXR1cmluZyAzMC00MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gbW9zdCBSSVNDCiAgICAgcGxhdGZvcm1zLiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IC1ub291dCBvcHRpb24gdG8gYXNuMXBhcnNlLiBUaGlzIGNhdXNlcyBubyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQKICAgICBpdHMgbWFpbiB1c2UgaXMgd2hlbiBjb21iaW5lZCB3aXRoIC1zdHJwYXJzZSBhbmQgLW91dCB0byBleHRyYWN0IGRhdGEKICAgICBmcm9tIGEgZmlsZSAod2hpY2ggbWF5IG5vdCBiZSBpbiBBU04uMSBmb3JtYXQpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgcGtjczEyIHByb2dyYW0uIEl0IHdhcyBoYXNoaW5nIGFuIGludmFsaWQgY2VydGlmaWNhdGUgcG9pbnRlcgogICAgIHdoZW4gcHJvZHVjaW5nIHRoZSBsb2NhbCBrZXkgaWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIE5ldyBvcHRpb24gLWRocGFyYW0gaW4gc19zZXJ2ZXIuIFRoaXMgYWxsb3dzIGEgREggcGFyYW1ldGVyIGZpbGUgdG8gYmUKICAgICBzdGF0ZWQgZXhwbGljaXRseS4gSWYgaXQgaXMgbm90IHN0YXRlZCB0aGVuIGl0IHRyaWVzIHRoZSBmaXJzdCBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZSBmaWxlLiBUaGUgcHJldmlvdXMgYmVoYXZpb3VyIGhhcmQgY29kZWQgdGhlIGZpbGVuYW1lCiAgICAgInNlcnZlci5wZW0iLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtcHViaW4gYW5kIC1wdWJvdXQgb3B0aW9ucyB0byB0aGUgcnNhIGFuZCBkc2EgY29tbWFuZHMuIFRoZXNlIGFsbG93CiAgICAgYSBwdWJsaWMga2V5IHRvIGJlIGlucHV0IG9yIG91dHB1dC4gRm9yIGV4YW1wbGU6CiAgICAgb3BlbnNzbCByc2EgLWluIGtleS5wZW0gLXB1Ym91dCAtb3V0IHB1YmtleS5wZW0KICAgICBBbHNvIGFkZGVkIG5lY2Vzc2FyeSBEU0EgcHVibGljIGtleSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHNvIFBLQ1M3X2RhdGFWZXJpZnkoKSBkb2Vzbid0IGNyYXNoIGlmIG5vIGNlcnRpZmljYXRlcyBhcmUgY29udGFpbmVkCiAgICAgaW4gdGhlIG1lc3NhZ2UuIFRoaXMgd2FzIGhhbmRsZWQgYnkgYWxsb3dpbmcKICAgICBYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwoKSB0byB0b2xlcmF0ZSBhIE5VTEwgcGFzc2VkIHRvIGl0LgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFNhbXBvIEtlbGxvbWFraSA8c2FtcG9AbWFpbC5uZXVyb25pby5wdD5dCgogICopIEZpeCBmb3IgYnVnIGluIGQyaV9BU04xX2J5dGVzKCk6IG90aGVyIEFTTjEgZnVuY3Rpb25zIGFkZCBhbiBleHRyYSBudWxsCiAgICAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5ncyB3aGVyZWFzIHRoaXMgZGlkbid0LiBUaGlzIHdvdWxkIGNhdXNlIHByb2JsZW1zCiAgICAgaWYgc3RyaW5ncyByZWFkIHdpdGggZDJpX0FTTjFfYnl0ZXMoKSB3ZXJlIGxhdGVyIG1vZGlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEFybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEZpeCBmb3IgYmFzZTY0IGRlY29kZSBidWcuIFdoZW4gYSBiYXNlNjQgYmlvIHJlYWRzIG9ubHkgb25lIGxpbmUgb2YKICAgICBkYXRhIGFuZCBpdCBjb250YWlucyBFT0YgaXQgd2lsbCBlbmQgdXAgcmV0dXJuaW5nIGFuIGVycm9yLiBUaGlzIGlzCiAgICAgY2F1c2VkIGJ5IGlucHV0IDQ2IGJ5dGVzIGxvbmcuIFRoZSBjYXVzZSBpcyBkdWUgdG8gdGhlIHdheSBiYXNlNjQKICAgICBCSU9zIGZpbmQgdGhlIHN0YXJ0IG9mIGJhc2U2NCBlbmNvZGVkIGRhdGEuIFRoZXkgZG8gdGhpcyBieSB0cnlpbmcgYQogICAgIHRyaWFsIGRlY29kZSBvbiBlYWNoIGxpbmUgdW50aWwgdGhleSBmaW5kIG9uZSB0aGF0IHdvcmtzLiBXaGVuIHRoZXkKICAgICBkbyBhIGZsYWcgaXMgc2V0IGFuZCBpdCBzdGFydHMgYWdhaW4ga25vd2luZyBpdCBjYW4gcGFzcyBhbGwgdGhlCiAgICAgZGF0YSBkaXJlY3RseSB0aHJvdWdoIHRoZSBkZWNvZGVyLiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3QgcmVzZXQKICAgICB0aGUgY29udGV4dCBpdCB1c2VzLiBUaGlzIG1lYW5zIHRoYXQgaWYgRU9GIGlzIHJlYWNoZWQgYW4gYXR0ZW1wdAogICAgIGlzIG1hZGUgdG8gcGFzcyB0d28gRU9GcyB0aHJvdWdoIHRoZSBjb250ZXh0IGFuZCB0aGlzIGNhdXNlcyB0aGUKICAgICByZXN1bHRpbmcgZXJyb3IuIFRoaXMgY2FuIGFsc28gY2F1c2Ugb3RoZXIgcHJvYmxlbXMgYXMgd2VsbC4gQXMgaXMKICAgICB1c3VhbCB3aXRoIHRoZXNlIHByb2JsZW1zIGl0IHRha2VzICphZ2VzKiB0byBmaW5kIGFuZCB0aGUgZml4IGlzCiAgICAgdHJpdmlhbDogbW92ZSBvbmUgbGluZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBpYW5AdW5zLm5zLmFjLnl1IChJdmFuIE5lamdlYmF1ZXIpIF0KCiAgKikgVWdseSB3b3JrYXJvdW5kIHRvIGdldCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgd29ya2luZyB1bmRlciBXaW5kb3dzLiBUaGUKICAgICBvbGQgY29kZSB3b3VsZG4ndCB3b3JrIGJlY2F1c2UgaXQgbmVlZGVkIHRvIHNlbGVjdCgpIG9uIHNvY2tldHMgYW5kIHRoZQogICAgIHR0eSAoZm9yIGtleXByZXNzZXMgYW5kIHRvIHNlZSBpZiBkYXRhIGNvdWxkIGJlIHdyaXR0ZW4pLiBXaW4zMiBvbmx5CiAgICAgc3VwcG9ydHMgc2VsZWN0KCkgb24gc29ja2V0cyBzbyB3ZSBzZWxlY3QoKSB3aXRoIGEgMXMgdGltZW91dCBvbiB0aGUKICAgICBzb2NrZXRzIGFuZCB0aGVuIHNlZSBpZiBhbnkgY2hhcmFjdGVycyBhcmUgd2FpdGluZyB0byBiZSByZWFkLCBpZiBub25lCiAgICAgYXJlIHByZXNlbnQgdGhlbiB3ZSByZXRyeSwgd2UgYWxzbyBhc3N1bWUgd2UgY2FuIGFsd2F5cyB3cml0ZSBkYXRhIHRvCiAgICAgdGhlIHR0eS4gVGhpcyBpc24ndCBuaWNlIGJlY2F1c2UgdGhlIGNvZGUgdGhlbiBibG9ja3MgdW50aWwgd2UndmUKICAgICByZWNlaXZlZCBhIGNvbXBsZXRlIGxpbmUgb2YgZGF0YSBhbmQgaXQgaXMgZWZmZWN0aXZlbHkgcG9sbGluZyB0aGUKICAgICBrZXlib2FyZCBhdCAxcyBpbnRlcnZhbHM6IGhvd2V2ZXIgaXQncyBxdWl0ZSBhIGJpdCBiZXR0ZXIgdGhhbiBub3QKICAgICB3b3JraW5nIGF0IGFsbCA6LSkgQSBkZWRpY2F0ZWQgV2luZG93cyBhcHBsaWNhdGlvbiBtaWdodCBoYW5kbGUgdGhpcwogICAgIHdpdGggYW4gZXZlbnQgbG9vcCBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIFJTQV9NRVRIT0Qgc3RydWN0dXJlLiBOb3cgdGhlcmUgYXJlIHR3byBleHRyYSBtZXRob2RzLCByc2Ffc2lnbgogICAgIGFuZCByc2FfdmVyaWZ5LiBXaGVuIHRoZSBSU0FfRkxBR1NfU0lHTl9WRVIgb3B0aW9uIGlzIHNldCB0aGVzZSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIFJTQV9zaWduKCkgYW5kIFJTQV92ZXJpZnkoKSBhcmUgdXNlZC4gVGhpcyBpcyB1c2VmdWwKICAgICBpZiByc2FfcHViX2RlYygpIGFuZCByc2FfcHJpdl9lbmMoKSBlcXVpdmFsZW50cyBhcmUgbm90IGF2YWlsYWJsZS4KICAgICBGb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5IFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkKICAgICBzaG91bGQgKm5vdCogYmUgdXNlZDogUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgogICAgIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSBzdXBwb3J0IG9mIGFuIGV4dHJhIHNpZ25hdHVyZSB0eXBlIE5JRF9tZDVfc2hhMQogICAgIGZvciBTU0wgc2lnbmF0dXJlcyBhbmQgbW9kaWZpY2F0aW9ucyB0byB0aGUgU1NMIGxpYnJhcnkgdG8gdXNlIGl0IGluc3RlYWQKICAgICBvZiBjYWxsaW5nIFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtdmVyaWZ5IC1DQWZpbGUgYW5kIC1DQXBhdGggb3B0aW9ucyB0byB0aGUgY3JsIHByb2dyYW0sIHRoZXNlCiAgICAgd2lsbCBsb29rdXAgYSBDUkwgaXNzdWVycyBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZ5IHRoZSBzaWduYXR1cmUgaW4gYQogICAgIHNpbWlsYXIgd2F5IHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbS4gVGlkeSB1cCB0aGUgY3JsIHByb2dyYW0gc28gaXQKICAgICBubyBsb25nZXIgYWNjZXNzZXMgc3RydWN0dXJlcyBkaXJlY3RseS4gTWFrZSB0aGUgQVNOMSBDUkwgcGFyc2luZyBhIGJpdAogICAgIGxlc3Mgc3RyaWN0LiBJdCB3aWxsIG5vdyBwZXJtaXQgQ1JMIGV4dGVuc2lvbnMgZXZlbiBpZiBpdCBpcyBub3QKICAgICBhIFYyIENSTDogdGhpcyB3aWxsIGFsbG93IGl0IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGl6ZSBhbGwgbm9uLWF1dG9tYXRpYyB2YXJpYWJsZXMgZWFjaCB0aW1lIG9uZSBvZiB0aGUgb3BlbnNzbAogICAgIHN1Yi1wcm9ncmFtcyBpcyBzdGFydGVkICh0aGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGV5IG1heSBiZSBzdGFydGVkCiAgICAgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUgIk9wZW5TU0w+IiBwcm9tcHQpLgogICAgIFtMZW5uYXJ0IEJhbmcsIEJvZG8gTW9lbGxlcl0KCiAgKikgUHJlbGltaW5hcnkgY29tcGlsYXRpb24gb3B0aW9uIFJTQV9OVUxMIHdoaWNoIGRpc2FibGVzIFJTQSBjcnlwdG8gd2l0aG91dAogICAgIHJlbW92aW5nIGFsbCBvdGhlciBSU0EgZnVuY3Rpb25hbGl0eSAodGhpcyBpcyB3aGF0IE5PX1JTQSBkb2VzKS4gVGhpcwogICAgIGlzIHNvIChmb3IgZXhhbXBsZSkgdGhvc2UgaW4gdGhlIFVTIGNhbiBkaXNhYmxlIHRob3NlIG9wZXJhdGlvbnMgY292ZXJlZAogICAgIGJ5IHRoZSBSU0EgcGF0ZW50IHdoaWxlIGFsbG93aW5nIHN0b3JhZ2UgYW5kIHBhcnNpbmcgb2YgUlNBIGtleXMgYW5kIFJTQQogICAgIGtleSBnZW5lcmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5vbi1jb3B5aW5nIGludGVyZmFjZSB0byBCSU8gcGFpcnMuCiAgICAgKHN0aWxsIGxhcmdlbHkgdW50ZXN0ZWQpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEFOUzFfdGFnMnN0cigpIHRvIGNvbnZlcnQgYW4gQVNOMSB0YWcgdG8gYSBkZXNjcmlwdGl2ZQogICAgIEFTQ0lJIHN0cmluZy4gVGhpcyB3YXMgaGFuZGxlZCBpbmRlcGVuZGVudGx5IGluIHZhcmlvdXMgcGxhY2VzIGJlZm9yZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIFVURjhfZ2V0YygpIGFuZCBVVEY4X3B1dGMoKSB0aGF0IHBhcnNlIGFuZCBnZW5lcmF0ZQogICAgIFVURjggc3RyaW5ncyBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGNsaWVudF92ZXJzaW9uIGZyb20gY2xpZW50IGhlbGxvIHRvIHNlbGVjdCB0aGUgcHJvdG9jb2wKICAgICAoczIzX3NydnIuYykgYW5kIGZvciBSU0EgY2xpZW50IGtleSBleGNoYW5nZSB2ZXJpZmljYXRpb24KICAgICAoczNfc3J2ci5jKSwgYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzLjAvVExTIDEuMCBzcGVjaWZpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgU1BLQUNzLCB0aGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICBoYW5kbGVkIGJ5IHBva2luZyByb3VuZCBpbiB0aGUgc3RydWN0dXJlIGludGVybmFscy4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgTkVUU0NBUEVfU1BLSV9wcmludCgpIHRvIHByaW50IG91dCBTUEtBQyBhbmQgYSBuZXcgdXRpbGl0eSAnc3BrYWMnIHRvCiAgICAgcHJpbnQsIHZlcmlmeSBhbmQgZ2VuZXJhdGUgU1BLQUNzLiBCYXNlZCBvbiBhbiBvcmlnaW5hbCBpZGVhIGZyb20KICAgICBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0PiBidXQgZXh0ZW5zaXZlbHkgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUklQRU1EMTYwIGlzIG9wZXJhdGlvbmFsIG9uIGFsbCBwbGF0Zm9ybXMgYW5kIGlzIGJhY2sgaW4gJ21ha2UgdGVzdCcuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFsbG93IHRoZSBjb25maWcgZmlsZSBleHRlbnNpb24gc2VjdGlvbiB0byBiZSBvdmVyd3JpdHRlbiBvbiB0aGUKICAgICBjb21tYW5kIGxpbmUuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbSBNYXNzaW1pbGlhbm8gUGFsYQogICAgIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+LiBUaGUgbmV3IG9wdGlvbiBpcyBjYWxsZWQgLWV4dGVuc2lvbnMKICAgICBhbmQgY2FuIGJlIGFwcGxpZWQgdG8gY2EsIHJlcSBhbmQgeDUwOS4gQWxzbyAtcmVxZXh0cyB0byBvdmVycmlkZQogICAgIHRoZSByZXF1ZXN0IGV4dGVuc2lvbnMgaW4gcmVxIGFuZCAtY3JsZXh0cyB0byBvdmVycmlkZSB0aGUgY3JsIGV4dGVuc2lvbnMKICAgICBpbiBjYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZlYXR1cmUgdG8gdGhlIFNQS0FDIGhhbmRsaW5nIGluIGNhLiAgTm93IHlvdSBjYW4gaW5jbHVkZQogICAgIHRoZSBzYW1lIGZpZWxkIG11bHRpcGxlIHRpbWVzIGJ5IHByZWNlZGluZyBpdCBieSAiWFhYWC4iIGZvciBleGFtcGxlOgogICAgIDEuT1U9IlVuaXQgbmFtZSAxIgogICAgIDIuT1U9IlVuaXQgbmFtZSAyIgogICAgIHRoaXMgaXMgdGhlIHNhbWUgc3ludGF4IGFzIHVzZWQgaW4gdGhlIHJlcSBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIGNlcnRpZmljYXRlIHJlcXVlc3RzLiBUaGVzZQogICAgIGFyZSBzcGVjaWZpZWQgaW4gYSAncmVxX2V4dGVuc2lvbnMnIG9wdGlvbiBvZiB0aGUgcmVxIHNlY3Rpb24gb2YgdGhlCiAgICAgY29uZmlnIGZpbGUuIFRoZXkgY2FuIGJlIHByaW50ZWQgb3V0IHdpdGggdGhlIC10ZXh0IG9wdGlvbiB0byByZXEgYnV0CiAgICAgYXJlIG90aGVyd2lzZSBpZ25vcmVkIGF0IHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGEgaG9ycmlibGUgYnVnIGluIGVuY19yZWFkKCkgaW4gY3J5cHRvL2V2cC9iaW9fZW5jLmM6IGlmIHRoZSBmaXJzdAogICAgIGRhdGEgcmVhZCBjb25zaXN0cyBvZiBvbmx5IHRoZSBmaW5hbCBibG9jayBpdCB3b3VsZCBub3QgZGVjcnlwdGVkIGJlY2F1c2UKICAgICBFVlBfQ2lwaGVyVXBkYXRlKCkgd291bGQgY29ycmVjdGx5IHJlcG9ydCB6ZXJvIGJ5dGVzIGhhZCBiZWVuIGRlY3J5cHRlZC4KICAgICBBIG1pc3BsYWNlZCAnYnJlYWsnIGFsc28gbWVhbnQgdGhlIGRlY3J5cHRlZCBmaW5hbCBibG9jayBtaWdodCBub3QgYmUKICAgICBjb3BpZWQgdW50aWwgdGhlIG5leHQgcmVhZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIERIX01FVEhPRC4gQWdhaW4gYmFzZWQgb24gUlNBX01FVEhPRC4gQWxzbyBhZGRlZAogICAgIGEgZmV3IGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIERIIHN0cnVjdHVyZTogdGhlc2Ugd2lsbCBiZSB1c2VmdWwgaWYKICAgICBmb3IgZXhhbXBsZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiAncScgb3IgaW1wbGVtZW50IFg5LjQyIERILgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgRFNBX01FVEhPRC4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgUlNBX01FVEhPRCBhbmQKICAgICBwcm92aWRlcyBob29rcyB0aGF0IGFsbG93IHRoZSBkZWZhdWx0IERTQSBmdW5jdGlvbnMgb3IgZnVuY3Rpb25zIG9uIGEKICAgICAicGVyIGtleSIgYmFzaXMgdG8gYmUgcmVwbGFjZWQuIFRoaXMgYWxsb3dzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBhbmQKICAgICBoYXJkd2FyZSBrZXkgc3RvcmFnZSB0byBiZSBoYW5kbGVkIHdpdGhvdXQgbWFqb3IgbW9kaWZpY2F0aW9uIHRvIHRoZQogICAgIGxpYnJhcnkuIEFsc28gYWRkZWQgbG93IGxldmVsIG1vZGV4cCBob29rcyBhbmQgQ1JZUFRPX0VYIHN0cnVjdHVyZSBhbmQgCiAgICAgYXNzb2NpYXRlZCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IGZsYWcgdG8gbWVtb3J5IEJJT3MsIEJJT19GTEFHX01FTV9SRE9OTFkuIFRoaXMgbWFya3MgdGhlIEJJTwogICAgIGFzICJyZWFkIG9ubHkiOiBpdCBjYW4ndCBiZSB3cml0dGVuIHRvIGFuZCB0aGUgYnVmZmVyIGl0IHBvaW50cyB0byB3aWxsCiAgICAgbm90IGJlIGZyZWVkLiBSZWFkaW5nIGZyb20gYSByZWFkIG9ubHkgQklPIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbgogICAgIGEgbm9ybWFsIG1lbW9yeSBCSU8uIFRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNldmVyYWwgdGltZXMgd2hlbgogICAgIGFuIGFyZWEgb2YgbWVtb3J5IG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBhIEJJTy4gVGhlIHByZXZpb3VzIG1ldGhvZCB3YXMKICAgICB0byBjcmVhdGUgYSBtZW1vcnkgQklPIGFuZCB3cml0ZSB0aGUgZGF0YSB0byBpdCwgdGhpcyByZXN1bHRzIGluIHR3bwogICAgIGNvcGllcyBvZiB0aGUgZGF0YSBhbmQgYW4gTyhuXjIpIHJlYWRpbmcgYWxnb3JpdGhtLiBUaGVyZSBpcyBhIG5ldwogICAgIGZ1bmN0aW9uIEJJT19uZXdfbWVtX2J1ZigpIHdoaWNoIGNyZWF0ZXMgYSByZWFkIG9ubHkgbWVtb3J5IEJJTyBmcm9tCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1MjNyByb3V0aW5lcyB0byB1c2UgcmVhZCBvbmx5CiAgICAgbWVtb3J5IEJJT3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4OiBzc2wyM19nZXRfY2xpZW50X2hlbGxvIGRpZCBub3Qgd29yayBwcm9wZXJseSB3aGVuIGNhbGxlZCBpbgogICAgIHN0YXRlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQiwgaS5lLiB3aGVuIHRoZSBmaXJzdCA3IGJ5dGVzIG9mCiAgICAgYSBTU0x2Mi1jb21wYXRpYmxlIGNsaWVudCBoZWxsbyBmb3IgU1NMdjMgb3IgVExTdjEgY291bGQgYmUgcmVhZCwKICAgICBidXQgYSByZXRyeSBjb25kaXRpb24gb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgcmVzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgUEtDUzdfRU5DX0NPTlRFTlRfbmV3KCkgZnVuY3Rpb24gd2FzIHNldHRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhcwogICAgIE5JRF9wa2NzN19lbmNyeXB0ZWQgYnkgZGVmYXVsdDogdGhpcyB3YXMgd3Jvbmcgc2luY2UgdGhpcyBzaG91bGQgYWxtb3N0CiAgICAgYWx3YXlzIGJlIE5JRF9wa2NzN19kYXRhLiBBbHNvIG1vZGlmaWVkIHRoZSBQS0NTN19zZXRfdHlwZSgpIHRvIGhhbmRsZQogICAgIHRoZSBlbmNyeXB0ZWQgZGF0YSB0eXBlOiB0aGlzIGlzIGEgbW9yZSBzZW5zaWJsZSBwbGFjZSB0byBwdXQgaXQgYW5kIGl0CiAgICAgYWxsb3dzIHRoZSBQS0NTIzEyIGNvZGUgdG8gYmUgdGlkaWVkIHVwIHRoYXQgZHVwbGljYXRlZCB0aGlzCiAgICAgZnVuY3Rpb25hbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VkIG9ial9kYXQucGwgc2NyaXB0IHNvIGl0IHRha2VzIGl0cyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG9uCiAgICAgdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBzaG91bGQgYXZvaWQgc2hlbGwgZXNjYXBlIHJlZGlyZWN0aW9uIHByb2JsZW1zCiAgICAgdW5kZXIgV2luMzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBleHRlbnNpb24gcmVxdWVzdHMsIHRoZXNlIGFyZSBpbmNsdWRlZAogICAgIGluIHRoaW5ncyBsaWtlIFhlbnJvbGwgY2VydGlmaWNhdGUgcmVxdWVzdHMuIEluY2x1ZGVkIGZ1bmN0aW9ucyB0byBhbGxvdwogICAgIGV4dGVuc2lvbnMgdG8gYmUgb2J0YWluZWQgYW5kIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC1jcmxmIG9wdGlvbiB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgZm9yIHNlbmRpbmcgbmV3bGluZXMgYXMKICAgICBDUkxGIChhcyByZXF1aXJlZCBieSBtYW55IHByb3RvY29scykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjNhIGFuZCAwLjkuNCAgWzA5IEF1ZyAxOTk5XQogIAogICopIEluc3RhbGwgbGliUlNBZ2x1ZS5hIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgbW9yZSBgYCNpZm5kZWYgTk9fRlBfQVBJIC8gI2VuZGlmJycgcGFpcnMgZm9yIGNvbnNpc3RlbmN5LgogICAgIFtBbmRyaWphIEFudG9uaWpldmljIDxUaGVBbnRvbnkyQGJpZ2Zvb3QuY29tPl0KCiAgKikgRml4IC1zdGFydGRhdGUgYW5kIC1lbmRkYXRlICh3aGljaCB3YXMgbWlzc2luZykgYXJndW1lbnRzIHRvICdjYScKICAgICBwcm9ncmFtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBEU0FfZHVwX0RILCB3aGljaCBkdXBsaWNhdGVzIERTQSBwYXJhbWV0ZXJzL2tleXMgYXMKICAgICBESCBwYXJhbWV0ZXJzL2tleXMgKHEgaXMgbG9zdCBkdXJpbmcgdGhhdCBjb252ZXJzaW9uLCBidXQgdGhlIHJlc3VsdGluZwogICAgIERIIHBhcmFtZXRlcnMgY29udGFpbiBpdHMgbGVuZ3RoKS4KCiAgICAgRm9yIDEwMjQtYml0IHAsIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGZvbGxvd2VkIGJ5IERTQV9kdXBfREggaXMKICAgICBtdWNoIGZhc3RlciB0aGFuIERIX2dlbmVyYXRlX3BhcmFtZXRlcnMgKHdoaWNoIGNyZWF0ZXMgcGFyYW1ldGVycwogICAgIHdoZXJlIHAgPSAyKnEgKyAxKSwgYW5kIGFsc28gdGhlIHNtYWxsZXIgcSBtYWtlcyBESCBjb21wdXRhdGlvbnMKICAgICBtdWNoIG1vcmUgZWZmaWNpZW50ICgxNjAtYml0IGV4cG9uZW50aWF0aW9uIGluc3RlYWQgb2YgMTAyNC1iaXQKICAgICBleHBvbmVudGlhdGlvbik7IHNvIHRoaXMgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBzdXBwb3J0IERIRQogICAgIGNpcGhlcnN1aXRlcyBpbiBTU0wvVExTIHNlcnZlcnMgKHNlZSBzc2wvc3NsdGVzdC5jKS4gIEl0IGlzIG9mCiAgICAgdXR0ZXIgaW1wb3J0YW5jZSB0byB1c2UKICAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIG9yCiAgICAgICAgIFNTTF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIHdoZW4gc3VjaCBESCBwYXJhbWV0ZXJzIGFyZSB1c2VkLCBiZWNhdXNlIG90aGVyd2lzZSBzbWFsbCBzdWJncm91cAogICAgIGF0dGFja3MgbWF5IGJlY29tZSBwb3NzaWJsZSEKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBtZW1vcnkgbGVhayBpbiBpMmRfREhwYXJhbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3cgdGhlIC1rIG9wdGlvbiB0byBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBlbmMgcHJvZ3JhbToKICAgICB0aGlzIGFsbG93cyB0aGUgc2FtZSBlbmNyeXB0ZWQgbWVzc2FnZSB0byBiZSByZWFkIGJ5IG11bHRpcGxlIHJlY2lwaWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9CSl9vYmoydHh0KGJ1ZiwgYnVmX2xlbiwgYSwgbm9fbmFtZSksIHRoaXMgY29udmVydHMKICAgICBhbiBBU04xX09CSkVDVCB0byBhIHRleHQgc3RyaW5nLiBJZiB0aGUgIm5vX25hbWUiIHBhcmFtZXRlciBpcyBzZXQgdGhlbgogICAgIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbnVtZXJpY2FsIGZvcm0gb2YgdGhlIE9JRCwgZXZlbiBpZiBpdCBoYXMgYSBzaG9ydAogICAgIG9yIGxvbmcgbmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBhbiBleHRyYSBSU0EgZmxhZzogUlNBX0ZMQUdfRVhUX1BLRVkuIFByZXZpb3VzbHkgdGhlIHJzYV9tb2RfZXhwCiAgICAgbWV0aG9kIG9ubHkgZ290IGNhbGxlZCBpZiBwLHEsZG1wMSxkbXExLGlxbXAgY29tcG9uZW50cyB3ZXJlIHByZXNlbnQsCiAgICAgb3RoZXJ3aXNlIGJuX21vZF9leHAgd2FzIGNhbGxlZC4gSW4gdGhlIGNhc2Ugb2YgaGFyZHdhcmUga2V5cyBmb3IgZXhhbXBsZQogICAgIG5vIHByaXZhdGUga2V5IGNvbXBvbmVudHMgbmVlZCBiZSBwcmVzZW50IGFuZCBpdCBtaWdodCBzdG9yZSBleHRyYSBkYXRhCiAgICAgaW4gdGhlIFJTQSBzdHJ1Y3R1cmUsIHdoaWNoIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGJuX21vZF9leHAuCiAgICAgQnkgc2V0dGluZyBSU0FfRkxBR19FWFRfUEtFWSByc2FfbW9kX2V4cCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZm9yCiAgICAgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBTUEFSQyBMaW51eC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgcGVtX3Bhc3N3b3JkX2NiIGZ1bmN0aW9uIHR5cGUgaW5jb21wYXRpYmx5IGNoYW5nZWQgZnJvbQogICAgICAgICAgdHlwZWRlZiBpbnQgcGVtX3Bhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcpOwogICAgIHRvCiAgICAgICAgICAuLi4uKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKTsKICAgICBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gcGFzcyBkYXRhIHRvIHRoZWlyIGNhbGxiYWNrczoKICAgICBUaGUgUEVNW19BU04xXV97cmVhZCx3cml0ZX0uLi4gZnVuY3Rpb25zIGFuZCBtYWNyb3Mgbm93IHRha2UgYW4KICAgICBhZGRpdGlvbmFsIHZvaWQgKiBhcmd1bWVudCwgd2hpY2ggaXMganVzdCBoYW5kZWQgdGhyb3VnaCB3aGVuZXZlcgogICAgIHRoZSBwYXNzd29yZCBjYWxsYmFjayBpcyBjYWxsZWQuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRtaWxsZXJAaWxvZ2ljLmNvbS5hdT47IHRpbnkgY2hhbmdlcyBieSBCb2RvIE1vZWxsZXJdCgogICAgIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YS4KCiAgICAgQ29tcGF0aWJpbGl0eSBub3RlOiBBcyBtYW55IEMgaW1wbGVtZW50YXRpb25zIHB1c2ggZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgb250byB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlciwgdGhlIG5ldyBsaWJyYXJ5IHZlcnNpb24gaXMgbGlrZWx5IHRvCiAgICAgaW50ZXJvcGVyYXRlIHdpdGggcHJvZ3JhbXMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUgb2xkCiAgICAgcGVtX3Bhc3N3b3JkX2NiIGRlZmluaXRpb24gKFBFTV93aGF0ZXZlciB0YWtlcyBzb21lIGRhdGEgdGhhdAogICAgIGhhcHBlbnMgdG8gYmUgb24gdGhlIHN0YWNrIGFzIGl0cyBsYXN0IGFyZ3VtZW50LCBhbmQgdGhlIGNhbGxiYWNrCiAgICAganVzdCBpZ25vcmVzIHRoaXMgZ2FyYmFnZSk7IGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgd2hhdHNvZXZlciB0aGF0CiAgICAgdGhpcyB3aWxsIHdvcmsuCgogICopIFRoZSAtRFBMQVRGT1JNPSJcIiQoUExBVEZPUk0pXCIiIGRlZmluaXRpb24gYW5kIHRoZSBzaW1pbGFyIC1EQ0ZMQUdTPS4uLgogICAgIChib3RoIGluIGNyeXB0by9NYWtlZmlsZS5zc2wgZm9yIHVzZSBieSBjcnlwdG8vY3ZlcnNpb24uYykgY2F1c2VkCiAgICAgcHJvYmxlbXMgbm90IG9ubHkgb24gV2luZG93cywgYnV0IGFsc28gb24gc29tZSBVbml4IHBsYXRmb3Jtcy4KICAgICBUbyBhdm9pZCBwcm9ibGVtYXRpYyBjb21tYW5kIGxpbmVzLCB0aGVzZSBkZWZpbml0aW9ucyBhcmUgbm93IGluIGFuCiAgICAgYXV0by1nZW5lcmF0ZWQgZmlsZSBjcnlwdG8vYnVpbGRpbmYuaCAoY3JlYXRlZCBieSBjcnlwdG8vTWFrZWZpbGUuc3NsCiAgICAgZm9yIHN0YW5kYXJkICJtYWtlIiBidWlsZHMsIGJ5IHV0aWwvbWsxbWYucGwgZm9yICJtazFtZiIgYnVpbGRzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNSVBTIElJSS9JViBhc3NlbWJsZXIgbW9kdWxlIGlzIHJlaW1wbGVtZW50ZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vcmUgREVTIGxpYnJhcnkgY2xlYW51cHM6IHJlbW92ZSByZWZlcmVuY2VzIHRvIHNyYW5kL3JhbmQgYW5kCiAgICAgZGVsZXRlIGFuIHVudXNlZCBmaWxlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIHRoZSBmcmVlIE5ldHdpZGUgYXNzZW1ibGVyIChOQVNNKSB1bmRlciBXaW4zMiwKICAgICBzaW5jZSBub3QgbWFueSBwZW9wbGUgaGF2ZSBNQVNNIChtbCkgYW5kIGl0IGNhbiBiZSBoYXJkIHRvIG9idGFpbi4KICAgICBUaGlzIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgT0sgYW5kIHBhc3MgYWxsCiAgICAgdGhlIHRlc3RzLiBDaGVjayBvdXQgSU5TVEFMTC5XMzIgZm9yIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBzM19jbG50LmM6IEFsbCBub24tYW5vbnltb3VzIFNTTDMvVExTMSBjb25uZWN0aW9ucwogICAgIHdpdGhvdXQgdGVtcG9yYXJ5IGtleXMga2VwdCBhbiBleHRyYSBjb3B5IG9mIHRoZSBzZXJ2ZXIga2V5LAogICAgIGFuZCBjb25uZWN0aW9ucyB3aXRoIHRlbXBvcmFyeSBrZXlzIGRpZCBub3QgZnJlZSBldmVyeXRoaW5nIGluIGNhc2UKICAgICBvZiBhbiBlcnJvci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUlNBX2NoZWNrX2tleSBhbmQgbmV3IG9wZW5zc2wgcnNhIG9wdGlvbiAtY2hlY2sKICAgICBmb3IgdmVyaWZ5aW5nIHRoZSBjb25zaXN0ZW5jeSBvZiBSU0Ega2V5cy4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgVmFyaW91cyBjaGFuZ2VzIHRvIG1ha2UgV2luMzIgY29tcGlsZSB3b3JrOiAKICAgICAxLiBDYXN0cyB0byBhdm9pZCAibG9zcyBvZiBkYXRhIiB3YXJuaW5ncyBpbiBwNV9jcnB0Mi5jCiAgICAgMi4gQ2hhbmdlIHVuc2lnbmVkIGludCB0byBpbnQgaW4gYl9kdW1wLmMgdG8gYXZvaWQgInNpZ25lZC91bnNpZ25lZAogICAgICAgIGNvbXBhcmlzb24iIHdhcm5pbmdzLgogICAgIDMuIEFkZCBza188VFlQRT5fc29ydCB0byBERUYgZmlsZSBnZW5lcmF0b3IgYW5kIGRvIG1ha2UgdXBkYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRlYnVnZ2luZyBvcHRpb24gdG8gUEtDUyM1IHYyIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9uOiB3aGVuCiAgICAgeW91ICNkZWZpbmUgREVCVUdfUEtDUzVWMiBwYXNzd29yZHMsIHNhbHRzLCBpdGVyYXRpb24gY291bnRzIGFuZAogICAgIGRlcml2ZWQga2V5cyBhcmUgcHJpbnRlZCB0byBzdGRlcnIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29weSB0aGUgZmxhZ3MgaW4gQVNOMV9TVFJJTkdfZHVwKCkuCiAgICAgW1JvbWFuIEUuIFBhdmxvdiA8cHJlQG1vLm1zay5ydT5dCgogICopIFRoZSB4NTA5IGFwcGxpY2F0aW9uIG1pc2hhbmRsZWQgc2lnbmluZyByZXF1ZXN0cyBjb250YWluaW5nIERTQQogICAgIGtleXMgd2hlbiB0aGUgc2lnbmluZyBrZXkgd2FzIGFsc28gRFNBIGFuZCB0aGUgcGFyYW1ldGVycyBkaWRuJ3QgbWF0Y2guCgogICAgIEl0IHdhcyBzdXBwb3NlZCB0byBvbWl0IHRoZSBwYXJhbWV0ZXJzIHdoZW4gdGhleSBtYXRjaGVkIHRoZSBzaWduaW5nIGtleToKICAgICB0aGUgdmVyaWZ5aW5nIHNvZnR3YXJlIHdhcyB0aGVuIHN1cHBvc2VkIHRvIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBDQSdzCiAgICAgcGFyYW1ldGVycyBpZiB0aGV5IHdlcmUgYWJzZW50IGZyb20gdGhlIGVuZCB1c2VyIGNlcnRpZmljYXRlLgoKICAgICBPbWl0dGluZyBwYXJhbWV0ZXJzIGlzIG5vIGxvbmdlciByZWNvbW1lbmRlZC4gVGhlIHRlc3Qgd2FzIGFsc28KICAgICB0aGUgd3Jvbmcgd2F5IHJvdW5kISBUaGlzIHdhcyBwcm9iYWJseSBkdWUgdG8gdW51c3VhbCBiZWhhdmlvdXIgaW4KICAgICBFVlBfY21wX3BhcmFtZXRlcnMoKSB3aGljaCByZXR1cm5zIDEgaWYgdGhlIHBhcmFtZXRlcnMgbWF0Y2guIAogICAgIFRoaXMgbWVhbnQgdGhhdCBwYXJhbWV0ZXJzIHdlcmUgb21pdHRlZCB3aGVuIHRoZXkgKmRpZG4ndCogbWF0Y2ggYW5kCiAgICAgdGhlIGNlcnRpZmljYXRlIHdhcyB1c2VsZXNzLiBDZXJ0aWZpY2F0ZXMgc2lnbmVkIHdpdGggJ2NhJyBkaWRuJ3QgaGF2ZQogICAgIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IERvdWcgRXJpY2tzb24gPERvdWcuRXJpY2tzb25AUGFydC5ORVQ+XQoKICAqKSBNZW1vcnkgbGVhayBjaGVja2luZyAoLURDUllQVE9fTURFQlVHKSBoYWQgc29tZSBwcm9ibGVtcy4KICAgICBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CiAgICAgQXBwbGljYXRpb25zIGNhbiB1c2UKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pIGFrYSBNZW1DaGVja19zdGFydCgpLAogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PRkYpIGFrYSBNZW1DaGVja19zdG9wKCk7CiAgICAgIm9mZiIgaXMgbm93IHRoZSBkZWZhdWx0LgogICAgIFRoZSBsaWJyYXJ5IGludGVybmFsbHkgdXNlcwogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19ESVNBQkxFKSBha2EgTWVtQ2hlY2tfb2ZmKCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0VOQUJMRSkgYWthIE1lbUNoZWNrX29uKCkKICAgICB0byBkaXNhYmxlIG1lbW9yeS1jaGVja2luZyB0ZW1wb3JhcmlseS4KCiAgICAgU29tZSBpbmNvbnNpc3RlbnQgc3RhdGVzIHRoYXQgcHJldmlvdXNseSB3ZXJlIHBvc3NpYmxlIChhbmQgd2VyZQogICAgIGV2ZW4gdGhlIGRlZmF1bHQpIGFyZSBub3cgYXZvaWRlZC4KCiAgICAgLURDUllQVE9fTURFQlVHX1RJTUUgaXMgbmV3IGFuZCBhZGRpdGlvbmFsbHkgc3RvcmVzIHRoZSBjdXJyZW50IHRpbWUKICAgICB3aXRoIGVhY2ggbWVtb3J5IGNodW5rIGFsbG9jYXRlZDsgdGhpcyBpcyBvY2Nhc2lvbmFsbHkgbW9yZSBoZWxwZnVsCiAgICAgdGhhbiBqdXN0IGhhdmluZyBhIGNvdW50ZXIuCgogICAgIC1EQ1JZUFRPX01ERUJVR19USFJFQUQgaXMgYWxzbyBuZXcgYW5kIGFkZHMgdGhlIHRocmVhZCBJRC4KCiAgICAgLURDUllQVE9fTURFQlVHX0FMTCBlbmFibGVzIGFsbCBvZiB0aGUgYWJvdmUsIHBsdXMgYW55IGZ1dHVyZQogICAgIGV4dGVuc2lvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlICJtb2RlIiBmb3IgU1NMIHN0cnVjdHVyZXMgKHdpdGggZGVmYXVsdHMgaW4gU1NMX0NUWCksCiAgICAgd2hpY2ggbGFyZ2VseSBwYXJhbGxlbHMgIm9wdGlvbnMiLCBidXQgaXMgZm9yIGNoYW5naW5nIEFQSSBiZWhhdmlvdXIsCiAgICAgd2hlcmVhcyAib3B0aW9ucyIgYXJlIGFib3V0IHByb3RvY29sIGJlaGF2aW91ci4KICAgICBJbml0aWFsICJtb2RlIiBmbGFncyBhcmU6CgogICAgIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFICAgQWxsb3cgU1NMX3dyaXRlIHRvIHJlcG9ydCBzdWNjZXNzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2luZ2xlIHJlY29yZCBoYXMgYmVlbiB3cml0dGVuLgogICAgIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSICBEb24ndCBpbnNpc3QgdGhhdCBTU0xfd3JpdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMgdXNlIHRoZSBzYW1lIGJ1ZmZlciBsb2NhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXQgYWxsIG9mIHRoZSBjb250ZW50cyBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQhKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogU1NMX3NldF9tb2RlIGlnbm9yZWQgaXRzIHBhcmFtZXRlciwgb25seSBTU0xfQ1RYX3NldF9tb2RlCiAgICAgd29ya2VkLgoKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBuby1obWFjIGV0Yy4KICAgICBbVWxmIE32bGxlciwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gV2VsbGluZ3RvbiA8YndlbGxpbmdAdGlzbGFicy5jb20+XQoKICAqKSBOZXcgZnVuY3Rpb25zIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSwgUlNBX3NldF9tZXRob2QoKSBhbmQKICAgICBSU0FfZ2V0X21ldGhvZCgpLiBUaGVzZSBhbGxvd3MgcmVwbGFjZW1lbnQgb2YgUlNBX01FVEhPRHMgd2l0aG91dCBoYXZpbmcKICAgICB0byBtZXNzIGFyb3VuZCB3aXRoIHRoZSBpbnRlcm5hbHMgb2YgYW4gUlNBIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIERTQV9kb19zaWduIGFuZCBEU0FfaXNfcHJpbWUuCiAgICAgQWxzbyByZWFsbHkgZW5hYmxlIG1lbW9yeSBsZWFrIGNoZWNrcyBpbiBvcGVuc3NsLmMgYW5kIGluIHNvbWUKICAgICB0ZXN0IHByb2dyYW1zLgogICAgIFtDaGFkIEMuIE11bGxpZ2FuLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBkMmlfQVNOMV9JTlRFR0VSKCkgYW5kIGkyZF9BU04xX0lOVEVHRVIoKSB3aGljaCBjYW4gbWVzcwogICAgIHVwIHRoZSBsZW5ndGggb2YgbmVnYXRpdmUgaW50ZWdlcnMuIFRoaXMgaGFzIG5vdyBiZWVuIHNpbXBsaWZpZWQgdG8ganVzdAogICAgIHN0b3JlIHRoZSBsZW5ndGggd2hlbiBpdCBpcyBmaXJzdCBkZXRlcm1pbmVkIGFuZCB1c2UgaXQgbGF0ZXIsIHJhdGhlcgogICAgIHRoYW4gdHJ5aW5nIHRvIGtlZXAgdHJhY2sgb2Ygd2hlcmUgZGF0YSBpcyBjb3BpZWQgYW5kIHVwZGF0aW5nIGl0IHRvCiAgICAgcG9pbnQgdG8gdGhlIGVuZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBCcmllbiBXaGVlbGVyCiAgICAgIDxid2hlZWxlckBhdXRoZW50aWNhLXNlY3VyaXR5LmNvbT5dCgogICopIEFkZCBhIG5ldyBmdW5jdGlvbiBQS0NTN19zaWduYXR1cmVWZXJpZnkuIFRoaXMgYWxsb3dzIHRoZSB2ZXJpZmljYXRpb24KICAgICBvZiBhIFBLQ1MjNyBzaWduYXR1cmUgYnV0IHdpdGggdGhlIHNpZ25pbmcgY2VydGlmaWNhdGUgcGFzc2VkIHRvIHRoZQogICAgIGZ1bmN0aW9uIGl0c2VsZi4gVGhpcyBjb250cmFzdHMgd2l0aCBQS0NTN19kYXRhVmVyaWZ5IHdoaWNoIGFzc3VtZXMgdGhlCiAgICAgY2VydGlmaWNhdGUgaXMgcHJlc2VudCBpbiB0aGUgUEtDUyM3IHN0cnVjdHVyZS4gVGhpcyBpc24ndCBhbHdheXMgdGhlCiAgICAgY2FzZTogY2VydGlmaWNhdGVzIGNhbiBiZSBvbWl0dGVkIGZyb20gYSBQS0NTIzcgc3RydWN0dXJlIGFuZCBiZQogICAgIGRpc3RyaWJ1dGVkIGJ5ICJvdXQgb2YgYmFuZCIgbWVhbnMgKHN1Y2ggYXMgYSBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29tcGxldGUgdGhlIFBFTV8qIG1hY3JvcyB3aXRoIERFQ0xBUkVfUEVNIHZlcnNpb25zIHRvIHJlcGxhY2UgdGhlCiAgICAgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBwZW0uaCwgYWxzbyBjaGFuZ2UgdXRpbC9ta2RlZi5wbCB0byBhZGQgdGhlCiAgICAgbmVjZXNzYXJ5IGZ1bmN0aW9uIG5hbWVzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBtazFtZi5wbCAodXNlZCBieSBXaW5kb3dzIGJ1aWxkcykgZGlkIG5vdCBwcm9wZXJseSByZWFkIHRoZQogICAgIG9wdGlvbnMgc2V0IGJ5IENvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLCBhbmQgQ29uZmlndXJlCiAgICAgd2FzIG5vdCBldmVuIGFibGUgdG8gd3JpdGUgbW9yZSB0aGFuIG9uZSBvcHRpb24gY29ycmVjdGx5LgogICAgIEZpeGVkLCBub3cgIm5vLWlkZWEgbm8tcmM1IC1EQ1JZUFRPX01ERUJVRyIgZXRjLiB3b3JrcyBhcyBpbnRlbmRlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIENPTkZfbG9hZF9iaW8oKSBhbmQgQ09ORl9sb2FkX2ZwKCkgdG8gYWxsb3cgYSBjb25maWcKICAgICBmaWxlIHRvIGJlIGxvYWRlZCBmcm9tIGEgQklPIG9yIEZJTEUgcG9pbnRlci4gVGhlIEJJTyB2ZXJzaW9uIHdpbGwKICAgICBmb3IgZXhhbXBsZSBhbGxvdyBtZW1vcnkgQklPcyB0byBjb250YWluIGNvbmZpZyBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiAiQ1JZUFRPX251bV9sb2NrcyIgdGhhdCByZXR1cm5zIENSWVBUT19OVU1fTE9DS1MuCiAgICAgV2hvZXZlciBob3BlcyB0byBhY2hpZXZlIHNoYXJlZC1saWJyYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIHZlcnNpb25zCiAgICAgbXVzdCB1c2UgdGhpcywgbm90IHRoZSBjb21waWxlLXRpbWUgbWFjcm8uCiAgICAgKEV4ZXJjaXNlIDAuOS40OiBXaGljaCBpcyB0aGUgbWluaW11bSBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZWQgYnkKICAgICBzdWNoIHByb2dyYW1zPykKICAgICBOb3RlOiBBbGwgdGhpcyBhcHBsaWVzIG9ubHkgdG8gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMsIG90aGVycyBkb24ndAogICAgIG5lZWQgbG9ja3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG1pc3NpbmcgY2FzZSB0byBzM19jbG50LmMgc3RhdGUgbWFjaGluZSAtLSBvbmUgb2YgdGhlIG5ldyBTU0wgdGVzdHMKICAgICB0aHJvdWdoIGEgQklPIHBhaXIgdHJpZ2dlcmVkIHRoZSBkZWZhdWx0IGNhc2UsIGkuZS4KICAgICBTU0xlcnIoLi4uLFNTTF9SX1VOS05PV05fU1RBVEUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiQklPIHBhaXIiIGNvbmNlcHQgKGNyeXB0by9iaW8vYnNzX2Jpby5jKSBzbyB0aGF0IGFwcGxpY2F0aW9ucwogICAgIGNhbiB1c2UgdGhlIFNTTCBsaWJyYXJ5IGV2ZW4gaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWMgQklPcyBpcwogICAgIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBpMmRfRFNBUHVibGljS2V5KCkgd2hpY2ggbWVhbnQgaXQgcmV0dXJuZWQgdGhlIHdyb25nIHZhbHVlCiAgICAgZm9yIHRoZSBlbmNvZGVkIGxlbmd0aC4KICAgICBbSmVvbiBLeW91bmdIbyA8a2hqZW9uQHNkcy5zYW1zdW5nLmNvLmtyPl0KCiAgKikgQWRkIGluaXRpYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgWDUwOVYzIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgcGFpciBvZiBmdW5jdGlvbnMgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleSgpIGFuZCAKICAgICBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleSgpIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8KICAgICBQRU1fd3JpdGVfUHJpdmF0ZUtleSgpIGFuZCBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoKSBidXQgdXNlIHRoZSBtb3JlCiAgICAgc2VjdXJlIFBLQ1MjOCBwcml2YXRlIGtleSBmb3JtYXQgd2l0aCBhIGhpZ2ggaXRlcmF0aW9uIGNvdW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZXRlcm1pbmF0aW9uIG9mIFBlcmwgaW50ZXJwcmV0ZXI6IEEgcGVybCBvciBwZXJsNQogICAgIF9kaXJlY3RvcnlfIGluICRQQVRIIHdhcyBhbHNvIGFjY2VwdGVkIGFzIHRoZSBpbnRlcnByZXRlci4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGRlbW9zL3NpZ24vc2lnbi5jOiB3ZWxsIHRoZXJlIHdhc24ndCBhbnl0aGluZyBzdHJpY3RseSBzcGVha2luZwogICAgIHdyb25nIHdpdGggaXQgYnV0IGl0IHdhcyB2ZXJ5IG9sZCBhbmQgZGlkIHRoaW5ncyBsaWtlIGNhbGxpbmcKICAgICBQRU1fQVNOMV9yZWFkKCkgZGlyZWN0bHkgYW5kIHVzZWQgTUQ1IGZvciB0aGUgaGFzaCBub3QgdG8gbWVudGlvbiBzb21lCiAgICAgdW51c3VhbCBmb3JtYXR0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZW1vcy9zZWxmc2lnbi5jOiBpdCB1c2VkIG9ic29sZXRlIGFuZCBkZWxldGVkIGZ1bmN0aW9ucywgY2hhbmdlZAogICAgIHRvIHVzZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgUEVNX3JlYWQvUEVNX3dyaXRlIGZ1bmN0aW9ucyBpbiBjcnlwdG8vcGVtL3BlbV9hbGwuYwogICAgIHdpdGggbWFjcm9zLiBUaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBjaGFuZ2UgdGhlaXIgZm9ybSwgYWRkIGV4dHJhCiAgICAgYXJndW1lbnRzIGV0Yy4gRml4IGEgZmV3IFBFTSBwcm90b3R5cGVzIHdoaWNoIGRpZG4ndCBoYXZlIGNpcGhlciBhcyBhCiAgICAgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUgYSBuZXcgZW50cnkgdGhhdCBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZQogICAgIG5hbWUgZm9yIHVuaXN0ZC5oIChmb3IgcHJlLVBPU0lYIHN5c3RlbXMpOyB3ZSBuZWVkIHRoaXMgZm9yIE5lWFRzdGVwLAogICAgIGFjY29yZGluZyB0byBNYXJrIENyaXNwaW4gPE1SQ0BQYW5kYS5DT00+LgogICAgIFtCb2RvIE1vZWxsZXJdCgojaWYgMAogICopIERFUyBDQkMgZGlkIG5vdCB1cGRhdGUgdGhlIElWLiBXZWlyZC4KICAgICBbQmVuIExhdXJpZV0KI2Vsc2UKICAgICBkZXNfY2JjX2VuY3J5cHQgZG9lcyBub3QgdXBkYXRlIHRoZSBJViwgYnV0IGRlc19uY2JjX2VuY3J5cHQgZG9lcy4KICAgICBDaGFuZ2luZyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBmb3JtZXIgbWlnaHQgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgLS0KICAgICB3aGVyZSBJViB1cGRhdGluZyBpcyBuZWVkZWQsIGRlc19uY2JjX2VuY3J5cHQgY2FuIGJlIHVzZWQuCiNlbmRpZgoKICAqKSBXaGVuIGJudGVzdCBpcyBydW4gZnJvbSAibWFrZSB0ZXN0IiBpdCBkcml2ZXMgYmMgdG8gY2hlY2sgaXRzCiAgICAgY2FsY3VsYXRpb25zLCBhcyB3ZWxsIGFzIGludGVybmFsbHkgY2hlY2tpbmcgdGhlbS4gSWYgYW4gaW50ZXJuYWwgY2hlY2sKICAgICBmYWlscywgaXQgbmVlZHMgdG8gY2F1c2UgYmMgdG8gZ2l2ZSBhIG5vbi16ZXJvIHJlc3VsdCBvciBtYWtlIHRlc3QgY2FycmllcwogICAgIG9uIHdpdGhvdXQgbm90aWNpbmcgdGhlIGZhaWx1cmUuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBERVMgbGlicmFyeSBjbGVhbnVwcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIFBCRSBhbGdvcml0aG1zLiBUaGlzIHdpbGwgcGVybWl0IFBLQ1MjOCB0byBiZQogICAgIHVzZWQgd2l0aCBhbnkgY2lwaGVyIHVubGlrZSBQS0NTIzUgdjEuNSB3aGljaCBjYW4gYXQgbW9zdCBoYW5kbGUgNjQgYml0CiAgICAgY2lwaGVycy4gTk9URTogYWx0aG91Z2ggdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkCiAgICAgYWdhaW5zdCBzb21lIHB1Ymxpc2hlZCB0ZXN0IHZlY3RvcnMgaXQgaGFzIG5vdCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZAogICAgIHlldC4gQWRkZWQgYSAtdjIgImNpcGhlciIgb3B0aW9uIHRvIHBrY3M4IGFwcGxpY2F0aW9uIHRvIGFsbG93IHRoZSB1c2UKICAgICBvZiB2Mi4wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluc3RlYWQgb2YgIm1rZGlyIC1wIiwgd2hpY2ggaXMgbm90IGZ1bGx5IHBvcnRhYmxlLCB1c2UgbmV3CiAgICAgUGVybCBzY3JpcHQgInV0aWwvbWtkaXItcC5wbCIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSB0aGUgd2F5IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gKFBCRSkgaXMgaGFuZGxlZC4gSXQgdXNlZCB0bwogICAgIGFzc3VtZSB0aGF0IHRoZSBBU04xIEFsZ29yaXRobUlkZW50aWZpZXIgcGFyYW1ldGVyIHdhcyBhIFBCRVBhcmFtZXRlcgogICAgIHN0cnVjdHVyZS4gVGhpcyB3YXMgdHJ1ZSBmb3IgdGhlIFBLQ1MjNSB2MS41IGFuZCBQS0NTIzEyIFBCRSBhbGdvcml0aG1zCiAgICAgYnV0IGRvZXNuJ3QgYXBwbHkgdG8gUEtDUyM1IHYyLjAgd2hlcmUgaXQgY2FuIGJlIHNvbWV0aGluZyBlbHNlLiBOb3cKICAgICB0aGUgJ3BhcmFtZXRlcicgZmllbGQgb2YgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgaXMgcGFzc2VkIHRvIHRoZQogICAgIHVuZGVybHlpbmcga2V5IGdlbmVyYXRpb24gZnVuY3Rpb24gc28gaXQgbXVzdCBkbyBpdHMgb3duIEFTTjEgcGFyc2luZy4KICAgICBUaGlzIGhhcyBhbHNvIGNoYW5nZWQgdGhlIEVWUF9QQkVfQ2lwaGVySW5pdCgpIGZ1bmN0aW9uIHdoaWNoIG5vdyBoYXMgYQogICAgICdwYXJhbWV0ZXInIGFyZ3VtZW50IGluc3RlYWQgb2YgbGl0ZXJhbCBzYWx0IGFuZCBpdGVyYXRpb24gY291bnQgdmFsdWVzCiAgICAgYW5kIHRoZSBmdW5jdGlvbiBFVlBfUEJFX0FMR09SX0NpcGhlckluaXQoKSBoYXMgYmVlbiBkZWxldGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFBLQ1MjNSB2MS41IGNvbXBhdGlibGUgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBhbGdvcml0aG1zCiAgICAgYW5kIFBLQ1MjOCBmdW5jdGlvbmFsaXR5LiBOZXcgJ3BrY3M4JyBhcHBsaWNhdGlvbiBsaW5rZWQgdG8gb3BlbnNzbC4KICAgICBOZWVkZWQgdG8gY2hhbmdlIHRoZSBQRU1fU1RSSU5HX0VWUF9QS0VZIHZhbHVlIHdoaWNoIHdhcyBqdXN0ICJQUklWQVRFCiAgICAgS0VZIiBiZWNhdXNlIHRoaXMgY2xhc2hlZCB3aXRoIFBLQ1MjOCB1bmVuY3J5cHRlZCBzdHJpbmcuIFNpbmNlIHRoaXMKICAgICB2YWx1ZSB3YXMganVzdCB1c2VkIGFzIGEgIm1hZ2ljIHN0cmluZyIgYW5kIG5vdCB1c2VkIGRpcmVjdGx5IGl0cwogICAgIHZhbHVlIGRvZXNuJ3QgbWF0dGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSBzb21lIHNlbWJsYW5jZSBvZiBjb25zdCBjb3JyZWN0bmVzcyB0byBCTi4gU2hhbWUgQyBkb2Vzbid0CiAgICAgc3VwcG9ydCBtdXRhYmxlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSAibGludXgtc3BhcmM2NCIgY29uZmlndXJhdGlvbiAodWx0cmFwZW5ndWluKS4KICAgICBbUmF5IE1pbGxlciA8cmF5Lm1pbGxlckBvdWNzLm94LmFjLnVrPl0KICAgICAibGludXgtc3BhcmMiIGNvbmZpZ3VyYXRpb24uCiAgICAgW0NocmlzdGlhbiBGb3JzdGVyIDxmb0BoYXdvLnN0dy51bmktZXJsYW5nZW4uZGU+XQoKICAqKSBjb25maWcgbm93IGdlbmVyYXRlcyBuby14eHggb3B0aW9ucyBmb3IgbWlzc2luZyBjaXBoZXJzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCAod29yayBpbiBwcm9ncmVzcykuCiAgICAgRmlsZSBlYmNkaWMuYyBub3QgeWV0IGluY2x1ZGVkIGJlY2F1c2UgaXQgaGFzIGEgZGlmZmVyZW50IGxpY2Vuc2UuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBTdXBwb3J0IEJTMjAwMC9PU0QtUE9TSVguCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBNYWtlIGNhbGxiYWNrcyBmb3Iga2V5IGdlbmVyYXRpb24gdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBTL01JTUUgc2FtcGxlcyBjb21waWxlIChub3QgeWV0IHRlc3RlZCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZGl0aW9uYWwgdHlwZXNhZmUgc3RhY2tzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50cyAiYnNkaS1lbGYtZ2NjIiAoQlNEL09TIDQueCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4zIGFuZCAwLjkuM2EgIFsyOSBNYXkgMTk5OV0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gdmFyaWFudCAic2NvNS1nY2MiLgoKICAqKSBVcGRhdGVkIHNvbWUgZGVtb3MuCiAgICAgW1NlYW4gTyBSaW9yZGFpbiwgV2FkZSBTY2hvbGluZV0KCiAgKikgQWRkIG1pc3NpbmcgQklPX2ZyZWUgYXQgZXhpdCBvZiBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1d1IFpoaWdhbmddCgogICopIEZpeCBtZW1vcnkgbGVhayBpbiBjb25mLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlcyBmb3IgV2luMzIgdG8gYXNzZW1ibGVyIHZlcnNpb24gb2YgTUQ1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldCAjISBwYXRoIHRvIHBlcmwgaW4gYXBwcy9kZXJfY2hvcCB0byB3aGVyZSB3ZSBmb3VuZCBpdAogICAgIGluc3RlYWQgb2YgdXNpbmcgYSBmaXhlZCBwYXRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNIQSBsaWJyYXJ5IGNoYW5nZXMgZm9yIGlyaXg2NC1taXBzNC1jYy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgSW1wcm92ZW1lbnRzIGZvciBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjJiIGFuZCAwLjkuMyAgWzI0IE1heSAxOTk5XQoKICAqKSBCaWdudW0gbGlicmFyeSBidWcgZml4LiBJUklYIDYgcGFzc2VzICJtYWtlIHRlc3QiIG5vdyEKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBwcm9ibGVtcyB3aXRoIFNDNC4yIGFuZCB1bnBhdGNoZWQgU0M1LiAgCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBza19udW0sIHNrX3ZhbHVlIGFuZCBza19zZXQgdG8gcmVwbGFjZSB0aGUgcHJldmlvdXMgbWFjcm9zLgogICAgIFRoZXNlIGFyZSByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSB0eXBlc2FmZSBzdGFjayB3b3VsZCBvdGhlcndpc2UgYnJlYWsgCiAgICAgZXhpc3RpbmcgY29kZS4gSWYgb2xkIGNvZGUgdXNlZCBhIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggdXNlZCB0byBiZSBTVEFDSwogICAgIGFuZCBpcyBub3cgU1RBQ0tfT0YgKGZvciBleGFtcGxlIGNlcnQgaW4gYSBQS0NTN19TSUdORUQgc3RydWN0dXJlKSB3aXRoCiAgICAgc2tfbnVtIG9yIHNrX3ZhbHVlIGl0IHdvdWxkIHByb2R1Y2UgYW4gZXJyb3IgYmVjYXVzZSB0aGUgbnVtLCBkYXRhIG1lbWJlcnMKICAgICBhcmUgbm90IHByZXNlbnQgaW4gU1RBQ0tfT0YuIE5vdyBpdCBqdXN0IHByb2R1Y2VzIGEgd2FybmluZy4gc2tfc2V0CiAgICAgcmVwbGFjZXMgdGhlIG9sZCBtZXRob2Qgb2YgYXNzaWduaW5nIGEgdmFsdWUgdG8gc2tfdmFsdWUKICAgICAoZS5nLiBza192YWx1ZSh4LCBpKSA9IHkpIHdoaWNoIHRoZSBsaWJyYXJ5IHVzZWQgaW4gYSBmZXcgY2FzZXMuIEFueSBjb2RlCiAgICAgdGhhdCBkb2VzIHRoaXMgd2lsbCBubyBsb25nZXIgd29yayAoYW5kIHNob3VsZCB1c2Ugc2tfc2V0IGluc3RlYWQpIGJ1dAogICAgIHRoaXMgY291bGQgYmUgcmVnYXJkZWQgYXMgYSAicXVlc3Rpb25hYmxlIiBiZWhhdmlvdXIgYW55d2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtb3N0IG9mIHRoZSBvdGhlciBQS0NTIzcgYnVncy4gVGhlICJleHBlcmltZW50YWwiIGNvZGUgY2FuIG5vdwogICAgIGNvcnJlY3RseSBoYW5kbGUgZW5jcnlwdGVkIFMvTUlNRSBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0eXBlIG9mIHZhcmlvdXMgREVTIGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIGRlc19jYmxvY2sKICAgICAod2hpY2ggbWVhbnMsIGluIGZ1bmN0aW9uIGFyZ3VtZW50IGRlY2xhcmF0aW9ucywgcG9pbnRlciB0byBjaGFyKQogICAgIHRvIGRlc19jYmxvY2sgKiAobWVhbmluZyBwb2ludGVyIHRvIGFycmF5IHdpdGggOCBjaGFyIGVsZW1lbnRzKSwKICAgICB3aGljaCBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGRvIG1vcmUgdHlwZWNoZWNraW5nOyBpdCB3YXMgbGlrZQogICAgIHRoYXQgYmFjayBpbiBTU0xlYXksIGJ1dCB3aXRoIGxvdHMgb2YgdWdseSBjYXN0cy4KCiAgICAgSW50cm9kdWNlIG5ldyB0eXBlIGNvbnN0X2Rlc19jYmxvY2suCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmdhbmlzZSB0aGUgUEtDUyM3IGxpYnJhcnkgYW5kIGdldCByaWQgb2Ygc29tZSBvZiB0aGUgbW9yZSBvYnZpb3VzCiAgICAgcHJvYmxlbXM6IGZpbmQgUmVjaXBpZW50SW5mbyBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHJlY2lwaWVudCBjZXJ0aWZpY2F0ZQogICAgIGFuZCBpbml0aWFsaXNlIHRoZSBBU04xIHN0cnVjdHVyZXMgcHJvcGVybHkgYmFzZWQgb24gcGFzc2VkIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZWxhdGVkbHkgbWFrZSB0aGUgQk4gdGVzdHMgYWN0dWFsbHkgY2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIG5lZ2F0aXZlIEFTTjEgSU5URUdFUlMgYW5kIGNvbnZlcnNpb24KICAgICB0byBhbmQgZnJvbSBCTnM6IGl0IHdhcyBjb21wbGV0ZWx5IGJyb2tlbi4gTmV3IGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIE5FR19QVUJLRVlfQlVHIHRvIGFsbG93IGZvciBzb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBlbmNvZGUgcHVibGljCiAgICAga2V5IGVsZW1lbnRzIGFzIG5lZ2F0aXZlIGludGVnZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pemUgYW5kIHNwZWVkIHVwIE1ENS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPl0KCiAgKikgTmV3IG9wdGlvbiAtb3V0IHRvIGFzbjFwYXJzZSB0byBhbGxvdyB0aGUgcGFyc2VkIHN0cnVjdHVyZSB0byBiZQogICAgIG91dHB1dCB0byBhIGZpbGUuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAtc3RycGFyc2UKICAgICBvcHRpb24gdG8gZXhhbWluZSB0aGUgb3V0cHV0IG9mIHRoaW5ncyBsaWtlIE9DVEVUIFNUUklOR1MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBTU0wgbGlicmFyeSBhIGxpdHRsZSBtb3JlIGZvb2wtcHJvb2YgYnkgbm90IHJlcXVpcmluZyBhbnkgbG9uZ2VyCiAgICAgdGhhdCBTU0xfc2V0X3thY2NlcHQsY29ubmVjdH1fc3RhdGUgYmUgY2FsbGVkIGJlZm9yZQogICAgIFNTTF97YWNjZXB0LGNvbm5lY3R9IG1heSBiZSB1c2VkIChTU0xfc2V0Xy4uLl9zdGF0ZSBpcyBvbWl0dGVkCiAgICAgaW4gbWFueSBhcHBsaWNhdGlvbnMgYmVjYXVzZSB1c3VhbGx5IGV2ZXJ5dGhpbmcgKmFwcGVhcmVkKiB0byB3b3JrIGFzCiAgICAgaW50ZW5kZWQgYW55d2F5IC0tIG5vdyBpdCByZWFsbHkgd29ya3MgYXMgaW50ZW5kZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgb3BlbnNzbC5jbmYgb3V0IG9mIGxpYi8uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB2YXJpb3VzIHRoaW5ncyB0byBsZXQgT3BlblNTTCBldmVuIHBhc3MgYGBlZ2NjIC1waXBlIC1PMiAtV2FsbAogICAgIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtV2Nhc3QtYWxpZ24gLVdtaXNzaW5nLXByb3RvdHlwZXMKICAgICAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbmVzdGVkLWV4dGVybnMgLVdpbmxpbmUnJyB3aXRoIEVHQ1MgMS4xLjIrIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHRoZSBFVlAgYW5kIFBLQ1MjNyBjb2RlLiBJdCBtYXkgbm93IGJlIGFibGUgdG8KICAgICBoYW5kbGUgUEtDUyM3IGVudmVsb3BlZCBkYXRhIHByb3Blcmx5LgogICAgIFtTZWJhc3RpYW4gQWtlcm1hbiA8c2FrQHBhcmFsbGVsY29uc3VsdGluZy5jb20+LCBtb2RpZmllZCBieSBTdGV2ZV0KCiAgKikgQ3JlYXRlIGEgZHVwbGljYXRlIG9mIHRoZSBTU0xfQ1RYJ3MgQ0VSVCBpbiBTU0xfbmV3IGluc3RlYWQgb2YKICAgICBjb3B5aW5nIHBvaW50ZXJzLiAgVGhlIGNlcnRfc3QgaGFuZGxpbmcgaXMgY2hhbmdlZCBieSB0aGlzIGluCiAgICAgdmFyaW91cyB3YXlzIChhbmQgdGh1cyB3aGF0IHVzZWQgdG8gYmUga25vd24gYXMgY3R4LT5kZWZhdWx0X2NlcnQKICAgICBpcyBub3cgY2FsbGVkIGN0eC0+Y2VydCwgc2luY2Ugd2UgZG9uJ3QgcmVzb3J0IHRvIHMtPmN0eC0+W2RlZmF1bHRfXWNlcnQKICAgICBhbnkgbG9uZ2VyIHdoZW4gcy0+Y2VydCBkb2VzIG5vdCBnaXZlIHVzIHdoYXQgd2UgbmVlZCkuCiAgICAgc3NsX2NlcnRfaW5zdGFudGlhdGUgYmVjb21lcyBvYnNvbGV0ZSBieSB0aGlzIGNoYW5nZS4KICAgICBBcyBzb29uIGFzIHdlJ3ZlIGdvdCB0aGUgbmV3IGNvZGUgcmlnaHQgKHBvc3NpYmx5IGl0IGFscmVhZHkgaXM/KSwKICAgICB3ZSBoYXZlIHNvbHZlZCBhIGNvdXBsZSBvZiBidWdzIG9mIHRoZSBlYXJsaWVyIGNvZGUgd2hlcmUgcy0+Y2VydAogICAgIHdhcyB1c2VkIGFzIGlmIGl0IGNvdWxkIG5vdCBoYXZlIGJlZW4gc2hhcmVkIHdpdGggb3RoZXIgU1NMIHN0cnVjdHVyZXMuCgogICAgIE5vdGUgdGhhdCB1c2luZyB0aGUgU1NMIEFQSSBpbiBjZXJ0YWluIGRpcnR5IHdheXMgbm93IHdpbGwgcmVzdWx0CiAgICAgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB0aGFuIG9ic2VydmVkIHdpdGggZWFybGllciBsaWJyYXJ5IHZlcnNpb25zOgogICAgIENoYW5naW5nIHNldHRpbmdzIGZvciBhbiBTU0xfQ1RYICpjdHggYWZ0ZXIgaGF2aW5nIGRvbmUgcyA9IFNTTF9uZXcoY3R4KQogICAgIGRvZXMgbm90IGluZmx1ZW5jZSBzIGFzIGl0IHVzZWQgdG8uCiAgICAgCiAgICAgSW4gb3JkZXIgdG8gY2xlYW4gdXAgdGhpbmdzIG1vcmUgdGhvcm91Z2hseSwgaW5zaWRlIFNTTF9TRVNTSU9OCiAgICAgd2UgZG9uJ3QgdXNlIENFUlQgYW55IGxvbmdlciwgYnV0IGEgbmV3IHN0cnVjdHVyZSBTRVNTX0NFUlQKICAgICB0aGF0IGhvbGRzIHBlci1zZXNzaW9uIGRhdGEgKGlmIGF2YWlsYWJsZSk7IGN1cnJlbnRseSwgdGhpcyBpcwogICAgIHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgY2hhaW4gYW5kLCBmb3IgY2xpZW50cywgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlCiAgICAgYW5kIHRlbXBvcmFyeSBrZXkuICBDRVJUIGhvbGRzIG9ubHkgdGhvc2UgdmFsdWVzIHRoYXQgY2FuIGhhdmUKICAgICBtZWFuaW5nZnVsIGRlZmF1bHRzIGluIGFuIFNTTF9DVFguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19FWFRfaTJkKCkgdG8gY3JlYXRlIGFuIFg1MDlfRVhURU5TSU9OIHN0cnVjdHVyZQogICAgIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBWYXJpb3VzIFBLQ1MjNyBmaXhlczogcmVtb3ZlIHNvbWUKICAgICBldmlsIGNhc3RzIGFuZCBzZXQgdGhlIGVuY19kaWdfYWxnIGZpZWxkIHByb3Blcmx5IGJhc2VkIG9uIHRoZSBzaWduaW5nCiAgICAga2V5IHR5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgUEtDUyMxMiBwYXNzd29yZCB0byBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHRoZQogICAgIGVudmlyb25tZW50LiBMZXQgJ2NhJyBnZXQgaXRzIGNvbmZpZyBmaWxlIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQKICAgICB2YXJpYWJsZXMgIk9QRU5TU0xfQ09ORiIgb3IgIlNTTEVBWV9DT05GIiAoZm9yIGNvbnNpc3RlbmN5IHdpdGggJ3JlcScKICAgICBhbmQgJ3g1MDknKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBwb2xpY2llcyBleHRlbnNpb24gdG8gdXNlIGFuIElBNVNUUklORyBmb3IgdGhlCiAgICAgb3JnYW5pemF0aW9uIGZpZWxkLiBUaGlzIGlzIGNvbnRyYXJ5IHRvIHRoZSBQS0lYIGRlZmluaXRpb24gYnV0CiAgICAgVmVyaVNpZ24gdXNlcyBpdCBhbmQgSUU1IG9ubHkgcmVjb2duaXNlcyB0aGlzIGZvcm0uIERvY3VtZW50ICd4NTA5JwogICAgIGV4dGVuc2lvbiBvcHRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFBFREFOVElDIGNvbXBpbGVyIGZsYWcgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBnY2MgLXBlZGFudGljLAogICAgIHdpdGhvdXQgZGlzYWxsb3dpbmcgaW5saW5lIGFzc2VtYmxlciBhbmQgdGhlIGxpa2UgZm9yIG5vbi1wZWRhbnRpYyBidWlsZHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFN1cHBvcnQgQm9ybGFuZCBDKysgYnVpbGRlci4KICAgICBbSmFuZXogSmVyZSA8ampAdm9pZC5zaT4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU0hBLTEgY2xlYW51cHMgYW5kIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cy4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTcGFyYyB2OHBsdXMgYXNzZW1ibGVyIGZvciB0aGUgYmlnbnVtIGxpYnJhcnkuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQWNjZXB0IGFueSAteHh4IGFuZCAreHh4IGNvbXBpbGVyIG9wdGlvbnMgaW4gQ29uZmlndXJlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBVcGRhdGUgSFBVWCBjb25maWd1cmF0aW9uLgogICAgIFtBbm9ueW1vdXNdCiAgCiAgKikgQWRkIG1pc3Npbmcgc2tfPHR5cGU+X3Vuc2hpZnQoKSBmdW5jdGlvbiB0byBzYWZlc3RhY2suaAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSB0aGF0IHNldHMgdGhlCiAgICAgImV4dHJhX2NlcnQicyBpbiBhZGRpdGlvbiB0byB0aGUgY2VydGlmaWNhdGUuICAoVGhpcyBtYWtlcyBzZW5zZQogICAgIG9ubHkgZm9yICJQRU0iIGZvcm1hdCBmaWxlcywgYXMgY2hhaW5zIGFzIGEgd2hvbGUgYXJlIG5vdAogICAgIERFUi1lbmNvZGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IHZlcmlmeV9kZXB0aCBmcm9tIHRoZSBTU0wgQVBJLgogICAgIHg1MDlfdmZ5LmMgaGFkIHdoYXQgY2FuIGJlIGNvbnNpZGVyZWQgYW4gb2ZmLWJ5LW9uZS1lcnJvcjoKICAgICBJdHMgZGVwdGggKHdoaWNoIHdhcyBub3QgcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlKQogICAgIHdhcyBhY3R1YWxseSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGNlcnRpZmljYXRlcyBpbiBhIGNoYWluOwogICAgIG5vdyBpdCByZWFsbHkgY291bnRzIHRoZSBkZXB0aC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXggaW4gY3J5cHRvL3g1MDkveDUwOV9jbXAuYzogVGhlIFNTTGVyciBtYWNybyB3YXMgdXNlZAogICAgIGluc3RlYWQgb2YgWDUwOWVyciwgd2hpY2ggb2Z0ZW4gcmVzdWx0ZWQgaW4gY29uZnVzaW5nIGVycm9yCiAgICAgbWVzc2FnZXMgc2luY2UgdGhlIGVycm9yIGNvZGVzIGFyZSBub3QgZ2xvYmFsbHkgdW5pcXVlCiAgICAgKGUuZy4gYW4gYWxsZWdlZCBlcnJvciBpbiBzc2wzX2FjY2VwdCB3aGVuIGEgY2VydGlmaWNhdGUKICAgICBkaWRuJ3QgbWF0Y2ggdGhlIHByaXZhdGUga2V5KS4KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCB0aGF0IGFsbG93cyB0byBzZXQgYSBkZWZhdWx0CiAgICAgdmFsdWUgKHNvIHRoYXQgeW91IGRvbid0IG5lZWQgU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQgZm9yIGVhY2gKICAgICBjb25uZWN0aW9uIHVzaW5nIHRoZSBTU0xfQ1RYKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPQUVQIGRlY29kaW5nIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgSU5TVEFMTF9QUkVGSVggZm9yIHBhY2thZ2UgYnVpbGRlcnMsIGFzIHByb3Bvc2VkIGJ5CiAgICAgRGF2aWQgSGFycmlzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAidGhyZWFkcyIgYW5kICJuby10aHJlYWRzIi4gIEZvciBzeXN0ZW1zCiAgICAgd2hlcmUgdGhlIHByb3BlciBjb21waWxlciBvcHRpb25zIGFyZSBrbm93biAoY3VycmVudGx5IFNvbGFyaXMKICAgICBhbmQgTGludXgpLCAidGhyZWFkcyIgaXMgdGhlIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IHNjcmlwdCB1dGlsL21rbGluay5wbCBhcyBhIGZhc3RlciBzdWJzdGl0dXRlIGZvciB1dGlsL21rbGluay5zaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnN0YWxsIHZhcmlvdXMgc2NyaXB0cyB0byAkKE9QRU5TU0xESVIpL21pc2MsIG5vdCB0bwogICAgICQoSU5TVEFMTFRPUCkvYmluIC0tIHRoZXkgc2hvdWxkbid0IGNsdXR0ZXIgZGlyZWN0b3JpZXMKICAgICBzdWNoIGFzIC91c3IvbG9jYWwvYmluLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopICJtYWtlIGxpbnV4LXNoYXJlZCIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KICAgICBbTmllbHMgUG9wcGUgPG5pZWxzQG5ldGJveC5vcmc+XQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiBuby08Y2lwaGVyPiAocnNhLCBpZGVhLCByYzUsIC4uLikuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCB0aGUgUEtDUyMxMiBBUEkgZG9jdW1lbnRhdGlvbiB0byBvcGVuc3NsLnR4dC4gUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IKICAgICBleHRlbnNpb24gYWRkaW5nIGluIHg1MDkgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgTk9QUk9UTyBzZWN0aW9ucyBhbmQgZXJyb3IgY29kZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUGFydGlhbCByZXdyaXRlIG9mIHRoZSBERUYgZmlsZSBnZW5lcmF0b3IgdG8gbm93IHBhcnNlIHRoZSBBTlNJCiAgICAgcHJvdG90eXBlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgLS1wcmVmaXg9RElSIGFuZCAtLW9wZW5zc2xkaXI9RElSLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBlcnJvciBjb2RlIHNjcmlwdChzKS4gSXQgaXMgYWxsIG5vdyBoYW5kbGVkCiAgICAgYnkgb25lIHNjcmlwdCBhdCB0aGUgdG9wIGxldmVsIHdoaWNoIGhhbmRsZXMgZXJyb3IgY29kZSBnYXRoZXJpbmcsCiAgICAgaGVhZGVyIHJld3JpdGluZyBhbmQgQyBzb3VyY2UgZmlsZSBnZW5lcmF0aW9uLiBJdCBzaG91bGQgYmUgbXVjaCBiZXR0ZXIKICAgICB0aGFuIHRoZSBvbGQgbWV0aG9kOiBpdCBub3cgdXNlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgVWxmJ3MgcGFyc2VyIHRvCiAgICAgcmVhZCB0aGUgQU5TSSBwcm90b3R5cGVzIGluIGFsbCBoZWFkZXIgZmlsZXMgKHRodXMgdGhlIG9sZCBLJlIgZGVmaW5pdGlvbnMKICAgICBhcmVuJ3QgbmVlZGVkIGZvciBlcnJvciBjcmVhdGlvbiBhbnkgbW9yZSkgYW5kIGRvIGEgYmV0dGVyIGpvYiBvZgogICAgIHRyYW5zbGF0aW5nIGZ1bmN0aW9uIGNvZGVzIGludG8gbmFtZXMuIFRoZSBvbGQgJ0FTTjEgZXJyb3IgY29kZSBpbWJlZGRlZAogICAgIGluIGEgY29tbWVudCcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBhbmQgaXQgZG9lc24ndCB1c2UgLmVyciBmaWxlcyB3aGljaAogICAgIGhhdmUgbm93IGJlZW4gZGVsZXRlZC4gQWxzbyB0aGUgZXJyb3IgY29kZSBjYWxsIGRvZXNuJ3QgaGF2ZSB0byBhcHBlYXIgYWxsCiAgICAgb24gb25lIGxpbmUgKHdoaWNoIHJlc3VsdGVkIGluIHNvbWUgbGFyZ2UgbGluZXMuLi4pLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSAjaW5jbHVkZSBmaWxlbmFtZXMgZnJvbSA8Zm9vLmg+IHRvIDxvcGVuc3NsL2Zvby5oPi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmVoYXZpb3VyIG9mIHNzbDJfcmVhZCB3aGVuIGZhY2luZyBsZW5ndGgtMCBwYWNrZXRzOiBEb24ndCByZXR1cm4KICAgICAwICh3aGljaCB1c3VhbGx5IGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uKSwgYnV0IGNvbnRpbnVlIHJlYWRpbmcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNvbWUgcmFjZSBjb25kaXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBleHRlbnNpb24uIEFkZCBDZXJ0aWZpY2F0ZQogICAgIFBvbGljaWVzIGFuZCBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdGhlIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGZpbGUgcGFydHMgdG8gY3J5cHRvL29wZW5zc2xjb25mLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBuZXcgNTYtYml0IERFUyBleHBvcnQgY2lwaGVyc3VpdGVzOiB0aGV5IHdlcmUgdXNpbmcgNyBieXRlcyBpbnN0ZWFkIG9mCiAgICAgOCBvZiBrZXlpbmcgbWF0ZXJpYWwuIE1lcmxpbiBoYXMgYWxzbyBjb25maXJtZWQgaW50ZXJvcCB3aXRoIHRoaXMgZml4CiAgICAgYmV0d2VlbiBPcGVuU1NMIGFuZCBCYWx0aW1vcmUgQy9TU0wgMi4wIGFuZCBKL1NTTCAyLjAuCiAgICAgW01lcmxpbiBIdWdoZXMgPG1lcmxpbkBiYWx0aW1vcmUuaWU+XQoKICAqKSBGaXggbG90cyBvZiB3YXJuaW5ncy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEluIGFkZF9jZXJ0X2RpcigpIGluIGNyeXB0by94NTA5L2J5X2Rpci5jLCBicmVhayBvdXQgb2YgdGhlIGxvb3AgaWYKICAgICB0aGUgZGlyZWN0b3J5IHNwZWMgZGlkbid0IGVuZCB3aXRoIGEgTElTVF9TRVBBUkFUT1JfQ0hBUi4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEZpeCBwcm9ibGVtcyB3aXRoIHNpemVvZihsb25nKSA9PSA4LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIENoYW5nZSBmdW5jdGlvbnMgdG8gQU5TSSBDLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggdHlwb3MgaW4gZXJyb3IgY29kZXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+LCBVbGYgTfZsbGVyXQoKICAqKSBSZW1vdmUgZGVmdW5jdCBhc3NlbWJsZXIgZmlsZXMgZnJvbSBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNQQVJDIHY4IGFzc2VtYmxlciBCSUdOVU0gaW1wbGVtZW50YXRpb24uCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgU3VwcG9ydCBmb3IgQ2VydGlmaWNhdGUgUG9saWNpZXMgZXh0ZW5zaW9uOiBib3RoIHByaW50IGFuZCBzZXQuCiAgICAgVmFyaW91cyBhZGRpdGlvbnMgdG8gc3VwcG9ydCB0aGUgcjJpIG1ldGhvZCB0aGlzIHVzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBsb3Qgb2YgY29uc3RpZmljYXRpb24sIGFuZCBmaXggYSBidWcgaW4gWDUwOV9OQU1FX29uZWxpbmUoKSB0aGF0IGNvdWxkCiAgICAgcmV0dXJuIGEgY29uc3Qgc3RyaW5nIHdoZW4geW91IGFyZSBleHBlY3RpbmcgYW4gYWxsb2NhdGVkIGJ1ZmZlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEFTTjEgdHlwZXMgVVRGOFN0cmluZyBhbmQgVklTSUJMRVNUUklORywgYWxzbyB0aGUgQ0hPSUNFCiAgICAgdHlwZXMgRGlyZWN0b3J5U3RyaW5nIGFuZCBEaXNwbGF5VGV4dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29kZSB0byBhbGxvdyByMmkgZXh0ZW5zaW9ucyB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UsCiAgICAgYWRkIGFuIExIQVNIIGRhdGFiYXNlIGRyaXZlciBhbmQgYWRkIHNldmVyYWwgY3R4IGhlbHBlciBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGFuIGV2aWwgYnVnIGluIGJuX2V4cGFuZDIoKSB3aGljaCBjYXVzZWQgdmFyaW91cyBCTiBmdW5jdGlvbnMgdG8KICAgICBmYWlsIHdoZW4gdGhleSBleHRlbmRlZCB0aGUgc2l6ZSBvZiBhIEJJR05VTS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTWE5ldCBleHRlbnNpb24uIE1vZGlmeSBta2RlZi5wbCB0bwogICAgIHN1cHBvcnQgdHlwZXNhZmUgc3RhY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHR5cG8gaW4gU1NMX1tnc11ldF9vcHRpb25zKCkuCiAgICAgW05pbHMgRnJvc3RiZXJnIDxuaWxzQG1lZGNvbS5zZT5dCgogICopIERlbGV0ZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgZmlsZXMgdGhhdCBiZWxvbmdlZCB0byB0aGUgKG5vdyBvYnNvbGV0ZSkKICAgICBvbGQgWDUwOVYzIGhhbmRsaW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb24gInJzYXJlZiIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvbid0IGF1dG8tZ2VuZXJhdGUgcGVtLmguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBBU04uMSBTRVRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb252ZXJ0IHZhcmlvdXMgYWRkaXRpb25hbCBjYXN0ZWQgc3RhY2tzIHRvIHR5cGUtc2FmZSBTVEFDS19PRigpIHZhcmlhbnRzLgogICAgIFtCZW4gTGF1cmllLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSB0eXBlLXNhZmUgU1RBQ0tzLiBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayBsb3RzIG9mIGNvZGUKICAgICB0aGF0IGxpbmtzIHdpdGggT3BlblNTTCAod2VsbCBhdCBsZWFzdCBjYXVzZSBsb3RzIG9mIHdhcm5pbmdzKSwgYnV0IGZlYXIKICAgICBub3Q6IHRoZSBjb252ZXJzaW9uIGlzIHRyaXZpYWwsIGFuZCBpdCBlbGltaW5hdGVzIGxvYWRzIG9mIGV2aWwgY2FzdHMuIEEKICAgICBmZXcgU1RBQ0tlZCB0aGluZ3MgaGF2ZSBiZWVuIGNvbnZlcnRlZCBhbHJlYWR5LiBGZWVsIGZyZWUgdG8gY29udmVydCBtb3JlLgogICAgIEluIHRoZSBmdWxsbmVzcyBvZiB0aW1lLCBJJ2xsIGRvIGF3YXkgd2l0aCB0aGUgU1RBQ0sgdHlwZSBhbHRvZ2V0aGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYG9wZW5zc2wgY2EgLXJldm9rZSA8Y2VydGZpbGU+JyBmYWNpbGl0eSB3aGljaCByZXZva2VzIGEgY2VydGlmaWNhdGUKICAgICBzcGVjaWZpZWQgaW4gPGNlcnRmaWxlPiBieSB1cGRhdGluZyB0aGUgZW50cnkgaW4gdGhlIGluZGV4LnR4dCBmaWxlLgogICAgIFRoaXMgd2F5IG9uZSBubyBsb25nZXIgaGFzIHRvIGVkaXQgdGhlIGluZGV4LnR4dCBmaWxlIG1hbnVhbGx5IGZvcgogICAgIHJldm9raW5nIGEgY2VydGlmaWNhdGUuIFRoZSAtcmV2b2tlIG9wdGlvbiBkb2VzIHRoZSBnb3J5IGRldGFpbHMgbm93LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBvcGVuY2Eub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGBvcGVuc3NsIGNybCAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdoZXJlIGAtbm9vdXQnIGtpbGxlZCB0aGUKICAgICBgLXRleHQnIG9wdGlvbiBhdCBhbGwgYW5kIHRoaXMgd2F5IHRoZSBgLW5vb3V0IC10ZXh0JyBjb21iaW5hdGlvbiB3YXMKICAgICBpbmNvbnNpc3RlbnQgaW4gYG9wZW5zc2wgY3JsJyB3aXRoIHRoZSBmcmllbmRzIGluIGBvcGVuc3NsIHg1MDl8cnNhfGRzYScuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSBhIGNvcnJlc3BvbmRpbmcgcGxhaW4gdGV4dCBlcnJvciBtZXNzYWdlIGV4aXN0cyBmb3IgdGhlCiAgICAgWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQvMjMgZXJyb3IgbnVtYmVyIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGEKICAgICB2ZXJpZnkgY2FsbGJhY2sgZnVuY3Rpb24gZGV0ZXJtaW5lZCB0aGF0IGEgY2VydGlmaWNhdGUgd2FzIHJldm9rZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEJ1Z2ZpeDogSW4gdGVzdC90ZXN0ZW5jLCBkb24ndCB0ZXN0ICJvcGVuc3NsIDxjaXBoZXI+IiBmb3IKICAgICBjaXBoZXJzIHRoYXQgd2VyZSBleGNsdWRlZCwgZS5nLiBieSAtRE5PX0lERUEuICBBbHNvLCB0ZXN0CiAgICAgYWxsIGF2YWlsYWJsZSBjaXBlcnMgaW5jbHVkaW5nIHJjNSwgd2hpY2ggd2FzIGZvcmdvdHRlbiB1bnRpbCBub3cuCiAgICAgSW4gb3JkZXIgdG8gbGV0IHRoZSB0ZXN0aW5nIHNoZWxsIHNjcmlwdCBrbm93IHdoaWNoIGFsZ29yaXRobXMKICAgICBhcmUgYXZhaWxhYmxlLCBhIG5ldyAodXAgdG8gbm93IHVuZG9jdW1lbnRlZCkgY29tbWFuZAogICAgICJvcGVuc3NsIGxpc3QtY2lwaGVyLWNvbW1hbmRzIiBpcyB1c2VkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogc19jbGllbnQgb2NjYXNpb25hbGx5IHdvdWxkIHNsZWVwIGluIHNlbGVjdCgpIHdoZW4KICAgICBpdCBzaG91bGQgaGF2ZSBjaGVja2VkIFNTTF9wZW5kaW5nKCkgZmlyc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBEU0FfZG9fc2lnbiBhbmQgRFNBX2RvX3ZlcmlmeSB0byBwcm92aWRlIGFjY2VzcyB0bwogICAgIHRoZSByYXcgRFNBIHZhbHVlcyBwcmlvciB0byBBU04uMSBlbmNvZGluZy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgVHdlYWtzIHRvIENvbmZpZ3VyZQogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIEFkZCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBBU04xIFBCRVMyIHN0cnVjdHVyZXMuIE5vIG90aGVyIHN1cHBvcnQsCiAgICAgeWV0Li4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHZhcmlhYmxlcyAkKFJBTkxJQikgYW5kICQoUEVSTCkgaW4gdGhlIE1ha2VmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IGNvbmZpZyBvcHRpb24gdG8gYXZvaWQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGlsbGVnYWwgb24gdGhlIDgwMzg2LgogICAgIFRoZSBkZWZhdWx0IGNvZGUgaXMgZmFzdGVyLCBidXQgcmVxdWlyZXMgYXQgbGVhc3QgYSA0ODYuCiAgICAgW1VsZiBN9mxsZXJdCiAgCiAgKikgR290IHJpZCBvZiBvbGQgU1NMMl9DTElFTlRfVkVSU0lPTiAoaW5jb25zaXN0ZW50bHkgdXNlZCkgYW5kCiAgICAgU1NMMl9TRVJWRVJfVkVSU0lPTiAobm90IHVzZWQgYXQgYWxsKSBtYWNyb3MsIHdoaWNoIGFyZSBub3cgdGhlCiAgICAgc2FtZSBhcyBTU0wyX1ZFUlNJT04gYW55d2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiLXNob3djZXJ0cyIgb3B0aW9uIGZvciBzX2NsaWVudC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdGlsbCBtb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBwa2NzMTIgYXBwbGljYXRpb24gdG8gb3BlbnNzbAogICAgIGFwcGxpY2F0aW9uLiBWYXJpb3VzIGNsZWFudXBzIGFuZCBmaXhlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBuZXcgcGtjczEyIGRpcmVjdG9yeSB3aXRoIE1ha2VmaWxlLnNzbCBhbmQKICAgICBtb2RpZnkgZXJyb3Igcm91dGluZXMgdG8gd29yayBpbnRlcm5hbGx5LiBBZGQgZXJyb3IgY29kZXMgYW5kIFBCRSBpbml0CiAgICAgdG8gbGlicmFyeSBzdGFydHVwIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1cnRoZXIgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkZWQgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiwgUEtDUyM4IGFuZAogICAgIHBhY2tpbmcgZnVuY3Rpb25zIHRvIGFzbjEgYW5kIGV2cC4gQ2hhbmdlZCBmdW5jdGlvbiBuYW1lcyBhbmQgZXJyb3IKICAgICBjb2RlcyBhbG9uZyB0aGUgd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBLQ1MxMiBpbnRlZ3JhdGlvbjogYW5kIHNvIGl0IGJlZ2lucy4uLiBGaXJzdCBvZiBzZXZlcmFsIHBhdGNoZXMgdG8KICAgICBzbG93bHkgaW50ZWdyYXRlIFBLQ1MjMTIgZnVuY3Rpb25hbGl0eSBpbnRvIE9wZW5TU0wuIEFkZCBQS0NTIzEyCiAgICAgb2JqZWN0cyB0byBvYmplY3RzLmgKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgJ2luZGVudCcgb3B0aW9uIHRvIHNvbWUgWDUwOVYzIGV4dGVuc2lvbiBjb2RlLiBJbml0aWFsIEFTTjEKICAgICBhbmQgZGlzcGxheSBzdXBwb3J0IGZvciBUaGF3dGUgc3Ryb25nIGV4dHJhbmV0IGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgTGludXhQUEMgc3VwcG9ydC4KICAgICBbSmVmZiBEdWJydWxlIDxpZ29yQHBvYm94Lm9yZz5dCgogICopIEdldCByaWQgb2YgcmVkdW5kYW50IEJOIGZpbGUgYm5fbXVsdy5jLCBhbmQgcmVuYW1lIGJuX2RpdjY0IHRvCiAgICAgYm5fZGl2X3dvcmRzIGluIGFscGhhLnMuCiAgICAgW0hhbm5lcyBSZWluZWNrZSA8SC5SZWluZWNrZUBody5hYy51az4gYW5kIEJlbiBMYXVyaWVdCgogICopIE1ha2Ugc3VyZSB0aGUgUlNBIE9BRVAgdGVzdCBpcyBza2lwcGVkIHVuZGVyIC1EUlNBcmVmIGJlY2F1c2UKICAgICBPQUVQIGlzbid0IHN1cHBvcnRlZCB3aGVuIE9wZW5TU0wgaXMgYnVpbHQgd2l0aCBSU0FyZWYuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBNb3ZlIGRlZmluaXRpb25zIG9mIElTX1NFVC9JU19TRVFVRU5DRSBpbnNpZGUgY3J5cHRvL2FzbjEvYXNuMS5oIAogICAgIHNvIHRoZXkgbm8gbG9uZ2VyIGFyZSBtaXNzaW5nIHVuZGVyIC1ETk9QUk9UTy4gCiAgICAgW1NvcmVuIFMuIEpvcnZhbmcgPHNvcmVuQHQuZGs+XQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjFjIGFuZCAwLjkuMmIgIFsyMiBNYXIgMTk5OV0KCiAgKikgTWFrZSBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbigpIHdvcmsgaW4gc2VydmVycy4gVW5mb3J0dW5hdGVseSwgaXQgc3RpbGwKICAgICBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQuIENvbWluZyBzb29uIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYSBzZWN1cml0eSBob2xlLCB0aGF0IGFsbG93cyBzZXNzaW9ucyB0byBiZSByZXVzZWQgaW4gdGhlIHdyb25nCiAgICAgY29udGV4dCB0aHVzIGJ5cGFzc2luZyBjbGllbnQgY2VydCBwcm90ZWN0aW9uISBBbGwgc29mdHdhcmUgdGhhdCB1c2VzCiAgICAgY2xpZW50IGNlcnRzIGFuZCBzZXNzaW9uIGNhY2hlcyBpbiBtdWx0aXBsZSBjb250ZXh0cyBORUVEUyBQQVRDSElORyB0bwogICAgIGFsbG93IHNlc3Npb24gcmV1c2UhIEEgZnVsbGVyIHNvbHV0aW9uIGlzIGluIHRoZSB3b3Jrcy4KICAgICBbQmVuIExhdXJpZSwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBIb2xnZXIgUmVpZiwgQm9kbyBNb2VsbGVyIChhbmQgPz8/KV0KCiAgKikgU29tZSBtb3JlIHNvdXJjZSB0cmVlIGNsZWFudXBzIChyZW1vdmVkIG9ic29sZXRlIGZpbGVzCiAgICAgY3J5cHRvL2JmL2FzbS9iZjU4Ni5wbCwgdGVzdC90ZXN0LnR4dCBhbmQgY3J5cHRvL3NoYS9hc20vZi5zOyBjaGFuZ2VkCiAgICAgcGVybWlzc2lvbiBvbiAiY29uZmlnIiBzY3JpcHQgdG8gYmUgZXhlY3V0YWJsZSkgYW5kIGEgZml4IGZvciB0aGUgSU5TVEFMTAogICAgIGRvY3VtZW50LgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgUmVtb3ZlIHNvbWUgbGVnYWN5IGFuZCBlcnJvbmVvdXMgdXNlcyBvZiBtYWxsb2MsIGZyZWUgaW5zdGVhZCBvZgogICAgIE1hbGxvYywgRnJlZS4KICAgICBbTGVubmFydCBCYW5nIDxsb2JAbmV0c3RyZWFtLnNlPiwgd2l0aCBtaW5vciBjaGFuZ2VzIGJ5IFN0ZXZlXQoKICAqKSBNYWtlIHJzYV9vYWVwX3Rlc3QgcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBTb2xhcmlzIHNoYXJlZCBsaWJyYXJpZXMuIENvbmZpZ3VyZQogICAgIHNvbGFyaXMtc3BhcmMtc2M0LXBpYywgbWFrZSwgdGhlbiBydW4gc2hsaWIvc29sYXJpcy1zYzQuc2guIEl0J2QgYmUgbmljZQogICAgIGlmIHNvbWVvbmUgd291bGQgbWFrZSB0aGF0IGxhc3Qgc3RlcCBhdXRvbWF0aWMuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQEFkTm92dW0uQ0g+XQoKICAqKSBjdHhfc2l6ZSB3YXMgbm90IGJ1aWx0IHdpdGggdGhlIHJpZ2h0IGNvbXBpbGVyIGR1cmluZyAibWFrZSBsaW5rcyIuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgdGhlIG1lYW5pbmcgb2YgJ0FMTCcgaW4gdGhlIGNpcGhlciBsaXN0LiBJdCBub3cgbWVhbnMgImV2ZXJ5dGhpbmcKICAgICBleGNlcHQgTlVMTCBjaXBoZXJzIi4gVGhpcyBtZWFucyB0aGUgZGVmYXVsdCBjaXBoZXIgbGlzdCB3aWxsIG5vIGxvbmdlcgogICAgIGVuYWJsZSBOVUxMIGNpcGhlcnMuIFRoZXkgbmVlZCB0byBiZSBzcGVjaWZpY2FsbHkgZW5hYmxlZCBlLmcuIHdpdGgKICAgICB0aGUgc3RyaW5nICJERUZBVUxUOmVOVUxMIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdG8gUlNBIHByaXZhdGUgZW5jcnlwdGlvbiByb3V0aW5lczogaWYgcCA8IHEgdGhlbiBpdCB3b3VsZAogICAgIG9jY2FzaW9uYWxseSBwcm9kdWNlIGFuIGludmFsaWQgcmVzdWx0LiBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2l0aAogICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGtleXMgYmVjYXVzZSBPcGVuU1NMIChhbmQgU1NMZWF5KSBlbnN1cmUgcCA+IHEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmUgbGVzcyByZXN0cmljdGl2ZSBhbmQgYWxsb3cgYWxzbyBgcGVybCB1dGlsL3BlcmxwYXRoLnBsCiAgICAgL3BhdGgvdG8vYmluL3BlcmwnIGluIGFkZGl0aW9uIHRvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwgL3BhdGgvdG8vYmluJywKICAgICBiZWNhdXNlIHRoaXMgd2F5IG9uZSBjYW4gYWxzbyB1c2UgYW4gaW50ZXJwcmV0ZXIgbmFtZWQgYHBlcmw1JyAod2hpY2ggaXMKICAgICB1c3VhbGx5IHRoZSBuYW1lIG9mIFBlcmwgNS54eHggb24gcGxhdGZvcm1zIHdoZXJlIGFuIFBlcmwgNC54IGlzIHN0aWxsCiAgICAgaW5zdGFsbGVkIGFzIGBwZXJsJykuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBMZXQgdXRpbC9jbGVhbi1kZXBlbmQucGwgd29yayBhbHNvIHdpdGggb2xkZXIgUGVybCA1LjAweCB2ZXJzaW9ucy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIEZpeCBNYWtlZmlsZS5vcmcgc28gQ0MsQ0ZMQUcgZXRjIGFyZSBwYXNzZWQgdG8gJ21ha2UgbGlua3MnIGFkZAogICAgIGFkdmFwaTMyLmxpYiB0byBXaW4zMiBidWlsZCBhbmQgY2hhbmdlIHRoZSBwZW0gdGVzdCBjb21wYXJpc2lvbgogICAgIHRvIGZjLmV4ZSAodGhhbmtzIHRvIFVscmljaCBLcm9lbmVyIDxrcm9uZXJ1QHlhaG9vLmNvbT4gZm9yIHRoZQogICAgIHN1Z2dlc3Rpb24pLiBGaXggbWlzcGxhY2VkIEFTTkkgcHJvdG90eXBlcyBhbmQgZGVjbGFyYXRpb25zIGluIGV2cC5oCiAgICAgYW5kIGNyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgREVTIHF1YWQgY2hlY2tzdW0gd2FzIGJyb2tlbiBvbiBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb21tZW50IG91dCB0d28gZnVuY3Rpb25zIGluIGJpby5oIHRoYXQgYXJlbid0IGltcGxlbWVudGVkLiBGaXggdXAgdGhlCiAgICAgV2luMzIgdGVzdCBiYXRjaCBmaWxlIHNvIGl0IChtaWdodCkgd29yayBhZ2Fpbi4gVGhlIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZQogICAgIGlzIGhvcnJpYmxlOiBJIGZlZWwgaWxsLi4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdmFyaW91cyAjaWZkZWZzIGFyb3VuZCBzbyBOT19TWVNMT0csIE5PX0RJUkVOVCBldGMgYXJlIG5vdyBzZWxlY3RlZAogICAgIGluIGVfb3MuaC4gQXVkaXQgb2YgaGVhZGVyIGZpbGVzIHRvIGNoZWNrIEFOU0kgYW5kIG5vbiBBTlNJCiAgICAgc2VjdGlvbnM6IDEwIGZ1bmN0aW9ucyB3ZXJlIGFic2VudCBmcm9tIG5vbiBBTlNJIHNlY3Rpb24gYW5kIG5vdCBleHBvcnRlZAogICAgIGZyb20gV2luZG93cyBETExzLiBGaXhlZCB1cCBsaWJlYXkubnVtIGZvciBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYG9wZW5zc2wgdmVyc2lvbicgb3V0cHV0IGxpbmVzIGNvbnNpc3RlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBXaW4zMiBzeW1ib2wgZXhwb3J0IGxpc3RzIGZvciBCSU8gZnVuY3Rpb25zOiBBZGRlZAogICAgIEJJT19nZXRfZXhfbmV3X2luZGV4LCBCSU9fZ2V0X2V4X251bSwgQklPX2dldF9leF9kYXRhIGFuZCBCSU9fc2V0X2V4X2RhdGEKICAgICB0byBtcy9saWJlYXl7MTYsMzJ9LmRlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU2Vjb25kIHJvdW5kIG9mIGZpeGluZyB0aGUgT3BlblNTTCBwZXJsLyBzdHVmZi4gSXQgbm93IGF0IGxlYXN0IGNvbXBpbGVkCiAgICAgZmluZSB1bmRlciBVbml4IGFuZCBwYXNzZXMgc29tZSB0cml2aWFsIHRlc3RzIEkndmUgbm93IGFkZGVkLiBCdXQgdGhlCiAgICAgd2hvbGUgc3R1ZmYgaXMgaG9ycmlibHkgaW5jb21wbGV0ZSwgc28gYSBSRUFETUUuMVNUIHdpdGggYSBkaXNjbGFpbWVyIHdhcwogICAgIGFkZGVkIHRvIG1ha2Ugc3VyZSBubyBvbmUgZXhwZWN0cyB0aGF0IHRoaXMgc3R1ZmYgcmVhbGx5IHdvcmtzIGluIHRoZQogICAgIE9wZW5TU0wgMC45LjIgcmVsZWFzZS4gIEFkZGl0aW9uYWxseSBJJ3ZlIHN0YXJ0ZWQgdG8gY2xlYW4gdGhlIFhTIHNvdXJjZXMKICAgICB1cCBhbmQgZml4ZWQgYSBmZXcgbGl0dGxlIGJ1Z3MgYW5kIGluY29uc2lzdGVuY2llcyBpbiBPcGVuU1NMLntwbSx4c30gYW5kCiAgICAgb3BlbnNzbF9iaW8ueHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgZ2VuZXJhdGlvbiBvZiB0d28gcGFydCBhZGRyZXNzZXMgaW4gcGVybC4KICAgICBbS2VuamkgTWl5YWtlIDxrZW5qaUBtaXlha2Uub3JnPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgY29uZmlnIGVudHJ5IGZvciBMaW51eCBvbiBNSVBTLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXlAY2hhbm5lbDEuY29tPl0KCiAgKikgTWFrZSBsaW5rcyB3aGVuZXZlciBDb25maWd1cmUgaXMgcnVuLCB1bmxlc3Mgd2UgYXJlIG9uIFdpbmRvemUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFBlcm1pdCBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIENSTHMgdXNpbmcgY3JsX3NlY3Rpb24gaW4gb3BlbnNzbC5jbmYuCiAgICAgQ3VycmVudGx5IG9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgQXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZQogICAgIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgdXNlZnVsIGtsdWRnZSB0byBhbGxvdyBwYWNrYWdlIG1haW50YWluZXJzIHRvIHNwZWNpZnkgY29tcGlsZXIgYW5kCiAgICAgb3RoZXIgcGxhdGZvcm1zIGRldGFpbHMgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRob3V0IGhhdmluZyB0byBwYXRjaCB0aGUKICAgICBDb25maWd1cmUgc2NyaXB0IGV2ZXJ5dGltZTogT25lIG5vdyBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUKICAgICA8aWQ+OjxkZXRhaWxzPicnLCBpLmUuIHBsYXRmb3JtIGlkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGRldGFpbHMgYXBwZW5kZWQKICAgICB0byB0aGVtIChzZXBlcmF0ZWQgYnkgY29sb25zKS4gVGhpcyBpcyB0cmVhdGVkIGFzIHRoZXJlIHdvdWxkIGJlIGEgc3RhdGljCiAgICAgcHJlLWNvbmZpZ3VyZWQgZW50cnkgaW4gQ29uZmlndXJlJ3MgJXRhYmxlIHVuZGVyIGtleSA8aWQ+IHdpdGggdmFsdWUKICAgICA8ZGV0YWlscz4gYW5kIGBgcGVybCBDb25maWd1cmUgPGlkPicnIGlzIGNhbGxlZC4gIFNvLCB3aGVuIHlvdSB3YW50IHRvCiAgICAgcGVyZm9ybSBhIHF1aWNrIHRlc3QtY29tcGlsZSB1bmRlciBGcmVlQlNEIDMuMSB3aXRoIHBnY2MgYW5kIHdpdGhvdXQKICAgICBhc3NlbWJsZXIgc3R1ZmYgeW91IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZSAiRnJlZUJTRC1lbGY6cGdjYzotTzY6OjoiJycKICAgICBub3csIHdoaWNoIG92ZXJyaWRlcyB0aGUgRnJlZUJTRC1lbGYgZW50cnkgb24tdGhlLWZseS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRGlzYWJsZSBuZXcgVExTMSBjaXBoZXJzdWl0ZXMgYnkgZGVmYXVsdDogdGhleSBhcmVuJ3Qgb2ZmaWNpYWwgeWV0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBEU08gZmxhZ3MgbGlrZSAtZnBpYywgLWZQSUMsIC1LUElDIGV0Yy4gdG8gYmUgc3BlY2lmaWVkCiAgICAgb24gdGhlIGBwZXJsIENvbmZpZ3VyZSAuLi4nIGNvbW1hbmQgbGluZS4gVGhpcyB3YXkgb25lIGNhbiBjb21waWxlCiAgICAgT3BlblNTTCBsaWJyYXJpZXMgd2l0aCBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHdoaWNoIGlzIG5lZWRlZAogICAgIGZvciBsaW5raW5nIGl0IGludG8gRFNPcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtYXJrYWJseSwgZXhwb3J0IGNpcGhlcnMgd2VyZSB0b3RhbGx5IGJyb2tlbiBhbmQgbm8tb25lIGhhZCBub3RpY2VkIQogICAgIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDbGVhbmVkIHVwIHRoZSBMSUNFTlNFIGRvY3VtZW50OiBUaGUgb2ZmaWNpYWwgY29udGFjdCBmb3IgYW55IGxpY2Vuc2UKICAgICBxdWVzdGlvbnMgbm93IGlzIHRoZSBPcGVuU1NMIGNvcmUgdGVhbSB1bmRlciBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCiAgICAgQW5kIGFkZCBhIHBhcmFncmFwaCBhYm91dCB0aGUgZHVhbC1saWNlbnNlIHNpdHVhdGlvbiB0byBtYWtlIHN1cmUgcGVvcGxlCiAgICAgcmVjb2duaXplIHRoYXQgX0JPVEhfIHRoZSBPcGVuU1NMIGxpY2Vuc2UgX0FORF8gdGhlIFNTTGVheSBsaWNlbnNlIGFwcGx5CiAgICAgdG8gdGhlIE9wZW5TU0wgdG9vbGtpdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgR2VuZXJhbCBzb3VyY2UgdHJlZSBtYWtlZmlsZSBjbGVhbnVwczogTWFkZSBgbWFraW5nIHh4eCBpbiB5eXkuLi4nCiAgICAgZGlzcGxheSBjb25zaXN0ZW50IGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgcmVwbGFjZWQgYC9iaW4vcm0nIGJ5IGBybScuCiAgICAgQWRkaXRvbmFsbHkgY2xlYW5lZCB1cCB0aGUgYG1ha2UgbGlua3MnIHRhcmdldDogUmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgc2VtaWNvbG9ucywgc3Vic2VxdWVudCByZWR1bmRhbnQgcmVtb3ZlcywgaW5saW5lIHBvaW50LnNoIGludG8gbWtsaW5rLnNoCiAgICAgdG8gc3BlZWQgcHJvY2Vzc2luZyBhbmQgbm8gbG9uZ2VyIGNsdXR0ZXIgdGhlIGRpc3BsYXkgd2l0aCBjb25mdXNpbmcKICAgICBzdHVmZi4gSW5zdGVhZCBvbmx5IHRoZSBhY3R1YWxseSBkb25lIGxpbmtzIGFyZSBkaXNwbGF5ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBlcm1pdCBudWxsIGVuY3J5cHRpb24gY2lwaGVyc3VpdGVzLCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBvbmx5LiBJdCB1c2VkCiAgICAgdG8gYmUgbmVjZXNzYXJ5IHRvIHNldCB0aGUgcHJlcHJvY2Vzc29yIGRlZmluZSBTU0xfQUxMT1dfRU5VTEwgdG8gZG8gdGhpcy4KICAgICBJdCBpcyBub3cgbmVjZXNzYXJ5IHRvIHNldCBTU0xfRk9SQklEX0VOVUxMIHRvIHByZXZlbnQgdGhlIHVzZSBvZiBudWxsCiAgICAgZW5jcnlwdGlvbi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZml4ZXMgdG8gdGhlIFBLQ1MjNyBzdHVmZi4gSXQgdXNlZCB0byBzb21ldGltZXMgcmVvcmRlcgogICAgIHNpZ25lZCBhdHRyaWJ1dGVzIHdoZW4gdmVyaWZ5aW5nIHNpZ25hdHVyZXMgKHRoaXMgd291bGQgYnJlYWsgdGhlbSksIAogICAgIHRoZSBkZXRhY2hlZCBkYXRhIGVuY29kaW5nIHdhcyB3cm9uZyBhbmQgcHVibGljIGtleXMgb2J0YWluZWQgdXNpbmcKICAgICBYNTA5X2dldF9wdWJrZXkoKSB3ZXJlbid0IGZyZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIHRoZSBCVUZGRVIgZnVuY3Rpb25zLiBBbHNvIGFkZGVkIGEgd29yayBhcm91bmQKICAgICB0byBhIFdpbjk1IGNvbnNvbGUgYnVnLiBUaGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHBhc3N3b3JkIHJlYWQgc3R1ZmY6IHRoZQogICAgIGxhc3QgY2hhcmFjdGVyIHR5cGVkIGdldHMgY2FycmllZCBvdmVyIHRvIHRoZSBuZXh0IGZyZWFkKCkuIElmIHlvdSB3ZXJlIAogICAgIGdlbmVyYXRpbmcgYSBuZXcgY2VydCByZXF1ZXN0IHVzaW5nICdyZXEnIGZvciBleGFtcGxlIHRoZW4gdGhlIGxhc3QKICAgICBjaGFyYWN0ZXIgb2YgdGhlIHBhc3NwaHJhc2Ugd291bGQgYmUgQ1Igd2hpY2ggd291bGQgdGhlbiBlbnRlciB0aGUgZmlyc3QKICAgICBmaWVsZCBhcyBibGFuay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgbmV3IGBJbmNsdWRlcyBPcGVuU1NMIENyeXB0b2dyYXBoeSBTb2Z0d2FyZScgYnV0dG9uIGFzCiAgICAgZG9jL29wZW5zc2xfYnV0dG9uLntnaWYsaHRtbH0gd2hpY2ggaXMgc2ltaWxhciBpbiBzdHlsZSB0byB0aGUgb2xkIFNTTGVheQogICAgIGJ1dHRvbiBhbmQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGJhc2VkIG9uIE9wZW5TU0wgdG8gc2hvdyB0aGUKICAgICByZWxhdGlvbnNoaXAgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4gIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgY29uZnVzaW5nIHZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzaWduYXR1cmVzIGluIGZpbGVzCiAgICAgc3NsL3NzbF9saWIuYyBhbmQgc3NsL3NzbC5oLgogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaW5zdGFsbCBic3NfZmlsZS5jIHVuZGVyIFBSRUZJWC9pbmNsdWRlLwogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgR2V0IHRoZSBXaW4zMiBjb21waWxlIHdvcmtpbmcgYWdhaW4uIE1vZGlmeSBta2RlZi5wbCBzbyBpdCBjYW4gaGFuZGxlCiAgICAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBoYXMgc3VwcG9ydCBmb3IgTlQgc3BlY2lmaWMKICAgICBzdHVmZi4gRml4IG1rMW1mLnBsIGFuZCBWQy0zMi5wbCB0byBzdXBwb3J0IE5UIGRpZmZlcmVuY2VzIGFsc28uIFZhcmlvdXMKICAgICAjaWZkZWYgV0lOMzIgYW5kIFdJTk5UcyBzcHJpbmtsZWQgYWJvdXQgdGhlIHBsYWNlIGFuZCBzb21lIGNoYW5nZXMgZnJvbQogICAgIHVuc2lnbmVkIHRvIHNpZ25lZCB0eXBlczogdGhpcyB3YXMga2lsbGluZyB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGNlcnRpZmljYXRlIGZpbGUgdG8gc3RhY2sgZnVuY3Rpb25zLAogICAgIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKSBhbmQKICAgICBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjaygpLiAgVGhlc2UgbGFyZ2VseSBzdXBwbGFudAogICAgIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKCksIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgbXVsdGlwbGUgY2VydHMgZWFzaWx5CiAgICAgdG8gYSBzdGFjayAodXN1YWxseSB0aGlzIGlzIHRoZW4gaGFuZGVkIHRvIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KCkpLgogICAgIFRoaXMgbWVhbnMgdGhhdCBBcGFjaGUtU1NMIGFuZCBzaW1pbGFyIHBhY2thZ2VzIGRvbid0IGhhdmUgdG8gbWVzcyBhcm91bmQKICAgICB0byBhZGQgYXMgbWFueSBDQXMgYXMgdGhleSB3YW50IHRvIHRoZSBwcmVmZXJyZWQgbGlzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRXhwZXJpbWVudCB3aXRoIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gQ3VycmVudGx5IG9ubHkgcGFydGlhbGx5IGFwcGxpZWQgdG8KICAgICBzc2wvc3NsX2xpYi5jLgogICAgIFNlZSBodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4vaW5kZXguaHRtbCwgYW5kIHJ1biBkb3h5Z2VuIHdpdGgKICAgICBvcGVuc3NsLmRveHkgYXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBbQmVuIExhdXJpZV0KICAKICAqKSBHZXQgcmlkIG9mIHJlbWFpbmluZyBDKystc3R5bGUgY29tbWVudHMgd2hpY2ggc3RyaWN0IEMgY29tcGlsZXJzIGhhdGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBvaW50ZWQgb3V0IGJ5IENhcmxvcyBBbWVuZ3VhbF0KCiAgKikgQ2hhbmdlZCBCTl9SRUNVUlNJT04gaW4gYm5fbW9udC5jIHRvIEJOX1JFQ1VSU0lPTl9NT05UIHNvIGl0IGlzIG5vdAogICAgIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQ6IGl0IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgU1NMX3h4eCgpIGZ1bmN0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHRlbXBvcmFyeSBSU0EgYW5kCiAgICAgREggcHJpdmF0ZSBrZXlzIGFuZC9vciBjYWxsYmFjayBmdW5jdGlvbnMgd2hpY2ggZGlyZWN0bHkgY29ycmVzcG9uZCB0bwogICAgIHRoZWlyIFNTTF9DVFhfeHh4KCkgY291bnRlcnBhcnRzIGJ1dCB3b3JrIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuIFRoaXMKICAgICBpcyBuZWVkZWQgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBoYXZlIHRvIGNvbmZpZ3VyZSBjZXJ0aWZpY2F0ZXMgb24gYQogICAgIHBlci1jb25uZWN0aW9uIGJhc2lzIChlLmcuIEFwYWNoZSttb2Rfc3NsKSBpbnN0ZWFkIG9mIGEgcGVyLWNvbnRleHQgYmFzaXMKICAgICAoZS5nLiBzX3NlcnZlcikuIAogICAgICAgIEZvciB0aGUgUlNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiBpcyBtYWtlcyBubyBkaWZmZXJlbmNlLCBidXQKICAgICBmb3IgdGhlIERTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gdGhpcyBmaXhlcyB0aGUgIm5vIHNoYXJlZCBjaXBoZXIiCiAgICAgcHJvYmxlbSB3aGVyZSB0aGUgT3BlblNTTCBjaXBoZXIgc2VsZWN0aW9uIHByb2NlZHVyZSBmYWlsZWQgYmVjYXVzZSB0aGUKICAgICB0ZW1wb3Jhcnkga2V5cyB3ZXJlIG5vdCBvdmVydGFrZW4gZnJvbSB0aGUgY29udGV4dCBhbmQgdGhlIEFQSSBwcm92aWRlZAogICAgIG5vIHdheSB0byByZWNvbmZpZ3VyZSB0aGVtLiAKICAgICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBub3cgbGV0IGFwcGxpY2F0aW9ucyByZWNvbmZpZ3VyZSB0aGUgc3R1ZmYgYW5kIHRoZXkKICAgICBhcmUgaW4gZGV0YWlsOiBTU0xfbmVlZF90bXBfUlNBLCBTU0xfc2V0X3RtcF9yc2EsIFNTTF9zZXRfdG1wX2RoLAogICAgIFNTTF9zZXRfdG1wX3JzYV9jYWxsYmFjayBhbmQgU1NMX3NldF90bXBfZGhfY2FsbGJhY2suICBBZGRpdGlvbmFsbHkgYSBuZXcKICAgICBub24tcHVibGljLUFQSSBmdW5jdGlvbiBzc2xfY2VydF9pbnN0YW50aWF0ZSgpIGlzIHVzZWQgYXMgYSBoZWxwZXIKICAgICBmdW5jdGlvbiBhbmQgYWxzbyB0byByZWR1Y2UgY29kZSByZWR1bmRhbmN5IGluc2lkZSBzc2xfcnNhLmMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vdmUgc19zZXJ2ZXIgLWRjZXJ0IGFuZCAtZGtleSBvcHRpb25zIG91dCBvZiB0aGUgdW5kb2N1bWVudGVkIGZlYXR1cmUKICAgICBhcmVhIGJlY2F1c2UgdGhleSBhcmUgdXNlZnVsIGZvciB0aGUgRFNBIHNpdHVhdGlvbiBhbmQgc2hvdWxkIGJlCiAgICAgcmVjb2duaXplZCBieSB0aGUgdXNlcnMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgY2lwaGVyIGRlY2lzaW9uIHNjaGVtZSBmb3IgZXhwb3J0IGNpcGhlcnM6IHRoZSBleHBvcnQgYml0cyBhcmUKICAgICAqbm90KiB3aXRoaW4gU1NMX01LRVlfTUFTSyBvciBTU0xfQVVUSF9NQVNLLCB0aGV5IGFyZSB3aXRoaW4KICAgICBTU0xfRVhQX01BU0suICBTbywgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIGhhcyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlCiAgICAgYWxyZWFkeSBtYXNrZWQgdmFyaWFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIEZpeCAncG9ydCcgdmFyaWFibGUgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBpbiBjcnlwdG8vYmlvL2Jfc29jay5jCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIENoYW5nZSB0eXBlIG9mIGFub3RoZXIgbWRfbGVuIHZhcmlhYmxlIGluIHBrN19kb2l0LmM6UEtDUzdfZGF0YUZpbmFsKCkKICAgICBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGJlY2F1c2UgaXQncyBhIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZWQgYnkKICAgICBFVlBfRGlnZXN0RmluYWwoKSB3aGljaCBleHBlY3RzIGFuIGB1bnNpZ25lZCBpbnQgKicuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGhhcmQtY29kZSBwYXRoIHRvIFBlcmwgaW50ZXJwcmV0ZXIgb24gc2hlYmFuZyBsaW5lIG9mIENvbmZpZ3VyZQogICAgIHNjcmlwdC4gSW5zdGVhZCB1c2UgdGhlIHVzdWFsIFNoZWxsLT5QZXJsIHRyYW5zaXRpb24gdHJpY2suCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgYG9wZW5zc2wgeDUwOSAtbm9vdXQgLW1vZHVsdXMnIGZ1bmN0aW9uYWwgYWxzbyBmb3IgRFNBIGNlcnRpZmljYXRlcwogICAgIChpbiBhZGRpdGlvbiB0byBSU0EgY2VydGlmaWNhdGVzKSB0byBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIGBvcGVuc3NsIGRzYQogICAgIC1ub291dCAtbW9kdWx1cycgYXMgaXQncyBhbHJlYWR5IHRoZSBjYXNlIGZvciBgb3BlbnNzbCByc2EgLW5vb3V0CiAgICAgLW1vZHVsdXMnLiAgRm9yIFJTQSB0aGUgLW1vZHVsdXMgaXMgdGhlIHJlYWwgIm1vZHVsdXMiIHdoaWxlIGZvciBEU0EKICAgICBjdXJyZW50bHkgdGhlIHB1YmxpYyBrZXkgaXMgcHJpbnRlZCAoYSBkZWNpc2lvbiB3aGljaCB3YXMgYWxyZWFkeSBkb25lIGJ5CiAgICAgYG9wZW5zc2wgZHNhIC1tb2R1bHVzJyBpbiB0aGUgcGFzdCkgd2hpY2ggc2VydmVzIGEgc2ltaWxhciBwdXJwb3NlLgogICAgIEFkZGl0aW9uYWxseSB0aGUgTk9fUlNBIG5vIGxvbmdlciBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHdob2xlIC1tb2R1bHVzCiAgICAgb3B0aW9uOyBpdCBub3cgb25seSBhdm9pZHMgdXNpbmcgdGhlIFJTQSBzdHVmZi4gU2FtZSBhcHBsaWVzIHRvIE5PX0RTQQogICAgIG5vdywgdG9vLgogICAgIFtSYWxmIFMuICBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIEFybmUgQW5zcGVyJ3MgcmVsaWFibGUgQklPIC0gdGhpcyBpcyBhbiBlbmNyeXB0ZWQsIGJsb2NrLWRpZ2VzdGVkCiAgICAgQklPLiBTZWUgdGhlIHNvdXJjZSAoY3J5cHRvL2V2cC9iaW9fb2suYykgZm9yIG1vcmUgaW5mby4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRHVtcCB0aGUgb2xkIHl1Y2t5IHJlcSBjb2RlIHRoYXQgdHJpZWQgKGFuZCBmYWlsZWQpIHRvIGFsbG93IHJhdyBPSURzCiAgICAgdG8gYmUgYWRkZWQuIE5vdyBib3RoICdyZXEnIGFuZCAnY2EnIGNhbiB1c2UgbmV3IG9iamVjdHMgZGVmaW5lZCBpbiB0aGUKICAgICBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29vbCBCSU8gdGhhdCBkb2VzIHN5c2xvZyAob3IgZXZlbnQgbG9nIG9uIE5UKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmV3IFRMUyBjaXBoZXJzdWl0ZXMsIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzRfNTZfTUQ1LAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzJfQ0JDXzU2X01ENSBhbmQKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfREVTX0NCQ19TSEEsIGFzIHNwZWNpZmllZCBpbiAiNTYtYml0IEV4cG9ydCBDaXBoZXIKICAgICBTdWl0ZXMgRm9yIFRMUyIsIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDAudHh0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgcHJlbGltaW5hcnkgY29uZmlnIGluZm8gZm9yIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFJTQV9OT19QQURESU5HIHJlYWxseSB1c2Ugbm8gcGFkZGluZy4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEdlbmVyYXRlIGVycm9ycyB3aGVuIHByaXZhdGUvcHVibGljIGtleSBjaGVjayBpcyBkb25lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBPdmVyaGF1bCBmb3IgJ2NybCcgdXRpbGl0eS4gTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX3ByaW50LiBQYXJ0aWFsIHN1cHBvcnQKICAgICBmb3Igc29tZSBDUkwgZXh0ZW5zaW9ucyBhbmQgbmV3IG9iamVjdHMgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVhbGx5IGZpeCB0aGUgQVNOMSBJTVBMSUNJVCBidWcgdGhpcyB0aW1lLi4uIFBhcnRpYWwgc3VwcG9ydCBmb3IgcHJpdmF0ZQogICAgIGtleSB1c2FnZSBleHRlbnNpb24gYW5kIGZ1bGxlciBzdXBwb3J0IGZvciBhdXRob3JpdHkga2V5IGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQUVQIGVuY3J5cHRpb24gZm9yIHRoZSBPcGVuU1NMIGNyeXB0byBsaWJyYXJ5LiBPQUVQIGlzIHRoZSBpbXByb3ZlZAogICAgIHBhZGRpbmcgbWV0aG9kIGZvciBSU0EsIHdoaWNoIGlzIHJlY29tbWVuZGVkIGZvciBuZXcgYXBwbGljYXRpb25zIGluIFBLQ1MKICAgICAjMSB2Mi4wIChSRkMgMjQzNywgT2N0b2JlciAxOTk4KS4KICAgICBPQUVQIChPcHRpbWFsIEFzeW1tZXRyaWMgRW5jcnlwdGlvbiBQYWRkaW5nKSBoYXMgYmV0dGVyIHRoZW9yZXRpY2FsCiAgICAgZm91bmRhdGlvbnMgdGhhbiB0aGUgYWQtaG9jIHBhZGRpbmcgdXNlZCBpbiBQS0NTICMxIHYxLjUuIEl0IGlzIHNlY3VyZQogICAgIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFJTQS4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT4sIHJlZm9ybWF0dGVkLCBjb3JyZWN0ZWQgYW5kIGludGVncmF0ZWQgYnkKICAgICAgQmVuIExhdXJpZV0KCiAgKikgVXBkYXRlcyB0byB0aGUgbmV3IFNTTCBjb21wcmVzc2lvbiBjb2RlCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgRml4IHNvIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBtYXN0ZXIgc2VjcmV0LCB3aGVuIHBhc3NlZAogICAgIHZpYSBSU0EsIGNoZWNrcyB0aGF0IGlmIFRMUyB3YXMgcHJvcG9zZWQsIGJ1dCB3ZSByb2xsIGJhY2sgdG8gU1NMdjMKICAgICAoYmVjYXVzZSB0aGUgc2VydmVyIHdpbGwgbm90IGFjY2VwdCBoaWdoZXIpLCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGlzIDB4MDMsMHgwMSwgbm90IDB4MDMsMHgwMAogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIFJ1biBleHRlbnNpdmUgbWVtb3J5IGxlYWsgY2hlY2tzIG9uIFNTTCBhcHBzLiBGaXhlZCAqbG90cyogb2YgbWVtb3J5CiAgICAgbGVha3MgaW4gc3NsLyByZWxhdGluZyB0byBuZXcgWDUwOV9nZXRfcHVia2V5KCkgYmVoYXZpb3VyLiBBbHNvIGZpeGVzCiAgICAgaW4gYXBwcy8gYW5kIGFuIHVucmVsYXRlZCBsZWFrIGluIGNyeXB0by9kc2EvZHNhX3ZyZi5jCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUkFXIGV4dGVuc2lvbnMgd2hlcmUgYW4gYXJiaXRyYXJ5IGV4dGVuc2lvbiBjYW4gYmUKICAgICBjcmVhdGVkIGJ5IGluY2x1ZGluZyBpdHMgREVSIGVuY29kaW5nLiBTZWUgYXBwcy9vcGVuc3NsLmNuZiBmb3IKICAgICBhbiBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSBsYXRlc3QgUGVybCB2ZXJzaW9ucyBkb24ndCBpbnRlcnByZXQgc29tZSBnZW5lcmF0ZWQgQyBhcnJheQogICAgIGNvZGUgYXMgUGVybCBhcnJheSBjb2RlIGluIHRoZSBjcnlwdG8vZXJyL2Vycl9nZW5jLnBsIHNjcmlwdC4KICAgICBbTGFycyBXZWJlciA8M3dlYmVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBNb2RpZnkgbXMvZG9fbXMuYmF0IHRvIG5vdCBnZW5lcmF0ZSBhc3NlbWJseSBsYW5ndWFnZSBtYWtlZmlsZXMgc2luY2UKICAgICBub3QgbWFueSBwZW9wbGUgaGF2ZSB0aGUgYXNzZW1ibGVyLiBWYXJpb3VzIFdpbjMyIGNvbXBpbGF0aW9uIGZpeGVzIGFuZAogICAgIHVwZGF0ZSB0byB0aGUgSU5TVEFMTC5XMzIgZmlsZSB3aXRoIChob3BlZnVsbHkpIG1vcmUgYWNjdXJhdGUgV2luMzIKICAgICBidWlsZCBpbnN0cnVjdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNvbmZpZ3VyZSBzY3JpcHQgJ0NvbmZpZ3VyZScgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgY3J5cHRvL2RhdGUuaAogICAgIGZpbGUgdW5kZXIgV2luMzIgYW5kIGFsc28gYnVpbGQgcGVtLmggZnJvbSBwZW0ub3JnLiBOZXcgc2NyaXB0CiAgICAgdXRpbC9ta2ZpbGVzLnBsIHRvIGNyZWF0ZSB0aGUgTUlORk8gZmlsZSBvbiBlbnZpcm9ubWVudHMgdGhhdCBjYW4ndCBkbyBhCiAgICAgJ21ha2UgZmlsZXMnOiBwZXJsIHV0aWwvbWtmaWxlcy5wbCA+TUlORk8gc2hvdWxkIHdvcmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFqb3IgcmV3b3JrIG9mIERFUyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGluIHRoZSBwdXJzdWl0IG9mIGNvcnJlY3RuZXNzCiAgICAgYW5kIHB1cml0eS4gQXMgYSByZXN1bHQsIG1hbnkgZXZpbCBjYXN0cyBldmFwb3JhdGVkLCBhbmQgc29tZSB3ZWlyZG5lc3MsCiAgICAgdG9vLiBZb3UgbWF5IGZpbmQgdGhpcyBjYXVzZXMgd2FybmluZ3MgaW4geW91ciBjb2RlLiBaYXBwaW5nIHlvdXIgZXZpbAogICAgIGNhc3RzIHdpbGwgcHJvYmFibHkgZml4IHRoZW0uIE1vc3RseS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBhIHR5cG8gaW4gYXNuMS5oLiBCdWcgZml4IHRvIG9iamVjdCBjcmVhdGlvbiBzY3JpcHQKICAgICBvYmpfZGF0LnBsLiBJdCBjb25zaWRlcmVkIGEgemVybyBpbiBhbiBvYmplY3QgZGVmaW5pdGlvbiB0byBtZWFuCiAgICAgImVuZCBvZiBvYmplY3QiOiBub25lIG9mIHRoZSBvYmplY3RzIGluIG9iamVjdHMuaCBoYXZlIGFueSB6ZXJvcwogICAgIHNvIGl0IHdhc24ndCBzcG90dGVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEVyd2FubiBBQkFMRUEgPGVhYmFsZWFAY2VydHBsdXMuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRyaXBsZSBERVMgQ2lwaGVyIEJsb2NrIENoYWluaW5nIHdpdGggT3V0cHV0IEZlZWRiYWNrCiAgICAgTWFza2luZyAoQ0JDTSkuIEluIHRoZSBhYnNlbmNlIG9mIHRlc3QgdmVjdG9ycywgdGhlIGJlc3QgSSBoYXZlIGJlZW4gYWJsZQogICAgIHRvIGRvIGlzIGNoZWNrIHRoYXQgdGhlIGRlY3J5cHQgdW5kb2VzIHRoZSBlbmNyeXB0LCBzbyBmYXIuIFNlbmQgbWUgdGVzdAogICAgIHZlY3RvcnMgaWYgeW91IGhhdmUgdGhlbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29ycmVjdCBjYWxjdWxhdGlvbiBvZiBrZXkgbGVuZ3RoIGZvciBleHBvcnQgY2lwaGVycyAodG9vIG11Y2ggc3BhY2Ugd2FzCiAgICAgYWxsb2NhdGVkIGZvciBudWxsIGNpcGhlcnMpLiBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG1rZGVmLnBsIGZvciBXaW4zMiBERUYgZmlsZSBjcmVhdGlvbi4gVGhlIHVzYWdlCiAgICAgbWVzc2FnZSBpcyBub3cgY29ycmVjdCAoaXQgdW5kZXJzdGFuZHMgImNyeXB0byIgYW5kICJzc2wiIG9uIGl0cwogICAgIGNvbW1hbmQgbGluZSkuIFRoZXJlIGlzIGFsc28gbm93IGFuICJ1cGRhdGUiIG9wdGlvbi4gVGhpcyB3aWxsIHVwZGF0ZQogICAgIHRoZSB1dGlsL3NzbGVheS5udW0gYW5kIHV0aWwvbGliZWF5Lm51bSBmaWxlcyB3aXRoIGFueSBuZXcgZnVuY3Rpb25zLgogICAgIElmIHlvdSBkbyBhOiAKICAgICBwZXJsIHV0aWwvbWtkZWYucGwgY3J5cHRvIHNzbCB1cGRhdGUKICAgICBpdCB3aWxsIHVwZGF0ZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsZWQgdGhlIFBlcmwgaW50ZXJmYWNlIChwZXJsLyopOgogICAgIC0gcG9ydGVkIEJOIHN0dWZmIHRvIE9wZW5TU0wncyBkaWZmZXJlbnQgQk4gbGlicmFyeQogICAgIC0gbWFkZSB0aGUgcGVybC8gc291cmNlIHRyZWUgQ1ZTLWF3YXJlCiAgICAgLSByZW5hbWVkIHRoZSBwYWNrYWdlIGZyb20gU1NMZWF5IHRvIE9wZW5TU0wgKHRoZSBmaWxlcyBzdGlsbCBjb250YWluCiAgICAgICB0aGVpciBoaXN0b3J5IGJlY2F1c2UgSSd2ZSBjb3BpZWQgdGhlbSBpbiB0aGUgcmVwb3NpdG9yeSkKICAgICAtIHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMgKHRoZSB0ZXN0IHNjcmlwdHMgd2lsbCBiZSByZXBsYWNlZAogICAgICAgYnkgYmV0dGVyIFRlc3Q6Okhhcm5lc3MgdmFyaWFudHMgaW4gdGhlIGZ1dHVyZSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRmlyc3QgY3V0IGZvciBhIHZlcnkgY29uc2VydmF0aXZlIHNvdXJjZSB0cmVlIGNsZWFudXA6CiAgICAgMS4gbWVyZ2UgdmFyaW91cyBvYnNvbGV0ZSByZWFkbWUgdGV4dHMgaW50byBkb2Mvc3NsZWF5LnR4dAogICAgIHdoZXJlIHdlIGNvbGxlY3QgdGhlIG9sZCBkb2N1bWVudHMgYW5kIHJlYWRtZSB0ZXh0cy4KICAgICAyLiByZW1vdmUgdGhlIGZpcnN0IHBhcnQgb2YgZmlsZXMgd2hlcmUgSSdtIGFscmVhZHkgc3VyZSB0aGF0IHdlIG5vCiAgICAgbG9uZ2VyIG5lZWQgdGhlbSBiZWNhdXNlIG9mIHRocmVlIHJlYXNvbnM6IGVpdGhlciB0aGV5IGFyZSBqdXN0IHRlbXBvcmFyeQogICAgIGZpbGVzIHdoaWNoIHdlcmUgbGVmdCBieSBFcmljIG9yIHRoZXkgYXJlIHByZXNlcnZlZCBvcmlnaW5hbCBmaWxlcyB3aGVyZQogICAgIEkndmUgdmVyaWZpZWQgdGhhdCB0aGUgZGlmZiBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIHZpYSAiY3ZzIGRpZmYKICAgICAtclNTTGVheV8wXzhfMWIiIG9yIHRoZXkgd2VyZSByZW5hbWVkIChhcyBpdCB3YXMgZGVmaW5pdGVseSB0aGUgY2FzZSBmb3IKICAgICB0aGUgY3J5cHRvL21kLyBzdHVmZikuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vcmUgZXh0ZW5zaW9uIGNvZGUuIEluY29tcGxldGUgc3VwcG9ydCBmb3Igc3ViamVjdCBhbmQgaXNzdWVyIGFsdAogICAgIG5hbWUsIGlzc3VlciBhbmQgYXV0aG9yaXR5IGtleSBpZC4gQ2hhbmdlIHRoZSBpMnYgZnVuY3Rpb24gcGFyYW1ldGVycwogICAgIGFuZCBhZGQgYW4gZXh0cmEgJ2NybCcgcGFyYW1ldGVyIGluIHRoZSBYNTA5VjNfQ1RYIHN0cnVjdHVyZTogZ3Vlc3MKICAgICB3aGF0IHRoYXQncyBmb3IgOi0pIEZpeCB0byBBU04xIG1hY3JvIHdoaWNoIG1lc3NlZCB1cAogICAgIElNUExJQ0lUIHRhZyBhbmQgYWRkIGZfZW51bS5jIHdoaWNoIGFkZHMgYTJpLCBpMmEgZm9yIEVOVU1FUkFURUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgRU5VTUVSQVRFRCB0eXBlLiBUaGlzIGlzIGxhcmdlbHkgY29waWVkIGZyb20gdGhlCiAgICAgSU5URUdFUiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24sIEVWUF9NRF9DVFhfY29weSgpIHRvIHJlcGxhY2UgZnJlcXVlbnQgdXNlIG9mIG1lbWNweS4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBNYWtlIHN1cmUgYG1ha2UgcmVoYXNoJyB0YXJnZXQgcmVhbGx5IGZpbmRzIHRoZSBgb3BlbnNzbCcgcHJvZ3JhbS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIFNxdWVlemUgYW5vdGhlciA3JSBvZiBzcGVlZCBvdXQgb2YgTUQ1IGFzc2VtYmxlciwgYXQgbGVhc3Qgb24gYSBQMi4gSSdkCiAgICAgbGlrZSB0byBoZWFyIGFib3V0IGl0IGlmIHRoaXMgc2xvd3MgZG93biBvdGhlciBwcm9jZXNzb3JzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgQ3lnV2luMzIgcGxhdGZvcm0gaW5mb3JtYXRpb24gdG8gQ29uZmlndXJlIHNjcmlwdC4KICAgICBbQWxhbiBCYXRpZSA8YmF0aWVAYWFoei5qZi5pbnRlbC5jb20+XQoKICAqKSBGaXhlZCBtcy8zMmFsbC5iYXQgc2NyaXB0OiBgbm9fYXNtJyAtPiBgbm8tYXNtJwogICAgIFtSYWluZXIgVy4gR2VybGluZyA8Z2VybGluZ0BtcGctZ3YubXBnLmRlPl0KICAKICAqKSBOZXcgcHJvZ3JhbSBuc2VxIHRvIG1hbmlwdWxhdGUgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNybDJwa2NzNyBzbyBpdCBzdXBwb3J0cyBtdWx0aXBsZSAtY2VydGZpbGUgYXJndW1lbnRzLiBGaXggYQogICAgIGZldyB0eXBvcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBCTiBjb2RlLiAgUHJldmlvdXNseSB0aGUgZGVmYXVsdCB3YXMgdG8gZGVmaW5lIEJOX1JFQ1VSU0lPTgogICAgIGJ1dCB0aGUgQk4gY29kZSBoYWQgc29tZSBwcm9ibGVtcyB0aGF0IHdvdWxkIGNhdXNlIGZhaWx1cmVzIHdoZW4KICAgICBkb2luZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNldmVyYWwgUEtJWCBhbmQgcHJpdmF0ZSBleHRlbmRlZCBrZXkgdXNhZ2UgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlICdjYScgcHJvZ3JhbSB0byBoYW5kbGUgdGhlIG5ldyBleHRlbnNpb24gY29kZS4gTW9kaWZ5CiAgICAgb3BlbnNzbC5jbmYgZm9yIG5ldyBleHRlbnNpb24gZm9ybWF0LCBhZGQgY29tbWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBYNTA5IFYzIGNoYW5nZXMuIEZpeCB0eXBvIGluIHYzX2JpdHN0ci5jLiBBZGQgc3VwcG9ydCB0byAncmVxJwogICAgIGFuZCBhZGQgYSBzYW1wbGUgdG8gb3BlbnNzbC5jbmYgc28gcmVxIC14NTA5IG5vdyBhZGRzIGFwcHJvcHJpYXRlCiAgICAgQ0EgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51ZWQgWDUwOSBWMyBjaGFuZ2VzLiBBZGQgdG8gb3RoZXIgbWFrZWZpbGVzLCBpbnRlZ3JhdGUgd2l0aCB0aGUKICAgICBlcnJvciBjb2RlLCBhZGQgaW5pdGlhbCBzdXBwb3J0IHRvIFg1MDlfcHJpbnQoKSBhbmQgeDUwOSBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUYWtlcyBhIGRlZXAgYnJlYXRoIGFuZCBzdGFydCBhZGRkaW5nIFg1MDkgVjMgZXh0ZW5zaW9uIHN1cHBvcnQgY29kZS4gQWRkCiAgICAgZmlsZXMgaW4gY3J5cHRvL3g1MDl2My4gTW92ZSBvcmlnaW5hbCBzdHVmZiB0byBjcnlwdG8veDUwOXYzL29sZC4gQWxsIHRoaXMKICAgICBzdHVmZiBpcyBjdXJyZW50bHkgaXNvbGF0ZWQgYW5kIGlzbid0IGV2ZW4gY29tcGlsZWQgeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVpbmcgcGF0Y2hlcyBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBGaXggdXAgY2VydGlmaWNhdGUgYW5kIENSTAogICAgIEFTTjEgdG8gdXNlIEFTTjFfVElNRSBhbmQgbW9kaWZ5IHByaW50IHJvdXRpbmVzIHRvIHVzZSBBU04xX1RJTUVfcHJpbnQuCiAgICAgUmVtb3ZlZCB0aGUgdmVyc2lvbnMgY2hlY2sgZnJvbSBYNTA5IHJvdXRpbmVzIHdoZW4gbG9hZGluZyBleHRlbnNpb25zOgogICAgIHRoaXMgYWxsb3dzIGNlcnRhaW4gYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGRvbid0IHNldCB0aGUgdmVyc2lvbgogICAgIHByb3Blcmx5IHRvIGJlIHByb2Nlc3NlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWFsIHdpdGggaXJyaXRhdGluZyBzaGl0IHRvIGRvIHdpdGggZGVwZW5kZW5jaWVzLCBpbiBZQUFIVyAoWWV0IEFub3RoZXIKICAgICBBZCBIb2MgV2F5KSAtIE1ha2VmaWxlLnNzbHMgbm93IGFsbCBjb250YWluIGxvY2FsIGRlcGVuZGVuY2llcywgd2hpY2gKICAgICBjYW4gc3RpbGwgYmUgcmVnZW5lcmF0ZWQgd2l0aCAibWFrZSBkZXBlbmQiLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTcGVsbGluZyBtaXN0YWtlIGluIEMgdmVyc2lvbiBvZiBDQVNULTEyOC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgSmVyZW15IEh5bHRvbiA8amVyZW15QGNucmkucmVzdG9uLnZhLnVzPl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgZXJyb3IgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgcGVybCBzY3JpcHQgZXJyLWNvZGUucGwgCiAgICAgbm93IHJlYWRzIGluIHRoZSBvbGQgZXJyb3IgY29kZXMgYW5kIHJldGFpbnMgdGhlIG9sZCBudW1iZXJzLCBvbmx5CiAgICAgYWRkaW5nIG5ldyBvbmVzIGlmIG5lY2Vzc2FyeS4gSXQgYWxzbyBvbmx5IGNoYW5nZXMgdGhlIC5lcnIgZmlsZXMgaWYgbmV3CiAgICAgY29kZXMgYXJlIGFkZGVkLiBUaGUgbWFrZWZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBvbmx5IGluc2VydCBlcnJvcnMKICAgICB3aGVuIG5lZWRlZCAodG8gYXZvaWQgbmVlZGxlc3NseSBtb2RpZnlpbmcgaGVhZGVyIGZpbGVzKS4gVGhpcyBpcyBkb25lCiAgICAgYnkgb25seSBpbnNlcnRpbmcgZXJyb3JzIGlmIHRoZSAuZXJyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgYXV0byBnZW5lcmF0ZWQKICAgICBDIGZpbGUuIFRvIHJlYnVpbGQgYWxsIHRoZSBlcnJvciBjb2RlcyBmcm9tIHNjcmF0Y2ggKHRoZSBvbGQgYmVoYXZpb3VyKQogICAgIGVpdGhlciBtb2RpZnkgY3J5cHRvL01ha2VmaWxlLnNzbCB0byBwYXNzIHRoZSAtcmVnZW4gZmxhZyB0byBlcnJfY29kZS5wbAogICAgIG9yIGRlbGV0ZSBhbGwgdGhlIC5lcnIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0FTVC0xMjggd2FzIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGZvciBzaG9ydCBrZXlzLiBUaGUgQyB2ZXJzaW9uIGhhcwogICAgIGJlZW4gZml4ZWQsIGJ1dCBpcyB1bnRlc3RlZC4gVGhlIGFzc2VtYmxlciB2ZXJzaW9ucyBhcmUgYWxzbyBmaXhlZCwgYnV0CiAgICAgbmV3IGFzc2VtYmxlciBIQVMgTk9UIEJFRU4gR0VORVJBVEVEIEZPUiBXSU4zMiAtIHRoZSBNYWtlZmlsZSBuZWVkcyBmaXhpbmcKICAgICB0byByZWdlbmVyYXRlIGl0IGlmIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgKHdpdGggZml4IGZvciBDIHZlcnNpb24pIGJ5IEp1bi1pY2hpcm8gaXRvanVuCiAgICAgIEhhZ2lubyA8aXRvanVuQGthbWUubmV0Pl0KCiAgKikgRmlsZSB3YXMgb3BlbmVkIGluY29ycmVjdGx5IGluIHJhbmRmaWxlLmMuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEJlZ2lubmluZyBvZiBzdXBwb3J0IGZvciBHZW5lcmFsaXplZFRpbWUuIGQyaSwgaTJkLCBjaGVjayBhbmQgcHJpbnQKICAgICBmdW5jdGlvbnMuIEFsc28gQVNOMV9USU1FIHN1aXRlIHdoaWNoIGlzIGEgQ0hPSUNFIG9mIFVUQ1RpbWUgb3IKICAgICBHZW5lcmFsaXplZFRpbWUuIEFTTjFfVElNRSBpcyB0aGUgcHJvcGVyIHR5cGUgdXNlZCBpbiBjZXJ0aWZpY2F0ZXMgZXQKICAgICBhbDogaXQncyBqdXN0IGFsbW9zdCBhbHdheXMgYSBVVENUaW1lLiBOb3RlIHRoaXMgcGF0Y2ggYWRkcyBuZXcgZXJyb3IKICAgICBjb2RlcyBzbyBkbyBhICJtYWtlIGVycm9ycyIgaWYgdGhlcmUgYXJlIHByb2JsZW1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3QgTGludXggMSByZWNvZ25pdGlvbiBpbiBjb25maWcuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBwb2ludGxlc3MgTUQ1IGhhc2ggd2hlbiB1c2luZyBEU0Ega2V5cyBpbiBjYS4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEdlbmVyYXRlIGFuIGVycm9yIGlmIGdpdmVuIGFuIGVtcHR5IHN0cmluZyBhcyBhIGNlcnQgZGlyZWN0b3J5LiBBbHNvCiAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgaGFuZGVkIE5VTEwgKHByZXZpb3VzbHkgcmV0dXJuZWQgMCB0byBpbmRpY2F0ZSBhbgogICAgIGVycm9yLCBidXQgZGlkbid0IHNldCBvbmUpLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gU1NMIG1ldGhvZHMuIE1ha2UgU1NMX3dyaXRlJ3MgYnVmZmVyIGNvbnN0LCBhdCBsYXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGR1bW15IGZ1bmN0aW9uIEJOX3JlZl9tb2RfZXhwKCkgaW4gcnNhcmVmLmMgdG8gaGF2ZSB0aGUgY29ycmVjdAogICAgIHBhcmFtZXRlcnMuIFRoaXMgd2FzIGNhdXNpbmcgYSB3YXJuaW5nIHdoaWNoIGtpbGxlZCBvZmYgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIEMrKyBzdHlsZSBjb21tZW50cyBmcm9tIGNyeXB0by9ibi9ibl9sb2NhbC5oLgogICAgIFtOZWlsIENvc3RpZ2FuIDxuZWlsLmNvc3RpZ2FuQGNlbG9jb20uY29tPl0KCiAgKikgVGhlIGZ1bmN0aW9uIE9CSl90eHQybmlkIHdhcyBicm9rZW4uIEl0IHdhcyBzdXBwb3NlZCB0byByZXR1cm4gYSBuaWQKICAgICBiYXNlZCBvbiBhIHRleHQgc3RyaW5nLCBsb29raW5nIHVwIHNob3J0IGFuZCBsb25nIG5hbWVzIGFuZCBmaW5hbGx5CiAgICAgImRvdCIgZm9ybWF0LiBUaGUgImRvdCIgZm9ybWF0IHN0dWZmIGRpZG4ndCB3b3JrLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBPQkpfdHh0Mm9iaiB0byBkbyB0aGUgc2FtZSBidXQgcmV0dXJuIGFuIEFTTjFfT0JKRUNUIGFuZCByZXdyb3RlIAogICAgIE9CSl90eHQybmlkIHRvIHVzZSBpdC4gT0JKX3R4dDJvYmogY2FuIGFsc28gcmV0dXJuIG9iamVjdHMgZXZlbiBpZiB0aGUKICAgICBPSUQgaXMgbm90IHBhcnQgb2YgdGhlIHRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFg1MDkgbG9va3VwL3ZlcmlmeSBtZXRob2RzLCBmaXhpbmcgYSBidWcgaW4KICAgICBYNTA5X0xPT0tVUF9ieV9hbGlhcygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTb3J0IG9wZW5zc2wgZnVuY3Rpb25zIGJ5IG5hbWUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdldCB0aGUgZ2VuZHNhIHByb2dyYW0gd29ya2luZyAoaG9wZWZ1bGx5KSBhbmQgYWRkIGl0IHRvIGFwcCBsaXN0LiBSZW1vdmUKICAgICBlbmNyeXB0aW9uIGZyb20gc2FtcGxlIERTQSBrZXlzIChpbiBjYXNlIGFueW9uZSBpcyBpbnRlcmVzdGVkIHRoZSBwYXNzd29yZAogICAgIHdhcyAiMTIzNCIpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgX2FsbF8gKl9mcmVlIGZ1bmN0aW9ucyBhY2NlcHQgYSBOVUxMIHBvaW50ZXIuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT5dCgogICopIElmIGEgREgga2V5IGlzIGdlbmVyYXRlZCBpbiBzM19zcnZyLmMsIGRvbid0IGJsb3cgaXQgYnkgdHJ5aW5nIHRvIHVzZQogICAgIE5VTEwgcG9pbnRlcnMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBzX3NlcnZlciBzaG91bGQgc2VuZCB0aGUgQ0FmaWxlIGFzIGFjY2VwdGFibGUgQ0FzLCBub3QgaXRzIG93biBjZXJ0LgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBEb24ndCBibG93IGl0IGZvciBudW1lcmljIC1uZXdrZXkgYXJndW1lbnRzIHRvIGFwcHMvcmVxLgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBUZW1wIGtleSAiZm9yIGV4cG9ydCIgdGVzdHMgd2VyZSB3cm9uZyBpbiBzM19zcnZyLmMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlIGZvciB0ZW1wIGtleSBjYWxsYmFjayBmdW5jdGlvbnMKICAgICBTU0xfQ1RYX3NldF90bXBfe3JzYSxkaH1fY2FsbGJhY2soKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBESF9mcmVlKCkgdG9sZXJhdGUgYmVpbmcgcGFzc2VkIGEgTlVMTCBwb2ludGVyIChsaWtlIFJTQV9mcmVlKCkgYW5kCiAgICAgRFNBX2ZyZWUoKSkuIE1ha2UgWDUwOV9QVUJLRVlfc2V0KCkgY2hlY2sgZm9yIGVycm9ycyBpbiBkMmlfUHVibGljS2V5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgWDUwOV9uYW1lX2FkZF9lbnRyeSgpIGZyZWVkIHRoZSB3cm9uZyB0aGluZyBhZnRlciBhbiBlcnJvci4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgcnNhX2VheS5jIHdvdWxkIGF0dGVtcHQgdG8gZnJlZSBhIE5VTEwgY29udGV4dC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX3Nfc29ja2V0KCkgaGFkIGEgYnJva2VuIHNob3VsZF9yZXRyeSgpIG9uIFdpbmRvemUuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19mX2J1ZmZlcigpIGRpZG4ndCBwYXNzIG9uIEJJT19DVFJMX0ZMVVNILgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBNYWtlIHN1cmUgdGhlIGFscmVhZHkgZXhpc3RpbmcgWDUwOV9TVE9SRS0+ZGVwdGggdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQKICAgICBpbiBYNTA5X1NUT1JFX25ldygpLCBidXQgZG9jdW1lbnQgdGhlIGZhY3QgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHN0aWxsCiAgICAgdW51c2VkIGluIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSB2YXJpb3VzIGxpYnJhcnkgYW5kIGFwcHMgZmlsZXMgdG8gZnJlZSB1cCBwa2V5cyBvYnRhaW5lZCBmcm9tCiAgICAgWDUwOV9QVUJLRVlfZ2V0KCkgZXQgYWwuIEFsc28gYWxsb3cgeDUwOS5jIHRvIGhhbmRsZSBuZXRzY2FwZSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCByZWZlcmVuY2UgY291bnRpbmcgaW4gWDUwOV9QVUJLRVlfZ2V0KCkuIFRoaXMgbWFrZXMKICAgICBkZW1vcy9tYXVyaWNlL2V4YW1wbGUyLmMgd29yaywgYW1vbmdzdCBvdGhlcnMsIHByb2JhYmx5LgogICAgIFtTdGV2ZSBIZW5zb24gYW5kIEJlbiBMYXVyaWVdCgogICopIEZpcnN0IGN1dCBvZiBhIGNsZWFudXAgZm9yIGFwcHMvLiBGaXJzdCB0aGUgYHNzbGVheScgcHJvZ3JhbSBpcyBub3cgbmFtZWQKICAgICBgb3BlbnNzbCcgYW5kIHNlY29uZCwgdGhlIHNob3J0Y3V0IHN5bWxpbmtzIGZvciB0aGUgYG9wZW5zc2wgPGNvbW1hbmQ+JwogICAgIGFyZSBubyBsb25nZXIgY3JlYXRlZC4gVGhpcyB3YXkgd2UgaGF2ZSBhIHNpbmdsZSBhbmQgY29uc2lzdGVudCBjb21tYW5kCiAgICAgbGluZSBpbnRlcmZhY2UgYG9wZW5zc2wgPGNvbW1hbmQ+Jywgc2ltaWxhciB0byBgY3ZzIDxjb21tYW5kPicuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIFBhdWwgU3V0dG9uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBjYS5jOiBtb3ZlIHRlc3QgZm9yIERTQSBrZXlzIGluc2lkZSAjaWZuZGVmIE5PX0RTQS4gTWFrZSBwdWJrZXkKICAgICBCSVQgU1RSSU5HIHdyYXBwZXIgYWx3YXlzIGhhdmUgemVybyB1bnVzZWQgYml0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQ0EucGwsIHBlcmwgdmVyc2lvbiBvZiBDQS5zaCwgYWRkIGV4dGVuZGVkIGtleSB1c2FnZSBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnRhdGlvbiBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KICAgICBbUGF1bCBTdXR0b25dCgogICopIE1ha2VmaWxlcyB1cGRhdGVkIHRvIGV4aXQgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc3ViLWRpcmVjdG9yeQogICAgIG1ha2UgKGluY2x1ZGluZyBpZiB1c2VyIHByZXNzZXMgXkMpIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZSBNb250Z29tZXJ5IGNvbnRleHQgc3R1ZmYgZXhwbGljaXQgaW4gUlNBIGRhdGEgc3RydWN0dXJlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnVpbGQgb3JkZXIgb2YgcGVtIGFuZCBlcnIgdG8gYWxsb3cgZm9yIGdlbmVyYXRlZCBwZW0uaC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHJlbnVtYmVyaW5nIGJ1ZyBpbiBYNTA5X05BTUVfZGVsZXRlX2VudHJ5KCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVuaGFuY2VkIHRoZSBlcnItaW5zLnBsIHNjcmlwdCBzbyBpdCBtYWtlcyB0aGUgZXJyb3IgbGlicmFyeSBudW1iZXIgCiAgICAgZ2xvYmFsIGFuZCBjYW4gYWRkIGEgbGlicmFyeSBuYW1lLiBUaGlzIGlzIG5lZWRlZCBmb3IgZXh0ZXJuYWwgQVNOMSBhbmQKICAgICBvdGhlciBlcnJvciBsaWJyYXJpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgc2tfaW5zZXJ0IHdoaWNoIG5ldmVyIHdvcmtlZCBwcm9wZXJseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQVNOMSBtYWNyb3Mgc28gdGhleSBjYW4gaGFuZGxlIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnV0ZWQgCiAgICAgRVhQTElDSVQgdGFncy4gU29tZSBub24gc3RhbmRhcmQgY2VydGlmaWNhdGVzIHVzZSB0aGVzZTogdGhleSBjYW4gbm93CiAgICAgYmUgcmVhZCBpbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZWQgdGhlIHZhcmlvdXMgb2xkL29ic29sZXRlIFNTTGVheSBkb2N1bWVudGF0aW9uIGZpbGVzIChkb2MveHh4LmRvYykKICAgICBpbnRvIGEgc2luZ2xlIGRvYy9zc2xlYXkudHh0IGJ1bmRsZS4gVGhpcyB3YXkgdGhlIGluZm9ybWF0aW9uIGlzIHN0aWxsCiAgICAgcHJlc2VydmVkIGJ1dCBubyBsb25nZXIgbWVzc2VzIHVwIHRoaXMgZGlyZWN0b3J5LiBOb3cgaXQncyBuZXcgcm9vbSBmb3IKICAgICB0aGUgbmV3IHNldCBvZiBkb2N1bWVuYXRpb24gZmlsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNFVHMgd2VyZSBpbmNvcnJlY3RseSBERVIgZW5jb2RlZC4gVGhpcyB3YXMgYSBtYWpvciBwYWluLCBiZWNhdXNlIHRoZXkKICAgICBzaGFyZWQgY29kZSB3aXRoIFNFUVVFTkNFcywgd2hpY2ggYXJlbid0IGNvZGVkIHRoZSBzYW1lLiBUaGlzIG1lYW5zIHRoYXQKICAgICBhbG1vc3QgZXZlcnl0aGluZyB0byBkbyB3aXRoIFNFVHMgb3IgU0VRVUVOQ0VzIGhhcyBlaXRoZXIgY2hhbmdlZCBuYW1lIG9yCiAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICBbQmVuIExhdXJpZSwgYmFzZWQgb24gYSBwYXJ0aWFsIGZpeCBieSBHUCBKYXlhbiA8Z3BAbnNqLmNvLmpwPl0KCiAgKikgRml4IHRlc3QgZGF0YSB0byB3b3JrIHdpdGggdGhlIGFib3ZlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIFJTQSBoZWFkZXIgZGVjbGFyYXRpb25zIHRoYXQgaGlkIGEgYnVnIEkgZml4ZWQgaW4gMC45LjBiIGJ1dAogICAgIHdhcyBhbHJlYWR5IGZpeGVkIGJ5IEVyaWMgZm9yIDAuOS4xIGl0IHNlZW1zLgogICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQXV0b2RldGVjdCBGcmVlQlNEMy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHZhcmlvdXMgYnVncyBpbiBDb25maWd1cmUuIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczoKICAgICBuZXh0c3RlcAogICAgIG5jci1zY2RlCiAgICAgdW5peHdhcmUtMi4wCiAgICAgdW5peHdhcmUtMi4wLXBlbnRpdW0KICAgICBzY281LWNjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gQ1ZTLiBSZW9yZGVyIHRlc3RzIHRvIHJlZ2VuZXJhdGUgZmlsZXMKICAgICBiZWZvcmUgdGhleSBhcmUgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZW5lcmF0ZSBNYWtlZmlsZS5zc2wgZnJvbSBNYWtlZmlsZS5vcmcgKHRvIGtlZXAgQ1ZTIGhhcHB5KS4KICAgICBbQmVuIExhdXJpZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYiBhbmQgMC45LjFjICBbMjMtRGVjLTE5OThdCgogICopIEFkZGVkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gY3J5cHRvL2NyeXB0by5oIGFuZCAKICAgICBjaGFuZ2VkIFNTTGVheSB0byBPcGVuU1NMIGluIHZlcnNpb24gc3RyaW5ncy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBTb21lIGZpeHVwcyB0byB0aGUgdG9wLWxldmVsIGRvY3VtZW50cy4KICAgICBbUGF1bCBTdXR0b25dCgogICopIEZpeGVkIHRoZSBuYXN0eSBidWcgd2hlcmUgcnNhcmVmLmggd2FzIG5vdCBmb3VuZCB1bmRlciBjb21waWxlLXRpbWUKICAgICBiZWNhdXNlIHRoZSBzeW1saW5rIHRvIGluY2x1ZGUvIHdhcyBtaXNzaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJbmNvcnBvcmF0ZWQgdGhlIHBvcHVsYXIgbm8tUlNBL0RTQS1vbmx5IHBhdGNoZXMgCiAgICAgd2hpY2ggYWxsb3cgdG8gY29tcGlsZSBhIFJTQS1mcmVlIFNTTGVheS4KICAgICBbQW5kcmV3IENvb2tlIC8gSW50ZXJyYWRlciBMZHQuLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBuYXN0eSByZWhhc2ggcHJvYmxlbSB1bmRlciBgbWFrZSAtZiBNYWtlZmlsZS5zc2wgbGlua3MnCiAgICAgd2hlbiAic3NsZWF5IiBpcyBzdGlsbCBub3QgZm91bmQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIG1vcmUgcGxhdGZvcm1zIHRvIENvbmZpZ3VyZTogQ3JheSBUM0UsIEhQVVggMTEsIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBCZWNrbWFubiA8YmVja21hbkBhY2wubGFubC5nb3Y+XQoKICAqKSBVcGRhdGVkIHRoZSBSRUFETUUgZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyAuY3ZzaWdub3JlIGZpbGVzIGluIHRoZSBDVlMgcmVwb3NpdG9yeSBzdWJkaXJzCiAgICAgdG8gbWFrZSBhICJjdnMgdXBkYXRlIiByZWFsbHkgc2lsZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWNvbXBpbGVkIHRoZSBlcnJvci1kZWZpbml0aW9uIGhlYWRlciBmaWxlcyBhbmQgYWRkZWQKICAgICBtaXNzaW5nIHN5bWJvbHMgdG8gdGhlIFdpbjMyIGxpbmtlciB0YWJsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFuZWQgdXAgdGhlIHRvcC1sZXZlbCBkb2N1bWVudHM7CiAgICAgbyBuZXcgZmlsZXM6IENIQU5HRVMgYW5kIExJQ0VOU0UKICAgICBvIG1lcmdlZCBWRVJTSU9OLCBISVNUT1JZKiBhbmQgUkVBRE1FKiBmaWxlcyBhIENIQU5HRVMuU1NMZWF5IAogICAgIG8gbWVyZ2VkIENPUFlSSUdIVCBpbnRvIExJQ0VOU0UKICAgICBvIHJlbW92ZWQgb2Jzb2xldGUgVE9ETyBmaWxlCiAgICAgbyByZW5hbWVkIE1JQ1JPU09GVCB0byBJTlNUQUxMLlczMgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmVkIGR1bW15IGZpbGVzIGZyb20gdGhlIDAuOS4xYiBzb3VyY2UgdHJlZTogCiAgICAgY3J5cHRvL2FzbjEveCBjcnlwdG8vYmlvL2NkIGNyeXB0by9iaW8vZmcgY3J5cHRvL2Jpby9ncmVwIGNyeXB0by9iaW8vdmkKICAgICBjcnlwdG8vYm4vYXNtLy4uLi4uLmFkZC5jIGNyeXB0by9ibi9hc20vYS5vdXQgY3J5cHRvL2RzYS9mIGNyeXB0by9tZDUvZgogICAgIGNyeXB0by9wZW0vZ21vbi5vdXQgY3J5cHRvL3Blcmxhc20vZiBjcnlwdG8vcGtjczcvYnVpbGQgY3J5cHRvL3JzYS9mCiAgICAgY3J5cHRvL3NoYS9hc20vZiBjcnlwdG8vdGhyZWFkcy9mIG1zL3p6eiBzc2wvZiBzc2wvZi5tYWsgdGVzdC9mCiAgICAgdXRpbC9mLm1hayB1dGlsL3BsL2YgdXRpbC9wbC9mLm1hayBjcnlwdG8vYmYvYmZfbG9jbC5vbGQgYXBwcy9mCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgcGxhdGZvcm0gcG9ydGFiaWxpdHkgZml4ZXMuCiAgICAgW01hcmsgSi4gQ294XQoKICAqKSBUaGUgR2VuZXNpcyBvZiB0aGUgT3BlblNTTCBycGplY3Q6CiAgICAgV2Ugc3RhcnQgd2l0aCB0aGUgbGF0ZXN0ICh1bnJlbGVhc2VkKSBTU0xlYXkgdmVyc2lvbiAwLjkuMWIgd2hpY2ggRXJpYyBBLgogICAgIFlvdW5nIGFuZCBUaW0gSi4gSHVkc29uIGNyZWF0ZWQgd2hpbGUgdGhleSB3ZXJlIHdvcmtpbmcgZm9yIEMyTmV0IHVudGlsCiAgICAgc3VtbWVyIDE5OTguCiAgICAgW1RoZSBPcGVuU1NMIFByb2plY3RdCiAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjBiIGFuZCAwLjkuMWIgIFtub3QgcmVsZWFzZWRdCgogICopIFVwZGF0ZWQgYSBmZXcgQ0EgY2VydGlmaWNhdGVzIHVuZGVyIGNlcnRzLwogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIHNvbWUgQklHTlVNIGFwaSBzdHVmZi4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgVmFyaW91cyBwbGF0Zm9ybSBwb3J0czogT3BlbkJTRCwgVWx0cml4LCBJUklYIDY0Yml0LCBOZXRCU0QsIAogICAgIERHVVggeDg2LCBMaW51eCBBbHBoYSwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOZXcgQ09NUCBsaWJyYXJ5IFtjcnlwdG8vY29tcC9dIGZvciBTU0wgUmVjb3JkIExheWVyIENvbXByZXNzaW9uOiAKICAgICBSTEUgKGR1bW15IGltcGxlbWVudGVkKSBhbmQgWkxJQiAocmVhbGx5IGltcGxlbWVudGVkIHdoZW4gWkxJQiBpcwogICAgIGF2YWlsYWJsZSkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZCAtc3RycGFyc2Ugb3B0aW9uIHRvIGFzbjFwYXJzIHByb2dyYW0gd2hpY2ggcGFyc2VzIG5lc3RlZCAKICAgICBiaW5hcnkgc3RydWN0dXJlcyAKICAgICBbRHIgU3RlcGhlbiBIZW5zb24gPHNoZW5zb25AYmlnZm9vdC5jb20+XQoKICAqKSBBZGRlZCAib2lkX2ZpbGUiIHRvIHNzbGVheS5jbmYgZm9yICJjYSIgYW5kICJyZXEiIHByb2dyYW1zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBEU0EgZml4IGZvciAiY2EiIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkICItZ2Vua2V5IiBvcHRpb24gdG8gImRzYXBhcmFtIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBSSVBFIE1EMTYwIChybWQxNjApIG1lc3NhZ2UgZGlnZXN0LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAtYSAoYWxsKSBvcHRpb24gdG8gInNzbGVheSB2ZXJzaW9uIiBjb21tYW5kLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBQTEFURk9STSBkZWZpbmUgd2hpY2ggaXMgdGhlIGlkIGdpdmVuIHRvIENvbmZpZ3VyZS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgTWVtQ2hlY2tfWFhYWCBmdW5jdGlvbnMgdG8gY3J5cHRvL21lbS5jIGZvciBtZW1vcnkgY2hlY2tpbmcuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIHRoZSBBU04uMSBwYXJzZXIgcm91dGluZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIEJJTyByb3V0aW5lcyB0byBzdXBwb3J0IFJFVVNFQUREUiwgc2VlaywgdGVsbCwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBhIEJOX0NUWCB0byB0aGUgQk4gbGlicmFyeS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdGhlIHdlYWsga2V5IHZhbHVlcyBpbiBERVMgbGlicmFyeQogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIEFQSSBpbiBFVlAgbGlicmFyeSBmb3IgY2lwaGVyIGFsaWFzZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFJDMi82NGJpdCBjaXBoZXIuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENvbnZlcnRlZCB0aGUgbGhhc2ggbGlicmFyeSB0byB0aGUgY3J5cHRvL21lbS5jIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSByZWNvZ25pemVkIEFTTi4xIG9iamVjdCBpZHMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgUlNBIHBhZGRpbmcgY2hlY2tzIGZvciBTU0wvVExTLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBCSU8gcHJveHkvZmlsdGVyIGZ1bmN0aW9uYWxpdHkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGV4dHJhX2NlcnRzIHRvIFNTTF9DVFggd2hpY2ggY2FuIGJlIHVzZWQKICAgICBzZW5kIGV4dHJhIENBIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IGluIHRoZSBDQSBjZXJ0IGNoYWluIHNlbmRpbmcKICAgICBwcm9jZXNzLiBJdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTm93IEZvcnRlenphIGlzIGRlbmllZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UgYmVjYXVzZQogICAgIHRoaXMgaXMga2V5IGV4Y2hhbmdlIG1lY2hhbmlzbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNTTGVheSBhdCBhbGwuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGl0aW9uYWwgUEtDUzEgY2hlY2tzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBTdXBwb3J0IHRoZSBzdHJpbmcgIlRMU3YxIiBmb3IgYWxsIFRMUyB2MSBjaXBoZXJzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBmdW5jdGlvbiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgd2hpY2ggZ2l2ZXMgdGhlCiAgICAgZXhfZGF0YSBpbmRleCBvZiB0aGUgU1NMIGNvbnRleHQgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIGV4X2RhdGEuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdmFyaW91cyBjb2RlIGFuZCBjb21tZW50IHR5cG9zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBIG1pbm9yIGJ1ZyBpbiBzc2wvczNfY2xudC5jIHdoZXJlIHRoZXJlIHdvdWxkIGFsd2F5cyBiZSA0IDAgCiAgICAgYnl0ZXMgc2VudCBpbiB0aGUgY2xpZW50IHJhbmRvbS4KICAgICBbRWR3YXJkIEJpc2hvcCA8ZWJpc2hvcEBzcHlnbGFzcy5jb20+XQoK