CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMW8gYW5kIDEuMC4xcCBbOSBKdWwgMjAxNV0KCiAgKikgQWx0ZXJuYXRlIGNoYWlucyBjZXJ0aWZpY2F0ZSBmb3JnZXJ5CgogICAgIER1cmluZyBjZXJ0aWZpY2F0ZSB2ZXJmaWZpY2F0aW9uLCBPcGVuU1NMIHdpbGwgYXR0ZW1wdCB0byBmaW5kIGFuCiAgICAgYWx0ZXJuYXRpdmUgY2VydGlmaWNhdGUgY2hhaW4gaWYgdGhlIGZpcnN0IGF0dGVtcHQgdG8gYnVpbGQgc3VjaCBhIGNoYWluCiAgICAgZmFpbHMuIEFuIGVycm9yIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxvZ2ljIGNhbiBtZWFuIHRoYXQgYW4KICAgICBhdHRhY2tlciBjb3VsZCBjYXVzZSBjZXJ0YWluIGNoZWNrcyBvbiB1bnRydXN0ZWQgY2VydGlmaWNhdGVzIHRvIGJlCiAgICAgYnlwYXNzZWQsIHN1Y2ggYXMgdGhlIENBIGZsYWcsIGVuYWJsaW5nIHRoZW0gdG8gdXNlIGEgdmFsaWQgbGVhZgogICAgIGNlcnRpZmljYXRlIHRvIGFjdCBhcyBhIENBIGFuZCAiaXNzdWUiIGFuIGludmFsaWQgY2VydGlmaWNhdGUuCgogICAgIFRoaXMgaXNzdWUgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgQWRhbSBMYW5nbGV5L0RhdmlkIEJlbmphbWluCiAgICAgKEdvb2dsZS9Cb3JpbmdTU0wpLgogICAgIFtNYXR0IENhc3dlbGxdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xbiBhbmQgMS4wLjFvIFsxMiBKdW4gMjAxNV0KCiAgKikgRml4IEhNQUMgQUJJIGluY29tcGF0aWJpbGl0eS4gVGhlIHByZXZpb3VzIHZlcnNpb24gaW50cm9kdWNlZCBhbiBBQkkKICAgICBpbmNvbXBhdGliaWxpdHkgaW4gdGhlIGhhbmRsaW5nIG9mIEhNQUMuIFRoZSBwcmV2aW91cyBBQkkgaGFzIG5vdyBiZWVuCiAgICAgcmVzdG9yZWQuCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xbSBhbmQgMS4wLjFuIFsxMSBKdW4gMjAxNV0KCiAgKikgTWFsZm9ybWVkIEVDUGFyYW1ldGVycyBjYXVzZXMgaW5maW5pdGUgbG9vcAoKICAgICBXaGVuIHByb2Nlc3NpbmcgYW4gRUNQYXJhbWV0ZXJzIHN0cnVjdHVyZSBPcGVuU1NMIGVudGVycyBhbiBpbmZpbml0ZSBsb29wCiAgICAgaWYgdGhlIGN1cnZlIHNwZWNpZmllZCBpcyBvdmVyIGEgc3BlY2lhbGx5IG1hbGZvcm1lZCBiaW5hcnkgcG9seW5vbWlhbAogICAgIGZpZWxkLgoKICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gZGVuaWFsIG9mIHNlcnZpY2UgYWdhaW5zdCBhbnkKICAgICBzeXN0ZW0gd2hpY2ggcHJvY2Vzc2VzIHB1YmxpYyBrZXlzLCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBvcgogICAgIGNlcnRpZmljYXRlcy4gIFRoaXMgaW5jbHVkZXMgVExTIGNsaWVudHMgYW5kIFRMUyBzZXJ2ZXJzIHdpdGgKICAgICBjbGllbnQgYXV0aGVudGljYXRpb24gZW5hYmxlZC4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBKb3NlcGggQmFyci1QaXh0b24uCiAgICAgKENWRS0yMDE1LTE3ODgpCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEV4cGxvaXRhYmxlIG91dC1vZi1ib3VuZHMgcmVhZCBpbiBYNTA5X2NtcF90aW1lCgogICAgIFg1MDlfY21wX3RpbWUgZG9lcyBub3QgcHJvcGVybHkgY2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgQVNOMV9USU1FCiAgICAgc3RyaW5nIGFuZCBjYW4gcmVhZCBhIGZldyBieXRlcyBvdXQgb2YgYm91bmRzLiBJbiBhZGRpdGlvbiwKICAgICBYNTA5X2NtcF90aW1lIGFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBmcmFjdGlvbmFsIHNlY29uZHMgaW4gdGhlCiAgICAgdGltZSBzdHJpbmcuCgogICAgIEFuIGF0dGFja2VyIGNhbiB1c2UgdGhpcyB0byBjcmFmdCBtYWxmb3JtZWQgY2VydGlmaWNhdGVzIGFuZCBDUkxzIG9mCiAgICAgdmFyaW91cyBzaXplcyBhbmQgcG90ZW50aWFsbHkgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQsIHJlc3VsdGluZyBpbgogICAgIGEgRG9TIG9uIGFwcGxpY2F0aW9ucyB0aGF0IHZlcmlmeSBjZXJ0aWZpY2F0ZXMgb3IgQ1JMcy4gVExTIGNsaWVudHMKICAgICB0aGF0IHZlcmlmeSBDUkxzIGFyZSBhZmZlY3RlZC4gVExTIGNsaWVudHMgYW5kIHNlcnZlcnMgd2l0aCBjbGllbnQKICAgICBhdXRoZW50aWNhdGlvbiBlbmFibGVkIG1heSBiZSBhZmZlY3RlZCBpZiB0aGV5IHVzZSBjdXN0b20gdmVyaWZpY2F0aW9uCiAgICAgY2FsbGJhY2tzLgoKICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IFJvYmVydCBTd2llY2tpIChHb29nbGUpLCBhbmQKICAgICBpbmRlcGVuZGVudGx5IGJ5IEhhbm5vIEL2Y2suCiAgICAgKENWRS0yMDE1LTE3ODkpCiAgICAgW0VtaWxpYSBL5HNwZXJdCgogICopIFBLQ1M3IGNyYXNoIHdpdGggbWlzc2luZyBFbnZlbG9wZWRDb250ZW50CgogICAgIFRoZSBQS0NTIzcgcGFyc2luZyBjb2RlIGRvZXMgbm90IGhhbmRsZSBtaXNzaW5nIGlubmVyIEVuY3J5cHRlZENvbnRlbnQKICAgICBjb3JyZWN0bHkuIEFuIGF0dGFja2VyIGNhbiBjcmFmdCBtYWxmb3JtZWQgQVNOLjEtZW5jb2RlZCBQS0NTIzcgYmxvYnMKICAgICB3aXRoIG1pc3NpbmcgY29udGVudCBhbmQgdHJpZ2dlciBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBvbiBwYXJzaW5nLgoKICAgICBBcHBsaWNhdGlvbnMgdGhhdCBkZWNyeXB0IFBLQ1MjNyBkYXRhIG9yIG90aGVyd2lzZSBwYXJzZSBQS0NTIzcKICAgICBzdHJ1Y3R1cmVzIGZyb20gdW50cnVzdGVkIHNvdXJjZXMgYXJlIGFmZmVjdGVkLiBPcGVuU1NMIGNsaWVudHMgYW5kCiAgICAgc2VydmVycyBhcmUgbm90IGFmZmVjdGVkLgoKICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IE1pY2hhbCBaYWxld3NraSAoR29vZ2xlKS4KICAgICAoQ1ZFLTIwMTUtMTc5MCkKICAgICBbRW1pbGlhIEvkc3Blcl0KCiAgKikgQ01TIHZlcmlmeSBpbmZpbml0ZSBsb29wIHdpdGggdW5rbm93biBoYXNoIGZ1bmN0aW9uCgogICAgIFdoZW4gdmVyaWZ5aW5nIGEgc2lnbmVkRGF0YSBtZXNzYWdlIHRoZSBDTVMgY29kZSBjYW4gZW50ZXIgYW4gaW5maW5pdGUgbG9vcAogICAgIGlmIHByZXNlbnRlZCB3aXRoIGFuIHVua25vd24gaGFzaCBmdW5jdGlvbiBPSUQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybQogICAgIGRlbmlhbCBvZiBzZXJ2aWNlIGFnYWluc3QgYW55IHN5c3RlbSB3aGljaCB2ZXJpZmllcyBzaWduZWREYXRhIG1lc3NhZ2VzIHVzaW5nCiAgICAgdGhlIENNUyBjb2RlLgogICAgIFRoaXMgaXNzdWUgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgSm9oYW5uZXMgQmF1ZXIuCiAgICAgKENWRS0yMDE1LTE3OTIpCiAgICAgW1N0ZXBoZW4gSGVuc29uXQoKICAqKSBSYWNlIGNvbmRpdGlvbiBoYW5kbGluZyBOZXdTZXNzaW9uVGlja2V0CgogICAgIElmIGEgTmV3U2Vzc2lvblRpY2tldCBpcyByZWNlaXZlZCBieSBhIG11bHRpLXRocmVhZGVkIGNsaWVudCB3aGVuIGF0dGVtcHRpbmcgdG8KICAgICByZXVzZSBhIHByZXZpb3VzIHRpY2tldCB0aGVuIGEgcmFjZSBjb25kaXRpb24gY2FuIG9jY3VyIHBvdGVudGlhbGx5IGxlYWRpbmcgdG8KICAgICBhIGRvdWJsZSBmcmVlIG9mIHRoZSB0aWNrZXQgZGF0YS4KICAgICAoQ1ZFLTIwMTUtMTc5MSkKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBSZWplY3QgREggaGFuZHNoYWtlcyB3aXRoIHBhcmFtZXRlcnMgc2hvcnRlciB0aGFuIDc2OCBiaXRzLgogICAgIFtLdXJ0IFJvZWNreCBhbmQgRW1pbGlhIEthc3Blcl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFsIGFuZCAxLjAuMW0gWzE5IE1hciAyMDE1XQoKICAqKSBTZWdtZW50YXRpb24gZmF1bHQgaW4gQVNOMV9UWVBFX2NtcCBmaXgKCiAgICAgVGhlIGZ1bmN0aW9uIEFTTjFfVFlQRV9jbXAgd2lsbCBjcmFzaCB3aXRoIGFuIGludmFsaWQgcmVhZCBpZiBhbiBhdHRlbXB0IGlzCiAgICAgbWFkZSB0byBjb21wYXJlIEFTTi4xIGJvb2xlYW4gdHlwZXMuIFNpbmNlIEFTTjFfVFlQRV9jbXAgaXMgdXNlZCB0byBjaGVjawogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBhbGdvcml0aG0gY29uc2lzdGVuY3kgdGhpcyBjYW4gYmUgdXNlZCB0byBjcmFzaCBhbnkKICAgICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gb3BlcmF0aW9uIGFuZCBleHBsb2l0ZWQgaW4gYSBEb1MgYXR0YWNrLiBBbnkKICAgICBhcHBsaWNhdGlvbiB3aGljaCBwZXJmb3JtcyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgdnVsbmVyYWJsZSBpbmNsdWRpbmcKICAgICBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgd2hpY2ggZW5hYmxlIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KICAgICAoQ1ZFLTIwMTUtMDI4NikKICAgICBbU3RlcGhlbiBIZW5zb25dCgogICopIEFTTi4xIHN0cnVjdHVyZSByZXVzZSBtZW1vcnkgY29ycnVwdGlvbiBmaXgKCiAgICAgUmV1c2luZyBhIHN0cnVjdHVyZSBpbiBBU04uMSBwYXJzaW5nIG1heSBhbGxvdyBhbiBhdHRhY2tlciB0byBjYXVzZQogICAgIG1lbW9yeSBjb3JydXB0aW9uIHZpYSBhbiBpbnZhbGlkIHdyaXRlLiBTdWNoIHJldXNlIGlzIGFuZCBoYXMgYmVlbgogICAgIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIGFuZCBpcyBiZWxpZXZlZCB0byBiZSByYXJlLgoKICAgICBBcHBsaWNhdGlvbnMgdGhhdCBwYXJzZSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgQ0hPSUNFIG9yIEFOWSBERUZJTkVEIEJZCiAgICAgY29tcG9uZW50cyBtYXkgYmUgYWZmZWN0ZWQuIENlcnRpZmljYXRlIHBhcnNpbmcgKGQyaV9YNTA5IGFuZCByZWxhdGVkCiAgICAgZnVuY3Rpb25zKSBhcmUgaG93ZXZlciBub3QgYWZmZWN0ZWQuIE9wZW5TU0wgY2xpZW50cyBhbmQgc2VydmVycyBhcmUKICAgICBub3QgYWZmZWN0ZWQuCiAgICAgKENWRS0yMDE1LTAyODcpCiAgICAgW1N0ZXBoZW4gSGVuc29uXQoKICAqKSBQS0NTNyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGZpeAoKICAgICBUaGUgUEtDUyM3IHBhcnNpbmcgY29kZSBkb2VzIG5vdCBoYW5kbGUgbWlzc2luZyBvdXRlciBDb250ZW50SW5mbwogICAgIGNvcnJlY3RseS4gQW4gYXR0YWNrZXIgY2FuIGNyYWZ0IG1hbGZvcm1lZCBBU04uMS1lbmNvZGVkIFBLQ1MjNyBibG9icyB3aXRoCiAgICAgbWlzc2luZyBjb250ZW50IGFuZCB0cmlnZ2VyIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIG9uIHBhcnNpbmcuCgogICAgIEFwcGxpY2F0aW9ucyB0aGF0IHZlcmlmeSBQS0NTIzcgc2lnbmF0dXJlcywgZGVjcnlwdCBQS0NTIzcgZGF0YSBvcgogICAgIG90aGVyd2lzZSBwYXJzZSBQS0NTIzcgc3RydWN0dXJlcyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzIGFyZQogICAgIGFmZmVjdGVkLiBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgYXJlIG5vdCBhZmZlY3RlZC4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBNaWNoYWwgWmFsZXdza2kgKEdvb2dsZSkuCiAgICAgKENWRS0yMDE1LTAyODkpCiAgICAgW0VtaWxpYSBL5HNwZXJdCgogICopIERvUyB2aWEgcmVhY2hhYmxlIGFzc2VydCBpbiBTU0x2MiBzZXJ2ZXJzIGZpeAoKICAgICBBIG1hbGljaW91cyBjbGllbnQgY2FuIHRyaWdnZXIgYW4gT1BFTlNTTF9hc3NlcnQgKGkuZS4sIGFuIGFib3J0KSBpbgogICAgIHNlcnZlcnMgdGhhdCBib3RoIHN1cHBvcnQgU1NMdjIgYW5kIGVuYWJsZSBleHBvcnQgY2lwaGVyIHN1aXRlcyBieSBzZW5kaW5nCiAgICAgYSBzcGVjaWFsbHkgY3JhZnRlZCBTU0x2MiBDTElFTlQtTUFTVEVSLUtFWSBtZXNzYWdlLgoKICAgICBUaGlzIGlzc3VlIHdhcyBkaXNjb3ZlcmVkIGJ5IFNlYW4gQnVyZm9yZCAoR29vZ2xlKSBhbmQgRW1pbGlhIEvkc3BlcgogICAgIChPcGVuU1NMIGRldmVsb3BtZW50IHRlYW0pLgogICAgIChDVkUtMjAxNS0wMjkzKQogICAgIFtFbWlsaWEgS+RzcGVyXQoKICAqKSBVc2UgQWZ0ZXIgRnJlZSBmb2xsb3dpbmcgZDJpX0VDUHJpdmF0ZWtleSBlcnJvciBmaXgKCiAgICAgQSBtYWxmb3JtZWQgRUMgcHJpdmF0ZSBrZXkgZmlsZSBjb25zdW1lZCB2aWEgdGhlIGQyaV9FQ1ByaXZhdGVLZXkgZnVuY3Rpb24KICAgICBjb3VsZCBjYXVzZSBhIHVzZSBhZnRlciBmcmVlIGNvbmRpdGlvbi4gVGhpcywgaW4gdHVybiwgY291bGQgY2F1c2UgYSBkb3VibGUKICAgICBmcmVlIGluIHNldmVyYWwgcHJpdmF0ZSBrZXkgcGFyc2luZyBmdW5jdGlvbnMgKHN1Y2ggYXMgZDJpX1ByaXZhdGVLZXkKICAgICBvciBFVlBfUEtDUzgyUEtFWSkgYW5kIGNvdWxkIGxlYWQgdG8gYSBEb1MgYXR0YWNrIG9yIG1lbW9yeSBjb3JydXB0aW9uCiAgICAgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlY2VpdmUgRUMgcHJpdmF0ZSBrZXlzIGZyb20gdW50cnVzdGVkCiAgICAgc291cmNlcy4gVGhpcyBzY2VuYXJpbyBpcyBjb25zaWRlcmVkIHJhcmUuCgogICAgIFRoaXMgaXNzdWUgd2FzIGRpc2NvdmVyZWQgYnkgdGhlIEJvcmluZ1NTTCBwcm9qZWN0IGFuZCBmaXhlZCBpbiB0aGVpcgogICAgIGNvbW1pdCA1MTcwNzNjZDRiLgogICAgIChDVkUtMjAxNS0wMjA5KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIFg1MDlfdG9fWDUwOV9SRVEgTlVMTCBwb2ludGVyIGRlcmVmIGZpeAoKICAgICBUaGUgZnVuY3Rpb24gWDUwOV90b19YNTA5X1JFUSB3aWxsIGNyYXNoIHdpdGggYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgaWYKICAgICB0aGUgY2VydGlmaWNhdGUga2V5IGlzIGludmFsaWQuIFRoaXMgZnVuY3Rpb24gaXMgcmFyZWx5IHVzZWQgaW4gcHJhY3RpY2UuCgogICAgIFRoaXMgaXNzdWUgd2FzIGRpc2NvdmVyZWQgYnkgQnJpYW4gQ2FycGVudGVyLgogICAgIChDVkUtMjAxNS0wMjg4KQogICAgIFtTdGVwaGVuIEhlbnNvbl0KCiAgKikgUmVtb3ZlZCB0aGUgZXhwb3J0IGNpcGhlcnMgZnJvbSB0aGUgREVGQVVMVCBjaXBoZXJzCiAgICAgW0t1cnQgUm9lY2t4XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWsgYW5kIDEuMC4xbCBbMTUgSmFuIDIwMTVdCgogICopIEJ1aWxkIGZpeGVzIGZvciB0aGUgV2luZG93cyBhbmQgT3BlblZNUyBwbGF0Zm9ybXMKICAgICBbTWF0dCBDYXN3ZWxsIGFuZCBSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xaiBhbmQgMS4wLjFrIFs4IEphbiAyMDE1XQoKICAqKSBGaXggRFRMUyBzZWdtZW50YXRpb24gZmF1bHQgaW4gZHRsczFfZ2V0X3JlY29yZC4gQSBjYXJlZnVsbHkgY3JhZnRlZCBEVExTCiAgICAgbWVzc2FnZSBjYW4gY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQgaW4gT3BlblNTTCBkdWUgdG8gYSBOVUxMIHBvaW50ZXIKICAgICBkZXJlZmVyZW5jZS4gVGhpcyBjb3VsZCBsZWFkIHRvIGEgRGVuaWFsIE9mIFNlcnZpY2UgYXR0YWNrLiBUaGFua3MgdG8KICAgICBNYXJrdXMgU3RlbmJlcmcgb2YgQ2lzY28gU3lzdGVtcywgSW5jLiBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1NzEpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IERUTFMgbWVtb3J5IGxlYWsgaW4gZHRsczFfYnVmZmVyX3JlY29yZC4gQSBtZW1vcnkgbGVhayBjYW4gb2NjdXIgaW4gdGhlCiAgICAgZHRsczFfYnVmZmVyX3JlY29yZCBmdW5jdGlvbiB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuIEluIHBhcnRpY3VsYXIgdGhpcwogICAgIGNvdWxkIG9jY3VyIGlmIGFuIGF0dGFja2VyIHNlbnQgcmVwZWF0ZWQgRFRMUyByZWNvcmRzIHdpdGggdGhlIHNhbWUKICAgICBzZXF1ZW5jZSBudW1iZXIgYnV0IGZvciB0aGUgbmV4dCBlcG9jaC4gVGhlIG1lbW9yeSBsZWFrIGNvdWxkIGJlIGV4cGxvaXRlZAogICAgIGJ5IGFuIGF0dGFja2VyIGluIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIHRocm91Z2ggbWVtb3J5IGV4aGF1c3Rpb24uCiAgICAgVGhhbmtzIHRvIENocmlzIE11ZWxsZXIgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNS0wMjA2KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIEZpeCBpc3N1ZSB3aGVyZSBuby1zc2wzIGNvbmZpZ3VyYXRpb24gc2V0cyBtZXRob2QgdG8gTlVMTC4gV2hlbiBvcGVuc3NsIGlzCiAgICAgYnVpbHQgd2l0aCB0aGUgbm8tc3NsMyBvcHRpb24gYW5kIGEgU1NMIHYzIENsaWVudEhlbGxvIGlzIHJlY2VpdmVkIHRoZSBzc2wKICAgICBtZXRob2Qgd291bGQgYmUgc2V0IHRvIE5VTEwgd2hpY2ggY291bGQgbGF0ZXIgcmVzdWx0IGluIGEgTlVMTCBwb2ludGVyCiAgICAgZGVyZWZlcmVuY2UuIFRoYW5rcyB0byBGcmFuayBTY2htaXJsZXIgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTY5KQogICAgIFtLdXJ0IFJvZWNreF0KCiAgKikgQWJvcnQgaGFuZHNoYWtlIGlmIHNlcnZlciBrZXkgZXhjaGFuZ2UgbWVzc2FnZSBpcyBvbWl0dGVkIGZvciBlcGhlbWVyYWwKICAgICBFQ0RIIGNpcGhlcnN1aXRlcy4KCiAgICAgVGhhbmtzIHRvIEthcnRoaWtleWFuIEJoYXJnYXZhbiBvZiB0aGUgUFJPU0VDQ08gdGVhbSBhdCBJTlJJQSBmb3IKICAgICByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzU3MikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgbm9uLWV4cG9ydCBlcGhlbWVyYWwgUlNBIGNvZGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIuIFRoaXMgY29kZQogICAgIHZpb2xhdGVkIHRoZSBUTFMgc3RhbmRhcmQgYnkgYWxsb3dpbmcgdGhlIHVzZSBvZiB0ZW1wb3JhcnkgUlNBIGtleXMgaW4KICAgICBub24tZXhwb3J0IGNpcGhlcnN1aXRlcyBhbmQgY291bGQgYmUgdXNlZCBieSBhIHNlcnZlciB0byBlZmZlY3RpdmVseQogICAgIGRvd25ncmFkZSB0aGUgUlNBIGtleSBsZW5ndGggdXNlZCB0byBhIHZhbHVlIHNtYWxsZXIgdGhhbiB0aGUgc2VydmVyCiAgICAgY2VydGlmaWNhdGUuIFRoYW5rcyBmb3IgS2FydGhpa2V5YW4gQmhhcmdhdmFuIG9mIHRoZSBQUk9TRUNDTyB0ZWFtIGF0CiAgICAgSU5SSUEgb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE1LTAyMDQpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgaXNzdWUgd2hlcmUgREggY2xpZW50IGNlcnRpZmljYXRlcyBhcmUgYWNjZXB0ZWQgd2l0aG91dCB2ZXJpZmljYXRpb24uCiAgICAgQW4gT3BlblNTTCBzZXJ2ZXIgd2lsbCBhY2NlcHQgYSBESCBjZXJ0aWZpY2F0ZSBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uCiAgICAgd2l0aG91dCB0aGUgY2VydGlmaWNhdGUgdmVyaWZ5IG1lc3NhZ2UuIFRoaXMgZWZmZWN0aXZlbHkgYWxsb3dzIGEgY2xpZW50IHRvCiAgICAgYXV0aGVudGljYXRlIHdpdGhvdXQgdGhlIHVzZSBvZiBhIHByaXZhdGUga2V5LiBUaGlzIG9ubHkgYWZmZWN0cyBzZXJ2ZXJzCiAgICAgd2hpY2ggdHJ1c3QgYSBjbGllbnQgY2VydGlmaWNhdGUgYXV0aG9yaXR5IHdoaWNoIGlzc3VlcyBjZXJ0aWZpY2F0ZXMKICAgICBjb250YWluaW5nIERIIGtleXM6IHRoZXNlIGFyZSBleHRyZW1lbHkgcmFyZSBhbmQgaGFyZGx5IGV2ZXIgZW5jb3VudGVyZWQuCiAgICAgVGhhbmtzIGZvciBLYXJ0aGlrZXlhbiBCaGFyZ2F2YW4gb2YgdGhlIFBST1NFQ0NPIHRlYW0gYXQgSU5SSUEgb3IgcmVwb3J0aW5nCiAgICAgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTUtMDIwNSkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbnN1cmUgdGhhdCB0aGUgc2Vzc2lvbiBJRCBjb250ZXh0IG9mIGFuIFNTTCBpcyB1cGRhdGVkIHdoZW4gaXRzCiAgICAgU1NMX0NUWCBpcyB1cGRhdGVkIHZpYSBTU0xfc2V0X1NTTF9DVFguCgogICAgIFRoZSBzZXNzaW9uIElEIGNvbnRleHQgaXMgdHlwaWNhbGx5IHNldCBmcm9tIHRoZSBwYXJlbnQgU1NMX0NUWCwKICAgICBhbmQgY2FuIHZhcnkgd2l0aCB0aGUgQ1RYLgogICAgIFtBZGFtIExhbmdsZXldCgogICopIEZpeCB2YXJpb3VzIGNlcnRpZmljYXRlIGZpbmdlcnByaW50IGlzc3Vlcy4KCiAgICAgQnkgdXNpbmcgbm9uLURFUiBvciBpbnZhbGlkIGVuY29kaW5ncyBvdXRzaWRlIHRoZSBzaWduZWQgcG9ydGlvbiBvZiBhCiAgICAgY2VydGlmaWNhdGUgdGhlIGZpbmdlcnByaW50IGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIHNpZ25hdHVyZS4KICAgICBBbHRob3VnaCBubyBkZXRhaWxzIG9mIHRoZSBzaWduZWQgcG9ydGlvbiBvZiB0aGUgY2VydGlmaWNhdGUgY2FuIGJlIGNoYW5nZWQKICAgICB0aGlzIGNhbiBjYXVzZSBwcm9ibGVtcyB3aXRoIHNvbWUgYXBwbGljYXRpb25zOiBlLmcuIHRob3NlIHVzaW5nIHRoZQogICAgIGNlcnRpZmljYXRlIGZpbmdlcnByaW50IGZvciBibGFja2xpc3RzLgoKICAgICAxLiBSZWplY3Qgc2lnbmF0dXJlcyB3aXRoIG5vbiB6ZXJvIHVudXNlZCBiaXRzLgoKICAgICBJZiB0aGUgQklUIFNUUklORyBjb250YWluaW5nIHRoZSBzaWduYXR1cmUgaGFzIG5vbiB6ZXJvIHVudXNlZCBiaXRzIHJlamVjdAogICAgIHRoZSBzaWduYXR1cmUuIEFsbCBjdXJyZW50IHNpZ25hdHVyZSBhbGdvcml0aG1zIHJlcXVpcmUgemVybyB1bnVzZWQgYml0cy4KCiAgICAgMi4gQ2hlY2sgY2VydGlmaWNhdGUgYWxnb3JpdGhtIGNvbnNpc3RlbmN5LgoKICAgICBDaGVjayB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBpbnNpZGUgVEJTIG1hdGNoZXMgdGhlIG9uZSBpbiB0aGUKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUuIE5COiB0aGlzIHdpbGwgcmVzdWx0IGluIHNpZ25hdHVyZSBmYWlsdXJlCiAgICAgZXJyb3JzIGZvciBzb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZXMuCgogICAgIFRoYW5rcyB0byBLb25yYWQgS3Jhc3pld3NraSBmcm9tIEdvb2dsZSBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgogICAgIDMuIENoZWNrIERTQS9FQ0RTQSBzaWduYXR1cmVzIHVzZSBERVIuCgogICAgIFJlZW5jb2RlIERTQS9FQ0RTQSBzaWduYXR1cmVzIGFuZCBjb21wYXJlIHdpdGggdGhlIG9yaWdpbmFsIHJlY2VpdmVkCiAgICAgc2lnbmF0dXJlLiBSZXR1cm4gYW4gZXJyb3IgaWYgdGhlcmUgaXMgYSBtaXNtYXRjaC4KCiAgICAgVGhpcyB3aWxsIHJlamVjdCB2YXJpb3VzIGNhc2VzIGluY2x1ZGluZyBnYXJiYWdlIGFmdGVyIHNpZ25hdHVyZQogICAgICh0aGFua3MgdG8gQW50dGkgS2FyamFsYWluZW4gYW5kIFR1b21vIFVudGluZW4gZnJvbSB0aGUgQ29kZW5vbWljb24gQ1JPU1MKICAgICBwcm9ncmFtIGZvciBkaXNjb3ZlcmluZyB0aGlzIGNhc2UpIGFuZCB1c2Ugb2YgQkVSIG9yIGludmFsaWQgQVNOLjEgSU5URUdFUnMKICAgICAobmVnYXRpdmUgb3Igd2l0aCBsZWFkaW5nIHplcm9lcykuCgogICAgIEZ1cnRoZXIgYW5hbHlzaXMgd2FzIGNvbmR1Y3RlZCBhbmQgZml4ZXMgd2VyZSBkZXZlbG9wZWQgYnkgU3RlcGhlbiBIZW5zb24KICAgICBvZiB0aGUgT3BlblNTTCBjb3JlIHRlYW0uCgogICAgIChDVkUtMjAxNC04Mjc1KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICAqKSBDb3JyZWN0IEJpZ251bSBzcXVhcmluZy4gQmlnbnVtIHNxdWFyaW5nIChCTl9zcXIpIG1heSBwcm9kdWNlIGluY29ycmVjdAogICAgICByZXN1bHRzIG9uIHNvbWUgcGxhdGZvcm1zLCBpbmNsdWRpbmcgeDg2XzY0LiBUaGlzIGJ1ZyBvY2N1cnMgYXQgcmFuZG9tCiAgICAgIHdpdGggYSB2ZXJ5IGxvdyBwcm9iYWJpbGl0eSwgYW5kIGlzIG5vdCBrbm93biB0byBiZSBleHBsb2l0YWJsZSBpbiBhbnkKICAgICAgd2F5LCB0aG91Z2ggaXRzIGV4YWN0IGltcGFjdCBpcyBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBUaGFua3MgdG8gUGlldGVyCiAgICAgIFd1aWxsZSAoQmxvY2tzdHJlYW0pIHdobyByZXBvcnRlZCB0aGlzIGlzc3VlIGFuZCBhbHNvIHN1Z2dlc3RlZCBhbiBpbml0aWFsCiAgICAgIGZpeC4gRnVydGhlciBhbmFseXNpcyB3YXMgY29uZHVjdGVkIGJ5IHRoZSBPcGVuU1NMIGRldmVsb3BtZW50IHRlYW0gYW5kCiAgICAgIEFkYW0gTGFuZ2xleSBvZiBHb29nbGUuIFRoZSBmaW5hbCBmaXggd2FzIGRldmVsb3BlZCBieSBBbmR5IFBvbHlha292IG9mCiAgICAgIHRoZSBPcGVuU1NMIGNvcmUgdGVhbS4KICAgICAgKENWRS0yMDE0LTM1NzApCiAgICAgIFtBbmR5IFBvbHlha292XQoKICAgKikgRG8gbm90IHJlc3VtZSBzZXNzaW9ucyBvbiB0aGUgc2VydmVyIGlmIHRoZSBuZWdvdGlhdGVkIHByb3RvY29sCiAgICAgIHZlcnNpb24gZG9lcyBub3QgbWF0Y2ggdGhlIHNlc3Npb24ncyB2ZXJzaW9uLiBSZXN1bWluZyB3aXRoIGEgZGlmZmVyZW50CiAgICAgIHZlcnNpb24sIHdoaWxlIG5vdCBzdHJpY3RseSBmb3JiaWRkZW4gYnkgdGhlIFJGQywgaXMgb2YgcXVlc3Rpb25hYmxlCiAgICAgIHNhbml0eSBhbmQgYnJlYWtzIGFsbCBrbm93biBjbGllbnRzLgogICAgICBbRGF2aWQgQmVuamFtaW4sIEVtaWxpYSBL5HNwZXJdCgogICAqKSBUaWdodGVuIGhhbmRsaW5nIG9mIHRoZSBDaGFuZ2VDaXBoZXJTcGVjIChDQ1MpIG1lc3NhZ2U6IHJlamVjdAogICAgICBlYXJseSBDQ1MgbWVzc2FnZXMgZHVyaW5nIHJlbmVnb3RpYXRpb24uIChOb3RlIHRoYXQgYmVjYXVzZQogICAgICByZW5lZ290aWF0aW9uIGlzIGVuY3J5cHRlZCwgdGhpcyBlYXJseSBDQ1Mgd2FzIG5vdCBleHBsb2l0YWJsZS4pCiAgICAgIFtFbWlsaWEgS+RzcGVyXQoKICAgKikgVGlnaHRlbiBjbGllbnQtc2lkZSBzZXNzaW9uIHRpY2tldCBoYW5kbGluZyBkdXJpbmcgcmVuZWdvdGlhdGlvbjoKICAgICAgZW5zdXJlIHRoYXQgdGhlIGNsaWVudCBvbmx5IGFjY2VwdHMgYSBzZXNzaW9uIHRpY2tldCBpZiB0aGUgc2VydmVyIHNlbmRzCiAgICAgIHRoZSBleHRlbnNpb24gYW5ldyBpbiB0aGUgU2VydmVySGVsbG8uIFByZXZpb3VzbHksIGEgVExTIGNsaWVudCB3b3VsZAogICAgICByZXVzZSB0aGUgb2xkIGV4dGVuc2lvbiBzdGF0ZSBhbmQgdGh1cyBhY2NlcHQgYSBzZXNzaW9uIHRpY2tldCBpZiBvbmUgd2FzCiAgICAgIGFubm91bmNlZCBpbiB0aGUgaW5pdGlhbCBTZXJ2ZXJIZWxsby4KCiAgICAgIFNpbWlsYXJseSwgZW5zdXJlIHRoYXQgdGhlIGNsaWVudCByZXF1aXJlcyBhIHNlc3Npb24gdGlja2V0IGlmIG9uZQogICAgICB3YXMgYWR2ZXJ0aXNlZCBpbiB0aGUgU2VydmVySGVsbG8uIFByZXZpb3VzbHksIGEgVExTIGNsaWVudCB3b3VsZAogICAgICBpZ25vcmUgYSBtaXNzaW5nIE5ld1Nlc3Npb25UaWNrZXQgbWVzc2FnZS4KICAgICAgW0VtaWxpYSBL5HNwZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xaSBhbmQgMS4wLjFqIFsxNSBPY3QgMjAxNF0KCiAgKikgU1JUUCBNZW1vcnkgTGVhay4KCiAgICAgQSBmbGF3IGluIHRoZSBEVExTIFNSVFAgZXh0ZW5zaW9uIHBhcnNpbmcgY29kZSBhbGxvd3MgYW4gYXR0YWNrZXIsIHdobwogICAgIHNlbmRzIGEgY2FyZWZ1bGx5IGNyYWZ0ZWQgaGFuZHNoYWtlIG1lc3NhZ2UsIHRvIGNhdXNlIE9wZW5TU0wgdG8gZmFpbAogICAgIHRvIGZyZWUgdXAgdG8gNjRrIG9mIG1lbW9yeSBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuIFRoaXMgY291bGQgYmUKICAgICBleHBsb2l0ZWQgaW4gYSBEZW5pYWwgT2YgU2VydmljZSBhdHRhY2suIFRoaXMgaXNzdWUgYWZmZWN0cyBPcGVuU1NMCiAgICAgMS4wLjEgc2VydmVyIGltcGxlbWVudGF0aW9ucyBmb3IgYm90aCBTU0wvVExTIGFuZCBEVExTIHJlZ2FyZGxlc3Mgb2YKICAgICB3aGV0aGVyIFNSVFAgaXMgdXNlZCBvciBjb25maWd1cmVkLiBJbXBsZW1lbnRhdGlvbnMgb2YgT3BlblNTTCB0aGF0CiAgICAgaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggT1BFTlNTTF9OT19TUlRQIGRlZmluZWQgYXJlIG5vdCBhZmZlY3RlZC4KCiAgICAgVGhlIGZpeCB3YXMgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIHRlYW0uCiAgICAgKENWRS0yMDE0LTM1MTMpCiAgICAgW09wZW5TU0wgdGVhbV0KCiAgKikgU2Vzc2lvbiBUaWNrZXQgTWVtb3J5IExlYWsuCgogICAgIFdoZW4gYW4gT3BlblNTTCBTU0wvVExTL0RUTFMgc2VydmVyIHJlY2VpdmVzIGEgc2Vzc2lvbiB0aWNrZXQgdGhlCiAgICAgaW50ZWdyaXR5IG9mIHRoYXQgdGlja2V0IGlzIGZpcnN0IHZlcmlmaWVkLiBJbiB0aGUgZXZlbnQgb2YgYSBzZXNzaW9uCiAgICAgdGlja2V0IGludGVncml0eSBjaGVjayBmYWlsaW5nLCBPcGVuU1NMIHdpbGwgZmFpbCB0byBmcmVlIG1lbW9yeQogICAgIGNhdXNpbmcgYSBtZW1vcnkgbGVhay4gQnkgc2VuZGluZyBhIGxhcmdlIG51bWJlciBvZiBpbnZhbGlkIHNlc3Npb24KICAgICB0aWNrZXRzIGFuIGF0dGFja2VyIGNvdWxkIGV4cGxvaXQgdGhpcyBpc3N1ZSBpbiBhIERlbmlhbCBPZiBTZXJ2aWNlCiAgICAgYXR0YWNrLgogICAgIChDVkUtMjAxNC0zNTY3KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1aWxkIG9wdGlvbiBuby1zc2wzIGlzIGluY29tcGxldGUuCgogICAgIFdoZW4gT3BlblNTTCBpcyBjb25maWd1cmVkIHdpdGggIm5vLXNzbDMiIGFzIGEgYnVpbGQgb3B0aW9uLCBzZXJ2ZXJzCiAgICAgY291bGQgYWNjZXB0IGFuZCBjb21wbGV0ZSBhIFNTTCAzLjAgaGFuZHNoYWtlLCBhbmQgY2xpZW50cyBjb3VsZCBiZQogICAgIGNvbmZpZ3VyZWQgdG8gc2VuZCB0aGVtLgogICAgIChDVkUtMjAxNC0zNTY4KQogICAgIFtBa2FtYWkgYW5kIHRoZSBPcGVuU1NMIHRlYW1dCgogICopIEFkZCBzdXBwb3J0IGZvciBUTFNfRkFMTEJBQ0tfU0NTVi4KICAgICBDbGllbnQgYXBwbGljYXRpb25zIGRvaW5nIGZhbGxiYWNrIHJldHJpZXMgc2hvdWxkIGNhbGwKICAgICBTU0xfc2V0X21vZGUocywgU1NMX01PREVfU0VORF9GQUxMQkFDS19TQ1NWKS4KICAgICAoQ1ZFLTIwMTQtMzU2NikKICAgICBbQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhZGRpdGlvbmFsIERpZ2VzdEluZm8gY2hlY2tzLgogCiAgICAgUmVlbmNvZGUgRGlnZXN0SW50byBpbiBERVIgYW5kIGNoZWNrIGFnYWluc3QgdGhlIG9yaWdpbmFsIHdoZW4KICAgICB2ZXJpZnlpbmcgUlNBIHNpZ25hdHVyZTogdGhpcyB3aWxsIHJlamVjdCBhbnkgaW1wcm9wZXJseSBlbmNvZGVkCiAgICAgRGlnZXN0SW5mbyBzdHJ1Y3R1cmVzLgoKICAgICBOb3RlOiB0aGlzIGlzIGEgcHJlY2F1dGlvbmFyeSBtZWFzdXJlIGFuZCBubyBhdHRhY2tzIGFyZSBjdXJyZW50bHkga25vd24uCgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xaCBhbmQgMS4wLjFpIFs2IEF1ZyAyMDE0XQoKICAqKSBGaXggU1JQIGJ1ZmZlciBvdmVycnVuIHZ1bG5lcmFiaWxpdHkuIEludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlCiAgICAgU1JQIGNvZGUgY2FuIGJlIG92ZXJydW4gYW4gaW50ZXJuYWwgYnVmZmVyLiBBZGQgc2FuaXR5IGNoZWNrIHRoYXQKICAgICBnLCBBLCBCIDwgTiB0byBTUlAgY29kZS4KCiAgICAgVGhhbmtzIHRvIFNlYW4gRGV2bGluIGFuZCBXYXRzb24gTGFkZCBvZiBDcnlwdG9ncmFwaHkgU2VydmljZXMsIE5DQwogICAgIEdyb3VwIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTEyKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEEgZmxhdyBpbiB0aGUgT3BlblNTTCBTU0wvVExTIHNlcnZlciBjb2RlIGNhdXNlcyB0aGUgc2VydmVyIHRvIG5lZ290aWF0ZQogICAgIFRMUyAxLjAgaW5zdGVhZCBvZiBoaWdoZXIgcHJvdG9jb2wgdmVyc2lvbnMgd2hlbiB0aGUgQ2xpZW50SGVsbG8gbWVzc2FnZQogICAgIGlzIGJhZGx5IGZyYWdtZW50ZWQuIFRoaXMgYWxsb3dzIGEgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrZXIgdG8gZm9yY2UgYQogICAgIGRvd25ncmFkZSB0byBUTFMgMS4wIGV2ZW4gaWYgYm90aCB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IHN1cHBvcnQgYQogICAgIGhpZ2hlciBwcm90b2NvbCB2ZXJzaW9uLCBieSBtb2RpZnlpbmcgdGhlIGNsaWVudCdzIFRMUyByZWNvcmRzLgoKICAgICBUaGFua3MgdG8gRGF2aWQgQmVuamFtaW4gYW5kIEFkYW0gTGFuZ2xleSAoR29vZ2xlKSBmb3IgZGlzY292ZXJpbmcgYW5kCiAgICAgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUxMSkKICAgICBbRGF2aWQgQmVuamFtaW5dCgogICopIE9wZW5TU0wgRFRMUyBjbGllbnRzIGVuYWJsaW5nIGFub255bW91cyAoRUMpREggY2lwaGVyc3VpdGVzIGFyZSBzdWJqZWN0CiAgICAgdG8gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suIEEgbWFsaWNpb3VzIHNlcnZlciBjYW4gY3Jhc2ggdGhlIGNsaWVudAogICAgIHdpdGggYSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UgKHJlYWQpIGJ5IHNwZWNpZnlpbmcgYW4gYW5vbnltb3VzIChFQylESAogICAgIGNpcGhlcnN1aXRlIGFuZCBzZW5kaW5nIGNhcmVmdWxseSBjcmFmdGVkIGhhbmRzaGFrZSBtZXNzYWdlcy4KCiAgICAgVGhhbmtzIHRvIEZlbGl4IEdy9mJlcnQgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzCiAgICAgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MTApCiAgICAgW0VtaWxpYSBL5HNwZXJdCgogICopIEJ5IHNlbmRpbmcgY2FyZWZ1bGx5IGNyYWZ0ZWQgRFRMUyBwYWNrZXRzIGFuIGF0dGFja2VyIGNvdWxkIGNhdXNlIG9wZW5zc2wKICAgICB0byBsZWFrIG1lbW9yeS4gVGhpcyBjYW4gYmUgZXhwbG9pdGVkIHRocm91Z2ggYSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIEFkYW0gTGFuZ2xleSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDcpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgQW4gYXR0YWNrZXIgY2FuIGZvcmNlIG9wZW5zc2wgdG8gY29uc3VtZSBsYXJnZSBhbW91bnRzIG9mIG1lbW9yeSB3aGlsc3QKICAgICBwcm9jZXNzaW5nIERUTFMgaGFuZHNoYWtlIG1lc3NhZ2VzLiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhCiAgICAgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyB0byBBZGFtIExhbmdsZXkgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA2KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIEFuIGF0dGFja2VyIGNhbiBmb3JjZSBhbiBlcnJvciBjb25kaXRpb24gd2hpY2ggY2F1c2VzIG9wZW5zc2wgdG8gY3Jhc2gKICAgICB3aGlsc3QgcHJvY2Vzc2luZyBEVExTIHBhY2tldHMgZHVlIHRvIG1lbW9yeSBiZWluZyBmcmVlZCB0d2ljZS4gVGhpcwogICAgIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KICAgICBUaGFua3MgdG8gQWRhbSBMYW5nbGV5IGFuZCBXYW4tVGVoIENoYW5nIGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcKICAgICB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA1KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIElmIGEgbXVsdGl0aHJlYWRlZCBjbGllbnQgY29ubmVjdHMgdG8gYSBtYWxpY2lvdXMgc2VydmVyIHVzaW5nIGEgcmVzdW1lZAogICAgIHNlc3Npb24gYW5kIHRoZSBzZXJ2ZXIgc2VuZHMgYW4gZWMgcG9pbnQgZm9ybWF0IGV4dGVuc2lvbiBpdCBjb3VsZCB3cml0ZQogICAgIHVwIHRvIDI1NSBieXRlcyB0byBmcmVlZCBtZW1vcnkuCgogICAgIFRoYW5rcyB0byBHYWJvciBUeXVrYXN6IChMb2dNZUluIEluYykgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzCiAgICAgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDkpCiAgICAgW0dhYm9yIFR5dWthc3pdCgogICopIEEgbWFsaWNpb3VzIHNlcnZlciBjYW4gY3Jhc2ggYW4gT3BlblNTTCBjbGllbnQgd2l0aCBhIG51bGwgcG9pbnRlcgogICAgIGRlcmVmZXJlbmNlIChyZWFkKSBieSBzcGVjaWZ5aW5nIGFuIFNSUCBjaXBoZXJzdWl0ZSBldmVuIHRob3VnaCBpdCB3YXMgbm90CiAgICAgcHJvcGVybHkgbmVnb3RpYXRlZCB3aXRoIHRoZSBjbGllbnQuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEKICAgICBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCgogICAgIFRoYW5rcyB0byBKb29uYXMgS3VvcmlsZWh0byBhbmQgUmlrdSBIaWV0YW3ka2kgKENvZGVub21pY29uKSBmb3IKICAgICBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtNTEzOSkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBIGZsYXcgaW4gT0JKX29iajJ0eHQgbWF5IGNhdXNlIHByZXR0eSBwcmludGluZyBmdW5jdGlvbnMgc3VjaCBhcwogICAgIFg1MDlfbmFtZV9vbmVsaW5lLCBYNTA5X25hbWVfcHJpbnRfZXggZXQgYWwuIHRvIGxlYWsgc29tZSBpbmZvcm1hdGlvbgogICAgIGZyb20gdGhlIHN0YWNrLiBBcHBsaWNhdGlvbnMgbWF5IGJlIGFmZmVjdGVkIGlmIHRoZXkgZWNobyBwcmV0dHkgcHJpbnRpbmcKICAgICBvdXRwdXQgdG8gdGhlIGF0dGFja2VyLgoKICAgICBUaGFua3MgdG8gSXZhbiBGcmF0cmljIChHb29nbGUpIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTA4KQogICAgIFtFbWlsaWEgS+RzcGVyLCBhbmQgU3RldmUgSGVuc29uXQoKICAqKSBGaXggZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUgKHRodXMsIEVDX1BPSU5Uc19tdWwgZXRjLikKICAgICBmb3IgY29ybmVyIGNhc2VzLiAoQ2VydGFpbiBpbnB1dCBwb2ludHMgYXQgaW5maW5pdHkgY291bGQgbGVhZCB0bwogICAgIGJvZ3VzIHJlc3VsdHMsIHdpdGggbm9uLWluZmluaXR5IGlucHV0cyBtYXBwZWQgdG8gaW5maW5pdHkgdG9vLikKICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWcgYW5kIDEuMC4xaCBbNSBKdW4gMjAxNF0KCiAgKikgRml4IGZvciBTU0wvVExTIE1JVE0gZmxhdy4gQW4gYXR0YWNrZXIgdXNpbmcgYSBjYXJlZnVsbHkgY3JhZnRlZAogICAgIGhhbmRzaGFrZSBjYW4gZm9yY2UgdGhlIHVzZSBvZiB3ZWFrIGtleWluZyBtYXRlcmlhbCBpbiBPcGVuU1NMCiAgICAgU1NML1RMUyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgoKICAgICBUaGFua3MgdG8gS0lLVUNISSBNYXNhc2hpIChMZXBpZHVtIENvLiBMdGQuKSBmb3IgZGlzY292ZXJpbmcgYW5kCiAgICAgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTAyMjQpCiAgICAgW0tJS1VDSEkgTWFzYXNoaSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggRFRMUyByZWN1cnNpb24gZmxhdy4gQnkgc2VuZGluZyBhbiBpbnZhbGlkIERUTFMgaGFuZHNoYWtlIHRvIGFuCiAgICAgT3BlblNTTCBEVExTIGNsaWVudCB0aGUgY29kZSBjYW4gYmUgbWFkZSB0byByZWN1cnNlIGV2ZW50dWFsbHkgY3Jhc2hpbmcKICAgICBpbiBhIERvUyBhdHRhY2suCgogICAgIFRoYW5rcyB0byBJbXJlIFJhZCAoU2VhcmNoLUxhYiBMdGQuKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMDIyMSkKICAgICBbSW1yZSBSYWQsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IERUTFMgaW52YWxpZCBmcmFnbWVudCB2dWxuZXJhYmlsaXR5LiBBIGJ1ZmZlciBvdmVycnVuIGF0dGFjayBjYW4KICAgICBiZSB0cmlnZ2VyZWQgYnkgc2VuZGluZyBpbnZhbGlkIERUTFMgZnJhZ21lbnRzIHRvIGFuIE9wZW5TU0wgRFRMUwogICAgIGNsaWVudCBvciBzZXJ2ZXIuIFRoaXMgaXMgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgdG8gcnVuIGFyYml0cmFyeQogICAgIGNvZGUgb24gYSB2dWxuZXJhYmxlIGNsaWVudCBvciBzZXJ2ZXIuCgogICAgIFRoYW5rcyB0byBK/HJpIEFlZGxhIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTAxOTUpCiAgICAgW0r8cmkgQWVkbGEsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBUTFMgY29kZSB3aGVyZSBjbGllbnRzIGVuYWJsZSBhbm9ueW1vdXMgRUNESCBjaXBoZXJzdWl0ZXMKICAgICBhcmUgc3ViamVjdCB0byBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIEZlbGl4IEdy9mJlcnQgYW5kIEl2YW4gRnJhdHJpYyBhdCBHb29nbGUgZm9yIGRpc2NvdmVyaW5nCiAgICAgdGhpcyBpc3N1ZS4gKENWRS0yMDE0LTM0NzApCiAgICAgW0ZlbGl4IEdy9mJlcnQsIEl2YW4gRnJhdHJpYywgU3RldmUgSGVuc29uXQoKICAqKSBIYXJtb25pemUgdmVyc2lvbiBhbmQgaXRzIGRvY3VtZW50YXRpb24uIC1mIGZsYWcgaXMgdXNlZCB0byBkaXNwbGF5CiAgICAgY29tcGlsYXRpb24gZmxhZ3MuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogICopIEZpeCBlY2tleV9wcml2X2VuY29kZSBzbyBpdCBpbW1lZGlhdGVseSByZXR1cm5zIGFuIGVycm9yIHVwb24gYSBmYWlsdXJlCiAgICAgaW4gaTJkX0VDUHJpdmF0ZUtleS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IHNvbWUgZG91YmxlIGZyZWVzLiBUaGVzZSBhcmUgbm90IHRob3VnaHQgdG8gYmUgZXhwbG9pdGFibGUuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZiBhbmQgMS4wLjFnIFs3IEFwciAyMDE0XQoKICAqKSBBIG1pc3NpbmcgYm91bmRzIGNoZWNrIGluIHRoZSBoYW5kbGluZyBvZiB0aGUgVExTIGhlYXJ0YmVhdCBleHRlbnNpb24KICAgICBjYW4gYmUgdXNlZCB0byByZXZlYWwgdXAgdG8gNjRrIG9mIG1lbW9yeSB0byBhIGNvbm5lY3RlZCBjbGllbnQgb3IKICAgICBzZXJ2ZXIuCgogICAgIFRoYW5rcyBmb3IgTmVlbCBNZWh0YSBvZiBHb29nbGUgU2VjdXJpdHkgZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnIGFuZCB0bwogICAgIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz4gYW5kIEJvZG8gTW9lbGxlciA8Ym1vZWxsZXJAYWNtLm9yZz4gZm9yCiAgICAgcHJlcGFyaW5nIHRoZSBmaXggKENWRS0yMDE0LTAxNjApCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIHRoZSBhdHRhY2sgZGVzY3JpYmVkIGluIHRoZSBwYXBlciAiUmVjb3ZlcmluZyBPcGVuU1NMCiAgICAgRUNEU0EgTm9uY2VzIFVzaW5nIHRoZSBGTFVTSCtSRUxPQUQgQ2FjaGUgU2lkZS1jaGFubmVsIEF0dGFjayIKICAgICBieSBZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyLiBEZXRhaWxzIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgogICAgIGh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAxNC8xNDAKCiAgICAgVGhhbmtzIHRvIFl1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXIgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBmbGF3IGFuZCB0byBZdXZhbCBZYXJvbSBmb3Igc3VwcGx5aW5nIGEgZml4IChDVkUtMjAxNC0wMDc2KQogICAgIFtZdXZhbCBZYXJvbSBhbmQgTmFvbWkgQmVuZ2VyXQoKICAqKSBUTFMgcGFkIGV4dGVuc2lvbjogZHJhZnQtYWdsLXRscy1wYWRkaW5nLTAzCgogICAgIFdvcmthcm91bmQgZm9yIHRoZSAiVExTIGhhbmcgYnVnIiAoc2VlIEZBUSBhbmQgUFIjMjc3MSk6IGlmIHRoZQogICAgIFRMUyBjbGllbnQgSGVsbG8gcmVjb3JkIGxlbmd0aCB2YWx1ZSB3b3VsZCBvdGhlcndpc2UgYmUgPiAyNTUgYW5kCiAgICAgbGVzcyB0aGF0IDUxMiBwYWQgd2l0aCBhIGR1bW15IGV4dGVuc2lvbiBjb250YWluaW5nIHplcm9lcyBzbyBpdAogICAgIGlzIGF0IGxlYXN0IDUxMiBieXRlcyBsb25nLgoKICAgICBbQWRhbSBMYW5nbGV5LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZSBhbmQgMS4wLjFmIFs2IEphbiAyMDE0XQoKICAqKSBGaXggZm9yIFRMUyByZWNvcmQgdGFtcGVyaW5nIGJ1Zy4gQSBjYXJlZnVsbHkgY3JhZnRlZCBpbnZhbGlkIAogICAgIGhhbmRzaGFrZSBjb3VsZCBjcmFzaCBPcGVuU1NMIHdpdGggYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uLgogICAgIFRoYW5rcyB0byBBbnRvbiBKb2hhbnNzb24gZm9yIHJlcG9ydGluZyB0aGlzIGlzc3Vlcy4KICAgICAoQ1ZFLTIwMTMtNDM1MykKCiAgKikgS2VlcCBvcmlnaW5hbCBEVExTIGRpZ2VzdCBhbmQgZW5jcnlwdGlvbiBjb250ZXh0cyBpbiByZXRyYW5zbWlzc2lvbgogICAgIHN0cnVjdHVyZXMgc28gd2UgY2FuIHVzZSB0aGUgcHJldmlvdXMgc2Vzc2lvbiBwYXJhbWV0ZXJzIGlmIHRoZXkgbmVlZAogICAgIHRvIGJlIHJlc2VudC4gKENWRS0yMDEzLTY0NTApCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbiBTU0xfT1BfU0FGQVJJX0VDREhFX0VDRFNBX0JVRyAocGFydCBvZiBTU0xfT1BfQUxMKSB3aGljaAogICAgIGF2b2lkcyBwcmVmZXJyaW5nIEVDREhFLUVDRFNBIGNpcGhlcnMgd2hlbiB0aGUgY2xpZW50IGFwcGVhcnMgdG8gYmUKICAgICBTYWZhcmkgb24gT1MgWC4gIFNhZmFyaSBvbiBPUyBYIDEwLjguLjEwLjguMyBhZHZlcnRpc2VzIHN1cHBvcnQgZm9yCiAgICAgc2V2ZXJhbCBFQ0RIRS1FQ0RTQSBjaXBoZXJzLCBidXQgZmFpbHMgdG8gbmVnb3RpYXRlIHRoZW0uICBUaGUgYnVnCiAgICAgaXMgZml4ZWQgaW4gT1MgWCAxMC44LjQsIGJ1dCBBcHBsZSBoYXZlIHJ1bGVkIG91dCBib3RoIGhvdCBmaXhpbmcKICAgICAxMC44Li4xMC44LjMgYW5kIGZvcmNpbmcgdXNlcnMgdG8gdXBncmFkZSB0byAxMC44LjQgb3IgbmV3ZXIuCiAgICAgW1JvYiBTdHJhZGxpbmcsIEFkYW0gTGFuZ2xleV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFkIGFuZCAxLjAuMWUgWzExIEZlYiAyMDEzXQoKICAqKSBDb3JyZWN0IGZpeCBmb3IgQ1ZFLTIwMTMtMDE2OS4gVGhlIG9yaWdpbmFsIGRpZG4ndCB3b3JrIG9uIEFFUy1OSQogICAgIHN1cHBvcnRpbmcgcGxhdGZvcm1zIG9yIHdoZW4gc21hbGwgcmVjb3JkcyB3ZXJlIHRyYW5zZmVycmVkLgogICAgIFtBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xYyBhbmQgMS4wLjFkIFs1IEZlYiAyMDEzXQoKICAqKSBNYWtlIHRoZSBkZWNvZGluZyBvZiBTU0x2MywgVExTIGFuZCBEVExTIENCQyByZWNvcmRzIGNvbnN0YW50IHRpbWUuCgogICAgIFRoaXMgYWRkcmVzc2VzIHRoZSBmbGF3IGluIENCQyByZWNvcmQgcHJvY2Vzc2luZyBkaXNjb3ZlcmVkIGJ5IAogICAgIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24uIERldGFpbHMgb2YgdGhpcyBhdHRhY2sgY2FuIGJlIGZvdW5kCiAgICAgYXQ6IGh0dHA6Ly93d3cuaXNnLnJodWwuYWMudWsvdGxzLyAgICAgCgogICAgIFRoYW5rcyBnbyB0byBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIG9mIHRoZSBJbmZvcm1hdGlvbgogICAgIFNlY3VyaXR5IEdyb3VwIGF0IFJveWFsIEhvbGxvd2F5LCBVbml2ZXJzaXR5IG9mIExvbmRvbgogICAgICh3d3cuaXNnLnJodWwuYWMudWspIGZvciBkaXNjb3ZlcmluZyB0aGlzIGZsYXcgYW5kIEFkYW0gTGFuZ2xleSBhbmQKICAgICBFbWlsaWEgS+RzcGVyIGZvciB0aGUgaW5pdGlhbCBwYXRjaC4KICAgICAoQ1ZFLTIwMTMtMDE2OSkKICAgICBbRW1pbGlhIEvkc3BlciwgQWRhbSBMYW5nbGV5LCBCZW4gTGF1cmllLCBBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmbGF3IGluIEFFU05JIGhhbmRsaW5nIG9mIFRMUyAxLjIgYW5kIDEuMSByZWNvcmRzIGZvciBDQkMgbW9kZQogICAgIGNpcGhlcnN1aXRlcyB3aGljaCBjYW4gYmUgZXhwbG9pdGVkIGluIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyBnbyB0byBhbmQgdG8gQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBmb3IgZGlzY292ZXJpbmcKICAgICBhbmQgZGV0ZWN0aW5nIHRoaXMgYnVnIGFuZCB0byBXb2xmZ2FuZyBFdHRsaW5nZXIKICAgICA8d29sZmdhbmcuZXR0bGluZ2VyQGdtYWlsLmNvbT4gZm9yIGluZGVwZW5kZW50bHkgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTItMjY4NikKICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBSZXR1cm4gYW4gZXJyb3Igd2hlbiBjaGVja2luZyBPQ1NQIHNpZ25hdHVyZXMgd2hlbiBrZXkgaXMgTlVMTC4KICAgICBUaGlzIGZpeGVzIGEgRG9TIGF0dGFjay4gKENWRS0yMDEzLTAxNjYpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBvcGVuc3NsIHZlcmlmeSByZXR1cm4gZXJyb3JzLgogICAgIFtDaHJpcyBQYWxtZXIgPHBhbG1lckBnb29nbGUuY29tPiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQ2FsbCBPQ1NQIFN0YXBsaW5nIGNhbGxiYWNrIGFmdGVyIGNpcGhlcnN1aXRlIGhhcyBiZWVuIGNob3Nlbiwgc28KICAgICB0aGUgcmlnaHQgcmVzcG9uc2UgaXMgc3RhcGxlZC4gQWxzbyBjaGFuZ2UgU1NMX2dldF9jZXJ0aWZpY2F0ZSgpCiAgICAgc28gaXQgcmV0dXJucyB0aGUgY2VydGlmaWNhdGUgYWN0dWFsbHkgc2VudC4KICAgICBTZWUgaHR0cDovL3J0Lm9wZW5zc2wub3JnL1RpY2tldC9EaXNwbGF5Lmh0bWw/aWQ9MjgzNi4KICAgICBbUm9iIFN0cmFkbGluZyA8cm9iLnN0cmFkbGluZ0Bjb21vZG8uY29tPl0KCiAgKikgRml4IHBvc3NpYmxlIGRlYWRsb2NrIHdoZW4gZGVjb2RpbmcgcHVibGljIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRG9uJ3QgdXNlIFRMUyAxLjAgcmVjb3JkIHZlcnNpb24gbnVtYmVyIGluIGluaXRpYWwgY2xpZW50IGhlbGxvCiAgICAgaWYgcmVuZWdvdGlhdGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWIgYW5kIDEuMC4xYyBbMTAgTWF5IDIwMTJdCgogICopIFNhbml0eSBjaGVjayByZWNvcmQgbGVuZ3RoIGJlZm9yZSBza2lwcGluZyBleHBsaWNpdCBJViBpbiBUTFMKICAgICAxLjIsIDEuMSBhbmQgRFRMUyB0byBmaXggRG9TIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIENvZGVub21pY29uIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlIHVzaW5nIEZ1enotby1NYXRpYwogICAgIGZ1enppbmcgYXMgYSBzZXJ2aWNlIHRlc3RpbmcgcGxhdGZvcm0uCiAgICAgKENWRS0yMDEyLTIzMzMpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGlzZSB0a2V5bGVuIHByb3Blcmx5IHdoZW4gZW5jcnlwdGluZyBDTVMgbWVzc2FnZXMuCiAgICAgVGhhbmtzIHRvIFNvbGFyIERlc2lnbmVyIG9mIE9wZW53YWxsIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBGSVBTIG1vZGUgZG9uJ3QgdHJ5IHRvIHVzZSBjb21wb3NpdGUgY2lwaGVycyBhcyB0aGV5IGFyZSBub3QKICAgICBhcHByb3ZlZC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWEgYW5kIDEuMC4xYiBbMjYgQXByIDIwMTJdCgogICopIE9wZW5TU0wgMS4wLjAgc2V0cyBTU0xfT1BfQUxMIHRvIDB4ODAwMDBGRkZMIGFuZCBPcGVuU1NMIDEuMC4xIGFuZAogICAgIDEuMC4xYSBzZXQgU1NMX09QX05PX1RMU3YxXzEgdG8gMHgwMDAwMDQwMEwgd2hpY2ggd291bGQgdW5mb3J0dW5hdGVseQogICAgIG1lYW4gYW55IGFwcGxpY2F0aW9uIGNvbXBpbGVkIGFnYWluc3QgT3BlblNTTCAxLjAuMCBoZWFkZXJzIHNldHRpbmcKICAgICBTU0xfT1BfQUxMIHdvdWxkIGFsc28gc2V0IFNTTF9PUF9OT19UTFN2MV8xLCB1bmludGVudGlvbmFsbHkgZGlzYWJsbmcKICAgICBUTFMgMS4xIGFsc28uIEZpeCB0aGlzIGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBTU0xfT1BfTk9fVExTdjFfMSB0bwogICAgIDB4MTAwMDAwMDBMIEFueSBhcHBsaWNhdGlvbiB3aGljaCB3YXMgcHJldmlvdXNseSBjb21waWxlZCBhZ2FpbnN0CiAgICAgT3BlblNTTCAxLjAuMSBvciAxLjAuMWEgaGVhZGVycyBhbmQgd2hpY2ggY2FyZXMgYWJvdXQgU1NMX09QX05PX1RMU3YxXzEKICAgICB3aWxsIG5lZWQgdG8gYmUgcmVjb21waWxlZCBhcyBhIHJlc3VsdC4gTGV0dGluZyBiZSByZXN1bHRzIGluCiAgICAgaW5hYmlsaXR5IHRvIGRpc2FibGUgc3BlY2lmaWNhbGx5IFRMUyAxLjEgYW5kIGluIGNsaWVudCBjb250ZXh0LAogICAgIGluIHVubGlrZSBldmVudCwgbGltaXQgbWF4aW11bSBvZmZlcmVkIHZlcnNpb24gdG8gVExTIDEuMCBbc2VlIGJlbG93XS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBvcmRlciB0byBlbnN1cmUgaW50ZXJvcGVyYWJpbHR5IFNTTF9PUF9OT19wcm90b2NvbFggZG9lcyBub3QKICAgICBkaXNhYmxlIGp1c3QgcHJvdG9jb2wgWCwgYnV0IGFsbCBwcm90b2NvbHMgYWJvdmUgWCAqaWYqIHRoZXJlIGFyZQogICAgIHByb3RvY29scyAqYmVsb3cqIFggc3RpbGwgZW5hYmxlZC4gSW4gbW9yZSBwcmFjdGljYWwgdGVybXMgaXQgbWVhbnMKICAgICB0aGF0IGlmIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRpc2FibGUgVExTMS4wIGluIGZhdm9yIG9mIFRMUzEuMSBhbmQKICAgICBhYm92ZSwgaXQncyBub3Qgc3VmZmljaWVudCB0byBwYXNzIFNTTF9PUF9OT19UTFN2MSwgb25lIGhhcyB0byBwYXNzCiAgICAgU1NMX09QX05PX1RMU3YxfFNTTF9PUF9OT19TU0x2M3xTU0xfT1BfTk9fU1NMdjIuIFRoaXMgYXBwbGllcyB0bwogICAgIGNsaWVudCBzaWRlLgogICAgIFtBbmR5IFBvbHlha292XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMSBhbmQgMS4wLjFhIFsxOSBBcHIgMjAxMl0KCiAgKikgQ2hlY2sgZm9yIHBvdGVudGlhbGx5IGV4cGxvaXRhYmxlIG92ZXJmbG93cyBpbiBhc24xX2QyaV9yZWFkX2JpbwogICAgIEJVRl9tZW1fZ3JvdyBhbmQgQlVGX21lbV9ncm93X2NsZWFuLiBSZWZ1c2UgYXR0ZW1wdHMgdG8gc2hyaW5rIGJ1ZmZlcgogICAgIGluIENSWVBUT19yZWFsbG9jX2NsZWFuLgoKICAgICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSwgR29vZ2xlIFNlY3VyaXR5IFRlYW0sIGZvciBkaXNjb3ZlcmluZyB0aGlzCiAgICAgaXNzdWUgYW5kIHRvIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz4gZm9yIGZpeGluZyBpdC4KICAgICAoQ1ZFLTIwMTItMjExMCkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpLCBUYXZpcyBPcm1hbmR5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRG9uJ3QgYWxsb3cgVExTIDEuMiBTSEEtMjU2IGNpcGhlcnN1aXRlcyBpbiBUTFMgMS4wLCAxLjEgY29ubmVjdGlvbnMuCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgV29ya2Fyb3VuZHMgZm9yIHNvbWUgYnJva2VuIHNlcnZlcnMgdGhhdCAiaGFuZyIgaWYgYSBjbGllbnQgaGVsbG8KICAgICByZWNvcmQgbGVuZ3RoIGV4Y2VlZHMgMjU1IGJ5dGVzLgoKICAgICAxLiBEbyBub3QgdXNlIHJlY29yZCB2ZXJzaW9uIG51bWJlciA+IFRMUyAxLjAgaW4gaW5pdGlhbCBjbGllbnQKICAgICAgICBoZWxsbzogc29tZSAoYnV0IG5vdCBhbGwpIGhhbmdpbmcgc2VydmVycyB3aWxsIG5vdyB3b3JrLgogICAgIDIuIElmIHdlIHNldCBPUEVOU1NMX01BWF9UTFMxXzJfQ0lQSEVSX0xFTkdUSCB0aGlzIHdpbGwgdHJ1bmNhdGUKCXRoZSBudW1iZXIgb2YgY2lwaGVycyBzZW50IGluIHRoZSBjbGllbnQgaGVsbG8uIFRoaXMgc2hvdWxkIGJlCiAgICAgICAgc2V0IHRvIGFuIGV2ZW4gbnVtYmVyLCBzdWNoIGFzIDUwLCBmb3IgZXhhbXBsZSBieSBwYXNzaW5nOgogICAgICAgIC1ET1BFTlNTTF9NQVhfVExTMV8yX0NJUEhFUl9MRU5HVEg9NTAgdG8gY29uZmlnIG9yIENvbmZpZ3VyZS4KICAgICAgICBNb3N0IGJyb2tlbiBzZXJ2ZXJzIHNob3VsZCBub3cgd29yay4KICAgICAzLiBJZiBhbGwgZWxzZSBmYWlscyBzZXR0aW5nIE9QRU5TU0xfTk9fVExTMV8yX0NMSUVOVCB3aWxsIGRpc2FibGUKCVRMUyAxLjIgY2xpZW50IHN1cHBvcnQgZW50aXJlbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IFNFR1YgaW4gVmVjdG9yIFBlcm11dGF0aW9uIEFFUyBtb2R1bGUgb2JzZXJ2ZWQgaW4gT3BlblNTSC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBoIGFuZCAxLjAuMSAgWzE0IE1hciAyMDEyXQoKICAqKSBBZGQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBNREMyIHNpZ25hdHVyZXMgd2hpY2ggdXNlIGFuIEFTTjEgT0NURVQKICAgICBTVFJJTkcgZm9ybSBpbnN0ZWFkIG9mIGEgRGlnZXN0SW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZm9ybWF0IHVzZWQgZm9yIE1EQzIgUlNBIHNpZ25hdHVyZXMgaXMgaW5jb25zaXN0ZW50IGJldHdlZW4gRVZQCiAgICAgYW5kIHRoZSBSU0Ffc2lnbi9SU0FfdmVyaWZ5IGZ1bmN0aW9ucy4gVGhpcyB3YXMgbWFkZSBtb3JlIGFwcGFyZW50IHdoZW4KICAgICBPcGVuU1NMIHVzZWQgUlNBX3NpZ24vUlNBX3ZlcmlmeSBmb3Igc29tZSBSU0Egc2lnbmF0dXJlcyBpbiBwYXJ0aWN1bGFyCiAgICAgdGhvc2Ugd2hpY2ggd2VudCB0aHJvdWdoIEVWUF9QS0VZX01FVEhPRCBpbiAxLjAuMCBhbmQgbGF0ZXIuIERldGVjdCAKICAgICB0aGUgY29ycmVjdCBmb3JtYXQgaW4gUlNBX3ZlcmlmeSBzbyBib3RoIGZvcm1zIHRyYW5zcGFyZW50bHkgd29yay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTb21lIHNlcnZlcnMgd2hpY2ggc3VwcG9ydCBUTFMgMS4wIGNhbiBjaG9rZSBpZiB3ZSBpbml0aWFsbHkgaW5kaWNhdGUKICAgICBzdXBwb3J0IGZvciBUTFMgMS4yIGFuZCBsYXRlciByZW5lZ290aWF0ZSB1c2luZyBUTFMgMS4wIGluIHRoZSBSU0EKICAgICBlbmNyeXB0ZWQgcHJlbWFzdGVyIHNlY3JldC4gQXMgYSB3b3JrYXJvdW5kIHVzZSB0aGUgbWF4aW11bSBwZW1pdHRlZAogICAgIGNsaWVudCB2ZXJzaW9uIGluIGNsaWVudCBoZWxsbywgdGhpcyBzaG91bGQga2VlcCBzdWNoIHNlcnZlcnMgaGFwcHkKICAgICBhbmQgc3RpbGwgd29yayB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMUy9EVExTIGhlYXJ0YmVhdHMuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU0NUUC4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEltcHJvdmVkIFBSTkcgc2VlZGluZyBmb3IgVk9TLgogICAgIFtQYXVsIEdyZWVuIDxQYXVsLkdyZWVuQHN0cmF0dXMuY29tPl0KCiAgKikgRXh0ZW5zaXZlIGFzc2VtYmxlciBwYWNrcyB1cGRhdGVzLCBtb3N0IG5vdGFibHk6CgoJLSB4ODZbXzY0XTogICAgIEFFUy1OSSwgUENMTVVMUURRLCBSRFJBTkQgc3VwcG9ydDsKCS0geDg2W182NF06ICAgICBTU1NFMyBzdXBwb3J0IChTSEExLCB2ZWN0b3ItcGVybXV0YXRpb24gQUVTKTsKCS0geDg2XzY0OiAgICAgICBiaXQtc2xpY2VkIEFFUyBpbXBsZW1lbnRhdGlvbjsKCS0gQVJNOiAgICAgICAgICBORU9OIHN1cHBvcnQsIGNvbnRlbXBvcmFyeSBwbGF0Zm9ybXMgb3B0aW1pemF0aW9uczsKCS0gczM5MHg6ICAgICAgICB6MTk2IHN1cHBvcnQ7CgktICo6ICAgICAgICAgICAgR0hBU0ggYW5kIEdGKDJebSkgbXVsdGlwbGljYXRpb24gaW1wbGVtZW50YXRpb25zOwoKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTWFrZSBUTFMtU1JQIGNvZGUgY29uZm9ybWFudCB3aXRoIFJGQyA1MDU0IEFQSSBjbGVhbnVwCiAgICAgKHJlbW92YWwgb2YgdW5uZWNlc3NhcnkgY29kZSkKICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxwZXRlci5zeWx2ZXN0ZXJAZWRlbHdlYi5mcj5dCgogICopIEFkZCBUTFMga2V5IG1hdGVyaWFsIGV4cG9ydGVyIGZyb20gUkZDIDU3MDUuCiAgICAgW0VyaWMgUmVzY29ybGFdCgogICopIEFkZCBEVExTLVNSVFAgbmVnb3RpYXRpb24gZnJvbSBSRkMgNTc2NC4KICAgICBbRXJpYyBSZXNjb3JsYV0KCiAgKikgQWRkIE5leHQgUHJvdG9jb2wgTmVnb3RpYXRpb24sCiAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYWdsLXRscy1uZXh0cHJvdG9uZWctMDAuIENhbiBiZQogICAgIGRpc2FibGVkIHdpdGggYSBuby1ucG4gZmxhZyB0byBjb25maWcgb3IgQ29uZmlndXJlLiBDb2RlIGRvbmF0ZWQKICAgICBieSBHb29nbGUuCiAgICAgW0FkYW0gTGFuZ2xleSA8YWdsQGdvb2dsZS5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgb3B0aW9uYWwgNjQtYml0IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgb2YgZWxsaXB0aWMgY3VydmVzIE5JU1QtUDIyNCwKICAgICBOSVNULVAyNTYsIE5JU1QtUDUyMSwgd2l0aCBjb25zdGFudC10aW1lIHNpbmdsZSBwb2ludCBtdWx0aXBsaWNhdGlvbiBvbgogICAgIHR5cGljYWwgaW5wdXRzLiBDb21waWxlciBzdXBwb3J0IGZvciB0aGUgbm9uc3RhbmRhcmQgdHlwZSBfX3VpbnQxMjhfdCBpcwogICAgIHJlcXVpcmVkIHRvIHVzZSB0aGlzIChwcmVzZW50IGluIGdjYyA0LjQgYW5kIGxhdGVyLCBmb3IgNjQtYml0IGJ1aWxkcykuCiAgICAgQ29kZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSB2ZXJzaW9uIDIuMC4KCiAgICAgU3BlY2lmeSAiZW5hYmxlLWVjX25pc3RwXzY0X2djY18xMjgiIG9uIHRoZSBDb25maWd1cmUgKG9yIGNvbmZpZykgY29tbWFuZAogICAgIGxpbmUgdG8gaW5jbHVkZSB0aGlzIGluIHlvdXIgYnVpbGQgb2YgT3BlblNTTCwgYW5kIHJ1biAibWFrZSBkZXBlbmQiIChvcgogICAgICJtYWtlIHVwZGF0ZSIpLiBUaGlzIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBFQ19NRVRIT0RzOgoKICAgICAgICAgRUNfR0ZwX25pc3RwMjI0X21ldGhvZCgpCiAgICAgICAgIEVDX0dGcF9uaXN0cDI1Nl9tZXRob2QoKQogICAgICAgICBFQ19HRnBfbmlzdHA1MjFfbWV0aG9kKCkKCiAgICAgRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoKSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZXNlICh3aGlsZQogICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAoKSBjdXJyZW50bHkgcHJlZmVycyB0aGUgbW9yZSBmbGV4aWJsZQogICAgIGltcGxlbWVudGF0aW9ucykuCiAgICAgW0VtaWxpYSBL5HNwZXIsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBVc2UgdHlwZSBvc3NsX3NzaXplX3QgaW5zdGFkIG9mIHNzaXplX3Qgd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIG9uCiAgICAgYWxsIHBsYXRmb3Jtcy4gTW92ZSBzc2l6ZV90IGRlZmluaXRpb24gZnJvbSBlX29zLmggdG8gdGhlIHB1YmxpYwogICAgIGhlYWRlciBmaWxlIGVfb3MyLmggYXMgaXQgbm93IGFwcGVhcnMgaW4gcHVibGljIGhlYWRlciBmaWxlIGNtcy5oCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1zaWdvcHQgb3B0aW9uIHRvIHRoZSBjYSwgcmVxIGFuZCB4NTA5IHV0aWxpdGllcy4gQWRkaXRpb25hbAogICAgIHNpZ25hdHVyZSBwYXJhbWV0ZXJzIGNhbiBiZSBwYXNzZWQgdXNpbmcgdGhpcyBvcHRpb24gYW5kIGluCiAgICAgcGFydGljdWxhciBQU1MuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBSU0EgUFNTIHNpZ25pbmcgZnVuY3Rpb24uIFRoaXMgd2lsbCBnZW5lcmF0ZSBhbmQgc2V0IHRoZQogICAgIGFwcHJvcHJpYXRlIEFsZ29yaXRobUlkZW50aWZpZXJzIGZvciBQU1MgYmFzZWQgb24gdGhvc2UgaW4gdGhlCiAgICAgY29ycmVzcG9uZGluZyBFVlBfTURfQ1RYIHN0cnVjdHVyZS4gTm8gYXBwbGljYXRpb24gc3VwcG9ydCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgY29tcGFuaW9uIGFsZ29yaXRobSBzcGVjaWZpYyBBU04xIHNpZ25pbmcgcm91dGluZXMuCiAgICAgTmV3IGZ1bmN0aW9uIEFTTjFfaXRlbV9zaWduX2N0eCgpIHNpZ25zIGEgcHJlLWluaXRpYWxpc2VkCiAgICAgRVZQX01EX0NUWCBzdHJ1Y3R1cmUgYW5kIHNldHMgQWxnb3JpdGhtSWRlbnRpZmllcnMgYmFzZWQgb24KICAgICB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGFsZ29yaXRobSBzcGVjaWZpYyBBU04xIHZlcmlmaWNhdGlvbiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbgogICAgIHRvIEVWUF9QS0VZX0FTTjFfTUVUSE9EOiB0aGlzIGlzIG5vdCBpbiBFVlBfUEtFWV9NRVRIT0Qgc2luY2UgdGhlIEFTTjEKICAgICBoYW5kbGluZyB3aWxsIGJlIHRoZSBzYW1lIG5vIG1hdHRlciB3aGF0IEVWUF9QS0VZX01FVEhPRCBpcyB1c2VkLgogICAgIEFkZCBhIFBTUyBoYW5kbGVyIHRvIHN1cHBvcnQgdmVyaWZpY2F0aW9uIG9mIFBTUyBzaWduYXR1cmVzOiBjaGVja2VkCiAgICAgYWdhaW5zdCBhIG51bWJlciBvZiBzYW1wbGUgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzaWduYXR1cmUgcHJpbnRpbmcgZm9yIFBTUy4gQWRkIFBTUyBPSURzLgogICAgIFtTdGV2ZSBIZW5zb24sIE1hcnRpbiBLYWlzZXIgPGxpc3RzQGthaXNlci5jeD5dCgogICopIEFkZCBhbGdvcml0aG0gc3BlY2lmaWMgc2lnbmF0dXJlIHByaW50aW5nLiBBbiBpbmRpdmlkdWFsIEFTTjEgbWV0aG9kCiAgICAgY2FuIG5vdyBwcmludCBvdXQgc2lnbmF0dXJlcyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBoZXggZHVtcC4gCgogICAgIE1vcmUgY29tcGxleCBzaWduYXR1cmVzIChlLmcuIFBTUykgY2FuIHByaW50IG91dCBtb3JlIG1lYW5pbmdmdWwKICAgICBpbmZvcm1hdGlvbi4gSW5jbHVkZSBEU0EgdmVyc2lvbiB0aGF0IHByaW50cyBvdXQgdGhlIHNpZ25hdHVyZQogICAgIHBhcmFtZXRlcnMgciwgcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQYXNzd29yZCBiYXNlZCByZWNpcGllbnQgaW5mbyBzdXBwb3J0IGZvciBDTVMgbGlicmFyeTogaW1wbGVtZW50aW5nCiAgICAgUkZDMzIxMS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTcGxpdCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGludG8gUEJFUzIgYW5kIFBCS0RGMiBmdW5jdGlvbnMuIFRoaXMKICAgICBuZWF0bHkgc2VwYXJhdGVzIHRoZSBjb2RlIGludG8gY2lwaGVyIGFuZCBQQkUgc2VjdGlvbnMgYW5kIGlzIHJlcXVpcmVkCiAgICAgZm9yIHNvbWUgYWxnb3JpdGhtcyB0aGF0IHNwbGl0IFBCRVMyIGludG8gc2VwYXJhdGUgcGllY2VzIChzdWNoIGFzCiAgICAgcGFzc3dvcmQgYmFzZWQgQ01TKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXNzaW9uLWhhbmRsaW5nIGZpeGVzOgogICAgIC0gRml4IGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHJlc3VtaW5nIHdpdGggYSBzZXNzaW9uIElELAogICAgICAgYnV0IGFsc28gc3VwcG9ydCBTZXNzaW9uIFRpY2tldHMuCiAgICAgLSBGaXggYSBidWcgdGhhdCBzdXBwcmVzc2VkIGlzc3Vpbmcgb2YgYSBuZXcgdGlja2V0IGlmIHRoZSBjbGllbnQKICAgICAgIHByZXNlbnRlZCBhIHRpY2tldCB3aXRoIGFuIGV4cGlyZWQgc2Vzc2lvbi4KICAgICAtIFRyeSB0byBzZXQgdGhlIHRpY2tldCBsaWZldGltZSBoaW50IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLgogICAgIC0gTWFrZSB0aWNrZXRzIHNob3J0ZXIgYnkgZXhjbHVkaW5nIGlycmVsZXZhbnQgaW5mb3JtYXRpb24uCiAgICAgLSBPbiB0aGUgY2xpZW50IHNpZGUsIGRvbid0IGlnbm9yZSByZW5ld2VkIHRpY2tldHMuCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBGaXggUFNLIHNlc3Npb24gcmVwcmVzZW50YXRpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIFJDNC1NRDUgYW5kIEFFU05JLVNIQTEgInN0aXRjaGVkIiBpbXBsZW1lbnRhdGlvbnMuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEludGVsLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgR0NNIHN1cHBvcnQgdG8gVExTIGxpYnJhcnkuIFNvbWUgY3VzdG9tIGNvZGUgaXMgbmVlZGVkIHRvIHNwbGl0CiAgICAgdGhlIElWIGJldHdlZW4gdGhlIGZpeGVkIChmcm9tIFBSRikgYW5kIGV4cGxpY2l0IChmcm9tIFRMUyByZWNvcmQpCiAgICAgcG9ydGlvbnMuIFRoaXMgYWRkcyBhbGwgR0NNIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQgYnkgUkZDNTI4OCBhbmQgCiAgICAgUkZDNTI4OS4gR2VuZXJhbGlzZSBzb21lIEFFUyogY2lwaGVyc3RyaW5ncyB0byBpbmxjbHVkZSBHQ00gYW5kCiAgICAgYWRkIGEgc3BlY2lhbCBBRVNHQ00gc3RyaW5nIGZvciBHQ00gb25seS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHBhbmQgcmFuZ2Ugb2YgY3RybHMgZm9yIEFFUyBHQ00uIFBlcm1pdCBzZXR0aW5nIGludm9jYXRpb24KICAgICBmaWVsZCBvbiBkZWNyeXB0IGFuZCByZXRyaWV2YWwgb2YgaW52b2NhdGlvbiBmaWVsZCBvbmx5IG9uIGVuY3J5cHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEhNQUMgRUNDIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzUyODkuIEluY2x1ZGUgU0hBMzg0IFBSRiBzdXBwb3J0LgogICAgIEFzIHJlcXVpcmVkIGJ5IFJGQzUyODkgdGhlc2UgY2lwaGVyc3VpdGVzIGNhbm5vdCBiZSB1c2VkIGlmIGZvcgogICAgIHZlcnNpb25zIG9mIFRMUyBlYXJsaWVyIHRoYW4gMS4yLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBGSVBTIGNhcGFibGUgT3BlblNTTCBpbnRlcnByZXQgYSBOVUxMIGRlZmF1bHQgcHVibGljIGtleSBtZXRob2QKICAgICBhcyB1bnNldCBhbmQgcmV0dXJuIHRoZSBhcHBvcHJpYXRlIGRlZmF1bHQgYnV0IGRvICpub3QqIHNldCB0aGUgZGVmYXVsdC4KICAgICBUaGlzIG1lYW5zIHdlIGNhbiByZXR1cm4gdGhlIGFwcG9wcmlhdGUgbWV0aG9kIGluIGFwcGxpY2F0aW9ucyB0aGF0CiAgICAgc3dpY3RoIGJldHdlZW4gRklQUyBhbmQgbm9uLUZJUFMgbW9kZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgSE1BQyBhbmQgQ01BQyBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluIEZJUFMgbW9kZS4gSWYgYW4KICAgICBFTkdJTkUgaXMgdXNlZCB0aGVuIHdlIGNhbm5vdCBoYW5kbGUgdGhhdCBpbiB0aGUgRklQUyBtb2R1bGUgc28gd2UKICAgICBrZWVwIG9yaWdpbmFsIGNvZGUgaWZmIG5vbi1GSVBTIG9wZXJhdGlvbnMgYXJlIGFsbG93ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1hdHRpbWUgb3B0aW9uIHRvIG9wZW5zc2wgdXRpbGl0aWVzLgogICAgIFtQZXRlciBFY2tlcnNsZXkgPHBkZUBlZmYub3JnPiwgQmVuIExhdXJpZSBhbmQgU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBEU0EgYW5kIERIIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW4gRklQUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IEVDRFNBIGFuZCBFQ0RIIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW4gRklQUyBtb2RlLiBBbHNvIHVzZQogICAgIEZJUFMgRUMgbWV0aG9kcyB1bmNvbmRpdGlvbmFsbHkgZm9yIG5vdy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYnVpbGQgb3B0aW9uIG5vLWVjMm0gdG8gZGlzYWJsZSBjaGFyYWN0ZXJpc3RpYyAyIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmFja3BvcnQgbGliY3J5cHRvIGF1ZGl0IG9mIHJldHVybiB2YWx1ZSBjaGVja2luZyBmcm9tIDEuMS4wLWRldjsgbm90CiAgICAgYWxsIGNhc2VzIGNhbiBiZSBjb3ZlcmVkIGFzIHNvbWUgaW50cm9kdWNlIGJpbmFyeSBpbmNvbXBhdGliaWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBSU0Egb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBpbmNsdWRpbmcga2V5Z2VuLAogICAgIGVuY3J5cHQsIGRlY3J5cHQsIHNpZ24gYW5kIHZlcmlmeS4gQmxvY2sgdXNlIG9mIG5vbiBGSVBTIFJTQSBtZXRob2RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzaW1pbGFyIGxvdyBsZXZlbCBBUEkgYmxvY2tpbmcgdG8gY2lwaGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBMb3cgbGV2ZWwgZGlnZXN0IEFQSXMgYXJlIG5vdCBhcHByb3ZlZCBpbiBGSVBTIG1vZGU6IGFueSBhdHRlbXB0CiAgICAgdG8gdXNlIHRoZXNlIHdpbGwgY2F1c2UgYSBmYXRhbCBlcnJvci4gQXBwbGljYXRpb25zIHRoYXQgKnJlYWxseSogd2FudAogICAgIHRvIHVzZSB0aGVtIGNhbiB1c2UgdGhlIHByaXZhdGVfKiB2ZXJzaW9uIGluc3RlYWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgY2lwaGVyIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgZm9yIEZJUFMgYnVpbGRzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBkaWdlc3Qgb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBmb3IgRklQUyBidWlsZHMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBidWlsZCBzeXN0ZW0gdG8gYWRkICJmaXBzIiBmbGFnIHdoaWNoIHdpbGwgbGluayBpbiBmaXBzY2FuaXN0ZXIubwogICAgIGZvciBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkcyBlbWJlZGRpbmcgYSBzaWduYXR1cmUgaWYgbmVlZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE91dHB1dCBUTFMgc3VwcG9ydGVkIGN1cnZlcyBpbiBwcmVmZXJlbmNlIG9yZGVyIGluc3RlYWQgb2YgbnVtZXJpY2FsCiAgICAgb3JkZXIuIFRoaXMgaXMgY3VycmVudGx5IGhhcmRjb2RlZCBmb3IgdGhlIGhpZ2hlc3Qgb3JkZXIgY3VydmVzIGZpcnN0LgogICAgIFRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSBzbyBhcHBsaWNhdGlvbnMgY2FuIGp1ZGdlIHNwZWVkIHZzIHN0cmVuZ3RoLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBUTFMgdjEuMiBzZXJ2ZXIgc3VwcG9ydCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRklQUyBtb2RlIGluIHNzbCBsaWJyYXJ5OiBkaXNhYmxlIFNTTHYzLCBub24tRklQUyBjaXBoZXJzCiAgICAgYW5kIGVuYWJsZSBNRDUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb25zIEZJUFNfbW9kZV9zZXQoKSBhbmQgRklQU19tb2RlKCkgd2hpY2ggY2FsbCB0aGUgdW5kZXJseWluZwogICAgIEZJUFMgbW9kdWxlcyB2ZXJzaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgVExTIHYxLjIgY2xpZW50IHNpZGUgc3VwcG9ydCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uLiBLZWVwIGNhY2hlCiAgICAgb2YgaGFuZHNoYWtlIHJlY29yZHMgbG9uZ2VyIGFzIHdlIGRvbid0IGtub3cgdGhlIGhhc2ggYWxnb3JpdGhtIHRvIHVzZQogICAgIHVudGlsIGFmdGVyIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IG1lc3NhZ2UgaXMgcmVjZWl2ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBUTFMgdjEuMiBjbGllbnQgc3VwcG9ydC4gQWRkIGEgZGVmYXVsdCBzaWduYXR1cmUgYWxnb3JpdGhtcwogICAgIGV4dGVuc2lvbiBpbmNsdWRpbmcgYWxsIHRoZSBhbGdvcml0aG1zIHdlIHN1cHBvcnQuIFBhcnNlIG5ldyBzaWduYXR1cmUKICAgICBmb3JtYXQgaW4gY2xpZW50IGtleSBleGNoYW5nZS4gUmVsYXggc29tZSBFQ0Mgc2lnbmluZyByZXN0cmljdGlvbnMgZm9yCiAgICAgVExTIHYxLjIgYXMgaW5kaWNhdGVkIGluIFJGQzUyNDYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNlcnZlciBzdXBwb3J0IGZvciBUTFMgdjEuMiBzaWduYXR1cmUgYWxnb3JpdGhtcyBleHRlbnNpb24uIFN3aXRjaAogICAgIHRvIG5ldyBzaWduYXR1cmUgZm9ybWF0IHdoZW4gbmVlZGVkIHVzaW5nIGNsaWVudCBkaWdlc3QgcHJlZmVyZW5jZS4KICAgICBBbGwgc2VydmVyIGNpcGhlcnN1aXRlcyBzaG91bGQgbm93IHdvcmsgY29ycmVjdGx5IGluIFRMUyB2MS4yLiBObyBjbGllbnQKICAgICBzdXBwb3J0IHlldCBhbmQgbm8gc3VwcG9ydCBmb3IgY2xpZW50IGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIFRMUyB2MS4yIHN1cHBvcnQuIEFkZCBuZXcgU0hBMjU2IGRpZ2VzdCB0byBzc2wgY29kZSwgc3dpdGNoCiAgICAgdG8gU0hBMjU2IGZvciBQUkYgd2hlbiB1c2luZyBUTFMgdjEuMiBhbmQgbGF0ZXIuIEFkZCBuZXcgU0hBMjU2IGJhc2VkCiAgICAgY2lwaGVyc3VpdGVzLiBBdCBwcmVzZW50IG9ubHkgUlNBIGtleSBleGNoYW5nZSBjaXBoZXJzdWl0ZXMgd29yayB3aXRoCiAgICAgVExTIHYxLjIuIEFkZCBuZXcgb3B0aW9uIGZvciBUTFMgdjEuMiByZXBsYWNpbmcgdGhlIG9sZCBhbmQgb2Jzb2xldGUKICAgICBTU0xfT1BfUEtDUzFfQ0hFQ0sgZmxhZ3Mgd2l0aCBTU0xfT1BfTk9fVExTdjFfMi4gTmV3IFRMU3YxLjIgbWV0aG9kcwogICAgIGFuZCB2ZXJzaW9uIGNoZWNraW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gT1BFTlNTTF9OT19TU0xfSU5URVJOLiBJZiBhbiBhcHBsaWNhdGlvbiBjYW4gYmUgY29tcGlsZWQKICAgICB3aXRoIHRoaXMgZGVmaW5lZCBpdCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBhbnkgY2hhbmdlcyB0byBzc2wgaW50ZXJuYWwKICAgICBzdHJ1Y3R1cmVzLiBBZGQgc2V2ZXJhbCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBhbGxvdyBvcGVuc3NsIGFwcGxpY2F0aW9uCiAgICAgdG8gd29yayB3aXRoIE9QRU5TU0xfTk9fU1NMX0lOVEVSTiBkZWZpbmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBTUlAgc3VwcG9ydC4KICAgICBbVG9tIFd1IDx0andAY3Muc3RhbmZvcmQuZWR1PiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIGZ1bmN0aW9ucyB0byBjb3B5IEVWUF9QS0VZX01FVEhPRCBhbmQgcmV0cmlldmUgZmxhZ3MgYW5kIGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBlcm1pdCBhYmJyZXZpYXRlZCBoYW5kc2hha2VzIHdoZW4gcmVuZWdvdGlhdGluZyB1c2luZyB0aGUgZnVuY3Rpb24KICAgICBTU0xfcmVuZWdvdGlhdGVfYWJicmV2aWF0ZWQoKS4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEFkZCBjYWxsIHRvIEVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKSB0bwogICAgIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpLCBzbyBzb21lIGltcGxlbWVudGF0aW9ucyBnZXQgdXNlZAogICAgIGF1dG9tYXRpY2FsbHkgaW5zdGVhZCBvZiBuZWVkaW5nIGV4cGxpY2l0IGFwcGxpY2F0aW9uIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMUyBrZXkgZXhwb3J0ZXIgYXMgZGVzY3JpYmVkIGluIFJGQzU3MDUuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgVExTdjEuMSBzdXBwb3J0LiBTaW5jZSBUTFN2MS4xIGlzIHZlcnkgc2ltaWxhciB0byBUTFMgdjEuMCBvbmx5CiAgICAgYSBmZXcgY2hhbmdlcyBhcmUgcmVxdWlyZWQ6CgogICAgICAgQWRkIFNTTF9PUF9OT19UTFN2MV8xIGZsYWcuCiAgICAgICBBZGQgVExTdjFfMSBtZXRob2RzLgogICAgICAgVXBkYXRlIHZlcnNpb24gY2hlY2tpbmcgbG9naWMgdG8gaGFuZGxlIHZlcnNpb24gMS4xLgogICAgICAgQWRkIGV4cGxpY2l0IElWIGhhbmRsaW5nIChwb3J0ZWQgZnJvbSBEVExTIGNvZGUpLgogICAgICAgQWRkIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHNfY2xpZW50L3Nfc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZyBhbmQgMS4wLjBoIFsxMiBNYXIgMjAxMl0KCiAgKikgRml4IE1NQSAoQmxlaWNoZW5iYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41IFJTQSBwYWRkaW5nKSB3ZWFrbmVzcwogICAgIGluIENNUyBhbmQgUEtDUzcgY29kZS4gV2hlbiBSU0EgZGVjcnlwdGlvbiBmYWlscyB1c2UgYSByYW5kb20ga2V5IGZvcgogICAgIGNvbnRlbnQgZGVjcnlwdGlvbiBhbmQgYWx3YXlzIHJldHVybiB0aGUgc2FtZSBlcnJvci4gTm90ZTogdGhpcyBhdHRhY2sKICAgICBuZWVkcyBvbiBhdmVyYWdlIDJeMjAgbWVzc2FnZXMgc28gaXQgb25seSBhZmZlY3RzIGF1dG9tYXRlZCBzZW5kZXJzLiBUaGUKICAgICBvbGQgYmVoYXZpb3VyIGNhbiBiZSByZWVuYWJsZWQgaW4gdGhlIENNUyBjb2RlIGJ5IHNldHRpbmcgdGhlCiAgICAgQ01TX0RFQlVHX0RFQ1JZUFQgZmxhZzogdGhpcyBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZyB3aGVyZQogICAgIGFuIE1NQSBkZWZlbmNlIGlzIG5vdCBuZWNlc3NhcnkuCiAgICAgVGhhbmtzIHRvIEl2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgICAgdGhpcyBpc3N1ZS4gKENWRS0yMDEyLTA4ODQpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IENWRS0yMDExLTQ2MTk6IG1ha2Ugc3VyZSB3ZSByZWFsbHkgYXJlIHJlY2VpdmluZyBhIAogICAgIGNsaWVudCBoZWxsbyBiZWZvcmUgcmVqZWN0aW5nIG11bHRpcGxlIFNHQyByZXN0YXJ0cy4gVGhhbmtzIHRvCiAgICAgSXZhbiBOZXN0bGVyb2RlIDxpbmVzdGxlcm9kZUB1cy5pYm0uY29tPiBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBmIGFuZCAxLjAuMGcgWzE4IEphbiAyMDEyXQoKICAqKSBGaXggZm9yIERUTFMgRG9TIGlzc3VlIGludHJvZHVjZWQgYnkgZml4IGZvciBDVkUtMjAxMS00MTA5LgogICAgIFRoYW5rcyB0byBBbnRvbmlvIE1hcnRpbiwgRW50ZXJwcmlzZSBTZWN1cmUgQWNjZXNzIFJlc2VhcmNoIGFuZAogICAgIERldmVsb3BtZW50LCBDaXNjbyBTeXN0ZW1zLCBJbmMuIGZvciBkaXNjb3ZlcmluZyB0aGlzIGJ1ZyBhbmQKICAgICBwcmVwYXJpbmcgYSBmaXguIChDVkUtMjAxMi0wMDUwKQogICAgIFtBbnRvbmlvIE1hcnRpbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBlIGFuZCAxLjAuMGYgWzQgSmFuIDIwMTJdCgogICopIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gaGF2ZSBkaXNjb3ZlcmVkIGFuIGV4dGVuc2lvbgogICAgIG9mIHRoZSBWYXVkZW5heSBwYWRkaW5nIG9yYWNsZSBhdHRhY2sgb24gQ0JDIG1vZGUgZW5jcnlwdGlvbgogICAgIHdoaWNoIGVuYWJsZXMgYW4gZWZmaWNpZW50IHBsYWludGV4dCByZWNvdmVyeSBhdHRhY2sgYWdhaW5zdAogICAgIHRoZSBPcGVuU1NMIGltcGxlbWVudGF0aW9uIG9mIERUTFMuIFRoZWlyIGF0dGFjayBleHBsb2l0cyB0aW1pbmcKICAgICBkaWZmZXJlbmNlcyBhcmlzaW5nIGR1cmluZyBkZWNyeXB0aW9uIHByb2Nlc3NpbmcuIEEgcmVzZWFyY2gKICAgICBwYXBlciBkZXNjcmliaW5nIHRoaXMgYXR0YWNrIGNhbiBiZSBmb3VuZCBhdDoKICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5pc2cucmh1bC5hYy51ay9+a3AvZHRscy5wZGYKICAgICBUaGFua3MgZ28gdG8gTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbiBvZiB0aGUgSW5mb3JtYXRpb24KICAgICBTZWN1cml0eSBHcm91cCBhdCBSb3lhbCBIb2xsb3dheSwgVW5pdmVyc2l0eSBvZiBMb25kb24KICAgICAod3d3LmlzZy5yaHVsLmFjLnVrKSBmb3IgZGlzY292ZXJpbmcgdGhpcyBmbGF3IGFuZCB0byBSb2JpbiBTZWdnZWxtYW5uCiAgICAgPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+IGFuZCBNaWNoYWVsIFR1ZXhlbiA8dHVleGVuQGZoLW11ZW5zdGVyLmRlPgogICAgIGZvciBwcmVwYXJpbmcgdGhlIGZpeC4gKENWRS0yMDExLTQxMDgpCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4sIE1pY2hhZWwgVHVleGVuXQoKICAqKSBDbGVhciBieXRlcyB1c2VkIGZvciBibG9jayBwYWRkaW5nIG9mIFNTTCAzLjAgcmVjb3Jkcy4KICAgICAoQ1ZFLTIwMTEtNDU3NikKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBPbmx5IGFsbG93IG9uZSBTR0MgaGFuZHNoYWtlIHJlc3RhcnQgZm9yIFNTTC9UTFMuIFRoYW5rcyB0byBHZW9yZ2UKICAgICBLYWRpYW5ha2lzIDxkZXNuYWNrZWRAZ21haWwuY29tPiBmb3IgZGlzY292ZXJpbmcgdGhpcyBpc3N1ZSBhbmQKICAgICBBZGFtIExhbmdsZXkgZm9yIHByZXBhcmluZyB0aGUgZml4LiAoQ1ZFLTIwMTEtNDYxOSkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBDaGVjayBwYXJhbWV0ZXJzIGFyZSBub3QgTlVMTCBpbiBHT1NUIEVOR0lORS4gKENWRS0yMDEyLTAwMjcpCiAgICAgW0FuZHJleSBLdWxpa292IDxhbWRlaWNoQGdtYWlsLmNvbT5dCgogICopIFByZXZlbnQgbWFsZm9ybWVkIFJGQzM3NzkgZGF0YSB0cmlnZ2VyaW5nIGFuIGFzc2VydGlvbiBmYWlsdXJlLgogICAgIFRoYW5rcyB0byBBbmRyZXcgQ2hpLCBCQk4gVGVjaG5vbG9naWVzLCBmb3IgZGlzY292ZXJpbmcgdGhlIGZsYXcKICAgICBhbmQgUm9iIEF1c3RlaW4gPHNyYUBoYWN0cm4ubmV0PiBmb3IgZml4aW5nIGl0LiAoQ1ZFLTIwMTEtNDU3NykKICAgICBbUm9iIEF1c3RlaW4gPHNyYUBoYWN0cm4ubmV0Pl0KCiAgKikgSW1wcm92ZWQgUFJORyBzZWVkaW5nIGZvciBWT1MuCiAgICAgW1BhdWwgR3JlZW4gPFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20+XQoKICAqKSBGaXggc3NsX2NpcGguYyBzZXQtdXAgcmFjZS4KICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggc3B1cmlvdXMgZmFpbHVyZXMgaW4gZWNkc2F0ZXN0LmMuCiAgICAgW0VtaWxpYSBL5HNwZXIgKEdvb2dsZSldCgogICopIEZpeCB0aGUgQklPX2ZfYnVmZmVyKCkgaW1wbGVtZW50YXRpb24gKHdoaWNoIHdhcyBtaXhpbmcgZGlmZmVyZW50CiAgICAgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSAnLi4uX2xlbicgZmllbGRzKS4KICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggaGFuZGxpbmcgb2YgQk5fQkxJTkRJTkc6IG5vdyBCTl9CTElORElOR19pbnZlcnRfZXggKHJhdGhlciB0aGFuCiAgICAgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4KSBjYWxscyBCTl9CTElORElOR191cGRhdGUsIGVuc3VyaW5nIHRoYXQgY29uY3VycmVudAogICAgIHRocmVhZHMgd29uJ3QgcmV1c2UgdGhlIHNhbWUgYmxpbmRpbmcgY29lZmZpY2llbnRzLgoKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBuZWVkIHRvIG9idGFpbiB0aGUgQ1JZUFRPX0xPQ0tfUlNBX0JMSU5ESU5HCiAgICAgbG9jayB0byBjYWxsIEJOX0JMSU5ESU5HX2ludmVydF9leCwgYW5kIGF2b2lkcyBvbmUgdXNlIG9mCiAgICAgQk5fQkxJTkRJTkdfdXBkYXRlIGZvciBlYWNoIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSAocHJldmlvdXNseSwKICAgICB0aGUgbGFzdCB1cGRhdGUgYWx3YXlzIHJlbWFpbmVkIHVudXNlZCkuCiAgICAgW0VtaWxpYSBL5HNwZXIgKEdvb2dsZSldCgogICopIEluIHNzbDNfY2xlYXIsIHByZXNlcnZlIHMzLT5pbml0X2V4dHJhIGFsb25nIHdpdGggczMtPnJidWYuCiAgICAgW0JvYiBCdWNraG9seiAoR29vZ2xlKV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBkIGFuZCAxLjAuMGUgWzYgU2VwIDIwMTFdCgogICopIEZpeCBidWcgd2hlcmUgQ1JMcyB3aXRoIG5leHRVcGRhdGUgaW4gdGhlIHBhc3QgYXJlIHNvbWV0aW1lcyBhY2NlcHRlZAogICAgIGJ5IGluaXRpYWxpc2luZyBYNTA5X1NUT1JFX0NUWCBwcm9wZXJseS4gKENWRS0yMDExLTMyMDcpCiAgICAgW0thc3BhciBCcmFuZCA8b3NzbEB2ZWxveC5jaD5dCgogICopIEZpeCBTU0wgbWVtb3J5IGhhbmRsaW5nIGZvciAoRUMpREggY2lwaGVyc3VpdGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgZm9yIG11bHRpLXRocmVhZGVkIHVzZSBvZiBFQ0RILiAoQ1ZFLTIwMTEtMzIxMCkKICAgICBbQWRhbSBMYW5nbGV5IChHb29nbGUpXQoKICAqKSBGaXggeDUwOV9uYW1lX2V4X2QyaSBtZW1vcnkgbGVhayBvbiBiYWQgaW5wdXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbW92ZSBoYXJkIGNvZGVkIGVjZHNhV2l0aFNIQTEgc2lnbmF0dXJlIHRlc3RzIGluIHNzbCBjb2RlIGFuZCBjaGVjawogICAgIHNpZ25hdHVyZSBwdWJsaWMga2V5IGFsZ29yaXRobSBieSB1c2luZyBPSUQgeHJlZiB1dGlsaXRpZXMgaW5zdGVhZC4KICAgICBCZWZvcmUgdGhpcyB5b3UgY291bGQgb25seSB1c2Ugc29tZSBFQ0MgY2lwaGVyc3VpdGVzIHdpdGggU0hBMSBvbmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90ZWN0aW9uIGFnYWluc3QgRUNEU0EgdGltaW5nIGF0dGFja3MgYXMgbWVudGlvbmVkIGluIHRoZSBwYXBlcgogICAgIGJ5IEJpbGx5IEJvYiBCcnVtbGV5IGFuZCBOaWNvbGEgVHV2ZXJpLCBzZWU6CgoJaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDExLzIzMi5wZGYKCiAgICAgW0JpbGx5IEJvYiBCcnVtbGV5IGFuZCBOaWNvbGEgVHV2ZXJpXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGMgYW5kIDEuMC4wZCBbOCBGZWIgMjAxMV0KCiAgKikgRml4IHBhcnNpbmcgb2YgT0NTUCBzdGFwbGluZyBDbGllbnRIZWxsbyBleHRlbnNpb24uIENWRS0yMDExLTAwMTQKICAgICBbTmVlbCBNZWh0YSwgQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXIgKEdvb2dsZSldCgogICopIEZpeCBidWcgaW4gc3RyaW5nIHByaW50aW5nIGNvZGU6IGlmICphbnkqIGVzY2FwaW5nIGlzIGVuYWJsZWQgd2UgbXVzdAogICAgIGVzY2FwZSB0aGUgZXNjYXBlIGNoYXJhY3RlciAoYmFja3NsYXNoKSBvciB0aGUgcmVzdWx0aW5nIHN0cmluZyBpcwogICAgIGFtYmlndW91cy4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGIgYW5kIDEuMC4wYyAgWzIgRGVjIDIwMTBdCgogICopIERpc2FibGUgY29kZSB3b3JrYXJvdW5kIGZvciBhbmNpZW50IGFuZCBvYnNvbGV0ZSBOZXRzY2FwZSBicm93c2VycwogICAgIGFuZCBzZXJ2ZXJzOiBhbiBhdHRhY2tlciBjYW4gdXNlIGl0IGluIGEgY2lwaGVyc3VpdGUgZG93bmdyYWRlIGF0dGFjay4KICAgICBUaGFua3MgdG8gTWFydGluIFJleCBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcuIENWRS0yMDEwLTQxODAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlZCBKLVBBS0UgaW1wbGVtZW50YXRpb24gZXJyb3IsIG9yaWdpbmFsbHkgZGlzY292ZXJlZCBieQogICAgIFNlYmFzdGllbiBNYXJ0aW5pLCBmdXJ0aGVyIGluZm8gYW5kIGNvbmZpcm1hdGlvbiBmcm9tIFN0ZWZhbgogICAgIEFyZW50eiBhbmQgRmVuZyBIYW8uIE5vdGUgdGhhdCB0aGlzIGZpeCBpcyBhIHNlY3VyaXR5IGZpeC4gQ1ZFLTIwMTAtNDI1MgogICAgIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGEgYW5kIDEuMC4wYiAgWzE2IE5vdiAyMDEwXQoKICAqKSBGaXggZXh0ZW5zaW9uIGNvZGUgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zIHdoaWNoIGNhbiByZXN1bHQgaW4gYSBidWZmZXIKICAgICBvdmVycnVuIHZ1bG5lcmFiaWxpdHk6IHJlc3VtZWQgc2Vzc2lvbnMgbXVzdCBub3QgYmUgbW9kaWZpZWQgYXMgdGhleSBjYW4KICAgICBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4gQ1ZFLTIwMTAtMzg2NAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBXSU4zMiBidWlsZCBzeXN0ZW0gdG8gY29ycmVjdGx5IGxpbmsgYW4gRU5HSU5FIGRpcmVjdG9yeSBpbnRvCiAgICAgYSBETEwuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wIGFuZCAxLjAuMGEgIFswMSBKdW4gMjAxMF0KCiAgKikgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGludF9yc2FfdmVyaWZ5IGluIHBrZXlfcnNhX3ZlcmlmeXJlY292ZXIgCiAgICAgKENWRS0yMDEwLTE2MzMpCiAgICAgW1N0ZXZlIEhlbnNvbiwgUGV0ZXItTWljaGFlbCBIYWdlciA8aGFnZXJAZG9ydG11bmQubmV0Pl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhuIGFuZCAxLjAuMCAgWzI5IE1hciAyMDEwXQoKICAqKSBBZGQgIm1pc3NpbmciIGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX2NvcHkoKS4gVGhpcyBjb3BpZXMgYSBjaXBoZXIKICAgICBjb250ZXh0LiBUaGUgb3BlcmF0aW9uIGNhbiBiZSBjdXN0b21pc2VkIHZpYSB0aGUgY3RybCBtZWNoYW5pc20gaW4KICAgICBjYXNlIEVOR0lORXMgd2FudCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUb2xlcmF0ZSB5ZXQgYW5vdGhlciBicm9rZW4gUEtDUyM4IGtleSBmb3JtYXQ6IHByaXZhdGUga2V5IHZhbHVlIG5lZ2F0aXZlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXN1YmplY3RfaGFzaF9vbGQgYW5kIC1pc3N1ZXJfaGFzaF9vbGQgb3B0aW9ucyB0byB4NTA5IHV0aWxpdHkgdG8KICAgICBvdXRwdXQgaGFzaGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLgogICAgIFtXaWxseSBXZWlzeiA8d2Vpc3pAdmNwYy51bml2aWUuYWMuYXQ+XQoKICAqKSBGaXggY29tcHJlc3Npb24gYWxnb3JpdGhtIGhhbmRsaW5nOiBpZiByZXN1bWluZyBhIHNlc3Npb24gdXNlIHRoZQogICAgIGNvbXByZXNzaW9uIGFsZ29yaXRobSBvZiB0aGUgcmVzdW1lZCBzZXNzaW9uIGluc3RlYWQgb2YgZGV0ZXJtaW5pbmcKICAgICBpdCBmcm9tIGNsaWVudCBoZWxsbyBhZ2Fpbi4gRG9uJ3QgYWxsb3cgc2VydmVyIHRvIGNoYW5nZSBhbGdvcml0aG0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGxvYWRfY3JscygpIGZ1bmN0aW9uIHRvIGFwcHMgdGlkeWluZyBsb2FkX2NlcnRzKCkgdG9vLiBBZGQgb3B0aW9uCiAgICAgdG8gdmVyaWZ5IHV0aWxpdHkgdG8gYWxsb3cgYWRkaXRpb25hbCBDUkxzIHRvIGJlIGluY2x1ZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBPQ1NQIHJlcXVlc3QgY29kZSB0byBwZXJtaXQgYWRkaW5nIGN1c3RvbSBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0OgogICAgIHNvbWUgcmVzcG9uZGVycyBuZWVkIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGZ1bmN0aW9uIEVWUF9QS0VZX3NpZ24oKSByZXR1cm5zIDw9MCBvbiBlcnJvcjogY2hlY2sgcmV0dXJuIGNvZGUKICAgICBjb3JyZWN0bHkuCiAgICAgW0p1bGlhIExhd2FsbCA8anVsaWFAZGlrdS5kaz5dCgogICopIFVwZGF0ZSB2ZXJpZnkgY2FsbGJhY2sgY29kZSBpbiBhcHBzL3NfY2IuYyBhbmQgYXBwcy92ZXJpZnkuYywgaXQKICAgICBuZWVkbGVzc2x5IGRlcmVmZXJlbmNlZCBzdHJ1Y3R1cmVzLCB1c2VkIG9ic29sZXRlIGZ1bmN0aW9ucyBhbmQKICAgICBkaWRuJ3QgaGFuZGxlIGFsbCB1cGRhdGVkIHZlcmlmeSBjb2RlcyBjb3JyZWN0bHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGlzYWJsZSBNRDIgaW4gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBCSU9fcG9wKCkgYW5kIEJJT19wdXNoKCkgdXNlIHRoZSBjdHJsIGFyZ3VtZW50ICh3aGljaCB3YXMgTlVMTCkgdG8KICAgICBpbmRpY2F0ZSB0aGUgaW5pdGlhbCBCSU8gYmVpbmcgcHVzaGVkIG9yIHBvcHBlZC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZQogICAgIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBCSU8gaXMgdGhlIG9uZSBleHBsaWNpdGx5IGNhbGxlZCBvciBhcyBhIHJlc3VsdAogICAgIG9mIHRoZSBjdHJsIGJlaW5nIHBhc3NlZCBkb3duIHRoZSBjaGFpbi4gRml4IEJJT19wb3AoKSBhbmQgU1NMIEJJT3Mgc28KICAgICBpdCBoYW5kbGVzIHJlZmVyZW5jZSBjb3VudHMgY29ycmVjdGx5IGFuZCBkb2Vzbid0IHplcm8gb3V0IHRoZSBJL08gYmlvCiAgICAgd2hlbiBpdCBpcyBub3QgYmVpbmcgZXhwbGljaXRseSBwb3BwZWQuIFdBUk5JTkc6IGFwcGxpY2F0aW9ucyB3aGljaAogICAgIGluY2x1ZGVkIHdvcmthcm91bmRzIGZvciB0aGUgb2xkIGJ1Z2d5IGJlaGF2aW91ciB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQKICAgICBvciB0aGV5IGNvdWxkIGZyZWUgdXAgYWxyZWFkeSBmcmVlZCBCSU9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCB0aGUgdW5pMmFzYy9hc2MydW5pID0+IE9QRU5TU0xfdW5pMmFzYy9PUEVOU1NMX2FzYzJ1bmkKICAgICByZW5hbWluZyB0byBhbGwgcGxhdGZvcm1zICh3aXRoaW4gdGhlIDAuOS44IGJyYW5jaCwgdGhpcyB3YXMKICAgICBkb25lIGNvbmRpdGlvbmFsbHkgb24gTmV0d2FyZSBwbGF0Zm9ybXMgdG8gYXZvaWQgYSBuYW1lIGNsYXNoKS4KICAgICBbR3VlbnRlciA8bGlzdHNAZ2tudy5uZXQ+XQoKICAqKSBBZGQgRUNESEUgYW5kIFBTSyBzdXBwb3J0IHRvIERUTFMuCiAgICAgW01pY2hhZWwgVHVleGVuIDx0dWV4ZW5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgQ0hFQ0tFRF9TVEFDS19PRiBtYWNybyB0byBzYWZlc3RhY2suaCwgb3RoZXJ3aXNlIHNhZmVzdGFjayBjYW4ndAogICAgIGJlIHVzZWQgb24gQysrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAibWlzc2luZyIgZnVuY3Rpb24gRVZQX01EX2ZsYWdzKCkgKHdpdGhvdXQgdGhpcyB0aGUgb25seSB3YXkgdG8KICAgICByZXRyaWV2ZSBhIGRpZ2VzdCBmbGFncyBpcyBieSBhY2Nlc3NpbmcgdGhlIHN0cnVjdHVyZSBkaXJlY3RseS4gVXBkYXRlCiAgICAgRVZQX01EX2RvX2FsbCooKSBhbmQgRVZQX0NJUEhFUl9kb19hbGwqKCkgdG8gaW5jbHVkZSB0aGUgbmFtZSBhIGRpZ2VzdAogICAgIG9yIGNpcGhlciBpcyByZWdpc3RlcmVkIGFzIGluIHRoZSAiZnJvbSIgYXJndW1lbnQuIFByaW50IG91dCBhbGwKICAgICByZWdpc3RlcmVkIGRpZ2VzdHMgaW4gdGhlIGRnc3QgdXNhZ2UgbWVzc2FnZSBpbnN0ZWFkIG9mIG1hbnVhbGx5IAogICAgIGF0dGVtcHRpbmcgdG8gd29yayB0aGVtIG91dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBubyBTU0x2MiBjaXBoZXJzIGFyZSB1c2VkIGRvbid0IHVzZSBhbiBTU0x2MiBjb21wYXRpYmxlIGNsaWVudCBoZWxsbzoKICAgICB0aGlzIGFsbG93cyB0aGUgdXNlIG9mIGNvbXByZXNzaW9uIGFuZCBleHRlbnNpb25zLiBDaGFuZ2UgZGVmYXVsdCBjaXBoZXIKICAgICBzdHJpbmcgdG8gcmVtb3ZlIFNTTHYyIGNpcGhlcnN1aXRlcy4gVGhpcyBlZmZlY3RpdmVseSBhdm9pZHMgYW5jaWVudCBTU0x2MgogICAgIGJ5IGRlZmF1bHQgdW5sZXNzIGFuIGFwcGxpY2F0aW9uIGNpcGhlciBzdHJpbmcgcmVxdWVzdHMgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWx0ZXIgbWF0Y2ggY3JpdGVyaWEgaW4gUEtDUzEyX3BhcnNlKCkuIEl0IHVzZWQgdG8gdHJ5IHRvIHVzZSBsb2NhbAogICAgIGtleSBpZHMgdG8gZmluZCBtYXRjaGluZyBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYnV0IHNvbWUgUEtDUyMxMiBmaWxlcwogICAgIGRvbid0IGZvbGxvdyB0aGUgKHNvbWV3aGF0IHVud3JpdHRlbikgcnVsZXMgYW5kIHRoaXMgc3RyYXRlZ3kgZmFpbHMuCiAgICAgTm93IGp1c3QgZ2F0aGVyIGFsbCBjZXJ0aWZpY2F0ZXMgdG9nZXRoZXIgYW5kIHRoZSBmaXJzdCBwcml2YXRlIGtleQogICAgIHRoZW4gbG9vayBmb3IgdGhlIGZpcnN0IGNlcnRpZmljYXRlIHRoYXQgbWF0Y2hlcyB0aGUga2V5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgdXNlIG9mIHJlZ2lzdGVyZWQgZGlnZXN0IGFuZCBjaXBoZXIgbmFtZXMgZm9yIGRnc3QgYW5kIGNpcGhlcgogICAgIGNvbW1hbmRzIGluc3RlYWQgb2YgaGF2aW5nIHRvIGFkZCBlYWNoIG9uZSBhcyBhIHNwZWNpYWwgY2FzZS4gU28gbm93CiAgICAgeW91IGNhbiBkbzoKCiAgICAgICAgb3BlbnNzbCBzaGEyNTYgZm9vCgogICAgIGFzIHdlbGwgYXM6CgogICAgICAgIG9wZW5zc2wgZGdzdCAtc2hhMjU2IGZvbwoKICAgICBhbmQgdGhpcyB3b3JrcyBmb3IgRU5HSU5FIGJhc2VkIGFsZ29yaXRobXMgdG9vLgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgR29zdCBFTkdJTkUgdG8gc3VwcG9ydCBwYXJhbWV0ZXIgZmlsZXMuCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT5dCgogICopIFN1cHBvcnQgR2VuZXJhbGl6ZWRUaW1lIGluIGNhIHV0aWxpdHkuIAogICAgIFtPbGl2ZXIgTWFydGluIDxvbGl2ZXJAdm9sYXRpbGV2b2lkLm5ldD4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgaGFzaCBmb3JtYXQgdXNlZCBmb3IgY2VydGlmaWNhdGUgZGlyZWN0b3J5IGxpbmtzLiBUaGUgbmV3CiAgICAgZm9ybSB1c2VzIHRoZSBjYW5vbmljYWwgZW5jb2RpbmcgKG1lYW5pbmcgZXF1aXZhbGVudCBuYW1lcyB3aWxsIHdvcmsKICAgICBldmVuIGlmIHRoZXkgYXJlbid0IGlkZW50aWNhbCkgYW5kIHVzZXMgU0hBMSBpbnN0ZWFkIG9mIE1ENS4gVGhpcyBmb3JtCiAgICAgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG9sZGVyIGZvcm1hdCBhbmQgYXMgYSByZXN1bHQgY19yZWhhc2ggc2hvdWxkCiAgICAgYmUgdXNlZCB0byByZWJ1aWxkIHN5bWJvbGljIGxpbmtzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUEtDUyM4IHRoZSBkZWZhdWx0IHdyaXRlIGZvcm1hdCBmb3IgcHJpdmF0ZSBrZXlzLCByZXBsYWNpbmcgdGhlCiAgICAgdHJhZGl0aW9uYWwgZm9ybWF0LiBUaGlzIGZvcm0gaXMgc3RhbmRhcmRpc2VkLCBtb3JlIHNlY3VyZSBhbmQgZG9lc24ndAogICAgIGluY2x1ZGUgYW4gaW1wbGljaXQgTUQ1IGRlcGVuZGVuY3kuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgJGdjY19kZXZ0ZWFtX3dhcm4gb3B0aW9uIHRvIENvbmZpZ3VyZS4gVGhlIGlkZWEgaXMgdGhhdCBhbnkgY29kZQogICAgIGNvbW1pdHRlZCB0byBPcGVuU1NMIHNob3VsZCBwYXNzIHRoaXMgbG90IGFzIGEgbWluaW11bS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2Vzc2lvbiB0aWNrZXQgb3ZlcnJpZGUgZnVuY3Rpb25hbGl0eSBmb3IgdXNlIGJ5IEVBUC1GQVNULgogICAgIFtKb3VuaSBNYWxpbmVuIDxqQHcxLmZpPl0KCiAgKikgTW9kaWZ5IEhNQUMgZnVuY3Rpb25zIHRvIHJldHVybiBhIHZhbHVlLiBTaW5jZSB0aGVzZSBjYW4gYmUgaW1wbGVtZW50ZWQKICAgICBpbiBhbiBFTkdJTkUgZXJyb3JzIGNhbiBvY2N1ci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUeXBlLWNoZWNrZWQgT0JKX2JzZWFyY2hfZXguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFR5cGUtY2hlY2tlZCBPQkpfYnNlYXJjaC4gQWxzbyBzb21lIGNvbnN0aWZpY2F0aW9uIG5lY2Vzc2l0YXRlZAogICAgIGJ5IHR5cGUtY2hlY2tpbmcuICBTdGlsbCB0byBjb21lOiBUWFRfREIsIGJzZWFyY2goPyksCiAgICAgT0JKX2JzZWFyY2hfZXgsIHFzb3J0LCBDUllQVE9fRVhfREFUQSwgQVNOMV9WQUxVRSwgQVNOMV9TVFJJTkcsCiAgICAgQ09ORl9WQUxVRS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfZ210aW1lX2FkaigpIHRvIGFkZCBhIHNwZWNpZmljIG51bWJlciBvZiBkYXlzIGFuZAogICAgIHNlY29uZHMgdG8gYSB0bSBzdHJ1Y3R1cmUgZGlyZWN0bHksIGluc3RlYWQgb2YgZ29pbmcgdGhyb3VnaCBPUwogICAgIHNwZWNpZmljIGRhdGUgcm91dGluZXMuIFRoaXMgYXZvaWRzIGFueSBpc3N1ZXMgd2l0aCBPUyByb3V0aW5lcyBzdWNoCiAgICAgYXMgdGhlIHllYXIgMjAzOCBidWcuIE5ldyAqX2FkaigpIGZ1bmN0aW9ucyBmb3IgQVNOMSB0aW1lIHN0cnVjdHVyZXMKICAgICBhbmQgWDUwOV90aW1lX2Fkal9leCgpIHRvIGNvdmVyIHRoZSBleHRlbmRlZCByYW5nZS4gVGhlIGV4aXN0aW5nCiAgICAgWDUwOV90aW1lX2FkaigpIGlzIHN0aWxsIHVzYWJsZSBhbmQgd2lsbCBubyBsb25nZXIgaGF2ZSBhbnkgZGF0ZSBpc3N1ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVsdGEgQ1JMIHN1cHBvcnQuIE5ldyB1c2UgZGVsdGFzIG9wdGlvbiB3aGljaCB3aWxsIGF0dGVtcHQgdG8gbG9jYXRlCiAgICAgYW5kIHNlYXJjaCBhbnkgYXBwcm9wcmlhdGUgZGVsdGEgQ1JMcyBhdmFpbGFibGUuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBDUkxzIHBhcnRpdGlvbmVkIGJ5IHJlYXNvbiBjb2RlLiBSZW9yZ2FuaXNlIENSTCBwcm9jZXNzaW5nCiAgICAgY29kZSBhbmQgYWRkIGFkZGl0aW9uYWwgc2NvcmUgZWxlbWVudHMuIFZhbGlkYXRlIGFsdGVybmF0ZSBDUkwgcGF0aHMKICAgICBhcyBwYXJ0IG9mIHRoZSBDUkwgY2hlY2tpbmcgYW5kIGluZGljYXRlIGEgbmV3IGVycm9yICJDUkwgcGF0aCB2YWxpZGF0aW9uCiAgICAgZXJyb3IiIGluIHRoaXMgY2FzZS4gQXBwbGljYXRpb25zIHdhbnRpbmcgYWRkaXRpb25hbCBkZXRhaWxzIGNhbiB1c2UKICAgICB0aGUgdmVyaWZ5IGNhbGxiYWNrIGFuZCBjaGVjayB0aGUgbmV3ICJwYXJlbnQiIGZpZWxkLiBJZiB0aGlzIGlzIG5vdAogICAgIE5VTEwgQ1JMIHBhdGggdmFsaWRhdGlvbiBpcyB0YWtpbmcgcGxhY2UuIEV4aXN0aW5nIGFwcGxpY2F0aW9ucyB3b250CiAgICAgc2VlIHRoaXMgYmVjYXVzZSBpdCByZXF1aXJlcyBleHRlbmRlZCBDUkwgc3VwcG9ydCB3aGljaCBpcyBvZmYgYnkKICAgICBkZWZhdWx0LgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgZnJlc2hlc3QgQ1JMIGV4dGVuc2lvbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgaW5kaXJlY3QgQ1JMIHN1cHBvcnQuIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBpbiB0aGUgQ1JMcwogICAgIHBhc3NlZCBkaXJlY3RseSBhbmQgbm90IHZpYSBsb29rdXAuIFByb2Nlc3MgY2VydGlmaWNhdGUgaXNzdWVyCiAgICAgQ1JMIGVudHJ5IGV4dGVuc2lvbiBhbmQgbG9va3VwIENSTCBlbnRyaWVzIGJ5IGJvdGhlciBpc3N1ZXIgbmFtZQogICAgIGFuZCBzZXJpYWwgbnVtYmVyLiBDaGVjayBhbmQgcHJvY2VzcyBDUkwgaXNzdWVyIGVudHJ5IGluIElEUCBleHRlbnNpb24uCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZGlzdGluY3QgY2VydGlmaWNhdGUgYW5kIENSTCBwYXRocy4gVGhlIENSTCBpc3N1ZXIKICAgICBjZXJ0aWZpY2F0ZSBpcyB2YWxpZGF0ZWQgc2VwYXJhdGVseSBpbiB0aGlzIGNhc2UuIE9ubHkgZW5hYmxlZCBpZgogICAgIGFuIGV4dGVuZGVkIENSTCBzdXBwb3J0IGZsYWcgaXMgc2V0OiB0aGlzIGZsYWcgd2lsbCBlbmFibGUgYWRkaXRpb25hbAogICAgIENSTCBmdW5jdGlvbmFsaXR5IGluIGZ1dHVyZS4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBwb2xpY3kgbWFwcGluZ3MgZXh0ZW5zaW9uLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gcGF0aGxlbmd0aCBjb25zdHJhaW50LCBzZWxmIGlzc3VlZCBjZXJ0aWZpY2F0ZSBoYW5kbGluZywKICAgICBwb2xpY3kgcHJvY2Vzc2luZyB0byBhbGlnbiB3aXRoIFJGQzMyODAgYW5kIFBLSVRTIHRlc3RzLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgbmFtZSBjb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uIEROLCBlbWFpbCwgRE5TCiAgICAgYW5kIFVSSSB0eXBlcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRvIGNhdGVyIGZvciBzeXN0ZW1zIHRoYXQgcHJvdmlkZSBhIHBvaW50ZXItYmFzZWQgdGhyZWFkIElEIHJhdGhlcgogICAgIHRoYW4gbnVtZXJpYywgZGVwcmVjYXRlIHRoZSBjdXJyZW50IG51bWVyaWMgdGhyZWFkIElEIG1lY2hhbmlzbSBhbmQKICAgICByZXBsYWNlIGl0IHdpdGggYSBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQgY2FsbGJhY2sgdHlwZS4gVGhpcwogICAgIG1lY2hhbmlzbSBhbGxvd3MgYSBudW1lcmljICJoYXNoIiB0byBiZSBleHRyYWN0ZWQgZnJvbSBhIHRocmVhZCBJRCBpbgogICAgIGVpdGhlciBjYXNlLCBhbmQgb24gcGxhdGZvcm1zIHdoZXJlIHBvaW50ZXJzIGFyZSBsYXJnZXIgdGhhbiAnbG9uZycsCiAgICAgbWl4aW5nIGlzIGRvbmUgdG8gaGVscCBlbnN1cmUgdGhlIG51bWVyaWMgJ2hhc2gnIGlzIHVzYWJsZSBldmVuIGlmIGl0CiAgICAgY2FuJ3QgYmUgZ3VhcmFudGVlZCB1bmlxdWUuIFRoZSBkZWZhdWx0IG1lY2hhbmlzbSBpcyB0byB1c2UgIiZlcnJubyIKICAgICBhcyBhIHBvaW50ZXItYmFzZWQgdGhyZWFkIElEIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhyZWFkcy4KCiAgICAgQXBwbGljYXRpb25zIHRoYXQgd2FudCB0byBwcm92aWRlIHRoZWlyIG93biB0aHJlYWQgSURzIHNob3VsZCBub3cgdXNlCiAgICAgQ1JZUFRPX1RIUkVBRElEX3NldF9jYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGNhbGwKICAgICBlaXRoZXIgQ1JZUFRPX1RIUkVBRElEX3NldF9udW1lcmljKCkgb3IgQ1JZUFRPX1RIUkVBRElEX3NldF9wb2ludGVyKCkuCgogICAgIE5vdGUgdGhhdCBFUlJfcmVtb3ZlX3N0YXRlKCkgaXMgbm93IGRlcHJlY2F0ZWQsIGJlY2F1c2UgaXQgaXMgdGllZAogICAgIHRvIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhyZWFkIElEcyBhcmUgbnVtZXJpYy4gIEVSUl9yZW1vdmVfc3RhdGUoMCkKICAgICB0byBmcmVlIHRoZSBjdXJyZW50IHRocmVhZCdzIGVycm9yIHN0YXRlIHNob3VsZCBiZSByZXBsYWNlZCBieQogICAgIEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpLgoKICAgICAoVGhpcyBuZXcgYXBwcm9hY2ggcmVwbGFjZXMgdGhlIGZ1bmN0aW9ucyBDUllQVE9fc2V0X2lkcHRyX2NhbGxiYWNrKCksCiAgICAgQ1JZUFRPX2dldF9pZHB0cl9jYWxsYmFjaygpLCBhbmQgQ1JZUFRPX3RocmVhZF9pZHB0cigpIHRoYXQgZXhpc3RlZCBpbgogICAgIE9wZW5TU0wgMC45LjktZGV2IGJldHdlZW4gSnVuZSAyMDA2IGFuZCBBdWd1c3QgMjAwOC4gQWxzbywgaWYgYW4KICAgICBhcHBsaWNhdGlvbiB3YXMgcHJldmlvdXNseSBwcm92aWRpbmcgYSBudW1lcmljIHRocmVhZCBjYWxsYmFjayB0aGF0CiAgICAgd2FzIGluYXBwcm9wcmlhdGUgZm9yIGRpc3Rpbmd1aXNoaW5nIHRocmVhZHMsIHRoZW4gdW5pcXVlbmVzcyBtaWdodAogICAgIGhhdmUgYmVlbiBvYnRhaW5lZCB3aXRoICZlcnJubyB0aGF0IGhhcHBlbmVkIGltbWVkaWF0ZWx5IGluIHRoZQogICAgIGludGVybWVkaWF0ZSBkZXZlbG9wbWVudCB2ZXJzaW9ucyBvZiBPcGVuU1NMOyB0aGlzIGlzIG5vIGxvbmdlciB0aGUKICAgICBjYXNlLCB0aGUgbnVtZXJpYyB0aHJlYWQgY2FsbGJhY2sgd2lsbCBub3cgb3ZlcnJpZGUgdGhlIGF1dG9tYXRpYyB1c2UKICAgICBvZiAmZXJybm8uKQogICAgIFtHZW9mZiBUaG9ycGUsIHdpdGggaGVscCBmcm9tIEJvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgQ1JMIGlzc3VpbmcgY2VydGlmaWNhdGVzLiBUaGlzIGNvdmVycyBhCiAgICAgc2ltcGxlIGNhc2Ugd2hlcmUgdGhlIHNlbGYgaXNzdWVkIGNlcnRpZmljYXRlcyBpbiB0aGUgY2hhaW4gZXhpc3QgYW5kCiAgICAgdGhlIHJlYWwgQ1JMIGlzc3VlciBpcyBoaWdoZXIgaW4gdGhlIGV4aXN0aW5nIGNoYWluLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlZCBlZmZlY3RpdmVseSBkZWZ1bmN0IGNyeXB0by9zdG9yZSBmcm9tIHRoZSBidWlsZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgUmV2YW1wIG9mIFNUQUNLIHRvIHByb3ZpZGUgc3Ryb25nZXIgdHlwZS1jaGVja2luZy4gU3RpbGwgdG8gY29tZToKICAgICBUWFRfREIsIGJzZWFyY2goPyksIE9CSl9ic2VhcmNoLCBxc29ydCwgQ1JZUFRPX0VYX0RBVEEsIEFTTjFfVkFMVUUsCiAgICAgQVNOMV9TVFJJTkcsIENPTkZfVkFMVUUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIG5ldyBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgbW9kZSBmbGFnIHRvIHJlbGVhc2UgdW51c2VkIGJ1ZmZlcgogICAgIFJBTSBvbiBTU0wgY29ubmVjdGlvbnMuICBUaGlzIG9wdGlvbiBjYW4gc2F2ZSBhYm91dCAzNGsgcGVyIGlkbGUgU1NMLgogICAgIFtOaWNrIE1hdGhld3Nvbl0KCiAgKikgUmV2YW1wIG9mIExIQVNIIHRvIHByb3ZpZGUgc3Ryb25nZXIgdHlwZS1jaGVja2luZy4gU3RpbGwgdG8gY29tZToKICAgICBTVEFDSywgVFhUX0RCLCBic2VhcmNoLCBxc29ydC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBDcnlwdG9ncmFwaGljIE1lc3NhZ2UgU3ludGF4IChha2EgQ01TKSBiYXNlZAogICAgIG9uIFJGQzM4NTAsIFJGQzM4NTEgYW5kIFJGQzM4NTIuIE5ldyBjbXMgZGlyZWN0b3J5IGFuZCBjbXMgdXRpbGl0eSwKICAgICBzdXBwb3J0IGZvciBkYXRhLCBzaWduZWREYXRhLCBjb21wcmVzc2VkRGF0YSwgZGlnZXN0ZWREYXRhIGFuZAogICAgIGVuY3J5cHRlZERhdGEsIGVudmVsb3BlZERhdGEgdHlwZXMgaW5jbHVkZWQuIFNjcmlwdHMgdG8gY2hlY2sgYWdhaW5zdAogICAgIFJGQzQxMzQgZXhhbXBsZXMgZHJhZnQgYW5kIGludGVyb3AgYW5kIGNvbnNpc3RlbmN5IGNoZWNrcyBvZiBtYW55CiAgICAgY29udGVudCB0eXBlcyBhbmQgdmFyaWFudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbnMgdG8gZW5jIHV0aWxpdHkgdG8gc3VwcG9ydCB1c2Ugb2YgemxpYiBjb21wcmVzc2lvbiBCSU8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIG1rMW1mIHRvIHN1cHBvcnQgaW1wb3J0aW5nIG9mIG9wdGlvbnMgYW5kIGFzc2VtYmx5IGxhbmd1YWdlCiAgICAgZmlsZXMgZnJvbSBDb25maWd1cmUgc2NyaXB0LCBjdXJyZW50bHkgb25seSBpbmNsdWRlZCBpbiBWQy1XSU4zMi4KICAgICBUaGUgYXNzZW1ibHkgbGFuZ3VhZ2UgcnVsZXMgY2FuIG5vdyBvcHRpb25hbGx5IGdlbmVyYXRlIHRoZSBzb3VyY2UKICAgICBmaWxlcyBmcm9tIHRoZSBhc3NvY2lhdGVkIHBlcmwgc2NyaXB0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgcmVtYWluaW5nIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIHN1cHBvcnQgR09TVCBjaXBoZXJzdWl0ZXMuCiAgICAgSW50ZXJvcCB0ZXN0aW5nIGhhcyBiZWVuIHBlcmZvcm1lZCB1c2luZyBDcnlwdG9Qcm8gaW1wbGVtZW50YXRpb25zLgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+XQoKICAqKSBzMzkweCBhc3NlbWJsZXIgcGFjay4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQVJNdjQgYXNzZW1ibGVyIHBhY2suIEFSTXY0IHJlZmVycyB0byB2NCBhbmQgbGF0ZXIgSVNBLCBub3QgQ1BVCiAgICAgImZhbWlseS4iCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEltcGxlbWVudCBPcGFxdWUgUFJGIElucHV0IFRMUyBleHRlbnNpb24gYXMgc3BlY2lmaWVkIGluCiAgICAgZHJhZnQtcmVzY29ybGEtdGxzLW9wYXF1ZS1wcmYtaW5wdXQtMDAudHh0LiAgU2luY2UgdGhpcyBpcyBub3QgYW4KICAgICBvZmZpY2lhbCBzcGVjaWZpY2F0aW9uIHlldCBhbmQgbm8gZXh0ZW5zaW9uIHR5cGUgYXNzaWdubWVudCBieQogICAgIElBTkEgZXhpc3RzLCB0aGlzIGV4dGVuc2lvbiAoZm9yIG5vdykgd2lsbCBoYXZlIHRvIGJlIGV4cGxpY2l0bHkKICAgICBlbmFibGVkIHdoZW4gYnVpbGRpbmcgT3BlblNTTCBieSBwcm92aWRpbmcgdGhlIGV4dGVuc2lvbiBudW1iZXIKICAgICB0byB1c2UuICBGb3IgZXhhbXBsZSwgc3BlY2lmeSBhbiBvcHRpb24KCiAgICAgICAgIC1EVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dD0weDk1MjcKCiAgICAgdG8gdGhlICJjb25maWciIG9yICJDb25maWd1cmUiIHNjcmlwdCB0byBlbmFibGUgdGhlIGV4dGVuc2lvbiwKICAgICBhc3N1bWluZyBleHRlbnNpb24gbnVtYmVyIDB4OTUyNyAod2hpY2ggaXMgYSBjb21wbGV0ZWx5IGFyYml0cmFyeQogICAgIGFuZCB1bm9mZmljaWFsIGFzc2lnbm1lbnQgYmFzZWQgb24gdGhlIE1ENSBoYXNoIG9mIHRoZSBJbnRlcm5ldAogICAgIERyYWZ0KS4gIE5vdGUgdGhhdCBieSBkb2luZyBzbywgeW91IHBvdGVudGlhbGx5IGxvc2UKICAgICBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgVExTIGltcGxlbWVudGF0aW9ucyBzaW5jZSB0aGVzZSBtaWdodAogICAgIGJlIHVzaW5nIHRoZSBzYW1lIGV4dGVuc2lvbiBudW1iZXIgZm9yIG90aGVyIHB1cnBvc2VzLgoKICAgICBTU0xfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0KHNzbCwgc3JjLCBsZW4pIGlzIHVzZWQgdG8gc2V0IHRoZQogICAgIG9wYXF1ZSBQUkYgaW5wdXQgdmFsdWUgdG8gdXNlIGluIHRoZSBoYW5kc2hha2UuICBUaGlzIHdpbGwgY3JlYXRlCiAgICAgYW4gaW50ZXJhbCBjb3B5IG9mIHRoZSBsZW5ndGgtJ2xlbicgc3RyaW5nIGF0ICdzcmMnLCBhbmQgd2lsbAogICAgIHJldHVybiBub24temVybyBmb3Igc3VjY2Vzcy4KCiAgICAgVG8gZ2V0IG1vcmUgY29udHJvbCBhbmQgZmxleGliaWxpdHksIHByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbgogICAgIGJ5IHVzaW5nCgogICAgICAgICAgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2soY3R4LCBjYikKICAgICAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrX2FyZyhjdHgsIGFyZykKCiAgICAgd2hlcmUKCiAgICAgICAgICBpbnQgKCpjYikoU1NMICosIHZvaWQgKnBlZXJpbnB1dCwgc2l6ZV90IGxlbiwgdm9pZCAqYXJnKTsKICAgICAgICAgIHZvaWQgKmFyZzsKCiAgICAgQ2FsbGJhY2sgZnVuY3Rpb24gJ2NiJyB3aWxsIGJlIGNhbGxlZCBpbiBoYW5kc2hha2VzLCBhbmQgaXMKICAgICBleHBlY3RlZCB0byB1c2UgU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dCgpIGFzIGFwcHJvcHJpYXRlLgogICAgIEFyZ3VtZW50ICdhcmcnIGlzIGZvciBhcHBsaWNhdGlvbiBwdXJwb3NlcyAodGhlIHZhbHVlIGFzIGdpdmVuIHRvCiAgICAgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKCkgd2lsbCBkaXJlY3RseQogICAgIGJlIHByb3ZpZGVkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbikuICBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICBoYXMgdG8gcmV0dXJuIG5vbi16ZXJvIHRvIHJlcG9ydCBzdWNjZXNzOiB1c3VhbGx5IDEgdG8gdXNlIG9wYXF1ZQogICAgIFBSRiBpbnB1dCBqdXN0IGlmIHBvc3NpYmxlLCBvciAyIHRvIGVuZm9yY2UgdXNlIG9mIHRoZSBvcGFxdWUgUFJGCiAgICAgaW5wdXQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBsaWJyYXJ5IHdpbGwgYWJvcnQgdGhlIGhhbmRzaGFrZQogICAgIGlmIG9wYXF1ZSBQUkYgaW5wdXQgaXMgbm90IHN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkLgoKICAgICBBcmd1bWVudHMgJ3BlZXJpbnB1dCcgYW5kICdsZW4nIGdpdmVuIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgIHdpbGwgYWx3YXlzIGJlIE5VTEwgYW5kIDAgaW4gdGhlIGNhc2Ugb2YgYSBjbGllbnQuICBBIHNlcnZlciB3aWxsCiAgICAgc2VlIHRoZSBjbGllbnQncyBvcGFxdWUgUFJGIGlucHV0IHRocm91Z2ggdGhlc2UgdmFyaWFibGVzIGlmCiAgICAgYXZhaWxhYmxlIChOVUxMIGFuZCAwIG90aGVyd2lzZSkuICBOb3RlIHRoYXQgaWYgdGhlIHNlcnZlcgogICAgIHByb3ZpZGVzIGFuIG9wYXF1ZSBQUkYgaW5wdXQsIHRoZSBsZW5ndGggbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUKICAgICBsZW5ndGggb2YgdGhlIGNsaWVudCdzIG9wYXF1ZSBQUkYgaW5wdXQuCgogICAgIE5vdGUgdGhhdCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNyZWF0aW5nCiAgICAgYSBuZXcgc2Vzc2lvbiAoc2Vzc2lvbiByZXN1bXB0aW9uIGNhbiByZXN1bWUgd2hhdGV2ZXIgd2FzCiAgICAgcHJldmlvdXNseSBuZWdvdGlhdGVkKSwgYW5kIHdpbGwgbm90IGJlIGNhbGxlZCBpbiBTU0wgMi4wCiAgICAgaGFuZHNoYWtlczsgdGh1cywgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsIFNTTF9PUF9OT19TU0x2Mikgb3IKICAgICBTU0xfc2V0X29wdGlvbnMoc3NsLCBTU0xfT1BfTk9fU1NMdjIpIGlzIGVzcGVjaWFsbHkgcmVjb21tZW5kZWQKICAgICBmb3IgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0byBlbmZvcmNlIG9wYXF1ZSBQUkYgaW5wdXQuCgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSBzc2wgY29kZSB0byBzdXBwb3J0IGRpZ2VzdHMgb3RoZXIgdGhhbiBTSEExK01ENSBmb3IgaGFuZHNoYWtlCiAgICAgTUFDLiAKCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT5dCgogICopIEFkZCBSRkM0NTA3IHN1cHBvcnQgdG8gT3BlblNTTC4gVGhpcyBpbmNsdWRlcyB0aGUgY29ycmVjdGlvbnMgaW4KICAgICBSRkM0NTA3YmlzLiBUaGUgZW5jcnlwdGVkIHRpY2tldCBmb3JtYXQgaXMgYW4gZW5jcnlwdGVkIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUsIHRoYXQgd2F5IG5ldyBzZXNzaW9uIGZlYXR1cmVzIGFyZSBhdXRvbWF0aWNhbGx5CiAgICAgc3VwcG9ydGVkLgoKICAgICBJZiBhIGNsaWVudCBhcHBsaWNhdGlvbiBjYWNoZXMgc2Vzc2lvbiBpbiBhbiBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmUKICAgICBzdXBwb3J0IGlzIHRyYW5zcGFyZW50IGJlY2F1c2UgdGlja2V0cyBhcmUgbm93IHN0b3JlZCBpbiB0aGUgZW5jb2RlZAogICAgIFNTTF9TRVNTSU9OLgogICAgIAogICAgIFRoZSBTU0xfQ1RYIHN0cnVjdHVyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBrZXlzIGZvciB0aWNrZXQKICAgICBwcm90ZWN0aW9uIGluIHNlcnZlcnMgc28gYWdhaW4gc3VwcG9ydCBzaG91bGQgYmUgcG9zc2libGUKICAgICB3aXRoIG5vIGFwcGxpY2F0aW9uIG1vZGlmaWNhdGlvbi4KCiAgICAgSWYgYSBjbGllbnQgb3Igc2VydmVyIHdpc2hlcyB0byBkaXNhYmxlIFJGQzQ1MDcgc3VwcG9ydCB0aGVuIHRoZSBvcHRpb24KICAgICBTU0xfT1BfTk9fVElDS0VUIGNhbiBiZSBzZXQuCgogICAgIEFkZCBhIFRMUyBleHRlbnNpb24gZGVidWdnaW5nIGNhbGxiYWNrIHRvIGFsbG93IHRoZSBjb250ZW50cyBvZiBhbnkgY2xpZW50CiAgICAgb3Igc2VydmVyIGV4dGVuc2lvbnMgdG8gYmUgZXhhbWluZWQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaW5hbCBjaGFuZ2VzIHRvIGF2b2lkIHVzZSBvZiBwb2ludGVyIHBvaW50ZXIgY2FzdHMgaW4gT3BlblNTTC4KICAgICBPcGVuU1NMIHNob3VsZCBub3cgY29tcGlsZSBjbGVhbmx5IG9uIGdjYyA0LjIKICAgICBbUGV0ZXIgSGFydGxleSA8cGRoQHV0dGVyLmNoYW9zLm9yZy51az4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIFNTTCBsaWJyYXJ5IHRvIHVzZSBuZXcgRVZQX1BLRVkgTUFDIEFQSS4gSW5jbHVkZSBnZW5lcmljIE1BQwogICAgIHN1cHBvcnQgaW5jbHVkaW5nIHN0cmVhbWluZyBNQUMgc3VwcG9ydDogdGhpcyBpcyByZXF1aXJlZCBmb3IgR09TVAogICAgIGNpcGhlcnN1aXRlIHN1cHBvcnQuCiAgICAgW1ZpY3RvciBCLiBXYWduZXIgPHZpdHVzQGNyeXB0b2NvbS5ydT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbiAtc3RyZWFtIHRvIHVzZSBQS0NTIzcgc3RyZWFtaW5nIGluIHNtaW1lIHV0aWxpdHkuIE5ldwogICAgIGZ1bmN0aW9uIGkyZF9QS0NTN19iaW9fc3RyZWFtKCkgYW5kIFBFTV93cml0ZV9QS0NTN19iaW9fc3RyZWFtKCkKICAgICB0byBvdXRwdXQgaW4gQkVSIGFuZCBQRU0gZm9ybWF0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB1c2Ugb2YgSE1BQyB2aWEgRVZQX1BLRVkgaW50ZXJmYWNlLiBUaGlzCiAgICAgYWxsb3dzIEhNQUMgdG8gYmUgaGFuZGxlZCB2aWEgdGhlIEVWUF9EaWdlc3RTaWduKigpIGludGVyZmFjZS4gVGhlCiAgICAgRVZQX1BLRVkgImtleSIgaW4gdGhpcyBjYXNlIGlzIHRoZSBITUFDIGtleSwgcG90ZW50aWFsbHkgYWxsb3dpbmcKICAgICBFTkdJTkUgc3VwcG9ydCBmb3IgSE1BQyBrZXlzIHdoaWNoIGFyZSB1bmV4dHJhY3RhYmxlLiBOZXcgLW1hYyBhbmQKICAgICAtbWFjb3B0IG9wdGlvbnMgdG8gZGdzdCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gLXNpZ29wdCB0byBkZ3N0IHV0aWxpdHkuIFVwZGF0ZSBkZ3N0IHRvIHVzZQogICAgIEVWUF9EaWdlc3R7U2lnbixWZXJpZnl9Ki4gVGhlc2UgdHdvIGNoYW5nZXMgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UKICAgICBhbHRlcm5hdGl2ZSBzaWduaW5nIHBhcmFtYXRlcnMgc3VjaCBhcyBYOS4zMSBvciBQU1MgaW4gdGhlIGRnc3QgCiAgICAgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2Ugc3NsX2NpcGhlcl9hcHBseV9ydWxlKCksIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGRvZXMKICAgICB0aGUgd29yayBlYWNoIHRpbWUgYSBjaXBoZXJzdWl0ZSBzdHJpbmcgcmVxdWVzdHMgZW5hYmxpbmcKICAgICAoImZvbytiYXIiKSwgbW92aW5nICgiK2ZvbytiYXIiKSwgZGlzYWJsaW5nICgiLWZvbytiYXIiLCBvcgogICAgIHJlbW92aW5nICgiIWZvbytiYXIiKSBhIGNsYXNzIG9mIGNpcGhlcnN1aXRlczogTm93IGl0IG1haW50YWlucwogICAgIHRoZSBvcmRlciBvZiBkaXNhYmxlZCBjaXBoZXJzdWl0ZXMgc3VjaCB0aGF0IHRob3NlIGNpcGhlcnN1aXRlcwogICAgIHRoYXQgbW9zdCByZWNlbnRseSB3ZW50IGZyb20gZW5hYmxlZCB0byBkaXNhYmxlZCBub3Qgb25seSBzdGF5CiAgICAgaW4gb3JkZXIgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsIGJ1dCBhbHNvIGhhdmUgaGlnaGVyIHByaW9yaXR5CiAgICAgdGhhbiBvdGhlciBkaXNhYmxlZCBjaXBoZXJzdWl0ZXMgdGhlIG5leHQgdGltZSBjaXBoZXJzdWl0ZXMgYXJlCiAgICAgZW5hYmxlZCBhZ2Fpbi4KCiAgICAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gbm93IHNheSwgZS5nLiwgIlBTSzotUFNLOkhJR0giIHRvIGVuYWJsZQogICAgIHRoZSBzYW1lIGNpcGhlcnN1aXRlcyBhcyB3aXRoICJISUdIIiBhbG9uZSwgYnV0IGluIGEgc3BlY2lmaWMKICAgICBvcmRlciB3aGVyZSB0aGUgUFNLIGNpcGhlcnN1aXRlcyBjb21lIGZpcnN0IChzaW5jZSB0aGV5IGFyZSB0aGUKICAgICBtb3N0IHJlY2VudGx5IGRpc2FibGVkIGNpcGhlcnN1aXRlcyB3aGVuICJISUdIIiBpcyBwYXJzZWQpLgoKICAgICBBbHNvLCBjaGFuZ2Ugc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpICh1c2luZyB0aGlzIG5ldwogICAgIGZ1bmNpb25hbGl0eSkgc3VjaCB0aGF0IGJldHdlZW4gb3RoZXJ3aXNlIGlkZW50aWNhbAogICAgIGNpaHBlcnN1aXRlcywgZXBoZW1lcmFsIEVDREggaXMgcHJlZmVycmVkIG92ZXIgZXBoZW1lcmFsIERIIGluCiAgICAgdGhlIGRlZmF1bHQgb3JkZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSBzbyB0aGF0IGl0IGF1dG9tYXRpY2FsbHkKICAgICBhcnJhbmdlcyB0aGUgY2lwaGVyc3VpdGVzIGluIHJlYXNvbmFibGUgb3JkZXIgYmVmb3JlIHN0YXJ0aW5nCiAgICAgdG8gcHJvY2VzcyB0aGUgcnVsZSBzdHJpbmcuICBUaHVzLCB0aGUgZGVmaW5pdGlvbiBmb3IgIkRFRkFVTFQiCiAgICAgKFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUKSBub3cgaXMganVzdCAiQUxMOiFhTlVMTDohZU5VTEwiLCBidXQKICAgICByZW1haW5zIGVxdWl2YWxlbnQgdG8gIkFFUzpBTEw6IWFOVUxMOiFlTlVMTDorYUVDREg6K2tSU0E6K1JDNDpAU1RSRU5HVEgiLgogICAgIFRoaXMgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gYXJyaXZlIGF0IGEgcmVhc29uYWJsZSBkZWZhdWx0IG9yZGVyCiAgICAgaW4gYXBwbGljYXRpb25zIGZvciB3aGljaCBhbm9ueW1vdXMgY2lwaGVycyBhcmUgT0sgKG1lYW5pbmcKICAgICB0aGF0IHlvdSBjYW4ndCBhY3R1YWxseSB1c2UgREVGQVVMVCkuCiAgICAgW0JvZG8gTW9lbGxlcjsgc3VnZ2VzdGVkIGJ5IFZpY3RvciBEdWNob3ZuaV0KCiAgKikgU3BsaXQgdGhlIFNTTC9UTFMgYWxnb3JpdGhtIG1hc2sgKGFzIHVzZWQgZm9yIGNpcGhlcnN1aXRlIHN0cmluZwogICAgIHByb2Nlc3NpbmcpIGludG8gbXVsdGlwbGUgaW50ZWdlcnMgaW5zdGVhZCBvZiBzZXR0aW5nCiAgICAgIlNTTF9NS0VZX01BU0siIGJpdHMsICJTU0xfQVVUSF9NQVNLIiBiaXRzLCAiU1NMX0VOQ19NQVNLIiwKICAgICAiU1NMX01BQ19NQVNLIiwgYW5kICJTU0xfU1NMX01BU0siIGJpdHMgYWxsIGluIGEgc2luZ2xlIGludGVnZXIuCiAgICAgKFRoZXNlIG1hc2tzIGFzIHdlbGwgYXMgdGhlIGluZGl2aWR1YWwgYml0IGRlZmluaXRpb25zIGFyZSBoaWRkZW4KICAgICBhd2F5IGludG8gdGhlIG5vbi1leHBvcnRlZCBpbnRlcmZhY2Ugc3NsL3NzbF9sb2NsLmgsIHNvIHRoaXMKICAgICBjaGFuZ2UgdG8gdGhlIGRlZmluaXRpb24gb2YgdGhlIFNTTF9DSVBIRVIgc3RydWN0dXJlIHNob3VsZG4ndAogICAgIGFmZmVjdCBhcHBsaWNhdGlvbnMuKSAgVGhpcyBnaXZlIHVzIG1vcmUgYml0cyBmb3IgZWFjaCBvZiB0aGVzZQogICAgIGNhdGVnb3JpZXMsIHNvIHRoZXJlIGlzIG5vIGxvbmdlciBhIG5lZWQgdG8gY29hZ3VsYXRlIEFFUzEyOCBhbmQKICAgICBBRVMyNTYgaW50byBhIHNpbmdsZSBhbGdvcml0aG0gYml0LCBhbmQgdG8gY29hZ3VsYXRlIENhbWVsbGlhMTI4CiAgICAgYW5kIENhbWVsbGlhMjU2IGludG8gYSBzaW5nbGUgYWxnb3JpdGhtIGJpdCwgd2hpY2ggaGFzIGxlZCB0byBhbGwKICAgICBraW5kcyBvZiBrbHVkZ2VzLgoKICAgICBUaHVzLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBrbHVkZ2UgaW50cm9kdWNlZCBpbiAwLjkuN20gYW5kCiAgICAgMC45LjhlIGZvciBtYXNraW5nIG91dCBBRVMyNTYgaW5kZXBlbmRlbnRseSBvZiBBRVMxMjggb3IgbWFza2luZwogICAgIG91dCBDYW1lbGxpYTI1NiBpbmRlcGVuZGVudGx5IG9mIEFFUzI1NiBpcyBub3QgbmVlZGVkIGhlcmUgaW4gMC45LjkuCgogICAgIFdpdGggdGhlIGNoYW5nZSwgd2UgYWxzbyBpbnRyb2R1Y2UgbmV3IGNpcGhlcnN1aXRlIGFsaWFzZXMgdGhhdAogICAgIHNvIGZhciB3ZXJlIG1pc3Npbmc6ICJBRVMxMjgiLCAiQUVTMjU2IiwgIkNBTUVMTElBMTI4IiwgYW5kCiAgICAgIkNBTUVMTElBMjU2Ii4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZHNhLXdpdGgtU0hBMjI0IGFuZCBkc2Etd2l0aC1TSEEyNTYuCiAgICAgVXNlIHRoZSBsZWZ0bW9zdCBOIGJ5dGVzIG9mIHRoZSBzaWduYXR1cmUgaW5wdXQgaWYgdGhlIGlucHV0IGlzCiAgICAgbGFyZ2VyIHRoYW4gdGhlIHByaW1lIHEgKHdpdGggTiBiZWluZyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBxKS4KICAgICBbTmlscyBMYXJzY2hdCgogICopIFZlcnkgKnZlcnkqIGV4cGVyaW1lbnRhbCBQS0NTIzcgc3RyZWFtaW5nIGVuY29kZXIgc3VwcG9ydC4gTm90aGluZyB1c2VzCiAgICAgaXQgeWV0IGFuZCBpdCBpcyBsYXJnZWx5IHVudGVzdGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgZWNkc2Etd2l0aC1TSEEyMjQvMjU2LzM4NC81MTIgc2lnbmF0dXJlIHR5cGVzLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgSW5pdGlhbCBpbmNvbXBsZXRlIGNoYW5nZXMgdG8gYXZvaWQgbmVlZCBmb3IgZnVuY3Rpb24gY2FzdHMgaW4gT3BlblNTTAogICAgIHNvbWUgY29tcGlsZXJzIChnY2MgNC4yIGFuZCBsYXRlcikgcmVqZWN0IHRoZWlyIHVzZS4gU2FmZXN0YWNrIGlzCiAgICAgcmVpbXBsZW1lbnRlZC4gIFVwZGF0ZSBBU04xIHRvIGF2b2lkIHVzZSBvZiBsZWdhY3kgZnVuY3Rpb25zLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaW4zMi82NCB0YXJnZXRzIGFyZSBsaW5rZWQgd2l0aCBXaW5zb2NrMi4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIGFuIFg1MDlfQ1JMX01FVEhPRCBzdHJ1Y3R1cmUgdG8gYWxsb3cgQ1JMIHByb2Nlc3NpbmcgdG8gYmUgcmVkaXJlY3RlZAogICAgIHRvIGV4dGVybmFsIGZ1bmN0aW9ucy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpbmNyZWFzZSBDUkwgaGFuZGxpbmcgCiAgICAgZWZmaWNpZW5jeSBlc3BlY2lhbGx5IHdoZW4gQ1JMcyBhcmUgdmVyeSBsYXJnZSBieSAoZm9yIGV4YW1wbGUpIHN0b3JpbmcKICAgICB0aGUgQ1JMIHJldm9rZWQgY2VydGlmaWNhdGVzIGluIGEgZGF0YWJhc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT3ZlcmhhdWwgb2YgYnlfZGlyIGNvZGUuIEFkZCBzdXBwb3J0IGZvciBkeW5hbWljIGxvYWRpbmcgb2YgQ1JMcyBzbwogICAgIG5ldyBDUkxzIGFkZGVkIHRvIGEgZGlyZWN0b3J5IGNhbiBiZSB1c2VkLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbgogICAgIC12ZXJpZnlfcmV0dXJuX2Vycm9yIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlci4gVGhpcyBjYXVzZXMgcmVhbCBlcnJvcnMKICAgICB0byBiZSByZXR1cm5lZCBieSB0aGUgdmVyaWZ5IGNhbGxiYWNrIGluc3RlYWQgb2YgY2Fycnlpbmcgb24gbm8gbWF0dGVyCiAgICAgd2hhdC4gVGhpcyByZWZsZWN0cyB0aGUgd2F5IGEgInJlYWwgd29ybGQiIHZlcmlmeSBjYWxsYmFjayB3b3VsZCBiZWhhdmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgR09TVCBlbmdpbmUsIHN1cHBvcnRpbmcgc2V2ZXJhbCBHT1NUIGFsZ29yaXRobXMgYW5kIHB1YmxpYyBrZXkgZm9ybWF0cy4KICAgICBLaW5kbHkgZG9uYXRlZCBieSBDcnlwdG9jb20uCiAgICAgW0NyeXB0b2NvbV0KCiAgKikgUGFydGlhbCBzdXBwb3J0IGZvciBJc3N1aW5nIERpc3RyaWJ1dGlvbiBQb2ludCBDUkwgZXh0ZW5zaW9uLiBDUkxzCiAgICAgcGFydGl0aW9uZWQgYnkgRFAgYXJlIGhhbmRsZWQgYnV0IG5vIGluZGlyZWN0IENSTCBvciByZWFzb24gcGFydGl0aW9uaW5nCiAgICAgKHlldCkuIENvbXBsZXRlIG92ZXJoYXVsIG9mIENSTCBoYW5kbGluZzogbm93IHRoZSBtb3N0IHN1aXRhYmxlIENSTCBpcwogICAgIHNlbGVjdGVkIHZpYSBhIHNjb3JpbmcgdGVjaG5pcXVlIHdoaWNoIGhhbmRsZXMgSURQIGFuZCBBS0lEIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFg1MDlfU1RPUkVfQ1RYIGNhbGxiYWNrcyBsb29rdXBfY3JscygpIGFuZCBsb29rdXBfY2VydHMoKSB3aGljaAogICAgIHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIGZvciBhbGwgdmVyaWZ5IG9wZXJhdGlvbnM6IHRoaXMgd2lsbCByZW1vdmUgdGhlCiAgICAgWDUwOV9TVE9SRSBkZXBlbmRlbmN5IG9uIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgYWxsb3cgYWx0ZXJuYXRpdmUKICAgICBsb29rdXAgbWV0aG9kcy4gIFg1MDlfU1RPUkUgYmFzZWQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIHR3byBjYWxsYmFja3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgbXVsdGlwbGUgQ1JMcyB0byBleGlzdCBpbiBhbiBYNTA5X1NUT1JFIHdpdGggbWF0Y2hpbmcgaXNzdWVyIG5hbWVzLgogICAgIE1vZGlmeSBnZXRfY3JsKCkgdG8gZmluZCBhIHZhbGlkICh1bmV4cGlyZWQpIENSTCBpZiBwb3NzaWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9DUkxfbWF0Y2goKSB0byBjaGVjayBpZiB0d28gQ1JMcyBhcmUgaWRlbnRpY2FsLiBOb3JtYWxseQogICAgIHRoaXMgd291bGQgYmUgY2FsbGVkIFg1MDlfQ1JMX2NtcCgpIGJ1dCB0aGF0IG5hbWUgaXMgYWxyZWFkeSB1c2VkIGJ5CiAgICAgYSBmdW5jdGlvbiB0aGF0IGp1c3QgY29tcGFyZXMgQ1JMIGlzc3VlciBuYW1lcy4gQ2FjaGUgc2V2ZXJhbCBDUkwgCiAgICAgZXh0ZW5zaW9ucyBpbiBYNTA5X0NSTCBzdHJ1Y3R1cmUgYW5kIGNhY2hlIENSTERQIGluIFg1MDkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3RvcmUgYSAiY2Fub25pY2FsIiByZXByZXNlbnRhdGlvbiBvZiBYNTA5X05BTUUgc3RydWN0dXJlIChBU04xIE5hbWUpCiAgICAgdGhpcyBtYXBzIGVxdWl2YWxlbnQgWDUwOV9OQU1FIHN0cnVjdHVyZXMgaW50byBhIGNvbnNpc3RlbnQgc3RydWN0dXJlLgogICAgIE5hbWUgY29tcGFyaXNvbiBjYW4gdGhlbiBiZSBwZXJmb3JtZWQgcmFwaWRseSB1c2luZyBtZW1jbXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOb24tYmxvY2tpbmcgT0NTUCByZXF1ZXN0IHByb2Nlc3NpbmcuIEFkZCAtdGltZW91dCBvcHRpb24gdG8gb2NzcCAKICAgICB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IGRpZ2VzdHMgdG8gc3VwcGx5IHRoZWlyIG93biBtaWNhbGcgc3RyaW5nIGZvciBTL01JTUUgdHlwZSB1c2luZwogICAgIHRoZSBjdHJsIEVWUF9NRF9DVFJMX01JQ0FMRy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEdXJpbmcgUEtDUzcgc2lnbmluZyBwYXNzIHRoZSBQS0NTNyBTaWduZXJJbmZvIHN0cnVjdHVyZSB0byB0aGUKICAgICBFVlBfUEtFWV9NRVRIT0QgYmVmb3JlIGFuZCBhZnRlciBzaWduaW5nIHZpYSB0aGUgRVZQX1BLRVlfQ1RSTF9QS0NTN19TSUdOCiAgICAgY3RybC4gSXQgY2FuIHRoZW4gY3VzdG9taXNlIHRoZSBzdHJ1Y3R1cmUgYmVmb3JlIGFuZC9vciBhZnRlciBzaWduaW5nCiAgICAgaWYgbmVjZXNzYXJ5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBPQkpfYWRkX3NpZ2lkKCkgdG8gYWxsb3cgYXBwbGljYXRpb24gZGVmaW5lZCBzaWduYXR1cmUgT0lEcwogICAgIHRvIGJlIGFkZGVkIHRvIE9wZW5TU0xzIGludGVybmFsIHRhYmxlcy4gTmV3IGZ1bmN0aW9uIE9CSl9zaWdpZF9mcmVlKCkKICAgICB0byBmcmVlIHVwIGFueSBhZGRlZCBzaWduYXR1cmUgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9DSVBIRVJfZG9fYWxsKCksIEVWUF9DSVBIRVJfZG9fYWxsX3NvcnRlZCgpLAogICAgIEVWUF9NRF9kb19hbGwoKSBhbmQgRVZQX01EX2RvX2FsbF9zb3J0ZWQoKSB0byBlbnVtZXJhdGUgaW50ZXJuYWwKICAgICBkaWdlc3QgYW5kIGNpcGhlciB0YWJsZXMuIE5ldyBvcHRpb25zIGFkZGVkIHRvIG9wZW5zc2wgdXRpbGl0eToKICAgICBsaXN0LW1lc3NhZ2UtZGlnZXN0LWFsZ29yaXRobXMgYW5kIGxpc3QtY2lwaGVyLWFsZ29yaXRobXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBiaW5hcnkgcG9seW5vbWlhbHM6IHRoZSBsaXN0CiAgICAgb2YgZGVncmVlcyBvZiBub24temVybyBjb2VmZmljaWVudHMgaXMgbm93IHRlcm1pbmF0ZWQgd2l0aCAtMS4KICAgICBQcmV2aW91c2x5IGl0IHdhcyB0ZXJtaW5hdGVkIHdpdGggMCwgd2hpY2ggd2FzIGFsc28gcGFydCBvZiB0aGUKICAgICB2YWx1ZTsgdGh1cywgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIHdhcyBub3QgYXBwbGljYWJsZSB0bwogICAgIHBvbHlub21pYWxzIHdoZXJlIHReMCBoYXMgY29lZmZpY2llbnQgemVyby4gIFRoaXMgY2hhbmdlIG1ha2VzCiAgICAgdGhlIGFycmF5IHJlcHJlc2VudGF0aW9uIHVzZWZ1bCBpbiBhIG1vcmUgZ2VuZXJhbCBjb250ZXh0LgogICAgIFtEb3VnbGFzIFN0ZWJpbGFdCgogICopIFZhcmlvdXMgbW9kaWZpY2F0aW9ucyBhbmQgZml4ZXMgdG8gU1NML1RMUyBjaXBoZXIgc3RyaW5nCiAgICAgaGFuZGxpbmcuICBGb3IgRUNDLCB0aGUgY29kZSBub3cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGZpeGVkIEVDREgKICAgICB3aXRoIFJTQSBjZXJ0aWZpY2F0ZXMgb24gdGhlIG9uZSBoYW5kIGFuZCB3aXRoIEVDRFNBIGNlcnRpZmljYXRlcwogICAgIG9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSB0aGVzZSBhcmUgc2VwYXJhdGUgY2lwaGVyc3VpdGVzLiAgVGhlCiAgICAgdW51c2VkIGNvZGUgZm9yIEZvcnRlenphIGNpcGhlcnN1aXRlcyBoYXMgYmVlbiByZW1vdmVkLgoKICAgICBGb3IgY29uc2lzdGVuY3kgd2l0aCBFREgsIGVwaGVtZXJhbCBFQ0RIIGlzIG5vdyBjYWxsZWQgIkVFQ0RIIgogICAgIChub3QgIkVDREhFIikuICBGb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgY29kZSBmb3IgREgKICAgICBjZXJ0aWZpY2F0ZXMsIHVzZSBvZiBFQ0RIIGNlcnRpZmljYXRlcyBpcyBub3cgY29uc2lkZXJlZCBFQ0RICiAgICAgYXV0aGVudGljYXRpb24sIG5vdCBSU0Egb3IgRUNEU0EgYXV0aGVudGljYXRpb24gKHRoZSBsYXR0ZXIgaXMKICAgICBtZXJlbHkgdGhlIENBJ3Mgc2lnbmluZyBhbGdvcml0aG0gYW5kIG5vdCBhY3RpdmVseSB1c2VkIGluIHRoZQogICAgIHByb3RvY29sKS4KCiAgICAgVGhlIHRlbXBvcmFyeSBjaXBoZXJzdWl0ZSBhbGlhcyAiRUNDZHJhZnQiIGlzIG5vIGxvbmdlcgogICAgIGF2YWlsYWJsZSwgYW5kIEVDQyBjaXBoZXJzdWl0ZXMgYXJlIG5vIGxvbmdlciBleGNsdWRlZCBmcm9tICJBTEwiCiAgICAgYW5kICJERUZBVUxUIi4gIFRoZSBmb2xsb3dpbmcgYWxpYXNlcyBub3cgZXhpc3QgZm9yIFJGQyA0NDkyCiAgICAgY2lwaGVyc3VpdGVzLCBtb3N0IG9mIHRoZXNlIGJ5IGFuYWxvZ3kgd2l0aCB0aGUgREggY2FzZToKCiAgICAgICAgIGtFQ0RIciAgIC0gRUNESCBjZXJ0LCBzaWduZWQgd2l0aCBSU0EKICAgICAgICAga0VDREhlICAgLSBFQ0RIIGNlcnQsIHNpZ25lZCB3aXRoIEVDRFNBCiAgICAgICAgIGtFQ0RIICAgIC0gRUNESCBjZXJ0IChzaWduZWQgd2l0aCBlaXRoZXIgUlNBIG9yIEVDRFNBKQogICAgICAgICBrRUVDREggICAtIGVwaGVtZXJhbCBFQ0RICiAgICAgICAgIEVDREggICAgIC0gRUNESCBjZXJ0IG9yIGVwaGVtZXJhbCBFQ0RICgogICAgICAgICBhRUNESCAgICAtIEVDREggY2VydAogICAgICAgICBhRUNEU0EgICAtIEVDRFNBIGNlcnQKICAgICAgICAgRUNEU0EgICAgLSBFQ0RTQSBjZXJ0CgogICAgICAgICBBRUNESCAgICAtIGFub255bW91cyBFQ0RICiAgICAgICAgIEVFQ0RIICAgIC0gbm9uLWFub255bW91cyBlcGhlbWVyYWwgRUNESCAoZXF1aXZhbGVudCB0byAia0VFQ0RIOi1BRUNESCIpCgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhZGRpdGlvbmFsIFMvTUlNRSBjYXBhYmlsaXRpZXMgZm9yIEFFUyBhbmQgR09TVCBjaXBoZXJzIGlmIHN1cHBvcnRlZC4KICAgICBVc2UgY29ycmVjdCBtaWNhbGcgcGFyYW1ldGVycyBkZXBlbmRpbmcgb24gZGlnZXN0KHMpIGluIHNpZ25lZCBtZXNzYWdlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBlbmdpbmUgc3VwcG9ydCBmb3IgRVZQX1BLRVlfQVNOMV9NRVRIT0QuIEFkZCBmdW5jdGlvbnMgdG8gcHJvY2VzcwogICAgIGFuIEVOR0lORSBhc24xIG1ldGhvZC4gU3VwcG9ydCBFTkdJTkUgbG9va3VwcyBpbiB0aGUgQVNOMSBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgZW5naW5lIHN1cHBvcnQgZm9yIEVWUF9QS0VZX01FVEhPRC4gTmV3IGZ1bmN0aW9ucyB0byBwZXJtaXQKICAgICBhbiBlbmdpbmUgdG8gcmVnaXN0ZXIgYSBtZXRob2QuIEFkZCBFTkdJTkUgbG9va3VwcyBmb3IgbWV0aG9kcyBhbmQKICAgICBmdW5jdGlvbmFsIHJlZmVyZW5jZSBwcm9jZXNzaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgRVZQX0RpZ2VzdHtTaWduLFZlcmlmeSkqLiBUaGVzZSBhcmUgZW5jaGFuY2UgdmVyc2lvbnMgb2YKICAgICBFVlBfe1NpZ24sVmVyaWZ5fSogd2hpY2ggYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gY3VzdG9taXNlIHRoZSBzaWduYXR1cmUKICAgICBwcm9jZXNzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtcmVzaWduIG9wdGlvbiB0byBzbWltZSB1dGlsaXR5LiBUaGlzIGFkZHMgb25lIG9yIG1vcmUgc2lnbmVycwogICAgIHRvIGFuIGV4aXN0aW5nIFBLQ1MjNyBzaWduZWREYXRhIHN0cnVjdHVyZS4gQWxzbyAtbWQgb3B0aW9uIHRvIHVzZSBhbgogICAgIGFsdGVybmF0aXZlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSBmb3Igc2lnbmluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaWR5IHVwIFBLQ1MjNyByb3V0aW5lcyBhbmQgYWRkIG5ldyBmdW5jdGlvbnMgdG8gbWFrZSBpdCBlYXNpZXIgdG8KICAgICBjcmVhdGUgUEtDUzcgc3RydWN0dXJlcyBjb250YWluaW5nIG11bHRpcGxlIHNpZ25lcnMuIFVwZGF0ZSBzbWltZQogICAgIGFwcGxpY2F0aW9uIHRvIHN1cHBvcnQgbXVsdGlwbGUgc2lnbmVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLW1hY2FsZyBvcHRpb24gdG8gcGtjczEyIHV0aWxpdHkgdG8gYWxsb3cgc2V0dGluZyBvZiBhbiBhbHRlcm5hdGl2ZQogICAgIGRpZ2VzdCBNQUMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBQUkZzIG90aGVyIHRoYW4gZGVmYXVsdCBTSEExIEhNQUMuCiAgICAgUmVvcmdhbml6ZSBQQkUgaW50ZXJuYWxzIHRvIGxvb2t1cCBmcm9tIGEgc3RhdGljIHRhYmxlIHVzaW5nIE5JRHMsCiAgICAgYWRkIHN1cHBvcnQgZm9yIEhNQUMgUEJFIE9JRCB0cmFuc2xhdGlvbi4gQWRkIGEgRVZQX0NJUEhFUiBjdHJsOgogICAgIEVWUF9DVFJMX1BCRV9QUkZfTklEIHRoaXMgYWxsb3dzIGEgY2lwaGVyIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBQUkYgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVzZWQgd2l0aCBQQkVTMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZXBsYWNlIHRoZSBhbGdvcml0aG0gc3BlY2lmaWMgY2FsbHMgdG8gZ2VuZXJhdGUga2V5cyBpbiAicmVxIiB3aXRoIHRoZQogICAgIG5ldyBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIFBLQ1MjNyBlbnZlbG9wZWQgZGF0YSByb3V0aW5lcyB0byB1c2UgbmV3IEFQSS4gVGhpcyBpcyBub3cKICAgICBzdXBwb3J0ZWQgYnkgYW55IHB1YmxpYyBrZXkgbWV0aG9kIHN1cHBvcnRpbmcgdGhlIGVuY3J5cHQgb3BlcmF0aW9uLiBBCiAgICAgY3RybCBpcyBhZGRlZCB0byBhbGxvdyB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gdG8gZXhhbWluZSBvciBtb2RpZnkKICAgICB0aGUgUEtDUyM3IFJlY2lwaWVudEluZm8gc3RydWN0dXJlIGlmIGl0IG5lZWRzIHRvOiBmb3IgUlNBIHRoaXMgaXMKICAgICBhIG5vIG9wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGN0cmwgdG8gYXNuMSBtZXRob2QgdG8gYWxsb3cgYSBwdWJsaWMga2V5IGFsZ29yaXRobSB0byBleHByZXNzCiAgICAgYSBkZWZhdWx0IGRpZ2VzdCB0eXBlIHRvIHVzZS4gSW4gbW9zdCBjYXNlcyB0aGlzIHdpbGwgYmUgU0hBMSBidXQgc29tZQogICAgIGFsZ29yaXRobXMgKHN1Y2ggYXMgR09TVCkgbmVlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGRpZ2VzdC4gVGhlCiAgICAgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBob3cgc3Ryb25nIHRoZSBwcmVmZXJuY2UgaXMgMSBtZWFucyBvcHRpb25hbCBhbmQKICAgICAyIGlzIG1hbmRhdG9yeSAodGhhdCBpcyBpdCBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdHlwZSkuIE1vZGlmeQogICAgIEFTTjFfaXRlbV9zaWduKCkgdG8gYWNjZXB0IGEgTlVMTCBkaWdlc3QgYXJndW1lbnQgdG8gaW5kaWNhdGUgaXQgc2hvdWxkCiAgICAgdXNlIHRoZSBkZWZhdWx0IG1kLiBVcGRhdGUgb3BlbnNzbCB1dGlsaXRpZXMgdG8gdXNlIHRoZSBkZWZhdWx0IGRpZ2VzdAogICAgIHR5cGUgZm9yIHNpZ25pbmcgaWYgaXQgaXMgbm90IGV4cGxpY2l0bHkgaW5kaWNhdGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBPSUQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGluIEFTTjFfc2lnbigpIGFuZCBBU04xX3ZlcmlmeSgpLiBOZXcgCiAgICAgRVZQX01EIGZsYWcgRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFLiBUaGlzIHVzZXMgdGhlIHJlbGV2YW50CiAgICAgc2lnbmluZyBtZXRob2QgZnJvbSB0aGUga2V5IHR5cGUuIFRoaXMgZWZmZWN0aXZlbHkgcmVtb3ZlcyB0aGUgbGluawogICAgIGJldHdlZW4gZGlnZXN0cyBhbmQgcHVibGljIGtleSB0eXBlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYW4gT0lEIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuIEl0cyBwdXJwb3NlIGlzIHRvCiAgICAgdHJhbnNsYXRlIGJldHdlZW4gc2lnbmF0dXJlIE9JRHMgc3VjaCBhcyBTSEExV2l0aHJzYUVuY3J5cHRpb24gYW5kIFNIQTEsCiAgICAgcnNhRW5jcnlwdGlvbi4gVGhpcyB3aWxsIGFsbG93IHNvbWUgb2YgdGhlIGFsZ29yaXRobSBzcGVjaWZpYyBoYWNrZXJ5CiAgICAgbmVlZGVkIHRvIHVzZSB0aGUgY29ycmVjdCBPSUQgdG8gYmUgcmVtb3ZlZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIGFsZ29yaXRobSBzcGVjaWZpYyBkZXBlbmRlbmNpZXMgd2hlbiBzZXR0aW5nIFBLQ1M3X1NJR05FUl9JTkZPCiAgICAgc3RydWN0dXJlcyBmb3IgUEtDUzdfc2lnbigpLiBUaGV5IGFyZSBub3cgc2V0IHVwIGJ5IHRoZSByZWxldmFudCBwdWJsaWMKICAgICBrZXkgQVNOMSBtZXRob2QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByb3Zpc2lvbmFsIEVDIHBrZXkgbWV0aG9kIHdpdGggc3VwcG9ydCBmb3IgRUNEU0EgYW5kIEVDREguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGtleSBkZXJpdmF0aW9uIChhZ3JlZW1lbnQpIGluIHRoZSBBUEksIERIIG1ldGhvZCBhbmQKICAgICBwa2V5dXRsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBEU0EgcGtleSBtZXRob2QgYW5kIERIIHBrZXkgbWV0aG9kcywgZXh0ZW5kIERIIEFTTjEgbWV0aG9kIHRvIHN1cHBvcnQKICAgICBwdWJsaWMgYW5kIHByaXZhdGUga2V5IGZvcm1hdHMuIEFzIGEgc2lkZSBlZmZlY3QgdGhlc2UgYWRkIGFkZGl0aW9uYWwgCiAgICAgY29tbWFuZCBsaW5lIGZ1bmN0aW9uYWxpdHkgbm90IHByZXZpb3VzbHkgYXZhaWxhYmxlOiBEU0Egc2lnbmF0dXJlcyBjYW4gYmUKICAgICBnZW5lcmF0ZWQgYW5kIHZlcmlmaWVkIHVzaW5nIHBrZXl1dGwgYW5kIERIIGtleSBzdXBwb3J0IGFuZCBnZW5lcmF0aW9uIGluCiAgICAgcGtleSwgZ2VucGtleS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZU9TIHN1cHBvcnQuCiAgICAgW09saXZlciBUYXBwZSA8em9vZXlAaGlyc2Noa2FlZmVyLmRlPl0KCiAgKikgTmV3IG1ha2UgdGFyZ2V0ICJpbnN0YWxsX2h0bWxfZG9jcyIgaW5zdGFsbHMgSFRNTCByZW5kaXRpb25zIG9mIHRoZQogICAgIG1hbnVhbCBwYWdlcy4KICAgICBbT2xpdmVyIFRhcHBlIDx6b29leUBoaXJzY2hrYWVmZXIuZGU+XQoKICAqKSBOZXcgdXRpbGl0eSAiZ2VucGtleSIgdGhpcyBpcyBhbmFsYWdvdXMgdG8gImdlbnJzYSIgZXRjIGV4Y2VwdCBpdCBjYW4KICAgICBnZW5lcmF0ZSBrZXlzIGZvciBhbnkgYWxnb3JpdGhtLiBFeHRlbmQgYW5kIHVwZGF0ZSBFVlBfUEtFWV9NRVRIT0QgdG8KICAgICBzdXBwb3J0IGtleSBhbmQgcGFyYW1ldGVyIGdlbmVyYXRpb24gYW5kIGFkZCBpbml0aWFsIGtleSBnZW5lcmF0aW9uCiAgICAgZnVuY3Rpb25hbGl0eSBmb3IgUlNBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgZm9yIG1haW4gRVZQX1BLRVlfbWV0aG9kIG9wZXJhdGlvbnMuIFRoZSB1bmRvY3VtZW50ZWQKICAgICBmdW5jdGlvbnMgRVZQX1BLRVlfe2VuY3J5cHQsZGVjcnlwdH0gaGF2ZSBiZWVuIHJlbmFtZWQgdG8KICAgICBFVlBfUEtFWV97ZW5jcnlwdCxkZWNyeXB0fV9vbGQuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgZGVmaW5pdGlvbnMgZm9yIEVWUF9QS0VZX01FVEhPRC4gVGhpcyB3aWxsIGJlIGEgaGlnaCBsZXZlbCBwdWJsaWMKICAgICBrZXkgQVBJLCBkb2Vzbid0IGRvIG11Y2ggeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBFVlBfUEtFWV9hc24xX2dldDBfaW5mbygpIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0CiAgICAgcHVibGljIGtleSBhbGdvcml0aG1zLiBOZXcgb3B0aW9uIHRvIG9wZW5zc2wgdXRpbGl0eToKICAgICAibGlzdC1wdWJsaWMta2V5LWFsZ29yaXRobXMiIHRvIHByaW50IG91dCBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgU3VwcG9ydGVkIEVsbGlwdGljIEN1cnZlcyBFeHRlbnNpb24gZm9yCiAgICAgRUNDIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgRG9uJ3QgZnJlZSB1cCBPSURzIGluIE9CSl9jbGVhbnVwKCkgaWYgdGhleSBhcmUgaW4gdXNlIGJ5IEVWUF9NRCBvcgogICAgIEVWUF9DSVBIRVIgc3RydWN0dXJlcyB0byBhdm9pZCBsYXRlciBwcm9ibGVtcyBpbiBFVlBfY2xlYW51cCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyB1dGlsaXRpZXMgcGtleSBhbmQgcGtleXBhcmFtLiBUaGVzZSBhcmUgc2ltaWxhciB0byBhbGdvcml0aG0gc3BlY2lmaWMKICAgICB1dGlsaXRpZXMgc3VjaCBhcyByc2EsIGRzYSwgZHNhcGFyYW0gZXRjIGV4Y2VwdCB0aGV5IHByb2Nlc3MgYW55IGtleQogICAgIHR5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVHJhbnNmZXIgcHVibGljIGtleSBwcmludGluZyByb3V0aW5lcyB0byBFVlBfUEtFWV9BU04xX01FVEhPRC4gTmV3IAogICAgIGZ1bmN0aW9ucyBFVlBfUEtFWV9wcmludF9wdWJsaWMoKSwgRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZSgpLAogICAgIEVWUF9QS0VZX3ByaW50X3BhcmFtKCkgdG8gcHJpbnQgcHVibGljIGtleSBkYXRhIGZyb20gYW4gRVZQX1BLRVkKICAgICBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBwbHVnZ2FibGUgcHVibGljIGtleSBBU04xLgogICAgIERlLXNwYWdoZXR0aWZ5IHRoZSBwdWJsaWMga2V5IEFTTjEgaGFuZGxpbmcuIE1vdmUgcHVibGljIGFuZCBwcml2YXRlCiAgICAga2V5IEFTTjEgaGFuZGxpbmcgdG8gYSBuZXcgRVZQX1BLRVlfQVNOMV9NRVRIT0Qgc3RydWN0dXJlLiBSZWxvY2F0ZQogICAgIGFsZ29yaXRobSBzcGVjaWZpYyBoYW5kbGluZyB0byBhIHNpbmdsZSBtb2R1bGUgd2l0aGluIHRoZSByZWxldmFudAogICAgIGFsZ29yaXRobSBkaXJlY3RvcnkuIEFkZCBmdW5jdGlvbnMgdG8gYWxsb3cgKG5lYXIpIG9wYXF1ZSBwcm9jZXNzaW5nCiAgICAgb2YgcHVibGljIGFuZCBwcml2YXRlIGtleSBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgU3VwcG9ydGVkIFBvaW50IEZvcm1hdHMgRXh0ZW5zaW9uIGZvcgogICAgIEVDQyBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMTIudHh0LgogICAgIFtEb3VnbGFzIFN0ZWJpbGFdCgogICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFJGQyA0Mjc5IFBTSyBUTFMgY2lwaGVyc3VpdGVzLiBBZGQgbWVtYmVycwogICAgIGZvciB0aGUgcHNrIGlkZW50aXR5IFtoaW50XSBhbmQgdGhlIHBzayBjYWxsYmFjayBmdW5jdGlvbnMgdG8gdGhlCiAgICAgU1NMX1NFU1NJT04sIFNTTCBhbmQgU1NMX0NUWCBzdHJ1Y3R1cmUuCiAgICAgCiAgICAgTmV3IGNpcGhlcnN1aXRlczoKICAgICAgICAgUFNLLVJDNC1TSEEsIFBTSy0zREVTLUVERS1DQkMtU0hBLCBQU0stQUVTMTI4LUNCQy1TSEEsCiAgICAgICAgIFBTSy1BRVMyNTYtQ0JDLVNIQQogCiAgICAgTmV3IGZ1bmN0aW9uczoKICAgICAgICAgU1NMX0NUWF91c2VfcHNrX2lkZW50aXR5X2hpbnQKICAgICAgICAgU1NMX2dldF9wc2tfaWRlbnRpdHlfaGludAogICAgICAgICBTU0xfZ2V0X3Bza19pZGVudGl0eQogICAgICAgICBTU0xfdXNlX3Bza19pZGVudGl0eV9oaW50CgogICAgIFtNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZiBOb2tpYSBDb3Jwb3JhdGlvbl0KCiAgKikgQWRkIFJGQyAzMTYxIGNvbXBsaWFudCB0aW1lIHN0YW1wIHJlcXVlc3QgY3JlYXRpb24sIHJlc3BvbnNlIGdlbmVyYXRpb24KICAgICBhbmQgcmVzcG9uc2UgdmVyaWZpY2F0aW9uIGZ1bmN0aW9uYWxpdHkuCiAgICAgW1pvbHThbiBHbPN6aWsgPHpnbG96aWtAb3BlbnRzYS5vcmc+LCBUaGUgT3BlblRTQSBQcm9qZWN0XQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBUTFMgZXh0ZW5zaW9ucywgc3BlY2lmaWNhbGx5IGZvciB0aGUgc2VydmVyX25hbWUKICAgICBleHRlbnNpb24gc28gZmFyLiAgVGhlIFNTTF9TRVNTSU9OLCBTU0xfQ1RYLCBhbmQgU1NMIGRhdGEgc3RydWN0dXJlcyBub3cKICAgICBoYXZlIG5ldyBtZW1iZXJzIGZvciBhIGhvc3QgbmFtZS4gIFRoZSBTU0wgZGF0YSBzdHJ1Y3R1cmUgaGFzIGFuCiAgICAgYWRkaXRpb25hbCBtZW1iZXIgU1NMX0NUWCAqaW5pdGlhbF9jdHggc28gdGhhdCBuZXcgc2Vzc2lvbnMgY2FuIGJlCiAgICAgc3RvcmVkIGluIHRoYXQgY29udGV4dCB0byBhbGxvdyBmb3Igc2Vzc2lvbiByZXN1bXB0aW9uLCBldmVuIGFmdGVyIHRoZQogICAgIFNTTCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIG5ldyBTU0xfQ1RYIGluIHJlYWN0aW9uIHRvIGEgY2xpZW50J3MKICAgICBzZXJ2ZXJfbmFtZSBleHRlbnNpb24uCgogICAgIE5ldyBmdW5jdGlvbnMgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZSgpCiAgICAgICAgIFNTTF9nZXRfc2VydmVybmFtZV90eXBlKCkKICAgICAgICAgU1NMX3NldF9TU0xfQ1RYKCkKCiAgICAgTmV3IENUUkwgY29kZXMgYW5kIG1hY3JvcyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2soKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoKQogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FICAgICAgICAgICAtIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCgogICAgIG9wZW5zc2wgc19jbGllbnQgaGFzIGEgbmV3ICctc2VydmVybmFtZSAuLi4nIG9wdGlvbi4KCiAgICAgb3BlbnNzbCBzX3NlcnZlciBoYXMgbmV3IG9wdGlvbnMgJy1zZXJ2ZXJuYW1lX2hvc3QgLi4uJywgJy1jZXJ0MiAuLi4nLAogICAgICcta2V5MiAuLi4nLCAnLXNlcnZlcm5hbWVfZmF0YWwnIChzdWJqZWN0IHRvIGNoYW5nZSkuICBUaGlzIGFsbG93cwogICAgIHRlc3RpbmcgdGhlIEhvc3ROYW1lIGV4dGVuc2lvbiBmb3IgYSBzcGVjaWZpYyBzaW5nbGUgaG9zdCBuYW1lICgnLWNlcnQnCiAgICAgYW5kICcta2V5JyByZW1haW4gZmFsbGJhY2tzIGZvciBoYW5kc2hha2VzIHdpdGhvdXQgSG9zdE5hbWUKICAgICBuZWdvdGlhdGlvbikuICBJZiB0aGUgdW5yZWNvZ25pbnplZF9uYW1lIGFsZXJ0IGhhcyB0byBiZSBzZW50LCB0aGlzIGJ5CiAgICAgZGVmYXVsdCBpcyBhIHdhcm5pbmc7IGl0IGJlY29tZXMgZmF0YWwgd2l0aCB0aGUgJy1zZXJ2ZXJuYW1lX2ZhdGFsJwogICAgIG9wdGlvbi4KCiAgICAgW1BldGVyIFN5bHZlc3RlciwgIFJlbXkgQWxsYWlzLCBDaHJpc3RvcGhlIFJlbm91XQoKICAqKSBXaGlybHBvb2wgaGFzaCBpbXBsZW1lbnRhdGlvbiBpcyBhZGRlZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQklHTlVNIGNvZGUgb24gNjQtYml0IFNQQVJDdjkgdGFyZ2V0cyBpcyBzd2l0Y2hlZCBmcm9tIGJuKDY0LDY0KSB0bwogICAgIGJuKDY0LDMyKS4gQmVjYXVzZSBvZiBpbnN0cnVjdGlvbiBzZXQgbGltaXRhdGlvbnMgaXQgZG9lc24ndCBoYXZlCiAgICAgYW55IG5lZ2F0aXZlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4gVGhpcyB3YXMgZG9uZSBtb3N0bHkgaW4gb3JkZXIKICAgICB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHNoYXJlIGFzc2VtYmxlciBtb2R1bGVzLCBzdWNoIGFzIGJuX211bF9tb250CiAgICAgaW1wbGVtZW50YXRpb25zLCBiZXR3ZWVuIDMyLSBhbmQgNjQtYml0IGJ1aWxkcyB3aXRob3V0IGhhc3NsZS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTW92ZSBjb2RlIHByZXZpb3VzbHkgZXhpbGVkIGludG8gZmlsZSBjcnlwdG8vZWMvZWMyX3NtcHQuYwogICAgIHRvIGVjMl9zbXBsLmMsIGFuZCBubyBsb25nZXIgcmVxdWlyZSB0aGUgT1BFTlNTTF9FQ19CSU5fUFRfQ09NUAogICAgIG1hY3JvLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBjYW5kaWRhdGUgZm9yIEJJR05VTSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24sIGJuX211bF9tb250LAogICAgIGRlZGljYXRlZCBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIHByb2NlZHVyZSwgaXMgaW50cm9kdWNlZC4KICAgICBCTl9NT05UX0NUWCBpcyBtb2RpZmllZCB0byBhbGxvdyBibl9tdWxfbW9udCB0byByZWFjaCBmb3IgaGlnaGVyCiAgICAgIjY0LWJpdCIgcGVyZm9ybWFuY2Ugb24gY2VydGFpbiAzMi1iaXQgdGFyZ2V0cy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IG9wdGlvbiBTU0xfT1BfTk9fQ09NUCB0byBkaXNhYmxlIHVzZSBvZiBjb21wcmVzc2lvbiBzZWxlY3RpdmVseQogICAgIGluIFNTTCBzdHJ1Y3R1cmVzLiBOZXcgU1NMIGN0cmwgdG8gc2V0IG1heGltdW0gc2VuZCBmcmFnbWVudCBzaXplLiAKICAgICBTYXZlIG1lbW9yeSBieSBzZWV0aW5nIHRoZSBJL08gYnVmZmVyIHNpemVzIGR5bmFtaWNhbGx5IGluc3RlYWQgb2YKICAgICB1c2luZyB0aGUgbWF4aW11bSBhdmFpbGFibGUgdmFsdWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiAtViBmb3IgJ29wZW5zc2wgY2lwaGVycycuIFRoaXMgcHJpbnRzIHRoZSBjaXBoZXJzdWl0ZSBjb2RlCiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIHRleHQgZGV0YWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBWZXJ5LCB2ZXJ5IHByZWxpbWluYXJ5IEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciBwcmludGluZyBvZiBnZW5lcmFsCiAgICAgQVNOMSBzdHJ1Y3R1cmVzLiBUaGlzIGN1cnJlbnRseSBwcm9kdWNlcyByYXRoZXIgdWdseSBvdXRwdXQgYW5kIGRvZXNuJ3QKICAgICBoYW5kbGUgc2V2ZXJhbCBjdXN0b21pc2VkIHN0cnVjdHVyZXMgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludGVncmF0ZWQgc3VwcG9ydCBmb3IgUFZLIGZpbGUgZm9ybWF0IGFuZCBzb21lIHJlbGF0ZWQgZm9ybWF0cyBzdWNoCiAgICAgYXMgTVMgUFVCTElDS0VZQkxPQiBhbmQgUFJJVkFURUtFWUJMT0IuIENvbW1hbmQgbGluZSBzd2l0Y2hlcyB0byBzdXBwb3J0CiAgICAgdGhlc2UgaW4gdGhlICdyc2EnIGFuZCAnZHNhJyB1dGlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUEtDUyMxIFJTQVB1YmxpY0tleSBmb3JtYXQgb24gcnNhIHV0aWxpdHkgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgYW5jaWVudCBBU04xX01FVEhPRCBjb2RlLiBUaGlzIHdhcyBvbmx5IGV2ZXIgdXNlZCBpbiBvbmUKICAgICBwbGFjZSBmb3IgdGhlICh2ZXJ5IG9sZCkgIk5FVFNDQVBFIiBmb3JtYXQgY2VydGlmaWNhdGVzIHdoaWNoIGFyZSBub3cKICAgICBoYW5kbGVkIHVzaW5nIG5ldyBBU04xIGNvZGUgZXF1aXZhbGVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0IHRoZSBUTFN2MV9tZXRob2QoKSBldGMuIGZ1bmN0aW9ucyByZXR1cm4gYSAnY29uc3QnIFNTTF9NRVRIT0QKICAgICBwb2ludGVyIGFuZCBtYWtlIHRoZSBTU0xfTUVUSE9EIHBhcmFtZXRlciBpbiBTU0xfQ1RYX25ldywKICAgICBTU0xfQ1RYX3NldF9zc2xfdmVyc2lvbiBhbmQgU1NMX3NldF9zc2xfbWV0aG9kICdjb25zdCcuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBNb2RpZnkgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZXh0ZW5zaW9uIGNvZGUgdG8gcHJpbnQgb3V0IHByZXZpb3VzbHkKICAgICB1bnN1cHBvcnRlZCBmaWVsZHMuIEVuaGFuY2UgZXh0ZW5zaW9uIHNldHRpbmcgY29kZSB0byBhbGxvdyBzZXR0aW5nIG9mCiAgICAgYWxsIGZpZWxkcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJpbnQgYW5kIHNldCBzdXBwb3J0IGZvciBJc3N1aW5nIERpc3RyaWJ1dGlvbiBQb2ludCBDUkwgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSAnQ29uZmlndXJlJyBzY3JpcHQgdG8gZW5hYmxlIENhbWVsbGlhIGJ5IGRlZmF1bHQuCiAgICAgW05UVF0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhtIGFuZCAwLjkuOG4gWzI0IE1hciAyMDEwXQoKICAqKSBXaGVuIHJlamVjdGluZyBTU0wvVExTIHJlY29yZHMgZHVlIHRvIGFuIGluY29ycmVjdCB2ZXJzaW9uIG51bWJlciwgbmV2ZXIKICAgICB1cGRhdGUgcy0+c2VydmVyIHdpdGggYSBuZXcgbWFqb3IgdmVyc2lvbiBudW1iZXIuICBBcyBvZgogICAgIC0gT3BlblNTTCAwLjkuOG0gaWYgJ3Nob3J0JyBpcyBhIDE2LWJpdCB0eXBlLAogICAgIC0gT3BlblNTTCAwLjkuOGYgaWYgJ3Nob3J0JyBpcyBsb25nZXIgdGhhbiAxNiBiaXRzLAogICAgIHRoZSBwcmV2aW91cyBiZWhhdmlvciBjb3VsZCByZXN1bHQgaW4gYSByZWFkIGF0dGVtcHQgYXQgTlVMTCB3aGVuCiAgICAgcmVjZWl2aW5nIHNwZWNpZmljIGluY29ycmVjdCBTU0wvVExTIHJlY29yZHMgb25jZSByZWNvcmQgcGF5bG9hZAogICAgIHByb3RlY3Rpb24gaXMgYWN0aXZlLiAgKENWRS0yMDEwLTA3NDApCiAgICAgW0JvZG8gTW9lbGxlciwgQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPl0KCiAgKikgRml4IGZvciBDVkUtMjAxMC0wNDMzIHdoZXJlIHNvbWUga2VyYmVyb3MgZW5hYmxlZCB2ZXJzaW9ucyBvZiBPcGVuU1NMIAogICAgIGNvdWxkIGJlIGNyYXNoZWQgaWYgdGhlIHJlbGV2YW50IHRhYmxlcyB3ZXJlIG5vdCBwcmVzZW50IChlLmcuIGNocm9vdGVkKS4KICAgICBbVG9tYXMgSG9nZXIgPHRob2dlckByZWRoYXQuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhsIGFuZCAwLjkuOG0gWzI1IEZlYiAyMDEwXQoKICAqKSBBbHdheXMgY2hlY2sgYm5fd2V4cGVuZCgpIHJldHVybiB2YWx1ZXMgZm9yIGZhaWx1cmUuICAoQ1ZFLTIwMDktMzI0NSkKICAgICBbTWFydGluIE9sc3NvbiwgTmVlbCBNZWh0YV0KCiAgKikgRml4IFg1MDlfU1RPUkUgbG9ja2luZzogRXZlcnkgJ29ianMnIGFjY2VzcyByZXF1aXJlcyBhIGxvY2sgKHRvCiAgICAgYWNjb21tb2RhdGUgZm9yIHN0YWNrIHNvcnRpbmcsIGFsd2F5cyBhIHdyaXRlIGxvY2shKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPbiBzb21lIHZlcnNpb25zIG9mIFdJTjMyIEhlYXAzMk5leHQgaXMgdmVyeSBzbG93LiBUaGlzIGNhbiBjYXVzZQogICAgIGV4Y2Vzc2l2ZSBkZWxheXMgaW4gdGhlIFJBTkRfcG9sbCgpOiBvdmVyIGEgbWludXRlLiBBcyBhIHdvcmthcm91bmQKICAgICBpbmNsdWRlIGEgdGltZSBjaGVjayBpbiB0aGUgaW5uZXIgSGVhcDMyTmV4dCBsb29wIHRvby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgY29kZSB0aGF0IGhhbmRsZWQgZmx1c2hpbmcgb2YgZGF0YSBpbiBTU0wvVExTIG9yaWdpbmFsbHkgdXNlZCB0aGUKICAgICBCSU9fQ1RSTF9JTkZPIGN0cmwgdG8gc2VlIGlmIGFueSBkYXRhIHdhcyBwZW5kaW5nIGZpcnN0LiBUaGlzIGNhdXNlZAogICAgIHRoZSBwcm9ibGVtIG91dGxpbmVkIGluIFBSIzE5NDkuIFRoZSBmaXggc3VnZ2VzdGVkIHRoZXJlIGhvd2V2ZXIgY2FuCiAgICAgdHJpZ2dlciBwcm9ibGVtcyB3aXRoIGJ1Z2d5IEJJT19DVFJMX1dQRU5ESU5HIChlLmcuIHNvbWUgdmVyc2lvbnMKICAgICBvZiBBcGFjaGUpLiBTbyBpbnN0ZWFkIHNpbXBsaWZ5IHRoZSBjb2RlIHRvIGZsdXNoIHVuY29uZGl0aW9uYWxseS4KICAgICBUaGlzIHNob3VsZCBiZSBmaW5lIHNpbmNlIGZsdXNoaW5nIHdpdGggbm8gZGF0YSB0byBmbHVzaCBpcyBhIG5vIG9wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhhbmRsZSBUTFMgdmVyc2lvbnMgMi4wIGFuZCBsYXRlciBwcm9wZXJseSBhbmQgY29ycmVjdGx5IHVzZSB0aGUKICAgICBoaWdoZXN0IHZlcnNpb24gb2YgVExTL1NTTCBzdXBwb3J0ZWQuIEFsdGhvdWdoIFRMUyA+PSAyLjAgaXMgc29tZSB3YXkKICAgICBvZmYgYW5jaWVudCBzZXJ2ZXJzIGhhdmUgYSBoYWJpdCBvZiBzdGlja2luZyBhcm91bmQgZm9yIGEgd2hpbGUuLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgY29tcHJlc3Npb24gY29kZSBzbyBpdCBmcmVlcyB1cCBzdHJ1Y3R1cmVzIHdpdGhvdXQgdXNpbmcgdGhlCiAgICAgZXhfZGF0YSBjYWxsYmFja3MuIFRoaXMgd29ya3MgYXJvdW5kIGEgcHJvYmxlbSB3aGVyZSBzb21lIGFwcGxpY2F0aW9ucwogICAgIGNhbGwgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSBiZWZvcmUgYXBwbGljYXRpb24gZXhpdCAoZS5nLiB3aGVuCiAgICAgcmVzdGFydGluZykgdGhlbiB1c2UgY29tcHJlc3Npb24gKGUuZy4gU1NMIHdpdGggY29tcHJlc3Npb24pIGxhdGVyLgogICAgIFRoaXMgcmVzdWx0cyBpbiBzaWduaWZpY2FudCBwZXItY29ubmVjdGlvbiBtZW1vcnkgbGVha3MgYW5kCiAgICAgaGFzIGNhdXNlZCBzb21lIHNlY3VyaXR5IGlzc3VlcyBpbmNsdWRpbmcgQ1ZFLTIwMDgtMTY3OCBhbmQKICAgICBDVkUtMjAwOS00MzU1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IGNyeXB0by9jYXN0IChpLmUuLCA8b3BlbnNzbC9jYXN0Lmg+KTogYSBDQVNUX0tFWSBkb2Vzbid0CiAgICAgY2hhbmdlIHdoZW4gZW5jcnlwdGluZyBvciBkZWNyeXB0aW5nLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBvcHRpb24gU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVCB3aGljaCB3aWxsIGFsbG93IGNsaWVudHMgdG8KICAgICBjb25uZWN0IGFuZCByZW5lZ290aWF0ZSB3aXRoIHNlcnZlcnMgd2hpY2ggZG8gbm90IHN1cHBvcnQgUkkuCiAgICAgVW50aWwgUkkgaXMgbW9yZSB3aWRlbHkgZGVwbG95ZWQgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAibWlzc2luZyIgc3NsIGN0cmxzIHRvIGNsZWFyIG9wdGlvbnMgYW5kIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgY2xpZW50IGF0dGVtcHRzIHRvIHJlbmVnb3RpYXRlIGFuZCBkb2Vzbid0IHN1cHBvcnQgUkkgcmVzcG9uZCB3aXRoCiAgICAgYSBub19yZW5lZ290aWF0aW9uIGFsZXJ0IGFzIHJlcXVpcmVkIGJ5IFJGQzU3NDYuICBTb21lIHJlbmVnb3RpYXRpbmcKICAgICBUTFMgY2xpZW50cyB3aWxsIGNvbnRpbnVlIGEgY29ubmVjdGlvbiBncmFjZWZ1bGx5IHdoZW4gdGhleSByZWNlaXZlCiAgICAgdGhlIGFsZXJ0LiBVbmZvcnR1bmF0ZWx5IE9wZW5TU0wgbWlzaGFuZGxlZCB0aGlzIGFsZXJ0IGFuZCB3b3VsZCBoYW5nCiAgICAgd2FpdGluZyBmb3IgYSBzZXJ2ZXIgaGVsbG8gd2hpY2ggaXQgd2lsbCBuZXZlciByZWNlaXZlLiBOb3cgd2UgdHJlYXQgYQogICAgIHJlY2VpdmVkIG5vX3JlbmVnb3RpYXRpb24gYWxlcnQgYXMgYSBmYXRhbCBlcnJvci4gVGhpcyBpcyBiZWNhdXNlCiAgICAgYXBwbGljYXRpb25zIHJlcXVlc3RpbmcgYSByZW5lZ290aWF0aW9uIG1pZ2h0IHdlbGwgZXhwZWN0IGl0IHRvIHN1Y2NlZWQKICAgICBhbmQgd291bGQgaGF2ZSBubyBjb2RlIGluIHBsYWNlIHRvIGhhbmRsZSB0aGUgc2VydmVyIGRlbnlpbmcgaXQgc28gdGhlCiAgICAgb25seSBzYWZlIHRoaW5nIHRvIGRvIGlzIHRvIHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY3RybCBtYWNybyBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoKSB3aGljaCByZXR1cm5zIDEgaWYKICAgICBwZWVyIHN1cHBvcnRzIHNlY3VyZSByZW5lZ290aWF0aW9uIGFuZCAwIG90aGVyd2lzZS4gUHJpbnQgb3V0IHBlZXIKICAgICByZW5lZ290aWF0aW9uIHN1cHBvcnQgaW4gc19jbGllbnQvc19zZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVwbGFjZSB0aGUgaGlnaGx5IGJyb2tlbiBhbmQgZGVwcmVjYXRlZCBTUEtBQyBjZXJ0aWZpY2F0aW9uIG1ldGhvZCB3aXRoCiAgICAgdGhlIHVwZGF0ZWQgTklEIGNyZWF0aW9uIHZlcnNpb24uIFRoaXMgc2hvdWxkIGNvcnJlY3RseSBoYW5kbGUgVVRGOC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgUkZDNTc0Ni4gUmUtZW5hYmxlIHJlbmVnb3RpYXRpb24gYnV0IHJlcXVpcmUgdGhlIGV4dGVuc2lvbgogICAgIGFzIG5lZWRlZC4gVW5mb3J0dW5hdGVseSwgU1NMM19GTEFHU19BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04KICAgICB0dXJucyBvdXQgdG8gYmUgYSBiYWQgaWRlYS4gSXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkKICAgICBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIHdoaWNoIGNhbiBiZSBzZXQgd2l0aAogICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoKS4gVGhpcyBpcyByZWFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3UKICAgICBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KICAgICBbRXJpYyBSZXNjb3JsYSA8ZWtyQG5ldHdvcmtyZXNvbmFuY2UuY29tPiwgQmVuIExhdXJpZSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBzdGF0ZWxlc3Mgc2Vzc2lvbiByZXN1bXB0aW9uIGhhbmRsaW5nLiBVc2UgaW5pdGlhbF9jdHggd2hlbgogICAgIGlzc3VpbmcgYW5kIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCB0aWNrZXRzIGluIGNhc2UgaXQgaGFzIGNoYW5nZWQgZHVyaW5nCiAgICAgc2VydmVybmFtZSBoYW5kbGluZy4gVXNlIGEgbm9uLXplcm8gbGVuZ3RoIHNlc3Npb24gSUQgd2hlbiBhdHRlbXB0aW5nCiAgICAgc3RhdGVsZXNzIHNlc3Npb24gcmVzdW1wdGlvbjogdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYKICAgICBhIHJlc3VtcHRpb24gaGFzIG9jY3VycmVkIGltbWVkaWF0ZWx5IGFmdGVyIHJlY2VpdmluZyBzZXJ2ZXIgaGVsbG8KICAgICAoc2V2ZXJhbCBwbGFjZXMgaW4gT3BlblNTTCBzdWJ0bHkgYXNzdW1lIHRoaXMpIGluc3RlYWQgb2YgbGF0ZXIgaW4KICAgICB0aGUgaGFuZHNoYWtlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmdW5jdGlvbnMgRU5HSU5FX2N0cmwoKSwgT1BFTlNTTF9pc3NlcnZpY2UoKSwKICAgICBDTVNfZ2V0MV9SZWNpcGllbnRSZXF1ZXN0KCkgYW5kIFJBTkRfYnl0ZXMoKSBjYW4gcmV0dXJuIDw9MCBvbiBlcnJvcgogICAgIGZpeGVzIGZvciBhIGZldyBwbGFjZXMgd2hlcmUgdGhlIHJldHVybiBjb2RlIGlzIG5vdCBjaGVja2VkCiAgICAgY29ycmVjdGx5LgogICAgIFtKdWxpYSBMYXdhbGwgPGp1bGlhQGRpa3UuZGs+XQoKICAqKSBBZGQgLS1zdHJpY3Qtd2FybmluZ3Mgb3B0aW9uIHRvIENvbmZpZ3VyZSBzY3JpcHQgdG8gaW5jbHVkZSBkZXZ0ZWFtCiAgICAgd2FybmluZ3MgaW4gb3RoZXIgY29uZmlndXJhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIC0tbGliZGlyIG9wdGlvbiBhbmQgTElCRElSIHZhcmlhYmxlIGluIG1ha2VmaWxlcy4gVGhpcwogICAgIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwgb3BlbnNzbCBsaWJyYXJpZXMgaW4gbG9jYXRpb25zIHdoaWNoCiAgICAgaGF2ZSBuYW1lcyBvdGhlciB0aGFuICJsaWIiLCBmb3IgZXhhbXBsZSAiL3Vzci9saWI2NCIgd2hpY2ggc29tZQogICAgIHN5c3RlbXMgbmVlZC4KICAgICBbU3RldmUgSGVuc29uLCBiYXNlZCBvbiBwYXRjaCBmcm9tIEplcmVteSBVdGxleV0KCiAgKikgRG9uJ3QgYWxsb3cgdGhlIHVzZSBvZiBsZWFkaW5nIDB4ODAgaW4gT0lEcy4gVGhpcyBpcyBhIHZpb2xhdGlvbiBvZgogICAgIFg2OTAgOC45LjEyIGFuZCBjYW4gcHJvZHVjZSBzb21lIG1pc2xlYWRpbmcgdGV4dHVhbCBvdXRwdXQgb2YgT0lEcy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBEYW4gS2FtaW5za3ldCgogICopIERlbGV0ZSBNRDIgZnJvbSBhbGdvcml0aG0gdGFibGVzLiBUaGlzIGZvbGxvd3MgdGhlIHJlY29tbWVuZGF0aW9uIGluCiAgICAgc2V2ZXJhbCBzdGFuZGFyZHMgdGhhdCBpdCBpcyBub3QgdXNlZCBpbiBuZXcgYXBwbGljYXRpb25zIGR1ZSB0bwogICAgIHNldmVyYWwgY3J5cHRvZ3JhcGhpYyB3ZWFrbmVzc2VzLiBGb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgcmVhc29ucwogICAgIHRoZSBNRDIgQVBJIGlzIHN0aWxsIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbXByZXNzaW9uIGlkIHRvIHtkMmksaTJkfV9TU0xfU0VTU0lPTiBzbyBpdCBpcyBjb3JyZWN0bHkgc2F2ZWQKICAgICBhbmQgcmVzdG9yZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVuYW1lIHVuaTJhc2MgYW5kIGFzYzJ1bmkgZnVuY3Rpb25zIHRvIE9QRU5TU0xfdW5pMmFzYyBhbmQKICAgICBPUEVOU1NMX2FzYzJ1bmkgY29uZGl0aW9uYWxseSBvbiBOZXR3YXJlIHBsYXRmb3JtcyB0byBhdm9pZCBhIG5hbWUKICAgICBjbGFzaC4KICAgICBbR3VlbnRlciA8bGlzdHNAZ2tudy5uZXQ+XQoKICAqKSBGaXggdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBjaGFpbiBidWlsZGluZyBjb2RlIHRvIHVzZSBYNTA5X3ZlcmlmeV9jZXJ0KCksCiAgICAgaXQgdXNlZCB0byBoYXZlIGFuIGFkLWhvYyBidWlsZGVyIHdoaWNoIHdhcyB1bmFibGUgdG8gY29wZSB3aXRoIGFueXRoaW5nCiAgICAgb3RoZXIgdGhhbiBhIHNpbXBsZSBjaGFpbi4KICAgICBbRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPiwgU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCBjaGVjayBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBzaWduYXR1cmVzIGluIFg1MDlfdmVyaWZ5X2NlcnQoKQogICAgIGJ5IGRlZmF1bHQgKGEgZmxhZyBjYW4gb3ZlcnJpZGUgdGhpcyk6IGl0IGp1c3Qgd2FzdGVzIHRpbWUgd2l0aG91dAogICAgIGFkZGluZyBhbnkgc2VjdXJpdHkuIEFzIGEgdXNlZnVsIHNpZGUgZWZmZWN0IHNlbGYgc2lnbmVkIHJvb3QgQ0FzCiAgICAgd2l0aCBub24tRklQUyBkaWdlc3RzIGFyZSBub3cgdXNhYmxlIGluIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBkdGxzMV9wcm9jZXNzX291dF9vZl9zZXFfbWVzc2FnZSgpIHRoZSBjaGVjayBpZiB0aGUgY3VycmVudCBtZXNzYWdlCiAgICAgaXMgYWxyZWFkeSBidWZmZXJlZCB3YXMgbWlzc2luZy4gRm9yIGV2ZXJ5IG5ldyBtZXNzYWdlIHdhcyBtZW1vcnkKICAgICBhbGxvY2F0ZWQsIGFsbG93aW5nIGFuIGF0dGFja2VyIHRvIHBlcmZvcm0gYW4gZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrCiAgICAgd2l0aCBzZW5kaW5nIG91dCBvZiBzZXEgaGFuZHNoYWtlIG1lc3NhZ2VzIHVudGlsIHRoZXJlIGlzIG5vIG1lbW9yeQogICAgIGxlZnQuIEFkZGl0aW9uYWxseSBldmVyeSBmdXR1cmUgbWVzc2VnZSB3YXMgYnVmZmVyZWQsIGV2ZW4gaWYgdGhlCiAgICAgc2VxdWVuY2UgbnVtYmVyIG1hZGUgbm8gc2Vuc2UgYW5kIHdvdWxkIGJlIHBhcnQgb2YgYW5vdGhlciBoYW5kc2hha2UuCiAgICAgU28gb25seSBtZXNzYWdlcyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgbGVzcyB0aGFuIDEwIGluIGFkdmFuY2Ugd2lsbCBiZQogICAgIGJ1ZmZlcmVkLiAgKENWRS0yMDA5LTEzNzgpCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4sIGRpc2NvdmVyZWQgYnkgRGFuaWVsIE1lbnR6XSAJCgogICopIFJlY29yZHMgYXJlIGJ1ZmZlcmVkIGlmIHRoZXkgYXJyaXZlIHdpdGggYSBmdXR1cmUgZXBvY2ggdG8gYmUKICAgICBwcm9jZXNzZWQgYWZ0ZXIgZmluaXNoaW5nIHRoZSBjb3JyZXNwb25kaW5nIGhhbmRzaGFrZS4gVGhlcmUgaXMKICAgICBjdXJyZW50bHkgbm8gbGltaXRhdGlvbiB0byB0aGlzIGJ1ZmZlciBhbGxvd2luZyBhbiBhdHRhY2tlciB0byBwZXJmb3JtCiAgICAgYSBET1MgYXR0YWNrIHdpdGggc2VuZGluZyByZWNvcmRzIHdpdGggZnV0dXJlIGVwb2NocyB1bnRpbCB0aGVyZSBpcyBubwogICAgIG1lbW9yeSBsZWZ0LiBUaGlzIHBhdGNoIGFkZHMgdGhlIHBxdWV1ZV9zaXplKCkgZnVuY3Rpb24gdG8gZGV0ZW1pbmUKICAgICB0aGUgc2l6ZSBvZiBhIGJ1ZmZlciBhbmQgbGltaXRzIHRoZSByZWNvcmQgYnVmZmVyIHRvIDEwMCBlbnRyaWVzLgogICAgIChDVkUtMjAwOS0xMzc3KQogICAgIFtSb2JpbiBTZWdnZWxtYW5uLCBkaXNjb3ZlcmVkIGJ5IERhbmllbCBNZW50el0gCQoKICAqKSBLZWVwIGEgY29weSBvZiBmcmFnLT5tc2dfaGVhZGVyLmZyYWdfbGVuIHNvIGl0IGNhbiBiZSB1c2VkIGFmdGVyIHRoZQogICAgIHBhcmVudCBzdHJ1Y3R1cmUgaXMgZnJlZWQuICAoQ1ZFLTIwMDktMTM3OSkKICAgICBbRGFuaWVsIE1lbnR6XSAJCgogICopIEhhbmRsZSBub24tYmxvY2tpbmcgSS9PIHByb3Blcmx5IGluIFNTTF9zaHV0ZG93bigpIGNhbGwuCiAgICAgW0RhcnJ5bCBNaWxlcyA8ZGFycnlsLW1haWxpbmdsaXN0c0BuZXRiYXVkcy5uZXQ+XQoKICAqKSBBZGQgMi41LjQuKiBPSURzCiAgICAgW0lseWEgTy4gPHZyZ2hvc3RAZ21haWwuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhrIGFuZCAwLjkuOGwgIFs1IE5vdiAyMDA5XQoKICAqKSBEaXNhYmxlIHJlbmVnb3RpYXRpb24gY29tcGxldGVseSAtIHRoaXMgZml4ZXMgYSBzZXZlcmUgc2VjdXJpdHkKICAgICBwcm9ibGVtIChDVkUtMjAwOS0zNTU1KSBhdCB0aGUgY29zdCBvZiBicmVha2luZyBhbGwKICAgICByZW5lZ290aWF0aW9uLiBSZW5lZ290aWF0aW9uIGNhbiBiZSByZS1lbmFibGVkIGJ5IHNldHRpbmcKICAgICBTU0wzX0ZMQUdTX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTiBpbiBzMy0+ZmxhZ3MgYXQKICAgICBydW4tdGltZS4gVGhpcyBpcyByZWFsbHkgbm90IHJlY29tbWVuZGVkIHVubGVzcyB5b3Uga25vdyB3aGF0CiAgICAgeW91J3JlIGRvaW5nLgogICAgIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGogYW5kIDAuOS44ayAgWzI1IE1hciAyMDA5XQoKICAqKSBEb24ndCBzZXQgdmFsIHRvIE5VTEwgd2hlbiBmcmVlaW5nIHVwIHN0cnVjdHVyZXMsIGl0IGlzIGZyZWVkIHVwIGJ5CiAgICAgdW5kZXJseWluZyBjb2RlLiBJZiBzaXplb2Yodm9pZCAqKSA+IHNpemVvZihsb25nKSB0aGlzIGNhbiByZXN1bHQgaW4KICAgICB6ZXJvaW5nIHBhc3QgdGhlIHZhbGlkIGZpZWxkLiAoQ1ZFLTIwMDktMDc4OSkKICAgICBbUGFvbG8gR2FuY2kgPFBhb2xvLkdhbmNpQEFkTm92dW0uQ0g+XQoKICAqKSBGaXggYnVnIHdoZXJlIHJldHVybiB2YWx1ZSBvZiBDTVNfU2lnbmVySW5mb192ZXJpZnlfY29udGVudCgpIHdhcyBub3QKICAgICBjaGVja2VkIGNvcnJlY3RseS4gVGhpcyB3b3VsZCBhbGxvdyBzb21lIGludmFsaWQgc2lnbmVkIGF0dHJpYnV0ZXMgdG8KICAgICBhcHBlYXIgdG8gdmVyaWZ5IGNvcnJlY3RseS4gKENWRS0yMDA5LTA1OTEpCiAgICAgW0l2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT5dCgogICopIFJlamVjdCBVbml2ZXJzYWxTdHJpbmcgYW5kIEJNUFN0cmluZyB0eXBlcyB3aXRoIGludmFsaWQgbGVuZ3Rocy4gVGhpcwogICAgIHByZXZlbnRzIGEgY3Jhc2ggaW4gQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSB3aGljaCBhc3N1bWVzIHRoZSBzdHJpbmdzIGhhdmUKICAgICBhIGxlZ2FsIGxlbmd0aC4gKENWRS0yMDA5LTA1OTApCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU2V0IFMvTUlNRSBzaWduaW5nIGFzIHRoZSBkZWZhdWx0IHB1cnBvc2UgcmF0aGVyIHRoYW4gc2V0dGluZyBpdCAKICAgICB1bmNvbmRpdGlvbmFsbHkuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBvdmVycmlkZSBpdCBhdCB0aGUgc3RvcmUKICAgICBsZXZlbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQZXJtaXQgcmVzdHJpY3RlZCByZWN1cnNpb24gb2YgQVNOMSBzdHJpbmdzLiBUaGlzIGlzIG5lZWRlZCBpbiBwcmFjdGljZQogICAgIHRvIGhhbmRsZSBzb21lIHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wcm92ZSBlZmZpY2llbmN5IG9mIG1lbV9nZXRzOiBkb24ndCBzZWFyY2ggd2hvbGUgYnVmZmVyIGVhY2ggdGltZQogICAgIGZvciBhICdcbicKICAgICBbSmVyZW15IFNoYXBpcm8gPGpuc2hhcGlyQHVzLmlibS5jb20+XQoKICAqKSBOZXcgLWhleCBvcHRpb24gZm9yIG9wZW5zc2wgcmFuZC4KICAgICBbTWF0dGhpZXUgSGVycmJdCgogICopIFByaW50IG91dCBVVEY4U3RyaW5nIGFuZCBOdW1lcmljU3RyaW5nIHdoZW4gcGFyc2luZyBBU04xLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgTnVtZXJpY1N0cmluZyB0eXBlIGZvciBuYW1lIGNvbXBvbmVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgQ0MgaW4gdGhlIGVudmlyb25tZW50IHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWNhbGx5IGNob3NlbgogICAgIGNvbXBpbGVyLiBOb3RlIHRoYXQgbm90aGluZyBpcyBkb25lIHRvIGVuc3VyZSBmbGFncyB3b3JrIHdpdGggdGhlCiAgICAgY2hvc2VuIGNvbXBpbGVyLgogICAgIFtCZW4gTGF1cmllXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGkgYW5kIDAuOS44aiAgWzA3IEphbiAyMDA5XQoKICAqKSBQcm9wZXJseSBjaGVjayBFVlBfVmVyaWZ5RmluYWwoKSBhbmQgc2ltaWxhciByZXR1cm4gdmFsdWVzCiAgICAgKENWRS0yMDA4LTUwNzcpLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXIsIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBFbmFibGUgVExTIGV4dGVuc2lvbnMgYnkgZGVmYXVsdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgdGhlIENISUwgZW5naW5lIHRvIGJlIGxvYWRlZCwgd2hldGhlciB0aGUgYXBwbGljYXRpb24gaXMKICAgICBtdWx0aXRocmVhZGVkIG9yIG5vdC4gKFRoaXMgZG9lcyBub3QgcmVsZWFzZSB0aGUgZGV2ZWxvcGVyIGZyb20gdGhlCiAgICAgb2JsaWdhdGlvbiB0byBzZXQgdXAgdGhlIGR5bmFtaWMgbG9ja2luZyBjYWxsYmFja3MuKQogICAgIFtTYW5kZXIgVGVtbWUgPHNhbmRlckB0ZW1tZS5uZXQ+XQoKICAqKSBVc2UgY29ycmVjdCBleGl0IGNvZGUgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gZGdzdCBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb247IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgUm9sYW5kIERpcmxld2FuZ2VyXQoKICAqKSBUd2VhayBDb25maWd1cmUgc28gdGhhdCB5b3UgbmVlZCB0byBzYXkgImV4cGVyaW1lbnRhbC1qcGFrZSIgdG8gZW5hYmxlCiAgICAgSlBBS0UsIGFuZCBuZWVkIHRvIHVzZSAtRE9QRU5TU0xfRVhQRVJJTUVOVEFMX0pQQUtFIGluIGFwcGxpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgZXhwZXJpbWVudGFsIEpQQUtFIHN1cHBvcnQsIGluY2x1ZGluZyBkZW1vIGF1dGhlbnRpY2F0aW9uIGluCiAgICAgc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTZXQgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdjNfYWRkcl9jYW5vbml6ZSgpLgogICAgIFtSb2IgQXVzdGVpbiA8c3JhQGhhY3Rybi5uZXQ+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgWE1QUCBTVEFSVFRMUyBpbiBzX2NsaWVudC4KICAgICBbUGhpbGlwIFBhZXBzIDxwaGlsaXBAZnJlZWJzZC5vcmc+XQoKICAqKSBDaGFuZ2UgdGhlIHNlcnZlci1zaWRlIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRyBiZWhhdmlvcgogICAgIHRvIGVuc3VyZSB0aGF0IGV2ZW4gd2l0aCB0aGlzIG9wdGlvbiwgb25seSBjaXBoZXJzdWl0ZXMgaW4gdGhlCiAgICAgc2VydmVyJ3MgcHJlZmVyZW5jZSBsaXN0IHdpbGwgYmUgYWNjZXB0ZWQuICAoTm90ZSB0aGF0IHRoZSBvcHRpb24KICAgICBhcHBsaWVzIG9ubHkgd2hlbiByZXN1bWluZyBhIHNlc3Npb24sIHNvIHRoZSBlYXJsaWVyIGJlaGF2aW9yIHdhcwogICAgIGp1c3QgYWJvdXQgdGhlIGFsZ29yaXRobSBjaG9pY2UgZm9yIHN5bW1ldHJpYyBjcnlwdG9ncmFwaHkuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44aCBhbmQgMC45LjhpICBbMTUgU2VwIDIwMDhdCgogICopIEZpeCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgaWYgYSBEVExTIHNlcnZlciByZWNlaXZlZAogICAgIENoYW5nZUNpcGhlclNwZWMgYXMgZmlyc3QgcmVjb3JkIChDVkUtMjAwOS0xMzg2KS4KICAgICBbUFIgIzE2NzldCgogICopIEZpeCBhIHN0YXRlIHRyYW5zaXRpdGlvbiBpbiBzM19zcnZyLmMgYW5kIGQxX3NydnIuYwogICAgICh3YXMgdXNpbmcgU1NMM19TVF9DV19DTE5UX0hFTExPX0IsIHNob3VsZCBiZSAuLi5fU1RfU1dfU1JWUl8uLi4pLgogICAgIFtOYWdlbmRyYSBNb2RhZHVndV0KCiAgKikgVGhlIGZpeCBpbiAwLjkuOGMgdGhhdCBzdXBwb3NlZGx5IGdvdCByaWQgb2YgdW5zYWZlCiAgICAgZG91YmxlLWNoZWNrZWQgbG9ja2luZyB3YXMgaW5jb21wbGV0ZSBmb3IgUlNBIGJsaW5kaW5nLAogICAgIGFkZHJlc3NpbmcganVzdCBvbmUgbGF5ZXIgb2Ygd2hhdCB0dXJucyBvdXQgdG8gaGF2ZSBiZWVuCiAgICAgZG91Ymx5IHVuc2FmZSB0cmlwbGUtY2hlY2tlZCBsb2NraW5nLgoKICAgICBTbyBub3cgZml4IHRoaXMgZm9yIHJlYWwgYnkgcmV0aXJpbmcgdGhlIE1PTlRfSEVMUEVSIG1hY3JvCiAgICAgaW4gY3J5cHRvL3JzYS9yc2FfZWF5LmMuCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWFyaXVzIFNjaGlsZGVyXQoKICAqKSBWYXJpb3VzIHByZWNhdXRpb25hcnkgbWVhc3VyZXM6CgogICAgIC0gQXZvaWQgc2l6ZV90IGludGVnZXIgb3ZlcmZsb3cgaW4gSEFTSF9VUERBVEUgKG1kMzJfY29tbW9uLmgpLgoKICAgICAtIEF2b2lkIGEgYnVmZmVyIG92ZXJmbG93IGluIGQyaV9TU0xfU0VTU0lPTigpIChzc2xfYXNuMS5jKS4KICAgICAgIChOQjogVGhpcyB3b3VsZCByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgc2VjcmV0IHNlc3Npb24gdGlja2V0IGtleQogICAgICAgdG8gZXhwbG9pdCwgaW4gd2hpY2ggY2FzZSB5b3UnZCBiZSBTT0wgZWl0aGVyIHdheS4pCgogICAgIC0gQ2hhbmdlIGJuX25pc3QuYyBzbyB0aGF0IGl0IHdpbGwgcHJvcGVybHkgaGFuZGxlIGlucHV0IEJJR05VTXMKICAgICAgIG91dHNpZGUgdGhlIGV4cGVjdGVkIHJhbmdlLgoKICAgICAtIEVuZm9yY2UgdGhlICdudW0nIGNoZWNrIGluIEJOX2RpdigpIChibl9kaXYuYykgZm9yIG5vbi1CTl9ERUJVRwogICAgICAgYnVpbGRzLgoKICAgICBbTmVlbCBNZWh0YSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvdyBlbmdpbmVzIHRvIGJlICJzb2Z0IGxvYWRlZCIgLSBpLmUuIG9wdGlvbmFsbHkgZG9uJ3QgZGllIGlmCiAgICAgdGhlIGxvYWQgZmFpbHMuIFVzZWZ1bCBmb3IgZGlzdHJvcy4KICAgICBbQmVuIExhdXJpZSBhbmQgdGhlIEZyZWVCU0QgdGVhbV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIExvY2FsIE1hY2hpbmUgS2V5c2V0IGF0dHJpYnV0ZSBpbiBQS0NTIzEyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBCTl9HRjJtX21vZF9hcnIoKSB0b3AtYml0IGNsZWFudXAgY29kZS4KICAgICBbSHVhbmcgWWluZ10KCiAgKikgRXhwYW5kIEVOR0lORSB0byBzdXBwb3J0IGVuZ2luZSBzdXBwbGllZCBTU0wgY2xpZW50IGNlcnRpZmljYXRlIGZ1bmN0aW9ucy4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgTG9naWNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBDcnlwdG9BUEkgRU5HSU5FIHRvIHN1cHBvcnQgdXNlIG9mIFJTQSBhbmQgRFNBIGtleXMgaGVsZCBpbiBXaW5kb3dzCiAgICAga2V5c3RvcmVzLiBTdXBwb3J0IGZvciBTU0wvVExTIGNsaWVudCBhdXRoZW50aWNhdGlvbiB0b28uCiAgICAgTm90IGNvbXBpbGVkIHVubGVzcyBlbmFibGUtY2FwaWVuZyBzcGVjaWZpZWQgdG8gQ29uZmlndXJlLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBMb2dpY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBYNTA5X0FUVFJJQlVURSBjcmVhdGlvbjogZG9udCBzZXQgYXR0cmlidXRlIHVzaW5nCiAgICAgQVNOMV9UWVBFX3NldDEgaWYgTUJTVFJJTkcgZmxhZyBzZXQuIFRoaXMgYnVnIHdvdWxkIGNyYXNoIGNlcnRhaW4KICAgICBhdHRyaWJ1dGUgY3JlYXRpb24gcm91dGluZXMgc3VjaCBhcyBjZXJ0aWZjYXRlIHJlcXVlc3RzIGFuZCBQS0NTIzEyCiAgICAgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhnIGFuZCAwLjkuOGggIFsyOCBNYXkgMjAwOF0KCiAgKikgRml4IGZsYXcgaWYgJ1NlcnZlciBLZXkgZXhjaGFuZ2UgbWVzc2FnZScgaXMgb21pdHRlZCBmcm9tIGEgVExTCiAgICAgaGFuZHNoYWtlIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjaWxlbnQgY3Jhc2ggYXMgZm91bmQgdXNpbmcgdGhlCiAgICAgQ29kZW5vbWljb24gVExTIHRlc3Qgc3VpdGUgKENWRS0yMDA4LTE2NzIpIAogICAgIFtTdGV2ZSBIZW5zb24sIE1hcmsgQ294XQoKICAqKSBGaXggZG91YmxlIGZyZWUgaW4gVExTIHNlcnZlciBuYW1lIGV4dGVuc2lvbnMgd2hpY2ggY291bGQgbGVhZCB0bwogICAgIGEgcmVtb3RlIGNyYXNoIGZvdW5kIGJ5IENvZGVub21pY29uIFRMUyB0ZXN0IHN1aXRlIChDVkUtMjAwOC0wODkxKSAKICAgICBbSm9lIE9ydG9uXQoKICAqKSBDbGVhciBlcnJvciBxdWV1ZSBpbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCkKCiAgICAgQ2xlYXIgdGhlIGVycm9yIHF1ZXVlIHRvIGVuc3VyZSB0aGF0IGVycm9yIGVudHJpZXMgbGVmdCBmcm9tCiAgICAgb2xkZXIgZnVuY3Rpb24gY2FsbHMgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBjb3JyZWN0IG9wZXJhdGlvbi4KICAgICBbTHV0eiBKYWVuaWNrZSwgRXJpayBkZSBDYXN0cm8gTG9wb10KCiAgKikgUmVtb3ZlIHJvb3QgQ0EgY2VydGlmaWNhdGVzIG9mIGNvbW1lcmNpYWwgQ0FzOgoKICAgICBUaGUgT3BlblNTTCBwcm9qZWN0IGRvZXMgbm90IHJlY29tbWVuZCBhbnkgc3BlY2lmaWMgQ0EgYW5kIGRvZXMgbm90CiAgICAgaGF2ZSBhbnkgcG9saWN5IHdpdGggcmVzcGVjdCB0byBpbmNsdWRpbmcgb3IgZXhjbHVkaW5nIGFueSBDQS4KICAgICBUaGVyZWZvcmUgaXQgZG9lcyBub3QgbWFrZSBhbnkgc2Vuc2UgdG8gc2hpcCBhbiBhcmJpdHJhcnkgc2VsZWN0aW9uCiAgICAgb2Ygcm9vdCBDQSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgT3BlblNTTCBzb2Z0d2FyZS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgUlNBIE9BRVAgcGF0Y2hlcyB0byBmaXggdHdvIHNlcGFyYXRlIGludmFsaWQgbWVtb3J5IHJlYWRzLgogICAgIFRoZSBmaXJzdCBvbmUgaW52b2x2ZXMgaW5wdXRzIHdoZW4gJ2x6ZXJvJyBpcyBncmVhdGVyIHRoYW4KICAgICAnU0hBX0RJR0VTVF9MRU5HVEgnIChpdCB3b3VsZCByZWFkIGFib3V0IFNIQV9ESUdFU1RfTEVOR1RIIGJ5dGVzCiAgICAgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgZnJvbSkuIFRoZSBzZWNvbmQgb25lIGludm9sdmVzIGlucHV0cyB3aGVyZQogICAgIHRoZSAnZGInIHNlY3Rpb24gY29udGFpbnMgbm90aGluZyBidXQgemVyb2VzICh0aGVyZSBpcyBhIG9uZS1ieXRlCiAgICAgaW52YWxpZCByZWFkIGFmdGVyIHRoZSBlbmQgb2YgJ2RiJykuCiAgICAgW0l2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT5dCgogICopIFBhcnRpYWwgYmFja3BvcnQgZnJvbSAwLjkuOS1kZXY6CgogICAgIEludHJvZHVjZSBibl9tdWxfbW9udCAoZGVkaWNhdGVkIE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24KICAgICBwcm9jZWR1cmUpIGFzIGEgY2FuZGlkYXRlIGZvciBCSUdOVU0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgogICAgIFdoaWxlIDAuOS45LWRldiB1c2VzIGFzc2VtYmxlciBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzLCBvbmx5CiAgICAgeDg2XzY0IGlzIGF2YWlsYWJsZSBieSBkZWZhdWx0IGhlcmUgaW4gdGhlIDAuOS44IGJyYW5jaCwgYW5kCiAgICAgMzItYml0IHg4NiBpcyBhdmFpbGFibGUgdGhyb3VnaCBhIGNvbXBpbGUtdGltZSBzZXR0aW5nLgoKICAgICBUbyB0cnkgdGhlIDMyLWJpdCB4ODYgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLCB1c2UgQ29uZmlndXJlCiAgICAgb3B0aW9uICJlbmFibGUtbW9udGFzbSIgKHdoaWNoIGV4aXN0cyBvbmx5IGZvciB0aGlzIGJhY2twb3J0KS4KCiAgICAgQXMgImVuYWJsZS1tb250YXNtIiBmb3IgMzItYml0IHg4NiBkaXNjbGFpbXMgY29kZSBzdGFiaWxpdHkKICAgICBhbnl3YXksIGluIHRoaXMgY29uc3RlbGxhdGlvbiB3ZSBhY3RpdmF0ZSBhZGRpdGlvbmFsIGNvZGUKICAgICBiYWNrcG9ydGVkIGZyb20gMC45LjktZGV2IGZvciBmdXJ0aGVyIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cywKICAgICBuYW1lbHkgQk5fZnJvbV9tb250Z29tZXJ5X3dvcmQuICAoVG8gZW5hYmxlIHRoaXMgb3RoZXJ3aXNlLAogICAgIGUuZy4geDg2XzY0LCB0cnkgIi1ETU9OVF9GUk9NX1dPUkRfX19OT05fREVGQVVMVF8wXzlfOF9CVUlMRCIuKQoKICAgICBbQW5keSBQb2x5YWtvdiAoYmFja3BvcnQgcGFydGlhbGx5IGJ5IEJvZG8gTW9lbGxlcildCgogICopIEFkZCBUTFMgc2Vzc2lvbiB0aWNrZXQgY2FsbGJhY2suIFRoaXMgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNldAogICAgIFRMUyB0aWNrZXQgY2lwaGVyIGFuZCBITUFDIGtleXMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBoYXJkY29kZWQgZml4ZWQKICAgICB2YWx1ZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBrZXkgcm9sbG92ZXIgZm9yIGV4YW1wbGUgd2hlcmUgc2V2ZXJhbCBrZXkKICAgICBzZXRzIG1heSBleGlzdCB3aXRoIGRpZmZlcmVudCBuYW1lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZXZlcnNlIEVOR0lORS1pbnRlcm5hbCBsb2dpYyBmb3IgY2FjaGluZyBkZWZhdWx0IEVOR0lORSBoYW5kbGVzLgogICAgIFRoaXMgd2FzIGJyb2tlbiB1bnRpbCBub3cgaW4gMC45LjggcmVsZWFzZXMsIHN1Y2ggdGhhdCB0aGUgb25seSB3YXkKICAgICBhIHJlZ2lzdGVyZWQgRU5HSU5FIGNvdWxkIGJlIHVzZWQgKGFzc3VtaW5nIGl0IGluaXRpYWxpc2VzCiAgICAgc3VjY2Vzc2Z1bGx5IG9uIHRoZSBob3N0KSB3YXMgdG8gZXhwbGljaXRseSBzZXQgaXQgYXMgdGhlIGRlZmF1bHQKICAgICBmb3IgdGhlIHJlbGV2YW50IGFsZ29yaXRobXMuIFRoaXMgaXMgaW4gY29udHJhZGljdGlvbiB3aXRoIDAuOS43CiAgICAgYmVoYXZpb3VyIGFuZCB0aGUgZG9jdW1lbnRhdGlvbi4gV2l0aCB0aGlzIGZpeCwgd2hlbiBhbiBFTkdJTkUgaXMKICAgICByZWdpc3RlcmVkIGludG8gYSBnaXZlbiBhbGdvcml0aG0ncyB0YWJsZSBvZiBpbXBsZW1lbnRhdGlvbnMsIHRoZQogICAgICd1cHRvZGF0ZScgZmxhZyBpcyByZXNldCBzbyB0aGF0IGF1dG8tZGlzY292ZXJ5IHdpbGwgYmUgdXNlZCBuZXh0CiAgICAgdGltZSBhIG5ldyBjb250ZXh0IGZvciB0aGF0IGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZWxlY3QgYW4KICAgICBpbXBsZW1lbnRhdGlvbi4KICAgICBbSWFuIExpc3RlciAodHdlYWtlZCBieSBHZW9mZiBUaG9ycGUpXQoKICAqKSBCYWNrcG9ydCBvZiBDTVMgY29kZSB0byBPcGVuU1NMIDAuOS44LiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgMC45LjkKICAgICBpbXBsZW1lbnRpb24gaW4gdGhlIGZvbGxvd2luZyB3YXlzOgoKICAgICBMYWNrIG9mIEVWUF9QS0VZX0FTTjFfTUVUSE9EIG1lYW5zIGFsZ29yaXRobSBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUKICAgICBoYXJkIGNvZGVkLgoKICAgICBMYWNrIG9mIEJFUiBzdHJlYW1pbmcgc3VwcG9ydCBtZWFucyBvbmUgcGFzcyBzdHJlYW1pbmcgcHJvY2Vzc2luZyBpcwogICAgIG9ubHkgc3VwcG9ydGVkIGlmIGRhdGEgaXMgZGV0YWNoZWQ6IHNldHRpbmcgdGhlIHN0cmVhbWluZyBmbGFnIGlzCiAgICAgaWdub3JlZCBmb3IgZW1iZWRkZWQgY29udGVudC4KCiAgICAgQ01TIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQKICAgICB3aXRoIHRoZSBlbmFibGUtY21zIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSB0aGUgR01QIGVuZ2luZSBnbHVlIHRvIGRvIGRpcmVjdCBjb3BpZXMgYmV0d2VlbiBCSUdOVU0gYW5kCiAgICAgbXB6X3Qgd2hlbiBvcGVuc3NsIGFuZCBHTVAgdXNlIHRoZSBzYW1lIGxpbWIgc2l6ZS4gT3RoZXJ3aXNlIHRoZQogICAgIGV4aXN0aW5nICJjb252ZXJzaW9uIHZpYSBhIHRleHQgc3RyaW5nIGV4cG9ydCIgdHJpY2sgaXMgc3RpbGwgdXNlZC4KICAgICBbUGF1bCBTaGVlciA8cGF1bHNoZWVyQGdtYWlsLmNvbT5dCgogICopIFpsaWIgY29tcHJlc3Npb24gQklPLiBUaGlzIGlzIGEgZmlsdGVyIEJJTyB3aGljaCBjb21wcmVzc2VkIGFuZAogICAgIHVuY29tcHJlc3NlcyBhbnkgZGF0YSBwYXNzZWQgdGhyb3VnaCBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQUVTX3dyYXBfa2V5KCkgYW5kIEFFU191bndyYXBfa2V5KCkgZnVuY3Rpb25zIHRvIGltcGxlbWVudAogICAgIFJGQzMzOTQgY29tcGF0aWJsZSBBRVMga2V5IHdyYXBwaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgQVNOMSBzdHJ1Y3R1cmVzLiBBU04xX1NUUklOR19zZXQwKCk6CiAgICAgc2V0cyBzdHJpbmcgZGF0YSB3aXRob3V0IGNvcHlpbmcuIFg1MDlfQUxHT1Jfc2V0MCgpIGFuZAogICAgIFg1MDlfQUxHT1JfZ2V0MCgpOiBzZXQgYW5kIHJldHJpZXZlIFg1MDlfQUxHT1IgKEFsZ29yaXRobUlkZW50aWZpZXIpCiAgICAgZGF0YS4gQXR0cmlidXRlIGZ1bmN0aW9uIFg1MDlhdF9nZXQwX2RhdGFfYnlfT0JKKCk6IHJldHJpZXZlcyBkYXRhCiAgICAgZnJvbSBhbiBYNTA5X0FUVFJJQlVURSBzdHJ1Y3R1cmUgb3B0aW9uYWxseSBjaGVja2luZyBpdCBvY2N1cnMgb25seQogICAgIG9uY2UuIEFTTjFfVFlQRV9zZXQxKCk6IHNldCBhbmQgQVNOMV9UWVBFIHN0cnVjdHVyZSBjb3B5aW5nIHN1cHBsaWVkCiAgICAgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQk4gZmxhZyBoYW5kbGluZyBpbiBSU0FfZWF5X21vZF9leHAoKSBhbmQgQk5fTU9OVF9DVFhfc2V0KCkKICAgICB0byBnZXQgdGhlIGV4cGVjdGVkIEJOX0ZMR19DT05TVFRJTUUgYmVoYXZpb3IuCiAgICAgW0JvZG8gTW9lbGxlciAoR29vZ2xlKV0KICAKICAqKSBOZXR3YXJlIHN1cHBvcnQ6CgogICAgIC0gZml4ZWQgd3JvbmcgdXNhZ2Ugb2YgaW9jdGxzb2NrZXQoKSB3aGVuIGJ1aWxkIGZvciBMSUJDIEJTRCBzb2NrZXRzCiAgICAgLSBmaXhlZCBkb190ZXN0cy5wbCB0byBydW4gdGhlIHRlc3Qgc3VpdGUgd2l0aCBDTElCIGJ1aWxkcyB0b28gKENMSUJfT1BUKQogICAgIC0gYWRkZWQgc29tZSBtb3JlIHRlc3RzIHRvIGRvX3Rlc3RzLnBsCiAgICAgLSBmaXhlZCBSdW5uaW5nUHJvY2VzcyB1c2FnZSBzbyB0aGF0IGl0IHdvcmtzIHdpdGggbmV3ZXIgTElCQyBOREtzIHRvbwogICAgIC0gcmVtb3ZlZCB1c2FnZSBvZiBCTl9MTE9ORyBmb3IgQ0xJQiBidWlsZHMgdG8gYXZvaWQgcnVudGltZSBkZXBlbmRlbmN5CiAgICAgLSBhZGRlZCBuZXcgQ29uZmlndXJlIHRhcmdldHMgbmV0d2FyZS1jbGliLWJzZHNvY2ssIG5ldHdhcmUtY2xpYi1nY2MsCiAgICAgICBuZXR3YXJlLWNsaWItYnNkc29jay1nY2MsIG5ldHdhcmUtbGliYy1ic2Rzb2NrLWdjYwogICAgIC0gdmFyaW91cyBjaGFuZ2VzIHRvIG5ldHdhcmUucGwgdG8gZW5hYmxlIGdjYy1jcm9zcyBidWlsZHMgb24gV2luMzIKICAgICAgIHBsYXRmb3JtCiAgICAgLSBjaGFuZ2VkIGNyeXB0by9iaW8vYl9zb2NrLmMgdG8gd29yayB3aXRoIG1hY3JvIGZ1bmN0aW9ucyAoQ0xJQiBCU0QpCiAgICAgLSB2YXJpb3VzIGNoYW5nZXMgdG8gZml4IG1pc3NpbmcgcHJvdG90eXBlIHdhcm5pbmdzCiAgICAgLSBmaXhlZCB4ODZuYXNtLnBsIHRvIGNyZWF0ZSBjb3JyZWN0IGFzbSBmaWxlcyBmb3IgTkFTTSBDT0ZGIG91dHB1dAogICAgIC0gYWRkZWQgQUVTLCBXSElSTFBPT0wgYW5kIENQVUlEIGFzc2VtYmxlciBjb2RlIHRvIGJ1aWxkIGZpbGVzCiAgICAgLSBhZGRlZCBtaXNzaW5nIEFFUyBhc3NlbWJsZXIgbWFrZSBydWxlcyB0byBtazFtZi5wbAogICAgIC0gZml4ZWQgb3JkZXIgb2YgaW5jbHVkZXMgaW4gYXBwcy9vY3NwLmMgc28gdGhhdCBlX29zLmggc2V0dGluZ3MgYXBwbHkKICAgICBbR3VlbnRlciBLbmF1ZiA8ZWZsYXNoQGdteC5uZXQ+XQoKICAqKSBJbXBsZW1lbnQgY2VydGlmaWNhdGUgc3RhdHVzIHJlcXVlc3QgVExTIGV4dGVuc2lvbiBkZWZpbmVkIGluIFJGQzM1NDYuCiAgICAgQSBjbGllbnQgY2FuIHNldCB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBhbmQgcmVjZWl2ZSB0aGUgZW5jb2RlZAogICAgIE9DU1AgcmVzcG9uc2UgdmlhIGEgY2FsbGJhY2suIEEgc2VydmVyIGNhbiBxdWVyeSB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycwogICAgIGFuZCBzZXQgdGhlIGVuY29kZWQgT0NTUCByZXNwb25zZSBpbiB0aGUgY2FsbGJhY2suIEFkZCBzaW1wbGlmaWVkIGV4YW1wbGVzCiAgICAgdG8gc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZiBhbmQgMC45LjhnICBbMTkgT2N0IDIwMDddCgogICopIEZpeCB2YXJpb3VzIGJ1Z3M6CiAgICAgKyBCaW5hcnkgaW5jb21wYXRpYmlsaXR5IG9mIHNzbF9jdHhfc3Qgc3RydWN0dXJlCiAgICAgKyBEVExTIGludGVyb3BlcmF0aW9uIHdpdGggbm9uLWNvbXBsaWFudCBzZXJ2ZXJzCiAgICAgKyBEb24ndCBjYWxsIGdldF9zZXNzaW9uX2NiKCkgd2l0aG91dCBwcm9wb3NlZCBzZXNzaW9uCiAgICAgKyBGaXggaWE2NCBhc3NlbWJsZXIgY29kZQogICAgIFtBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZSBhbmQgMC45LjhmICBbMTEgT2N0IDIwMDddCgogICopIERUTFMgSGFuZHNoYWtlIG92ZXJoYXVsLiBUaGVyZSB3ZXJlIGxvbmdzdGFuZGluZyBpc3N1ZXMgd2l0aAogICAgIE9wZW5TU0wgRFRMUyBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2VyZSBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICBSRkMgNDM0NyBjb21wbGlhbnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggT3BlblNTTCBzZXJ2ZXIuCiAgICAgVW5mb3J0dW5hdGVseSBqdXN0IGZpeGluZyB0aGVzZSBpbmNvbXBhdGliaWxpdGllcyB3b3VsZCAiY3V0IG9mZiIKICAgICBwcmUtMC45LjhmIGNsaWVudHMuIFRvIGFsbG93IGZvciBoYXNzbGUgZnJlZSB1cGdyYWRlIHBvc3QtMC45LjhlCiAgICAgc2VydmVyIGtlZXBzIHRvbGVyYXRpbmcgbm9uIFJGQyBjb21wbGlhbnQgc3ludGF4LiBUaGUgb3Bwb3NpdGUgaXMKICAgICBub3QgdHJ1ZSwgMC45LjhmIGNsaWVudCBjYW4gbm90IGNvbW11bmljYXRlIHdpdGggZWFybGllciBzZXJ2ZXIuCiAgICAgVGhpcyB1cGRhdGUgZXZlbiBhZGRyZXNzZXMgQ1ZFLTIwMDctNDk5NS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQ2hhbmdlcyB0byBhdm9pZCBuZWVkIGZvciBmdW5jdGlvbiBjYXN0cyBpbiBPcGVuU1NMOiBzb21lIGNvbXBpbGVycwogICAgIChnY2MgNC4yIGFuZCBsYXRlcikgcmVqZWN0IHRoZWlyIHVzZS4KICAgICBbS3VydCBSb2Vja3ggPGt1cnRAcm9lY2t4LmJlPiwgUGV0ZXIgSGFydGxleSA8cGRoQHV0dGVyLmNoYW9zLm9yZy51az4sCiAgICAgIFN0ZXZlIEhlbnNvbl0KICAKICAqKSBBZGQgUkZDNDUwNyBzdXBwb3J0IHRvIE9wZW5TU0wuIFRoaXMgaW5jbHVkZXMgdGhlIGNvcnJlY3Rpb25zIGluCiAgICAgUkZDNDUwN2Jpcy4gVGhlIGVuY3J5cHRlZCB0aWNrZXQgZm9ybWF0IGlzIGFuIGVuY3J5cHRlZCBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlLCB0aGF0IHdheSBuZXcgc2Vzc2lvbiBmZWF0dXJlcyBhcmUgYXV0b21hdGljYWxseQogICAgIHN1cHBvcnRlZC4KCiAgICAgSWYgYSBjbGllbnQgYXBwbGljYXRpb24gY2FjaGVzIHNlc3Npb24gaW4gYW4gU1NMX1NFU1NJT04gc3RydWN0dXJlCiAgICAgc3VwcG9ydCBpcyB0cmFuc3BhcmVudCBiZWNhdXNlIHRpY2tldHMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTi4KICAgICAKICAgICBUaGUgU1NMX0NUWCBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMga2V5cyBmb3IgdGlja2V0CiAgICAgcHJvdGVjdGlvbiBpbiBzZXJ2ZXJzIHNvIGFnYWluIHN1cHBvcnQgc2hvdWxkIGJlIHBvc3NpYmxlCiAgICAgd2l0aCBubyBhcHBsaWNhdGlvbiBtb2RpZmljYXRpb24uCgogICAgIElmIGEgY2xpZW50IG9yIHNlcnZlciB3aXNoZXMgdG8gZGlzYWJsZSBSRkM0NTA3IHN1cHBvcnQgdGhlbiB0aGUgb3B0aW9uCiAgICAgU1NMX09QX05PX1RJQ0tFVCBjYW4gYmUgc2V0LgoKICAgICBBZGQgYSBUTFMgZXh0ZW5zaW9uIGRlYnVnZ2luZyBjYWxsYmFjayB0byBhbGxvdyB0aGUgY29udGVudHMgb2YgYW55IGNsaWVudAogICAgIG9yIHNlcnZlciBleHRlbnNpb25zIHRvIGJlIGV4YW1pbmVkLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgVExTIGV4dGVuc2lvbnMsIHNwZWNpZmljYWxseSBmb3IgdGhlIHNlcnZlcl9uYW1lCiAgICAgZXh0ZW5zaW9uIHNvIGZhci4gIFRoZSBTU0xfU0VTU0lPTiwgU1NMX0NUWCwgYW5kIFNTTCBkYXRhIHN0cnVjdHVyZXMgbm93CiAgICAgaGF2ZSBuZXcgbWVtYmVycyBmb3IgYSBob3N0IG5hbWUuICBUaGUgU1NMIGRhdGEgc3RydWN0dXJlIGhhcyBhbgogICAgIGFkZGl0aW9uYWwgbWVtYmVyIFNTTF9DVFggKmluaXRpYWxfY3R4IHNvIHRoYXQgbmV3IHNlc3Npb25zIGNhbiBiZQogICAgIHN0b3JlZCBpbiB0aGF0IGNvbnRleHQgdG8gYWxsb3cgZm9yIHNlc3Npb24gcmVzdW1wdGlvbiwgZXZlbiBhZnRlciB0aGUKICAgICBTU0wgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBuZXcgU1NMX0NUWCBpbiByZWFjdGlvbiB0byBhIGNsaWVudCdzCiAgICAgc2VydmVyX25hbWUgZXh0ZW5zaW9uLgoKICAgICBOZXcgZnVuY3Rpb25zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWUoKQogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWVfdHlwZSgpCiAgICAgICAgIFNTTF9zZXRfU1NMX0NUWCgpCgogICAgIE5ldyBDVFJMIGNvZGVzIGFuZCBtYWNyb3MgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9DQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0FSRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9IT1NUTkFNRSAgICAgICAgICAgLSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQoKICAgICBvcGVuc3NsIHNfY2xpZW50IGhhcyBhIG5ldyAnLXNlcnZlcm5hbWUgLi4uJyBvcHRpb24uCgogICAgIG9wZW5zc2wgc19zZXJ2ZXIgaGFzIG5ldyBvcHRpb25zICctc2VydmVybmFtZV9ob3N0IC4uLicsICctY2VydDIgLi4uJywKICAgICAnLWtleTIgLi4uJywgJy1zZXJ2ZXJuYW1lX2ZhdGFsJyAoc3ViamVjdCB0byBjaGFuZ2UpLiAgVGhpcyBhbGxvd3MKICAgICB0ZXN0aW5nIHRoZSBIb3N0TmFtZSBleHRlbnNpb24gZm9yIGEgc3BlY2lmaWMgc2luZ2xlIGhvc3QgbmFtZSAoJy1jZXJ0JwogICAgIGFuZCAnLWtleScgcmVtYWluIGZhbGxiYWNrcyBmb3IgaGFuZHNoYWtlcyB3aXRob3V0IEhvc3ROYW1lCiAgICAgbmVnb3RpYXRpb24pLiAgSWYgdGhlIHVucmVjb2duaW56ZWRfbmFtZSBhbGVydCBoYXMgdG8gYmUgc2VudCwgdGhpcyBieQogICAgIGRlZmF1bHQgaXMgYSB3YXJuaW5nOyBpdCBiZWNvbWVzIGZhdGFsIHdpdGggdGhlICctc2VydmVybmFtZV9mYXRhbCcKICAgICBvcHRpb24uCgogICAgIFtQZXRlciBTeWx2ZXN0ZXIsICBSZW15IEFsbGFpcywgQ2hyaXN0b3BoZSBSZW5vdSwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQUVTIGFuZCBTU0UyIGFzc2VtYmx5IGxhbmd1YWdlIHN1cHBvcnQgdG8gVkMrKyBidWlsZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNaXRpZ2F0ZSBhdHRhY2sgb24gZmluYWwgc3VidHJhY3Rpb24gaW4gTW9udGdvbWVyeSByZWR1Y3Rpb24uCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEZpeCBjcnlwdG8vZWMvZWNfbXVsdC5jIHRvIHdvcmsgcHJvcGVybHkgd2l0aCBzY2FsYXJzIG9mIHZhbHVlIDAKICAgICAod2hpY2ggcHJldmlvdXNseSBjYXVzZWQgYW4gaW50ZXJuYWwgZXJyb3IpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNxdWVlemUgYW5vdGhlciAxMCUgb3V0IG9mIElHRSBtb2RlIHdoZW4gaW4gIT0gb3V0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBRVMgSUdFIG1vZGUgc3BlZWR1cC4KICAgICBbRGVhbiBHYXVkZXQgKEdvb2dsZSldCgogICopIEFkZCB0aGUgS29yZWFuIHN5bW1ldHJpYyAxMjgtYml0IGNpcGhlciBTRUVEIChzZWUKICAgICBodHRwOi8vd3d3Lmtpc2Eub3Iua3Iva2lzYS9zZWVkL2pzcC9zZWVkX2VuZy5qc3ApIGFuZAogICAgIGFkZCBTRUVEIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0MTYyOgoKICAgICAgICBUTFNfUlNBX1dJVEhfU0VFRF9DQkNfU0hBICAgICAgPSAgIlNFRUQtU0hBIgogICAgICAgIFRMU19ESEVfRFNTX1dJVEhfU0VFRF9DQkNfU0hBICA9ICAiREhFLURTUy1TRUVELVNIQSIKICAgICAgICBUTFNfREhFX1JTQV9XSVRIX1NFRURfQ0JDX1NIQSAgPSAgIkRIRS1SU0EtU0VFRC1TSEEiCiAgICAgICAgVExTX0RIX2Fub25fV0lUSF9TRUVEX0NCQ19TSEEgID0gICJBREgtU0VFRC1TSEEiCgogICAgIFRvIG1pbmltaXplIGNoYW5nZXMgYmV0d2VlbiBwYXRjaGxldmVscyBpbiB0aGUgT3BlblNTTCAwLjkuOAogICAgIHNlcmllcywgU0VFRCByZW1haW5zIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24gdW5sZXNzIE9wZW5TU0wKICAgICBpcyBjb25maWd1cmVkIHdpdGggJ2VuYWJsZS1zZWVkJy4KICAgICBbS0lTQSwgQm9kbyBNb2VsbGVyXQoKICAqKSBNaXRpZ2F0ZSBicmFuY2ggcHJlZGljdGlvbiBhdHRhY2tzLCB3aGljaCBjYW4gYmUgcHJhY3RpY2FsIGlmIGEKICAgICBzaW5nbGUgcHJvY2Vzc29yIGlzIHNoYXJlZCwgYWxsb3dpbmcgYSBzcHkgcHJvY2VzcyB0byBleHRyYWN0CiAgICAgaW5mb3JtYXRpb24uICBGb3IgZGV0YWlsZWQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiwgc2VlCiAgICAgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDA3LzAzOSAoTy4gQWNpaWNtZXosIFMuIEd1ZXJvbiwKICAgICBKLi1QLiBTZWlmZXJ0LCAiTmV3IEJyYW5jaCBQcmVkaWN0aW9uIFZ1bG5lcmFiaWxpdGllcyBpbiBPcGVuU1NMCiAgICAgYW5kIE5lY2Vzc2FyeSBTb2Z0d2FyZSBDb3VudGVybWVhc3VyZXMiKS4gIFRoZSBjb3JlIG9mIHRoZSBjaGFuZ2UKICAgICBhcmUgbmV3IHZlcnNpb25zIEJOX2Rpdl9ub19icmFuY2goKSBhbmQKICAgICBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2goKSBvZiBCTl9kaXYoKSBhbmQgQk5fbW9kX2ludmVyc2UoKSwKICAgICByZXNwZWN0aXZlbHksIHdoaWNoIGFyZSBzbG93ZXIsIGJ1dCBhdm9pZCB0aGUgc2VjdXJpdHktcmVsZXZhbnQKICAgICBjb25kaXRpb25hbCBicmFuY2hlcy4gIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGNhbGxlZCBieSBCTl9kaXYoKQogICAgIGFuZCBCTl9tb2RfaW52ZXJzZSgpIGlmIHRoZSBmbGFnIEJOX0ZMR19DT05TVFRJTUUgaXMgc2V0IGZvciBvbmUKICAgICBvZiB0aGUgaW5wdXQgQklHTlVNcy4gIEFsc28sIEJOX2lzX2JpdF9zZXQoKSBoYXMgYmVlbiBjaGFuZ2VkIHRvCiAgICAgcmVtb3ZlIGEgY29uZGl0aW9uYWwgYnJhbmNoLgoKICAgICBCTl9GTEdfQ09OU1RUSU1FIGlzIHRoZSBuZXcgbmFtZSBmb3IgdGhlIHByZXZpb3VzCiAgICAgQk5fRkxHX0VYUF9DT05TVFRJTUUgZmxhZywgc2luY2UgaXQgbm93IGFmZmVjdHMgbW9yZSB0aGFuIGp1c3QKICAgICBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLiAgKFNpbmNlIE9wZW5TU0wgMC45LjdoLCBzZXR0aW5nIHRoaXMgZmxhZwogICAgIGluIHRoZSBleHBvbmVudCBjYXVzZXMgQk5fbW9kX2V4cF9tb250KCkgdG8gdXNlIHRoZSBhbHRlcm5hdGl2ZQogICAgIGltcGxlbWVudGF0aW9uIGluIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKS4pICBUaGUgb2xkIG5hbWUKICAgICByZW1haW5zIGFzIGEgZGVwcmVjYXRlZCBhbGlhcy4KCiAgICAgU2ltaWxhcnksIFJTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUgaXMgcmVwbGFjZWQgYnkgYSBtb3JlIGdlbmVyYWwKICAgICBSU0FfRkxBR19OT19DT05TVFRJTUUgZmxhZyBzaW5jZSB0aGUgUlNBIGltcGxlbWVudGF0aW9uIG5vdyB1c2VzCiAgICAgY29uc3RhbnQtdGltZSBpbXBsZW1lbnRhdGlvbnMgZm9yIG1vcmUgdGhhbiBqdXN0IGV4cG9uZW50aWF0aW9uLgogICAgIEhlcmUgdG9vIHRoZSBvbGQgbmFtZSBpcyBrZXB0IGFzIGEgZGVwcmVjYXRlZCBhbGlhcy4KCiAgICAgQk5fQkxJTkRJTkdfbmV3KCkgd2lsbCBub3cgdXNlIEJOX2R1cCgpIGZvciB0aGUgbW9kdWx1cyBzbyB0aGF0CiAgICAgdGhlIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSBnZXRzIGFuIGluZGVwZW5kZW50IGNvcHkgb2YgdGhlCiAgICAgbW9kdWx1cy4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcHJldmlvdXMgIkJJR05VTSAqbSIgYXJndW1lbnQgdG8KICAgICBCTl9CTElORElOR19uZXcoKSBhbmQgdG8gQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKCkgbm93CiAgICAgZXNzZW50aWFsbHkgYmVjb21lcyAiY29uc3QgQklHTlVNICptIiwgYWx0aG91Z2ggd2UgY2FuJ3QgYWN0dWFsbHkKICAgICBjaGFuZ2UgdGhpcyBpbiB0aGUgaGVhZGVyIGZpbGUgYmVmb3JlIDAuOS45LiAgSXQgYWxsb3dzCiAgICAgUlNBX3NldHVwX2JsaW5kaW5nKCkgdG8gdXNlIEJOX3dpdGhfZmxhZ3MoKSBvbiB0aGUgbW9kdWx1cyB0bwogICAgIGVuYWJsZSBCTl9GTEdfQ09OU1RUSU1FLgoKICAgICBbTWF0dGhldyBEIFdvb2QgKEludGVsIENvcnApXQoKICAqKSBJbiB0aGUgU1NML1RMUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIGJlIHN0cmljdCBhYm91dCBzZXNzaW9uIElECiAgICAgY29udGV4dCBtYXRjaGluZyAod2hpY2ggbWF0dGVycyBpZiBhbiBhcHBsaWNhdGlvbiB1c2VzIGEgc2luZ2xlCiAgICAgZXh0ZXJuYWwgY2FjaGUgZm9yIGRpZmZlcmVudCBwdXJwb3NlcykuICBQcmV2aW91c2x5LAogICAgIG91dC1vZi1jb250ZXh0IHJldXNlIHdhcyBmb3JiaWRkZW4gb25seSBpZiBTU0xfVkVSSUZZX1BFRVIgd2FzCiAgICAgc2V0LiAgVGhpcyBkaWQgZW5zdXJlIHN0cmljdCBjbGllbnQgdmVyaWZpY2F0aW9uLCBidXQgbWVhbnQgdGhhdCwKICAgICB3aXRoIGFwcGxpY2F0aW9ucyB1c2luZyBhIHNpbmdsZSBleHRlcm5hbCBjYWNoZSBmb3IgcXVpdGUKICAgICBkaWZmZXJlbnQgcmVxdWlyZW1lbnRzLCBjbGllbnRzIGNvdWxkIGNpcmN1bXZlbnQgY2lwaGVyc3VpdGUKICAgICByZXN0cmljdGlvbnMgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBJRCBjb250ZXh0IGJ5IHN0YXJ0aW5nIGEgc2Vzc2lvbgogICAgIGluIGEgZGlmZmVyZW50IGNvbnRleHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSAiIWVOVUxMIiBpbiBTU0xfREVGQVVMVF9DSVBIRVJfTElTVCB0byBtYWtlIHN1cmUgdGhhdAogICAgIGEgY2lwaGVyc3VpdGUgc3RyaW5nIHN1Y2ggYXMgIkRFRkFVTFQ6UlNBIiBjYW5ub3QgZW5hYmxlCiAgICAgYXV0aGVudGljYXRpb24tb25seSBjaXBoZXJzdWl0ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRoZSBTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKCkgZml4IENWRS0yMDA2LTM3Mzggd2hpY2ggd2FzCiAgICAgbm90IGNvbXBsZXRlIGFuZCBjb3VsZCBsZWFkIHRvIGEgcG9zc2libGUgc2luZ2xlIGJ5dGUgb3ZlcmZsb3cKICAgICAoQ1ZFLTIwMDctNTEzNSkgW0JlbiBMYXVyaWVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZCBhbmQgMC45LjhlICBbMjMgRmViIDIwMDddCgogICopIFNpbmNlIEFFUzEyOCBhbmQgQUVTMjU2IChhbmQgc2ltaWxhcmx5IENhbWVsbGlhMTI4IGFuZAogICAgIENhbWVsbGlhMjU2KSBzaGFyZSBhIHNpbmdsZSBtYXNrIGJpdCBpbiB0aGUgbG9naWMgb2YKICAgICBzc2wvc3NsX2NpcGguYywgdGhlIGNvZGUgZm9yIG1hc2tpbmcgb3V0IGRpc2FibGVkIGNpcGhlcnMgbmVlZHMgYQogICAgIGtsdWRnZSB0byB3b3JrIHByb3Blcmx5IGlmIEFFUzEyOCBpcyBhdmFpbGFibGUgYW5kIEFFUzI1NiBpc24ndAogICAgIChvciBpZiBDYW1lbGxpYTEyOCBpcyBhdmFpbGFibGUgYW5kIENhbWVsbGlhMjU2IGlzbid0KS4KICAgICBbVmljdG9yIER1Y2hvdm5pXQoKICAqKSBGaXggdGhlIEJJVCBTVFJJTkcgZW5jb2RpbmcgZ2VuZXJhdGVkIGJ5IGNyeXB0by9lYy9lY19hc24xLmMKICAgICAod2l0aGluIGkyZF9FQ1ByaXZhdGVLZXksIGkyZF9FQ1BLUGFyYW1ldGVycywgaTJkX0VDUGFyYW1ldGVycyk6CiAgICAgV2hlbiBhIHBvaW50IG9yIGEgc2VlZCBpcyBlbmNvZGVkIGluIGEgQklUIFNUUklORywgd2UgbmVlZCB0bwogICAgIHByZXZlbnQgdGhlIHJlbW92YWwgb2YgdHJhaWxpbmcgemVybyBiaXRzIHRvIGdldCB0aGUgcHJvcGVyIERFUgogICAgIGVuY29kaW5nLiAgKEJ5IGRlZmF1bHQsIGNyeXB0by9hc24xL2FfYml0c3RyLmMgYXNzdW1lcyB0aGUgY2FzZQogICAgIG9mIGEgTmFtZWRCaXRMaXN0LCBmb3Igd2hpY2ggdHJhaWxpbmcgMCBiaXRzIG5lZWQgdG8gYmUgcmVtb3ZlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSGF2ZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0b2xlcmF0ZSAibWlzbWF0Y2hlZCIgcmVjb3JkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiB3aGlsZSByZWNlaXZpbmcgQ2xpZW50SGVsbG8gZXZlbiBpZiB0aGUKICAgICBDbGllbnRIZWxsbyBpcyBmcmFnbWVudGVkLiAgKFRoZSBzZXJ2ZXIgY2FuJ3QgaW5zaXN0IG9uIHRoZQogICAgIHBhcnRpY3VsYXIgcHJvdG9jb2wgdmVyc2lvbiBpdCBoYXMgY2hvc2VuIGJlZm9yZSB0aGUgU2VydmVySGVsbG8KICAgICBtZXNzYWdlIGhhcyBpbmZvcm1lZCB0aGUgY2xpZW50IGFib3V0IGhpcyBjaG9pY2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBSRkMgMzc3OSBzdXBwb3J0LgogICAgIFtSb2IgQXVzdGVpbiBmb3IgQVJJTiwgQmVuIExhdXJpZV0KCiAgKikgTG9hZCBlcnJvciBjb2RlcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluc3RlYWQgb2YgdXNpbmcgYQogICAgIHN0YXRpYyB2YXJpYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSBjbGVhbmx5IHVubG9hZGVkIGFuZCByZWxvYWRlZC4KICAgICBJbXByb3ZlIGhlYWRlciBmaWxlIGZ1bmN0aW9uIG5hbWUgcGFyc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBleHRlbmQgU01UUCBhbmQgSU1BUCBwcm90b2NvbCBlbXVsYXRpb24gaW4gc19jbGllbnQgdG8gdXNlIEVITE8KICAgICBvciBDQVBBQklMSVRZIGhhbmRzaGFrZSBhcyByZXF1aXJlZCBieSBSRkNzLgogICAgIFtHb2V0eiBCYWJpbi1FYmVsbF0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhjIGFuZCAwLjkuOGQgIFsyOCBTZXAgMjAwNl0KCiAgKikgSW50cm9kdWNlIGxpbWl0cyB0byBwcmV2ZW50IG1hbGljaW91cyBrZXlzIGJlaW5nIGFibGUgdG8KICAgICBjYXVzZSBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5NDApCiAgICAgW1N0ZXZlIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQVNOLjEgcGFyc2luZyBvZiBjZXJ0YWluIGludmFsaWQgc3RydWN0dXJlcyB0aGF0IGNhbiByZXN1bHQKICAgICBpbiBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5MzcpICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93IGluIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoKSBmdW5jdGlvbi4gCiAgICAgKENWRS0yMDA2LTM3MzgpIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEZpeCBTU0wgY2xpZW50IGNvZGUgd2hpY2ggY291bGQgY3Jhc2ggaWYgY29ubmVjdGluZyB0byBhCiAgICAgbWFsaWNpb3VzIFNTTHYyIHNlcnZlci4gIChDVkUtMjAwNi00MzQzKQogICAgIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIFNpbmNlIDAuOS44YiwgY2lwaGVyc3VpdGUgc3RyaW5ncyBuYW1pbmcgZXhwbGljaXQgY2lwaGVyc3VpdGVzCiAgICAgbWF0Y2ggb25seSB0aG9zZS4gIEJlZm9yZSB0aGF0LCAiQUVTMjU2LVNIQSIgd291bGQgYmUgaW50ZXJwcmV0ZWQKICAgICBhcyBhIHBhdHRlcm4gYW5kIG1hdGNoICJBRVMxMjgtU0hBIiB0b28gKHNpbmNlIEFFUzEyOC1TSEEgZ290CiAgICAgdGhlIHNhbWUgc3RyZW5ndGggY2xhc3NpZmljYXRpb24gaW4gMC45LjdoKSBhcyB3ZSBjdXJyZW50bHkgb25seQogICAgIGhhdmUgYSBzaW5nbGUgQUVTIGJpdCBpbiB0aGUgY2lwaGVyc3VpdGUgZGVzY3JpcHRpb24gYml0bWFwLgogICAgIFRoYXQgY2hhbmdlLCBob3dldmVyLCBhbHNvIGFwcGxpZWQgdG8gY2lwaGVyc3VpdGUgc3RyaW5ncyBzdWNoIGFzCiAgICAgIlJDNC1NRDUiIHRoYXQgaW50ZW50aW9uYWxseSBtYXRjaGVkIG11bHRpcGxlIGNpcGhlcnN1aXRlcyAtLQogICAgIG5hbWVseSwgU1NMIDIuMCBjaXBoZXJzdWl0ZXMgaW4gYWRkaXRpb24gdG8gdGhlIG1vcmUgY29tbW9uIG9uZXMKICAgICBmcm9tIFNTTCAzLjAvVExTIDEuMC4KCiAgICAgU28gd2UgY2hhbmdlIHRoZSBzZWxlY3Rpb24gYWxnb3JpdGhtIGFnYWluOiBOYW1pbmcgYW4gZXhwbGljaXQKICAgICBjaXBoZXJzdWl0ZSBzZWxlY3RzIHRoaXMgb25lIGNpcGhlcnN1aXRlLCBhbmQgYW55IG90aGVyIHNpbWlsYXIKICAgICBjaXBoZXJzdWl0ZSAoc2FtZSBiaXRtYXApIGZyb20gKm90aGVyKiBwcm90b2NvbCB2ZXJzaW9ucy4KICAgICBUaHVzLCAiUkM0LU1ENSIgYWdhaW4gd2lsbCBwcm9wZXJseSBzZWxlY3QgYm90aCB0aGUgU1NMIDIuMAogICAgIGNpcGhlcnN1aXRlIGFuZCB0aGUgU1NMIDMuMC9UTFMgMS4wIGNpcGhlcnN1aXRlLgoKICAgICBTaW5jZSBTU0wgMi4wIGRvZXMgbm90IGhhdmUgYW55IGNpcGhlcnN1aXRlcyBmb3Igd2hpY2ggdGhlCiAgICAgMTI4LzI1NiBiaXQgZGlzdGluY3Rpb24gd291bGQgYmUgcmVsZXZhbnQsIHRoaXMgd29ya3MgZm9yIG5vdy4KICAgICBUaGUgcHJvcGVyIGZpeCB3aWxsIGJlIHRvIHVzZSBkaWZmZXJlbnQgYml0cyBmb3IgQUVTMTI4IGFuZAogICAgIEFFUzI1Niwgd2hpY2ggd291bGQgaGF2ZSBhdm9pZGVkIHRoZSBwcm9ibGVtcyBmcm9tIHRoZSBiZWdpbm5pbmc7CiAgICAgaG93ZXZlciwgYml0cyBhcmUgc2NhcmNlLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGluIGEgbmV3IHJlbGVhc2UKICAgICAobm90IGp1c3QgYSBwYXRjaGxldmVsKSB3aGVuIHdlIGNhbiBjaGFuZ2UgdGhlIFNTTF9DSVBIRVIKICAgICBkZWZpbml0aW9uIHRvIHNwbGl0IHRoZSBzaW5nbGUgJ3Vuc2lnbmVkIGxvbmcgbWFzaycgYml0bWFwIGludG8KICAgICBtdWx0aXBsZSB2YWx1ZXMgdG8gZXh0ZW5kIHRoZSBhdmFpbGFibGUgc3BhY2UuCgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YiBhbmQgMC45LjhjICBbMDUgU2VwIDIwMDZdCgogICopIEF2b2lkIFBLQ1MgIzEgdjEuNSBzaWduYXR1cmUgYXR0YWNrIGRpc2NvdmVyZWQgYnkgRGFuaWVsIEJsZWljaGVuYmFjaGVyCiAgICAgKENWRS0yMDA2LTQzMzkpICBbQmVuIExhdXJpZSBhbmQgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEFkZCBBRVMgSUdFIGFuZCBiaUlHRSBtb2Rlcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IHJhbmRvbW5lc3MgZW50cm9weSBnYXRoZXJpbmcgdG8gdXNlIHBvbGwoKSB3aGVuCiAgICAgcG9zc2libGUgaW5zdGVhZCBvZiBzZWxlY3QoKSwgc2luY2UgdGhlIGxhdHRlciBoYXMgc29tZQogICAgIHVuZGVzaXJhYmxlIGxpbWl0YXRpb25zLgogICAgIFtEYXJyeWwgTWlsZXMgdmlhIFJpY2hhcmQgTGV2aXR0ZSBhbmQgQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlICJFQ0NkcmFmdCIgY2lwaGVyc3VpdGVzIG1vcmUgdGhvcm91Z2hseS4gIE5vdyBzcGVjaWFsCiAgICAgdHJlYXRtZW50IGluIHNzbC9zc2xfY2lwaC5zIG1ha2VzIHN1cmUgdGhhdCB0aGVzZSBjaXBoZXJzdWl0ZXMKICAgICBjYW5ub3QgYmUgaW1wbGljaXRseSBhY3RpdmF0ZWQgYXMgcGFydCBvZiwgZS5nLiwgdGhlICJBRVMiIGFsaWFzLgogICAgIEhvd2V2ZXIsIHBsZWFzZSB1cGdyYWRlIHRvIE9wZW5TU0wgMC45LjlbLWRldl0gZm9yCiAgICAgbm9uLWV4cGVyaW1lbnRhbCB1c2Ugb2YgdGhlIEVDQyBjaXBoZXJzdWl0ZXMgdG8gZ2V0IFRMUyBleHRlbnNpb24KICAgICBzdXBwb3J0LCB3aGljaCBpcyByZXF1aXJlZCBmb3IgY3VydmUgYW5kIHBvaW50IGZvcm1hdCBuZWdvdGlhdGlvbgogICAgIHRvIGF2b2lkIHBvdGVudGlhbCBoYW5kc2hha2UgcHJvYmxlbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSByb2d1ZSBjaXBoZXJzdWl0ZXM6CgogICAgICAtIFNTTHYyIDB4MDggMHgwMCAweDgwICgiUkM0LTY0LU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYxICgiRVhQMTAyNC1SQzItQ0JDLU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYwICgiRVhQMTAyNC1SQzQtTUQ1IikKCiAgICAgVGhlIGxhdHRlciB0d28gd2VyZSBwdXJwb3J0ZWRseSBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wWzAxXS50eHQsIGJ1dCBkbyBub3QgcmVhbGx5CiAgICAgYXBwZWFyIHRoZXJlLgoKICAgICBBbHNvIGRlYWN0aXZhdGUgdGhlIHJlbWFpbmluZyBjaXBoZXJzdWl0ZXMgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDEudHh0LiAgVGhlc2UgYXJlIGp1c3QgYXMKICAgICB1bm9mZmljaWFsLCBhbmQgdGhlIElEIGhhcyBsb25nIGV4cGlyZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFJTQSBibGluZGluZyBIZWlzZW5idWcgKHByb2JsZW1zIHNvbWV0aW1lcyBvY2N1cmVkIG9uCiAgICAgZHVhbC1jb3JlIG1hY2hpbmVzKSBhbmQgb3RoZXIgcG90ZW50aWFsIHRocmVhZC1zYWZldHkgaXNzdWVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgc3ltbWV0cmljIGNpcGhlciBDYW1lbGxpYSAoMTI4LWJpdCwgMTkyLWJpdCwgMjU2LWJpdCBrZXkKICAgICB2ZXJzaW9ucyksIHdoaWNoIGlzIG5vdyBhdmFpbGFibGUgZm9yIHJveWFsdHktZnJlZSB1c2UKICAgICAoc2VlIGh0dHA6Ly9pbmZvLmlzbC5udHQuY28uanAvY3J5cHQvZW5nL2luZm8vY2hpdGVraS5odG1sKS4KICAgICBBbHNvLCBhZGQgQ2FtZWxsaWEgVExTIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0MTMyLgoKICAgICBUbyBtaW5pbWl6ZSBjaGFuZ2VzIGJldHdlZW4gcGF0Y2hsZXZlbHMgaW4gdGhlIE9wZW5TU0wgMC45LjgKICAgICBzZXJpZXMsIENhbWVsbGlhIHJlbWFpbnMgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiB1bmxlc3MgT3BlblNTTAogICAgIGlzIGNvbmZpZ3VyZWQgd2l0aCAnZW5hYmxlLWNhbWVsbGlhJy4KICAgICBbTlRUXQoKICAqKSBEaXNhYmxlIHRoZSBwYWRkaW5nIGJ1ZyBjaGVjayB3aGVuIGNvbXByZXNzaW9uIGlzIGluIHVzZS4gVGhlIHBhZGRpbmcKICAgICBidWcgY2hlY2sgYXNzdW1lcyB0aGUgZmlyc3QgcGFja2V0IGlzIG9mIGV2ZW4gbGVuZ3RoLCB0aGlzIGlzIG5vdAogICAgIG5lY2Vzc2FyaWx5IHRydWUgaWYgY29tcHJlc3NzaW9uIGlzIGVuYWJsZWQgYW5kIGNhbiByZXN1bHQgaW4gZmFsc2UKICAgICBwb3NpdGl2ZXMgY2F1c2luZyBoYW5kc2hha2UgZmFpbHVyZS4gVGhlIGFjdHVhbCBidWcgdGVzdCBpcyBhbmNpZW50CiAgICAgY29kZSBzbyBpdCBpcyBob3BlZCB0aGF0IGltcGxlbWVudGF0aW9ucyB3aWxsIGVpdGhlciBoYXZlIGZpeGVkIGl0IGJ5CiAgICAgbm93IG9yIGFueSB3aGljaCBzdGlsbCBoYXZlIHRoZSBidWcgZG8gbm90IHN1cHBvcnQgY29tcHJlc3Npb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhhIGFuZCAwLjkuOGIgIFswNCBNYXkgMjAwNl0KCiAgKikgV2hlbiBhcHBseWluZyBhIGNpcGhlciBydWxlIGNoZWNrIHRvIHNlZSBpZiBzdHJpbmcgbWF0Y2ggaXMgYW4gZXhwbGljaXQKICAgICBjaXBoZXIgc3VpdGUgYW5kIG9ubHkgbWF0Y2ggdGhhdCBvbmUgY2lwaGVyIHN1aXRlIGlmIGl0IGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExpbmsgaW4gbWFuaWZlc3RzIGZvciBWQysrIGlmIG5lZWRlZC4KICAgICBbQXVzdGluIFppZWdsZXIgPGhhbG9zdGF0dWVAZ21haWwuY29tPl0KCiAgKikgVXBkYXRlIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBUTFMgY2lwaGVyc3VpdGVzIGFjY29yZGluZyB0bwogICAgIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgd2l0aCBwcm9wb3NlZCBjaGFuZ2VzIChidXQgd2l0aG91dAogICAgIFRMUyBleHRlbnNpb25zLCB3aGljaCBhcmUgc3VwcG9ydGVkIHN0YXJ0aW5nIHdpdGggdGhlIDAuOS45CiAgICAgYnJhbmNoLCBub3QgaW4gdGhlIE9wZW5TU0wgMC45LjggYnJhbmNoKS4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9DSVBIRVJfQ1RYX25ldygpIGFuZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKCkgdG8gc3VwcG9ydAogICAgIG9wYXF1ZSBFVlBfQ0lQSEVSX0NUWCBoYW5kbGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHpsaWIgY29tcHJlc3Npb24gY29kZS4gV2Ugbm93IG9ubHkgdXNlCiAgICAgInpsaWIxLmRsbCIgYW5kIHVzZSB0aGUgZGVmYXVsdCBfX2NkZWNsIGNhbGxpbmcgY29udmVudGlvbiBvbiBXaW4zMgogICAgIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmRzIG1lbnRpb25lZCBoZXJlOgogICAgICAgICAgIGh0dHA6Ly93d3cuemxpYi5uZXQvRExMX0ZBUS50eHQKICAgICBTdGF0aWMgemxpYiBsaW5raW5nIG5vdyB3b3JrcyBvbiBXaW5kb3dzIGFuZCB0aGUgbmV3IC0td2l0aC16bGliLWluY2x1ZGUKICAgICAtLXdpdGgtemxpYi1saWIgb3B0aW9ucyB0byBDb25maWd1cmUgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHRoZSBsb2NhdGlvbgogICAgIG9mIHRoZSBoZWFkZXJzIGFuZCBsaWJyYXJ5LiBHcmFjZWZ1bGx5IGhhbmRsZSBjYXNlIHdoZXJlIHpsaWIgbGlicmFyeQogICAgIGNhbid0IGJlIGxvYWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXZlcmFsIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlIE9JRCBnZW5lcmF0aW9uIGNvZGUuIFRoZSBvbGQgY29kZQogICAgIHNvbWV0aW1lcyBhbGxvd2VkIGludmFsaWQgT0lEcyAoMS5YIGZvciBYID49IDQwIGZvciBleGFtcGxlKSwgY291bGRuJ3QKICAgICBoYW5kbGUgbnVtYmVycyBsYXJnZXIgdGhhbiBVTE9OR19NQVgsIHRydW5jYXRlZCBwcmludGluZyBhbmQgaGFkIGEKICAgICBub24gc3RhbmRhcmQgT0JKX29iajJ0eHQoKSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIG9mIGVuZ2luZXMgdW5kZXIgZW5naW5lLyBhcyBzaGFyZWQgbGlicmFyaWVzCiAgICAgdW5kZXIgVkMrKyBidWlsZCBzeXN0ZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29ycmVjdGVkIHRoZSBudW1lcm91cyBidWdzIGluIHRoZSBXaW4zMiBwYXRoIHNwbGl0dGVyIGluIERTTy4KICAgICBIb3BlZnVsbHksIHdlIHdpbGwgbm90IHNlZSBhbnkgZmFsc2UgY29tYmluYXRpb24gb2YgcGF0aHMgYW55IG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjggYW5kIDAuOS44YSAgWzExIE9jdCAyMDA1XQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcKICAgICAocGFydCBvZiBTU0xfT1BfQUxMKS4gIFRoaXMgb3B0aW9uIHVzZWQgdG8gZGlzYWJsZSB0aGUKICAgICBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IG1hbi1pbi10aGUtbWlkZGxlIHByb3RvY29sLXZlcnNpb24KICAgICByb2xsYmFjayBpbiB0aGUgU1NMIDIuMCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGEgYmFkCiAgICAgaWRlYS4gIChDVkUtMjAwNS0yOTY5KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFl1dGFrYSBPaXdhIChSZXNlYXJjaCBDZW50ZXIKICAgICBmb3IgSW5mb3JtYXRpb24gU2VjdXJpdHksIE5hdGlvbmFsIEluc3RpdHV0ZSBvZiBBZHZhbmNlZCBJbmR1c3RyaWFsCiAgICAgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBbQUlTVF0sIEphcGFuKV0KCiAgKikgQWRkIHR3byBmdW5jdGlvbiB0byBjbGVhciBhbmQgcmV0dXJuIHRoZSB2ZXJpZnkgcGFyYW1ldGVyIGZsYWdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEtlZXAgY2lwaGVybGlzdHMgc29ydGVkIGluIHRoZSBzb3VyY2UgaW5zdGVhZCBvZiBzb3J0aW5nIHRoZW0gYXQKICAgICBydW50aW1lLCB0aHVzIHJlbW92aW5nIHRoZSBuZWVkIGZvciBhIGxvY2suCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBBdm9pZCBzb21lIHNtYWxsIHN1Ymdyb3VwIGF0dGFja3MgaW4gRGlmZmllLUhlbGxtYW4uCiAgICAgW05pY2sgTWF0aGV3c29uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgZnVuY3Rpb25zIGZvciB3ZWxsLWtub3duIHByaW1lcy4KICAgICBbTmljayBNYXRoZXdzb25dCgogICopIEV4dGVuZGVkIFdpbmRvd3MgQ0Ugc3VwcG9ydC4KICAgICBbU2F0b3NoaSBOYWthbXVyYSBhbmQgQW5keSBQb2x5YWtvdl0KCiAgKikgSW5pdGlhbGl6ZSBTU0xfTUVUSE9EIHN0cnVjdHVyZXMgYXQgY29tcGlsZSB0aW1lIGluc3RlYWQgb2YgZHVyaW5nCiAgICAgcnVudGltZSwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCBmb3IgYSBsb2NrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgUEtDUzdfZGVjcnlwdCgpIHdvcmsgZXZlbiBpZiBubyBjZXJ0aWZpY2F0ZSBpcyBzdXBwbGllZCBieQogICAgIGF0dGVtcHRpbmcgdG8gZGVjcnlwdCBlYWNoIGVuY3J5cHRlZCBrZXkgaW4gdHVybi4gQWRkIHN1cHBvcnQgdG8KICAgICBzbWltZSB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aCBhbmQgMC45LjggIFswNSBKdWwgMjAwNV0KCiAgW05COiBPcGVuU1NMIDAuOS43aSBhbmQgbGF0ZXIgMC45LjcgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS44Ll0KCiAgKikgQWRkIGxpYmNyeXB0by5wYyBhbmQgbGlic3NsLnBjIGZvciB0aG9zZSB3aG8gZmVlbCB0aGV5IG5lZWQgdGhlbS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgQ0Euc2ggYW5kIENBLnBsIHNvIHRoZXkgZG9uJ3QgYnVuZGxlIHRoZSBDU1IgYW5kIHRoZSBwcml2YXRlCiAgICAga2V5IGludG8gdGhlIHNhbWUgZmlsZSBhbnkgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciBXaW42NCwgYm90aCBJQTY0IGFuZCBBTUQ2NC94NjQgZmxhdm9ycy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIC11dGY4IGNvbW1hbmQgbGluZSBhbmQgY29uZmlnIGZpbGUgb3B0aW9uIHRvICdjYScuCiAgICAgW1N0ZWZhbiA8c3RmQHVkb21hLm9yZ10KCiAgKikgUmVtb3ZlZCB0aGUgbWFjcm8gZGVzX2NyeXB0KCksIGFzIGl0IHNlZW1zIHRvIGNvbmZsaWN0IHdpdGggc29tZQogICAgIGxpYnJhcmllcy4gIFVzZSBERVNfY3J5cHQoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb3JyZWN0IG5hbWluZyBvZiB0aGUgJ2NoaWwnIGFuZCAnNDc1OGNjYScgRU5HSU5Fcy4gVGhpcwogICAgIGludm9sdmVzIHJlbmFtaW5nIHRoZSBzb3VyY2UgYW5kIGdlbmVyYXRlZCBzaGFyZWQtbGlicyBmb3IKICAgICBib3RoLiBUaGUgZW5naW5lcyB3aWxsIGFjY2VwdCB0aGUgY29ycmVjdGVkIG9yIGxlZ2FjeSBpZHMKICAgICAoJ25jaXBoZXInIGFuZCAnNDc1OF9jY2EnIHJlc3BlY3RpdmVseSkgd2hlbiBiaW5kaW5nLiBOQiwKICAgICB0aGlzIG9ubHkgYXBwbGllcyB3aGVuIGJ1aWxkaW5nICdzaGFyZWQnLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYXR0cmlidXRlIGZ1bmN0aW9ucyB0byBFVlBfUEtFWSBzdHJ1Y3R1cmUuIE1vZGlmeQogICAgIFBLQ1MxMl9jcmVhdGUoKSB0byByZWNvZ25pemUgYSBDU1AgbmFtZSBhdHRyaWJ1dGUgYW5kCiAgICAgdXNlIGl0LiBNYWtlIC1DU1Agb3B0aW9uIHdvcmsgYWdhaW4gaW4gcGtjczEyIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRoZSBibiBibGluZGluZyBjb2RlOgogICAgIC0gYXV0b21hdGljIHJlLWNyZWF0aW9uIG9mIHRoZSBCTl9CTElORElORyBwYXJhbWV0ZXJzIGFmdGVyCiAgICAgICBhIGZpeGVkIG51bWJlciBvZiB1c2VzIChjdXJyZW50bHkgMzIpCiAgICAgLSBhZGQgbmV3IGZ1bmN0aW9uIGZvciBwYXJhbWV0ZXIgY3JlYXRpb24KICAgICAtIGludHJvZHVjZSBmbGFncyB0byBjb250cm9sIHRoZSB1cGRhdGUgYmVoYXZpb3VyIG9mIHRoZQogICAgICAgQk5fQkxJTkRJTkcgcGFyYW1ldGVycwogICAgIC0gaGlkZSBCTl9CTElORElORyBzdHJ1Y3R1cmUKICAgICBBZGQgYSBzZWNvbmQgQk5fQkxJTkRJTkcgc2xvdCB0byB0aGUgUlNBIHN0cnVjdHVyZSB0byBpbXByb3ZlCiAgICAgcGVyZm9ybWFuY2Ugd2hlbiBhIHNpbmdsZSBSU0Egb2JqZWN0IGlzIHNoYXJlZCBhbW9uZyBzZXZlcmFsCiAgICAgdGhyZWFkcy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEFkZCBzdXBwb3J0IGZvciBEVExTLgogICAgIFtOYWdlbmRyYSBNb2RhZHVndSA8bmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1PiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIERFUiBlbmNvZGVkIHByaXZhdGUga2V5cyAoU1NMX0ZJTEVUWVBFX0FTTjEpCiAgICAgdG8gU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKCkgYW5kIFNTTF91c2VfUHJpdmF0ZUtleV9maWxlKCkKICAgICBbV2FsdGVyIEdvdWxldF0KCiAgKikgUmVtb3ZlIGJ1Z2d5IGFuZCBpbmNvbXBsZXRldCBESCBjZXJ0IHN1cHBvcnQgZnJvbQogICAgIHNzbC9zc2xfcnNhLmMgYW5kIHNzbC9zM19ib3RoLmMKICAgICBbTmlscyBMYXJzY2hdCgogICopIFVzZSBTSEEtMSBpbnN0ZWFkIG9mIE1ENSBhcyB0aGUgZGVmYXVsdCBkaWdlc3QgYWxnb3JpdGhtIGZvcgogICAgIHRoZSBhcHBzL29wZW5zc2wgYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQ29tcGlsZSBjbGVhbiB3aXRoICItV2FsbCAtV21pc3NpbmctcHJvdG90eXBlcwogICAgIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV2Vycm9yIi4gQ3VycmVudGx5CiAgICAgREVCVUdfU0FGRVNUQUNLIG11c3QgYWxzbyBiZSBzZXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSAuL0NvbmZpZ3VyZSBzbyB0aGF0IGNlcnRhaW4gYWxnb3JpdGhtcyBjYW4gYmUgZGlzYWJsZWQgYnkgZGVmYXVsdC4KICAgICBUaGUgbmV3IGNvdW50ZXJwaWVjZSB0byAibm8teHh4IiBpcyAiZW5hYmxlLXh4eCIuCgogICAgIFRoZSBwYXRlbnRlZCBSQzUgYW5kIE1EQzIgYWxnb3JpdGhtcyB3aWxsIG5vdyBiZSBkaXNhYmxlZCB1bmxlc3MKICAgICAiZW5hYmxlLXJjNSIgYW5kICJlbmFibGUtbWRjMiIsIHJlc3BlY3RpdmVseSwgYXJlIHNwZWNpZmllZC4KCiAgICAgKElERUEgcmVtYWlucyBlbmFibGVkIGRlc3BpdGUgYmVpbmcgcGF0ZW50ZWQuICBUaGlzIGlzIGJlY2F1c2UgSURFQQogICAgIGlzIGZyZXF1ZW50bHkgcmVxdWlyZWQgZm9yIGludGVyb3BlcmFiaWxpdHksIGFuZCB0aGVyZSBpcyBubyBsaWNlbnNlCiAgICAgZmVlIGZvciBub24tY29tbWVyY2lhbCB1c2UuICBBcyBiZWZvcmUsICJuby1pZGVhIiBjYW4gYmUgdXNlZCB0bwogICAgIGF2b2lkIHRoaXMgYWxnb3JpdGhtLikKCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHByb2Nlc3Npbmcgb2YgcHJveHkgY2VydGlmaWNhdGVzIChzZWUgUkZDIDM4MjApLiAgVGhpcyB3b3JrIHdhcwogICAgIHNwb25zb3JlZCBieSBLVEggKFRoZSBSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSBpbiBTdG9ja2hvbG0pIGFuZAogICAgIEVHRUUgKEVuYWJsaW5nIEdyaWRzIGZvciBFLXNjaWVuY2UgaW4gRXVyb3BlKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSQzQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb24gbW9kZXJuIGFyY2hpdGVjdHVyZXMvaW1wbGVtZW50YXRpb25zLCBzdWNoCiAgICAgYXMgSW50ZWwgUDQsIElBLTY0IGFuZCBBTUQ2NC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IHV0aWxpdHkgZXh0cmFjdC1zZWN0aW9uLnBsLiBUaGlzIGNhbiBiZSB1c2VkIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBzZWN0aW9uIG51bWJlciBpbiBhIHBvZCBmaWxlIGluc3RlYWQgb2YgaGF2aW5nIHRvIHRyZWF0IGVhY2ggZmlsZSBhcwogICAgIGEgc2VwYXJhdGUgY2FzZSBpbiBNYWtlZmlsZS4gVGhpcyBjYW4gYmUgZG9uZSBieSBhZGRpbmcgdHdvIGxpbmVzIHRvIHRoZQogICAgIHBvZCBmaWxlOgoKICAgICA9Zm9yIGNvbW1lbnQgb3BlbnNzbF9zZWN0aW9uOlhYWAoKICAgICBUaGUgYmxhbmsgbGluZSBpcyBtYW5kYXRvcnkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBhcmd1bWVudHMgLWNlcnRmb3JtLCAta2V5Zm9ybSBhbmQgLXBhc3MgZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIHRvIGFsbG93IGFsdGVybmF0aXZlIGZvcm1hdCBrZXkgYW5kIGNlcnRpZmljYXRlIGZpbGVzIGFuZCBwYXNzcGhyYXNlCiAgICAgc291cmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgc3RydWN0dXJlIFg1MDlfVkVSSUZZX1BBUkFNIHdoaWNoIGNvbWJpbmVzIGN1cnJlbnQgdmVyaWZ5IHBhcmFtZXRlcnMsCiAgICAgdXBkYXRlIGFzc29jaWF0ZWQgc3RydWN0dXJlcyBhbmQgYWRkIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMuCgogICAgIEFkZCBuZXcgcG9saWN5IHJlbGF0ZWQgdmVyaWZ5IHBhcmFtZXRlcnMsIGluY2x1ZGUgcG9saWN5IGNoZWNraW5nIGluIAogICAgIHN0YW5kYXJkIHZlcmlmeSBjb2RlLiBFbmhhbmNlICdzbWltZScgYXBwbGljYXRpb24gd2l0aCBleHRyYSBwYXJhbWV0ZXJzCiAgICAgdG8gc3VwcG9ydCBwb2xpY3kgY2hlY2tpbmcgYW5kIHByaW50IG91dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgZW5naW5lIHRvIHN1cHBvcnQgVklBIFBhZExvY2sgQUNFIGV4dGVuc2lvbnMgaW4gdGhlIFZJQSBDMwogICAgIE5laGVtaWFoIHByb2Nlc3NvcnMuIFRoZXNlIGV4dGVuc2lvbnMgc3VwcG9ydCBBRVMgZW5jcnlwdGlvbiBpbiBoYXJkd2FyZQogICAgIGFzIHdlbGwgYXMgUk5HICh0aG91Z2ggUk5HIHN1cHBvcnQgaXMgY3VycmVudGx5IGRpc2FibGVkKS4KICAgICBbTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6Piwgd2l0aCBoZWxwIGZyb20gQW5keSBQb2x5YWtvdl0KCiAgKikgRGVwcmVjYXRlIEJOX1tnZXR8c2V0XV9wYXJhbXMoKSBmdW5jdGlvbnMgKHRoZXkgd2VyZSBpZ25vcmVkIGludGVybmFsbHkpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBGSVBTIDE4MC0yIGFsZ29yaXRobXMsIFNIQS0yMjQvLTI1Ni8tMzg0Ly01MTIgYXJlIGltcGxlbWVudGVkLgogICAgIFtBbmR5IFBvbHlha292IGFuZCBhIG51bWJlciBvZiBvdGhlciBwZW9wbGVdCgogICopIEltcHJvdmVkIFBvd2VyUEMgcGxhdGZvcm0gc3VwcG9ydC4gTW9zdCBub3RhYmx5IEJJR05VTSBhc3NlbWJsZXIKICAgICBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBJQk0uCiAgICAgW1N1cmVzaCBDaGFyaSwgUGV0ZXIgV2FsdGVuYmVyZywgQW5keSBQb2x5YWtvdl0KCiAgKikgVGhlIG5ldyAnUlNBX2dlbmVyYXRlX2tleV9leCcgZnVuY3Rpb24gbm93IHRha2VzIGEgQklHTlVNIGZvciB0aGUgcHVibGljCiAgICAgZXhwb25lbnQgcmF0aGVyIHRoYW4gJ3Vuc2lnbmVkIGxvbmcnLiBUaGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgY2hhbmdlIHRvCiAgICAgdGhlIG5ldyAncnNhX2tleWdlbicgZWxlbWVudCBvZiB0aGUgUlNBX01FVEhPRCBzdHJ1Y3R1cmUuCiAgICAgW0plbHRlIEphbnNlbiwgR2VvZmYgVGhvcnBlXQoKICAqKSBGdW5jdGlvbmFsaXR5IGZvciBjcmVhdGluZyB0aGUgaW5pdGlhbCBzZXJpYWwgbnVtYmVyIGZpbGUgaXMgbm93CiAgICAgbW92ZWQgZnJvbSBDQS5wbCB0byB0aGUgJ2NhJyB1dGlsaXR5IHdpdGggYSBuZXcgb3B0aW9uIC1jcmVhdGVfc2VyaWFsLgoKICAgICAoQmVmb3JlIE9wZW5TU0wgMC45LjdlLCBDQS5wbCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHNlcmlhbAogICAgIG51bWJlciBmaWxlIHRvIDEsIHdoaWNoIGlzIGJvdW5kIHRvIGNhdXNlIHByb2JsZW1zLiAgVG8gYXZvaWQKICAgICB0aGUgcHJvYmxlbXMgd2hpbGUgcmVzcGVjdGluZyBjb21wYXRpYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IDAuOS43CiAgICAgcGF0Y2hsZXZlbHMsIDAuOS43ZSAgZW1wbG95ZWQgJ29wZW5zc2wgeDUwOSAtbmV4dF9zZXJpYWwnIGluCiAgICAgQ0EucGwgZm9yIHNlcmlhbCBudW1iZXIgaW5pdGlhbGl6YXRpb24uICBXaXRoIHRoZSBuZXcgcmVsZWFzZSAwLjkuOCwKICAgICB3ZSBjYW4gZml4IHRoZSBwcm9ibGVtIGRpcmVjdGx5IGluIHRoZSAnY2EnIHV0aWxpdHkuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZHVjZWQgaGVhZGVyIGludGVyZGVwZW5jaWVzIGJ5IGRlY2xhcmluZyBtb3JlIG9wYXF1ZSBvYmplY3RzIGluCiAgICAgb3NzbF90eXAuaC4gQXMgYSBjb25zZXF1ZW5jZSwgaW5jbHVkaW5nIHNvbWUgaGVhZGVycyAoZWcuIGVuZ2luZS5oKSB3aWxsCiAgICAgZ2l2ZSBmZXdlciByZWN1cnNpdmUgaW5jbHVkZXMsIHdoaWNoIGNvdWxkIGJyZWFrIGxhenkgc291cmNlIGNvZGUgLSBzbwogICAgIHRoaXMgY2hhbmdlIGlzIGNvdmVyZWQgYnkgdGhlIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBzeW1ib2wuIEFzIGFsd2F5cywKICAgICBkZXZlbG9wZXJzIHNob3VsZCBkZWZpbmUgdGhpcyBzeW1ib2wgd2hlbiBidWlsZGluZyBhbmQgdXNpbmcgb3BlbnNzbCB0bwogICAgIGVuc3VyZSB0aGV5IHRyYWNrIHRoZSByZWNvbW1lbmRlZCBiZWhhdmlvdXIsIGludGVyZmFjZXMsIFtldGNdLCBidXQKICAgICBiYWNrd2FyZHMtY29tcGF0aWJsZSBiZWhhdmlvdXIgcHJldmFpbHMgd2hlbiB0aGlzIGlzbid0IGRlZmluZWQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfUE9MSUNZX05PREVfcHJpbnQoKSB3aGljaCBwcmludHMgb3V0IHBvbGljeSBub2Rlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IEVWUCBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9yYW5kX2tleSBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbmFsaXR5LgogICAgIFRoaXMgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBrZXkgb2YgdGhlIGFwcHJvcHJpYXRlIGxlbmd0aCBiYXNlZCBvbiB0aGUgCiAgICAgY2lwaGVyIGNvbnRleHQuIFRoZSBFVlBfQ0lQSEVSIGNhbiBwcm92aWRlIGl0cyBvd24gcmFuZG9tIGtleSBnZW5lcmF0aW9uCiAgICAgcm91dGluZSB0byBzdXBwb3J0IGtleXMgb2YgYSBzcGVjaWZpYyBmb3JtLiBUaGlzIGlzIHVzZWQgaW4gdGhlIGRlcyBhbmQgCiAgICAgM2RlcyByb3V0aW5lcyB0byBnZW5lcmF0ZSBhIGtleSBvZiB0aGUgY29ycmVjdCBwYXJpdHkuIFVwZGF0ZSBTL01JTUUKICAgICBjb2RlIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGFuZCBoZW5jZSBnZW5lcmF0ZSBjb3JyZWN0IHBhcml0eSBERVMga2V5cy4KICAgICBBZGQgRVZQX0NIRUNLX0RFU19LRVkgI2RlZmluZSB0byByZXR1cm4gYW4gZXJyb3IgaWYgdGhlIGtleSBpcyBub3QgCiAgICAgdmFsaWQgKHdlYWsgb3IgaW5jb3JyZWN0IHBhcml0eSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbG9jYWwgc2V0IG9mIENSTHMgdGhhdCBjYW4gYmUgdXNlZCBieSBYNTA5X3ZlcmlmeV9jZXJ0KCkgYXMgd2VsbAogICAgIGFzIGxvb2tpbmcgdGhlbSB1cC4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdmVyaWZpZWQgc3RydWN0dXJlIG1heSBjb250YWluCiAgICAgQ1JMcywgZm9yIGV4YW1wbGUgUEtDUyM3IHNpZ25lZERhdGEuIE1vZGlmeSBQS0NTN192ZXJpZnkoKSB0byB1c2UgYW55IENSTHMKICAgICBwcmVzZW50IHVubGVzcyB0aGUgbmV3IFBLQ1M3X05PX0NSTCBmbGFnIGlzIGFzc2VydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBBU04xIG9pZCBjb25maWd1cmF0aW9uIG1vZHVsZS4gSXQgbm93IGFkZGl0aW9uYWxseSBhY2NlcHRzIHRoZQogICAgIHN5bnRheDoKCiAgICAgc2hvcnROYW1lID0gc29tZSBsb25nIG5hbWUsIDEuMi4zLjQKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudGVkIHRoZSBCTl9DVFggaW1wbGVtZW50YXRpb24uIFRoZXJlIGlzIG5vdyBubyBtb3JlIHN0YXRpYwogICAgIGxpbWl0YXRpb24gb24gdGhlIG51bWJlciBvZiB2YXJpYWJsZXMgaXQgY2FuIGhhbmRsZSBub3IgdGhlIGRlcHRoIG9mIHRoZQogICAgICJzdGFjayIgaGFuZGxpbmcgZm9yIEJOX0NUWF9zdGFydCgpL0JOX0NUWF9lbmQoKSBwYWlycy4gVGhlIHN0YWNrCiAgICAgaW5mb3JtYXRpb24gY2FuIG5vdyBleHBhbmQgYXMgcmVxdWlyZWQsIGFuZCByYXRoZXIgdGhhbiBoYXZpbmcgYSBzaW5nbGUKICAgICBzdGF0aWMgYXJyYXkgb2YgYmlnbnVtcywgQk5fQ1RYIG5vdyB1c2VzIGEgbGlua2VkLWxpc3Qgb2Ygc3VjaCBhcnJheXMKICAgICBhbGxvd2luZyBpdCB0byBleHBhbmQgb24gZGVtYW5kIHdoaWxzdCBtYWludGFpbmluZyB0aGUgdXNlZnVsbmVzcyBvZgogICAgIEJOX0NUWCdzICJidW5kbGluZyIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgbWlzc2luZyBCTl9DVFggcGFyYW1ldGVyIHRvIHRoZSAncnNhX21vZF9leHAnIGNhbGxiYWNrIGluIFJTQV9NRVRIT0QKICAgICB0byBhbGxvdyBhbGwgUlNBIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24gdXNpbmcgYSBzaW5nbGUgQk5fQ1RYLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIHBvbGljeSBldmFsdWF0aW9uIGFuZCBjaGVja2luZy4gVGhpcwogICAgIGlzIGluaXRpYWxseSBpbnRlbmRlZCB0byBwYXNzIHRoZSB0ZXN0cyBvdXRsaW5lZCBpbiAiQ29uZm9ybWFuY2UgVGVzdGluZwogICAgIG9mIFJlbHlpbmcgUGFydHkgQ2xpZW50IENlcnRpZmljYXRlIFBhdGggUHJvY2Vzc2luZyBMb2dpYyIgdjEuMDcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgYm5fZHVwX2V4cGFuZCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGl0IHdhcyBpbnRyb2R1Y2VkIGluIDAuOS43IGFuZAogICAgIHJlbWFpbmVkIHVudXNlZCBhbmQgbm90IHRoYXQgdXNlZnVsLiBBIHZhcmlldHkgb2Ygb3RoZXIgbGl0dGxlIGJpZ251bQogICAgIHR3ZWFrcyBhbmQgZml4ZXMgaGF2ZSBhbHNvIGJlZW4gbWFkZSBjb250aW51aW5nIG9uIGZyb20gdGhlIGF1ZGl0IChzZWUKICAgICBiZWxvdykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ29uc3RpZnkgYWxsIG9yIGFsbW9zdCBhbGwgZDJpLCBjMmksIHMyaSBhbmQgcjJpIGZ1bmN0aW9ucywgYWxvbmcgd2l0aAogICAgIGFzc29jaWF0ZWQgQVNOMSwgRVZQIGFuZCBTU0wgZnVuY3Rpb25zIGFuZCBvbGQgQVNOMSBtYWNyb3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQk5femVybygpIG9ubHkgbmVlZHMgdG8gc2V0ICd0b3AnIGFuZCAnbmVnJyB0byB6ZXJvIGZvciBjb3JyZWN0IHJlc3VsdHMsCiAgICAgYW5kIHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuIFNvIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgdXNlIG9mCiAgICAgQk5fc2V0X3dvcmQoKSAod2hpY2ggY2FuIGZhaWwgZHVlIHRvIG5lZWRsZXNzIGV4cGFuc2lvbikgaXMgbm93IGRlcHJlY2F0ZWQ7CiAgICAgaWYgT1BFTlNTTF9OT19ERVBSRUNBVEVEIGlzIGRlZmluZWQsIEJOX3plcm8oKSBpcyBhIHZvaWQgbWFjcm8uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQk5fQ1RYX2dldCgpIHNob3VsZCByZXR1cm4gemVyby12YWx1ZWQgYmlnbnVtcywgcHJvdmlkaW5nIHRoZSBzYW1lCiAgICAgaW5pdGlhbGlzZWQgdmFsdWUgYXMgQk5fbmV3KCkuCiAgICAgW0dlb2ZmIFRob3JwZSwgc3VnZ2VzdGVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgZm9yIGluaGliaXRBbnlQb2xpY3kgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFuIGF1ZGl0IG9mIHRoZSBCSUdOVU0gY29kZSBpcyB1bmRlcndheSwgZm9yIHdoaWNoIGRlYnVnZ2luZyBjb2RlIGlzCiAgICAgZW5hYmxlZCB3aGVuIEJOX0RFQlVHIGlzIGRlZmluZWQuIFRoaXMgbWFrZXMgc3RyaWN0ZXIgZW5mb3JjZW1lbnRzIG9uIHdoYXQKICAgICBpcyBjb25zaWRlcmVkIHZhbGlkIHdoZW4gcHJvY2Vzc2luZyBCSUdOVU1zLCBhbmQgY2F1c2VzIGV4ZWN1dGlvbiB0bwogICAgIGFzc2VydCgpIHdoZW4gYSBwcm9ibGVtIGlzIGRpc2NvdmVyZWQuIElmIEJOX0RFQlVHX1JBTkQgaXMgZGVmaW5lZCwKICAgICBmdXJ0aGVyIHN0ZXBzIGFyZSB0YWtlbiB0byBkZWxpYmVyYXRlbHkgcG9sbHV0ZSB1bnVzZWQgZGF0YSBpbiBCSUdOVU0KICAgICBzdHJ1Y3R1cmVzIHRvIHRyeSBhbmQgZXhwb3NlIGZhdWx0eSBjb2RlIGZ1cnRoZXIgb24uIEZvciBub3csIG9wZW5zc2wgd2lsbAogICAgIChpbiBpdHMgZGVmYXVsdCBtb2RlIG9mIG9wZXJhdGlvbikgY29udGludWUgdG8gdG9sZXJhdGUgdGhlIGluY29uc2lzdGVudAogICAgIGZvcm1zIHRoYXQgaXQgaGFzIHRvbGVyYXRlZCBpbiB0aGUgcGFzdCwgYnV0IGF1dGhvcnMgYW5kIHBhY2thZ2VycyBzaG91bGQKICAgICBjb25zaWRlciB0cnlpbmcgb3BlbnNzbCBhbmQgdGhlaXIgb3duIGFwcGxpY2F0aW9ucyB3aGVuIGNvbXBpbGVkIHdpdGgKICAgICB0aGVzZSBkZWJ1Z2dpbmcgc3ltYm9scyBkZWZpbmVkLiBJdCB3aWxsIGhlbHAgaGlnaGxpZ2h0IHBvdGVudGlhbCBidWdzIGluCiAgICAgdGhlaXIgb3duIGNvZGUsIGFuZCB3aWxsIGltcHJvdmUgdGhlIHRlc3QgY292ZXJhZ2UgZm9yIE9wZW5TU0wgaXRzZWxmLiBBdAogICAgIHNvbWUgcG9pbnQsIHRoZXNlIHRpZ2h0ZXIgcnVsZXMgd2lsbCBiZWNvbWUgb3BlbnNzbCdzIGRlZmF1bHQgdG8gaW1wcm92ZQogICAgIG1haW50YWluYWJpbGl0eSwgdGhvdWdoIHRoZSBhc3NlcnQoKXMgYW5kIG90aGVyIG92ZXJoZWFkcyB3aWxsIHJlbWFpbiBvbmx5CiAgICAgaW4gZGVidWdnaW5nIGNvbmZpZ3VyYXRpb25zLiBTZWUgYm4uaCBmb3IgbW9yZSBkZXRhaWxzLgogICAgIFtHZW9mZiBUaG9ycGUsIE5pbHMgTGFyc2NoLCBVbGYgTfZsbGVyXQoKICAqKSBCTl9DVFhfaW5pdCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIGFzIEJOX0NUWCBpcyBhbiBvcGFxdWUgc3RydWN0dXJlCiAgICAgdGhhdCBjYW4gb25seSBiZSBvYnRhaW5lZCB0aHJvdWdoIEJOX0NUWF9uZXcoKSAod2hpY2ggaW1wbGljaXRseQogICAgIGluaXRpYWxpc2VzIGl0KS4gVGhlIHByZXNlbmNlIG9mIHRoaXMgZnVuY3Rpb24gb25seSBtYWRlIGl0IHBvc3NpYmxlCiAgICAgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIHN0cnVjdHVyZSAoYW5kIGNhdXNlIG1lbW9yeSBsZWFrcykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQmVjYXVzZSBvZiB0aGUgY2FsbGJhY2stYmFzZWQgYXBwcm9hY2ggZm9yIGltcGxlbWVudGluZyBMSEFTSCBhcyBhCiAgICAgdGVtcGxhdGUgdHlwZSwgbGhfaW5zZXJ0KCkgYWRkcyBvcGFxdWUgb2JqZWN0cyB0byBoYXNoLXRhYmxlcyBhbmQKICAgICBsaF9kb2FsbCgpIG9yIGxoX2RvYWxsX2FyZygpIGFyZSB0eXBpY2FsbHkgdXNlZCB3aXRoIGEgZGVzdHJ1Y3RvciBjYWxsYmFjawogICAgIHRvIGNsZWFuIHVwIHRob3NlIGNvcnJlc3BvbmRpbmcgb2JqZWN0cyBiZWZvcmUgZGVzdHJveWluZyB0aGUgaGFzaCB0YWJsZQogICAgIChhbmQgbG9zaW5nIHRoZSBvYmplY3QgcG9pbnRlcnMpLiBTbyBzb21lIG92ZXItemVhbG91cyBjb25zdGlmaWNhdGlvbnMgaW4KICAgICBMSEFTSCBoYXZlIGJlZW4gcmVsYXhlZCBzbyB0aGF0IGxoX2luc2VydCgpIGRvZXMgbm90IHRha2UgKG5vciBzdG9yZSkgdGhlCiAgICAgb2JqZWN0cyBhcyAiY29uc3QiIGFuZCB0aGUgbGhfZG9hbGxbX2FyZ10gY2FsbGJhY2sgd3JhcHBlcnMgYXJlIG5vdAogICAgIHByb3RvdHlwZWQgdG8gaGF2ZSAiY29uc3QiIHJlc3RyaWN0aW9ucyBvbiB0aGUgb2JqZWN0IHBvaW50ZXJzIHRoZXkgYXJlCiAgICAgZ2l2ZW4gKGFuZCBzbyBhcmVuJ3QgcmVxdWlyZWQgdG8gY2FzdCB0aGVtIGF3YXkgYW55IG1vcmUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSB0bWRpZmYuaCBBUEkgd2FzIHNvIHVnbHkgYW5kIG1pbmltYWwgdGhhdCBvdXIgb3duIHRpbWluZyB1dGlsaXR5CiAgICAgKHNwZWVkKSBwcmVmZXJzIHRvIHVzZSBpdHMgb3duIGltcGxlbWVudGF0aW9uLiBUaGUgdHdvIGltcGxlbWVudGF0aW9ucwogICAgIGhhdmVuJ3QgYmVlbiBjb25zb2xpZGF0ZWQgYXMgeWV0ICh2b2x1bnRlZXJzPykgYnV0IHRoZSB0bWRpZmYgQVBJIGhhcyBoYWQKICAgICBpdHMgb2JqZWN0IHR5cGUgcHJvcGVybHkgZXhwb3NlZCAoTVNfVE0pIGluc3RlYWQgb2YgY2FzdGluZyB0by9mcm9tICJjaGFyCiAgICAgKiIuIFRoaXMgbWF5IHN0aWxsIGNoYW5nZSB5ZXQgaWYgc29tZW9uZSByZWFsaXNlcyBNU19UTSBhbmQgIm1zX3RpbWVfKioqIgogICAgIGFyZW4ndCBuZWNlc3NhcmlseSB0aGUgZ3JlYXRlc3Qgbm9tZW5jbGF0dXJlcyAtIGJ1dCB0aGlzIGlzIHdoYXQgd2FzIHVzZWQKICAgICBpbnRlcm5hbGx5IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBzbyBJJ3ZlIHVzZWQgdGhhdCBmb3Igbm93LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVuc3VyZSB0aGF0IGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGRvIG5vdCBnZXQgY29tcGlsZWQgd2hlbgogICAgIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyBkZWZpbmVkLiBTb21lICJvcGVuc3NsIiBzdWJjb21tYW5kcyBhbmQgYSBmZXcgb2YKICAgICB0aGUgc2VsZi10ZXN0cyB3ZXJlIHN0aWxsIHVzaW5nIGRlcHJlY2F0ZWQga2V5LWdlbmVyYXRpb24gZnVuY3Rpb25zIHNvCiAgICAgdGhlc2UgaGF2ZSBiZWVuIHVwZGF0ZWQgYWxzby4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBSZW9yZ2FuaXNlIFBLQ1MjNyBjb2RlIHRvIHNlcGFyYXRlIHRoZSBkaWdlc3QgbG9jYXRpb24gZnVuY3Rpb25hbGl0eQogICAgIGludG8gUEtDUzdfZmluZF9kaWdlc3QoKSwgZGlnZXN0IGFkZHRpb24gaW50byBQS0NTN19iaW9fYWRkX2RpZ2VzdCgpLgogICAgIE5ldyBmdW5jdGlvbiBQS0NTN19zZXRfZGlnZXN0KCkgdG8gc2V0IHRoZSBkaWdlc3QgdHlwZSBmb3IgUEtDUyM3CiAgICAgZGlnZXN0ZWREYXRhIHR5cGUuIEFkZCBhZGRpdGlvbmFsIGNvZGUgdG8gY29ycmVjdGx5IGdlbmVyYXRlIHRoZQogICAgIGRpZ2VzdGVkRGF0YSB0eXBlIGFuZCBhZGQgc3VwcG9ydCBmb3IgdGhpcyB0eXBlIGluIFBLQ1M3IGluaXRpYWxpemF0aW9uCiAgICAgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBQS0NTN19zZXQwX3R5cGVfb3RoZXIoKSB0aGlzIGluaXRpYWxpemVzIGEgUEtDUzcgCiAgICAgc3RydWN0dXJlIG9mIHR5cGUgIm90aGVyIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcHJpbWUgZ2VuZXJhdGlvbiBsb29wIGluIGNyeXB0by9ibi9ibl9wcmltZS5wbCBieSBtYWtpbmcKICAgICBzdXJlIHRoZSBsb29wIGRvZXMgY29ycmVjdGx5IHN0b3AgYW5kIGJyZWFraW5nICgiZGl2aXNpb24gYnkgemVybyIpCiAgICAgbW9kdWx1cyBvcGVyYXRpb25zIGFyZSBub3QgcGVyZm9ybWVkLiBUaGUgKHByZS1nZW5lcmF0ZWQpIHByaW1lCiAgICAgdGFibGUgY3J5cHRvL2JuL2JuX3ByaW1lLmggd2FzIGFscmVhZHkgY29ycmVjdCwgYnV0IGl0IGNvdWxkIG5vdCBiZQogICAgIHJlLWdlbmVyYXRlZCBvbiBzb21lIHBsYXRmb3JtcyBiZWNhdXNlIG9mIHRoZSAiZGl2aXNpb24gYnkgemVybyIKICAgICBzaXR1YXRpb24gaW4gdGhlIHNjcmlwdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgVXBkYXRlIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBUTFMgY2lwaGVyc3VpdGVzIGFjY29yZGluZyB0bwogICAgIGRyYWZ0LWlldGYtdGxzLWVjYy0wMy50eHQ6IHRoZSBLREYxIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHdpdGgKICAgICBTSEEtMSBub3cgaXMgb25seSB1c2VkIGZvciAic21hbGwiIGN1cnZlcyAod2hlcmUgdGhlCiAgICAgcmVwcmVzZW50YXRpb24gb2YgYSBmaWVsZCBlbGVtZW50IHRha2VzIHVwIHRvIDI0IGJ5dGVzKTsgZm9yCiAgICAgbGFyZ2VyIGN1cnZlcywgdGhlIGZpZWxkIGVsZW1lbnQgcmVzdWx0aW5nIGZyb20gRUNESCBpcyBkaXJlY3RseQogICAgIHVzZWQgYXMgcHJlbWFzdGVyIHNlY3JldC4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBjb2RlIGZvciBrUCtsUSB0aW1pbmdzIHRvIGNyeXB0by9lYy9lY3Rlc3QuYywgYW5kIGFkZCBTRUMyCiAgICAgY3VydmUgc2VjcDE2MHIxIHRvIHRoZSB0ZXN0cy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gbG9hZCBzeW1ib2xzIGdsb2JhbGx5IHdpdGggRFNPLgogICAgIFtH9nR6IEJhYmluLUViZWxsIDxiYWJpbi1lYmVsbEB0cnVzdGNlbnRlci5kZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbnMgRVJSX3NldF9tYXJrKCkgYW5kIEVSUl9wb3BfdG9fbWFyaygpIGZvciBiZXR0ZXIKICAgICBjb250cm9sIG9mIHRoZSBlcnJvciBzdGFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU1RPUkUgaW4gRU5HSU5FLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgU1RPUkUgdHlwZS4gIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbW1vbiBpbnRlcmZhY2UKICAgICB0byBjZXJ0aWZpY2F0ZSBhbmQga2V5IHN0b3JlcywgYmUgdGhleSBzaW1wbGUgZmlsZS1iYXNlZCBzdG9yZXMsIG9yCiAgICAgSFNNLXR5cGUgc3RvcmUsIG9yIExEQVAgc3RvcmVzLCBvci4uLgogICAgIE5PVEU6IFRoZSBjb2RlIGlzIGN1cnJlbnRseSBVTlRFU1RFRCBhbmQgaXNuJ3QgcmVhbGx5IHVzZWQgYW55d2hlcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGEgZ2VuZXJpYyBzdHJ1Y3R1cmUgY2FsbGVkIE9QRU5TU0xfSVRFTS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KICAgICBwYXNzIGEgbGlzdCBvZiBhcmd1bWVudHMgdG8gYW55IGZ1bmN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBhIHdheQogICAgIGZvciBhIGZ1bmN0aW9uIHRvIHBhc3MgZGF0YSBiYWNrIHRvIHRoZSBjYWxsZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbnMgQlVGX3N0cm5kdXAoKSBhbmQgQlVGX21lbWR1cCgpLiAgQlVGX3N0cm5kdXAoKQogICAgIHdvcmtzIGxpa2UgQlVGX3N0cmR1cCgpIGJ1dCBjYW4gYmUgdXNlZCB0byBkdXBsaWNhdGUgYSBwb3J0aW9uIG9mCiAgICAgYSBzdHJpbmcuICBUaGUgY29weSBnZXRzIE5VTC10ZXJtaW5hdGVkLiAgQlVGX21lbWR1cCgpIGR1cGxpY2F0ZXMKICAgICBhIG1lbW9yeSBhcmVhLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb24gc2tfZmluZF9leCgpIHdoaWNoIHdvcmtzIGxpa2Ugc2tfZmluZCgpLCBidXQgd2lsbAogICAgIHJldHVybiBhbiBpbmRleCB0byBhbiBlbGVtZW50IGV2ZW4gaWYgYW4gZXhhY3QgbWF0Y2ggY291bGRuJ3QgYmUKICAgICBmb3VuZC4gIFRoZSBpbmRleCBpcyBndWFyYW50ZWVkIHRvIHBvaW50IGF0IHRoZSBlbGVtZW50IHdoZXJlIHRoZQogICAgIHNlYXJjaGVkLWZvciBrZXkgd291bGQgYmUgaW5zZXJ0ZWQgdG8gcHJlc2VydmUgc29ydGluZyBvcmRlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9uIE9CSl9ic2VhcmNoX2V4KCkgd2hpY2ggd29ya3MgbGlrZSBPQkpfYnNlYXJjaCgpIGJ1dAogICAgIHRha2VzIGFuIGV4dHJhIGZsYWdzIGFyZ3VtZW50IGZvciBvcHRpb25hbCBmdW5jdGlvbmFsaXR5LiAgQ3VycmVudGx5LAogICAgIHRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIGRlZmluZWQ6CgoJT0JKX0JTRUFSQ0hfVkFMVUVfT05fTk9NQVRDSAoJVGhpcyBvbmUgZ2V0cyBPQkpfYnNlYXJjaF9leCgpIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CgllbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24gcmV0dXJucyBhIG5lZ2F0aXZlIG9yIHplcm8KCW51bWJlci4KCglPQkpfQlNFQVJDSF9GSVJTVF9WQUxVRV9PTl9NQVRDSAoJVGhpcyBvbmUgZ2V0cyBPQkpfYnNlYXJjaF9leCgpIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0CgllbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLiAgVGhpcyBpcyB1c2VmdWwKCWlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGVsZW1lbnQgd2hlcmUgdGhlIGNvbXBhcmluZyBmdW5jdGlvbgoJcmV0dXJucyB6ZXJvLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gY3JlYXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcyB3aXRoICdvcGVuc3NsIGNhJwogICAgIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYmVjb21lcyBwYXJ0IG9mIHRoZQogICAgIENBIGRhdGFiYXNlIGFuZCB1c2VzIHRoZSBzYW1lIG1lY2hhbmlzbXMgZm9yIHNlcmlhbCBudW1iZXIgZ2VuZXJhdGlvbgogICAgIGFzIGFsbCBvdGhlciBjZXJ0aWZpY2F0ZSBzaWduaW5nLiAgVGhlIG5ldyBmbGFnICctc2VsZnNpZ24nIGVuYWJsZXMKICAgICB0aGlzIGZ1bmN0aW9uYWxpdHkuICBBZGFwdCBDQS5zaCBhbmQgQ0EucGwuaW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gY2hlY2sgdGhlIHB1YmxpYyBrZXkgb2YgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CiAgICAgYWdhaW5zdCBhIGdpdmVuIHByaXZhdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjayB0aGF0IGEgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IGNhbiBiZSBzaWduZWQgYnkgdGhhdCBrZXkgKHNlbGYtc2lnbmluZykuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZQogICAgIHN1YmplY3QgaW4gdGhlIENBIGluZGV4IGZpbGUuICBUaGlzIGlzIGRvbmUgb25seSBpZiB0aGUga2V5d29yZAogICAgICd1bmlxdWVfc3ViamVjdCcgaXMgc2V0IHRvICdubycgaW4gdGhlIG1haW4gQ0Egc2VjdGlvbiAoZGVmYXVsdAogICAgIGlmICdDQV9kZWZhdWx0Jykgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSB2YWx1ZSBpcyBzYXZlZAogICAgIHdpdGggdGhlIGRhdGFiYXNlIGl0c2VsZiBpbiBhIHNlcGFyYXRlIGluZGV4IGF0dHJpYnV0ZSBmaWxlLAogICAgIG5hbWVkIGxpa2UgdGhlIGluZGV4IGZpbGUgd2l0aCAnLmF0dHInIGFwcGVuZGVkIHRvIHRoZSBuYW1lLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEdlbmVyYXRlIG11dGkgdmFsdWVkIEFWQXMgdXNpbmcgJysnIG5vdGF0aW9uIGluIGNvbmZpZyBmaWxlcyBmb3IKICAgICByZXEgYW5kIGRpck5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgbmFtZUNvbnN0cmFpbnRzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBwb2xpY3lDb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgcG9saWN5TWFwcGluZ3MgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSB0aGUgZGVmYXVsdCBEU0FfTUVUSE9EIGltcGxlbWVudGF0aW9uIG9ubHkgdXNlcyBpdHMKICAgICBkc2FfbW9kX2V4cCgpIGFuZC9vciBibl9tb2RfZXhwKCkgaGFuZGxlcnMgaWYgdGhleSBhcmUgbm9uLU5VTEwsCiAgICAgYW5kIGNoYW5nZSBpdHMgb3duIGhhbmRsZXJzIHRvIGJlIE5VTEwgc28gYXMgdG8gcmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgaW5kaXJlY3Rpb24uIFRoaXMgbGV0cyBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgZmFsbGJhY2sgdG8gdGhlCiAgICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtb3JlIGVhc2lseS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTdXBwb3J0IGZvciBkaXJlY3RvcnlOYW1lIGluIEdlbmVyYWxOYW1lIHJlbGF0ZWQgZXh0ZW5zaW9ucwogICAgIGluIGNvbmZpZyBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGxpbmsgYXBwbGljYXRpb25zIHVzaW5nIE1ha2VmaWxlLnNoYXJlZC4KICAgICBNYWtlIHRoYXQgcG9zc2libGUgZXZlbiB3aGVuIGxpbmtpbmcgYWdhaW5zdCBzdGF0aWMgbGlicmFyaWVzIQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFN1cHBvcnQgZm9yIHNpbmdsZSBwYXNzIHByb2Nlc3NpbmcgZm9yIFMvTUlNRSBzaWduaW5nLiBUaGlzIG5vdwogICAgIG1lYW5zIHRoYXQgUy9NSU1FIHNpZ25pbmcgY2FuIGJlIGRvbmUgZnJvbSBhIHBpcGUsIGluIGFkZGl0aW9uCiAgICAgY2xlYXJ0ZXh0IHNpZ25pbmcgKG11bHRpcGFydC9zaWduZWQgdHlwZSkgaXMgZWZmZWN0aXZlbHkgc3RyZWFtaW5nCiAgICAgYW5kIHRoZSBzaWduZWQgZGF0YSBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsbCBoZWxkIGluIG1lbW9yeS4KCiAgICAgVGhpcyBpcyBkb25lIHdpdGggYSBuZXcgZmxhZyBQS0NTN19TVFJFQU0uIFdoZW4gdGhpcyBmbGFnIGlzIHNldAogICAgIFBLQ1M3X3NpZ24oKSBvbmx5IGluaXRpYWxpemVzIHRoZSBQS0NTNyBzdHJ1Y3R1cmUgYW5kIHRoZSBhY3R1YWwgc2lnbmluZwogICAgIGlzIGRvbmUgYWZ0ZXIgdGhlIGRhdGEgaXMgb3V0cHV0IChhbmQgZGlnZXN0cyBjYWxjdWxhdGVkKSBpbgogICAgIFNNSU1FX3dyaXRlX1BLQ1M3KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bGwgc3VwcG9ydCBmb3IgLXJwYXRoLy1SLCBib3RoIGluIHNoYXJlZCBsaWJyYXJpZXMgYW5kCiAgICAgYXBwbGljYXRpb25zLCBhdCBsZWFzdCBvbiB0aGUgcGxhdGZvcm1zIHdoZXJlIGl0J3Mga25vd24gaG93CiAgICAgdG8gZG8gaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gY3J5cHRvL2VjL2VjX211bHQuYywgaW1wbGVtZW50IGZhc3QgcG9pbnQgbXVsdGlwbGljYXRpb24gd2l0aAogICAgIHByZWNvbXB1dGF0aW9uLCBiYXNlZCBvbiB3TkFGIHNwbGl0dGluZzogRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB3aWxsIG5vdyBjb21wdXRlIGEgdGFibGUgb2YgbXVsdGlwbGVzIG9mIHRoZSBnZW5lcmF0b3IgdGhhdAogICAgIG1ha2VzIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YgRUNfUE9JTlRzX211bCgpIG9yIEVDX1BPSU5UX211bCgpCiAgICAgZmFzdGVyIChub3RhYmx5IGluIHRoZSBjYXNlIG9mIGEgc2luZ2xlIHBvaW50IG11bHRpcGxpY2F0aW9uLAogICAgIHNjYWxhciAqIGdlbmVyYXRvcikuCiAgICAgW05pbHMgTGFyc2NoLCBCb2RvIE1vZWxsZXJdCgogICopIElQdjYgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucy4gVGhlIHZhcmlvdXMgZXh0ZW5zaW9ucwogICAgIHdoaWNoIHVzZSB0aGUgSVA6YS5iLmMuZCBjYW4gbm93IHRha2UgSVB2NiBhZGRyZXNzZXMgdXNpbmcgdGhlCiAgICAgZm9ybWF0cyBvZiBSRkMxODg0IDIuMiAuIElQdjYgYWRkcmVzc2VzIGFyZSBub3cgYWxzbyBkaXNwbGF5ZWQKICAgICBjb3JyZWN0bHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgYW4gRU5HSU5FIHRoYXQgaW1wbGVtZW50cyBSU0EgYnkgcGVyZm9ybWluZyBwcml2YXRlIGtleQogICAgIGV4cG9uZW50aWF0aW9ucyB3aXRoIHRoZSBHTVAgbGlicmFyeS4gVGhlIGNvbnZlcnNpb25zIHRvIGFuZCBmcm9tCiAgICAgR01QJ3MgbXB6X3QgZm9ybWF0IGFyZW4ndCBvcHRpbWlzZWQgbm9yIGFyZSBhbnkgbW9udGdvbWVyeSBmb3JtcwogICAgIGNhY2hlZCwgYW5kIG9uIHg4NiBpdCBhcHBlYXJzIE9wZW5TU0wncyBvd24gcGVyZm9ybWFuY2UgaGFzIGNhdWdodCB1cC4KICAgICBIb3dldmVyIHRoZXJlIGFyZSBsaWtlbHkgdG8gYmUgb3RoZXIgYXJjaGl0ZWN0dXJlcyB3aGVyZSBHTVAgY291bGQKICAgICBwcm92aWRlIGEgYm9vc3QuIFRoaXMgRU5HSU5FIGlzIG5vdCBidWlsdCBpbiBieSBkZWZhdWx0LCBidXQgaXQgY2FuIGJlCiAgICAgc3BlY2lmaWVkIGF0IENvbmZpZ3VyZSB0aW1lIGFuZCBzaG91bGQgYmUgYWNjb21wYW5pZWQgYnkgdGhlIG5lY2Vzc2FyeQogICAgIGxpbmtlciBhZGRpdGlvbnMsIGVnOwogICAgICAgICAuL2NvbmZpZyAtRE9QRU5TU0xfVVNFX0dNUCAtbGdtcAogICAgIFtHZW9mZiBUaG9ycGVdCgogICopICJvcGVuc3NsIGVuZ2luZSIgd2lsbCBub3QgZGlzcGxheSBFTkdJTkUvRFNPIGxvYWQgZmFpbHVyZSBlcnJvcnMgd2hlbgogICAgIHRlc3RpbmcgYXZhaWxhYmlsaXR5IG9mIGVuZ2luZXMgd2l0aCAiLXQiIC0gdGhlIG9sZCBiZWhhdmlvdXIgaXMKICAgICBwcm9kdWNlZCBieSBpbmNyZWFzaW5nIHRoZSBmZWF0dXJlJ3MgdmVyYm9zaXR5IHdpdGggIi10dCIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgRUNEU0Egcm91dGluZXM6IHVuZGVyIGNlcnRhaW4gZXJyb3IgY29uZGl0aW9ucyB1bmluaXRpYWxpemVkIEJOIG9iamVjdHMKICAgICBjb3VsZCBiZSBmcmVlZC4gU29sdXRpb246IG1ha2Ugc3VyZSBpbml0aWFsaXphdGlvbiBpcyBwZXJmb3JtZWQgZWFybHkKICAgICBlbm91Z2guIChSZXBvcnRlZCBhbmQgZml4IHN1cHBsaWVkIGJ5IE5pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+CiAgICAgdmlhIFBSIzQ1OSkKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgS2V5LWdlbmVyYXRpb24gY2FuIG5vdyBiZSBpbXBsZW1lbnRlZCBpbiBSU0FfTUVUSE9ELCBEU0FfTUVUSE9ECiAgICAgYW5kIERIX01FVEhPRCAoZWcuIGJ5IEVOR0lORSBpbXBsZW1lbnRhdGlvbnMpIHRvIG92ZXJyaWRlIHRoZSBub3JtYWwKICAgICBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbnMuIEZvciBEU0EgYW5kIERILCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBjYW4KICAgICBhbHNvIGJlIG92ZXJyaWRlbiBieSBwcm92aWRpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIHRoZSAicHJvZ3Jlc3MiIG1lY2hhbmlzbSB1c2VkIGluIGtleS1nZW5lcmF0aW9uIGFuZAogICAgIHByaW1hbGl0eSB0ZXN0aW5nIHRvIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSBuZXcgQk5fR0VOQ0IgcG9pbnRlciBpbgogICAgIHBsYWNlIG9mIGNhbGxiYWNrL2FyZ3VtZW50IHBhaXJzLiBUaGUgbmV3IEFQSSBmdW5jdGlvbnMgaGF2ZSAiX2V4IgogICAgIHBvc3RmaXhlcyBhbmQgdGhlIG9sZGVyIGZ1bmN0aW9ucyBhcmUgcmVpbXBsZW1lbnRlZCBhcyB3cmFwcGVycyBmb3IKICAgICB0aGUgbmV3IG9uZXMuIFRoZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQgc3ltYm9sIGNhbiBiZSB1c2VkIHRvIGhpZGUKICAgICBkZWNsYXJhdGlvbnMgb2YgdGhlIG9sZCBmdW5jdGlvbnMgdG8gaGVscCAoZ3JhY2VmdWwpIGF0dGVtcHRzIHRvCiAgICAgbWlncmF0ZSB0byB0aGUgbmV3IGZ1bmN0aW9ucy4gQWxzbywgdGhlIG5ldyBrZXktZ2VuZXJhdGlvbiBBUEkKICAgICBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBhIGNhbGxlci1zdXBwbGllZCBrZXktc3RydWN0dXJlIGFuZCByZXR1cm4KICAgICBzdWNjZXNzL2ZhaWx1cmUgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEga2V5IG9yIE5VTEwgLSB0aGlzIGlzIHRvCiAgICAgaGVscCBtYWtlICJrZXlnZW4iIGFub3RoZXIgbWVtYmVyIGZ1bmN0aW9uIG9mIFJTQV9NRVRIT0QgZXRjLgoKICAgICBFeGFtcGxlIGZvciB1c2luZyB0aGUgbmV3IGNhbGxiYWNrIGludGVyZmFjZToKCiAgICAgICAgICBpbnQgKCpteV9jYWxsYmFjaykoaW50IGEsIGludCBiLCBCTl9HRU5DQiAqY2IpID0gLi4uOwogICAgICAgICAgdm9pZCAqbXlfYXJnID0gLi4uOwogICAgICAgICAgQk5fR0VOQ0IgbXlfY2I7CgogICAgICAgICAgQk5fR0VOQ0Jfc2V0KCZteV9jYiwgbXlfY2FsbGJhY2ssIG15X2FyZyk7CgogICAgICAgICAgcmV0dXJuIEJOX2lzX3ByaW1lX2V4KHNvbWVfYmlnbnVtLCBCTl9wcmltZV9jaGVja3MsIE5VTEwsICZjYik7CiAgICAgICAgICAvKiBGb3IgdGhlIG1lYW5pbmcgb2YgYSwgYiBpbiBjYWxscyB0byBteV9jYWxsYmFjaygpLCBzZWUgdGhlCiAgICAgICAgICAgKiBkb2N1bWVudGF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBjYWxsYmFjay4KICAgICAgICAgICAqIGNiIHdpbGwgcG9pbnQgdG8gbXlfY2I7IG15X2FyZyBjYW4gYmUgcmV0cmlldmVkIGFzIGNiLT5hcmcuCiAgICAgICAgICAgKiBteV9jYWxsYmFjayBzaG91bGQgcmV0dXJuIDEgaWYgaXQgd2FudHMgQk5faXNfcHJpbWVfZXgoKQogICAgICAgICAgICogdG8gY29udGludWUsIG9yIDAgdG8gc3RvcC4KICAgICAgICAgICAqLwoKICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgdGhlIFpMSUIgY29tcHJlc3Npb24gbWV0aG9kIHRvIGJlIHN0YXRlZnVsLCBhbmQgbWFrZSBpdAogICAgIGF2YWlsYWJsZSB0byBUTFMgd2l0aCB0aGUgbnVtYmVyIGRlZmluZWQgaW4gCiAgICAgZHJhZnQtaWV0Zi10bHMtY29tcHJlc3Npb24tMDQudHh0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgQVNOLjEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGZvciBDZXJ0aWZpY2F0ZVBhaXIsIHdoaWNoCiAgICAgaXMgZGVmaW5lZCBhcyBmb2xsb3dzIChhY2NvcmRpbmcgdG8gWC41MDlfNHRoRWRpdGlvbkRyYWZ0VjYucGRmKToKCiAgICAgQ2VydGlmaWNhdGVQYWlyIDo6PSBTRVFVRU5DRSB7CiAgICAgICAgZm9yd2FyZAkJWzBdCUNlcnRpZmljYXRlIE9QVElPTkFMLAogICAgICAgIHJldmVyc2UJCVsxXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKICAgICAgICAtLSBhdCBsZWFzdCBvbmUgb2YgdGhlIHBhaXIgc2hhbGwgYmUgcHJlc2VudCAtLSB9CgogICAgIEFsc28gaW1wbGVtZW50IHRoZSBQRU0gZnVuY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXRlIGNlcnRpZmljYXRlCiAgICAgcGFpcnMsIGFuZCBkZWZpbmVkIHRoZSBQRU0gdGFnIGFzICJDRVJUSUZJQ0FURSBQQUlSIi4KCiAgICAgVGhpcyBuZWVkZWQgdG8gYmUgZGVmaW5lZCwgbW9zdGx5IGZvciB0aGUgc2FrZSBvZiB0aGUgTERBUAogICAgIGF0dHJpYnV0ZSBjcm9zc0NlcnRpZmljYXRlUGFpciwgYnV0IG1heSBwcm92ZSB1c2VmdWwgZWxzZXdoZXJlIGFzCiAgICAgd2VsbC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGluaGliaXQgc3ltbGlua2luZyBvZiBzaGFyZWQgbGlicmFyaWVzIGluCiAgICAgTWFrZWZpbGUuc2hhcmVkLCBmb3IgQ3lnd2luJ3Mgc2FrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFeHRlbmQgdGhlIEJJR05VTSBBUEkgYnkgY3JlYXRpbmcgYSBmdW5jdGlvbiAKICAgICAgICAgIHZvaWQgQk5fc2V0X25lZ2F0aXZlKEJJR05VTSAqYSwgaW50IG5lZyk7CiAgICAgYW5kIGEgbWFjcm8gdGhhdCBiZWhhdmUgbGlrZQogICAgICAgICAgaW50ICBCTl9pc19uZWdhdGl2ZShjb25zdCBCSUdOVU0gKmEpOwoKICAgICB0byBhdm9pZCB0aGUgbmVlZCB0byBhY2Nlc3MgJ2EtPm5lZycgZGlyZWN0bHkgaW4gYXBwbGljYXRpb25zLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgSW1wbGVtZW50IGZhc3QgbW9kdWxhciByZWR1Y3Rpb24gZm9yIHBzZXVkby1NZXJzZW5uZSBwcmltZXMKICAgICB1c2VkIGluIE5JU1QgY3VydmVzIChjcnlwdG8vYm4vYm5fbmlzdC5jLCBjcnlwdG8vZWMvZWNwX25pc3QuYykuCiAgICAgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCgpIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgdXNlIHRoaXMKICAgICBpZiBhcHBsaWNhYmxlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIG5ldyBsb2NrIHR5cGUgKENSWVBUT19MT0NLX0JOKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIEVOR0lORSBmcmFtZXdvcmsgdG8gYXV0b21hdGljYWxseSBsb2FkIGVuZ2luZXMKICAgICBkeW5hbWljYWxseSBmcm9tIHNwZWNpZmljIGRpcmVjdG9yaWVzIHVubGVzcyB0aGV5IGNvdWxkIGJlCiAgICAgZm91bmQgdG8gYWxyZWFkeSBiZSBidWlsdCBpbiBvciBsb2FkZWQuICBNb3ZlIGFsbCB0aGUKICAgICBjdXJyZW50IGVuZ2luZXMgZXhjZXB0IGZvciB0aGUgY3J5cHRvZGV2IG9uZSB0byBhIG5ldwogICAgIGRpcmVjdG9yeSBlbmdpbmVzLy4KICAgICBUaGUgZW5naW5lcyBpbiBlbmdpbmVzLyBhcmUgYnVpbHQgYXMgc2hhcmVkIGxpYnJhcmllcyBpZgogICAgIHRoZSAic2hhcmVkIiBvcHRpb25zIHdhcyBnaXZlbiB0byAuL0NvbmZpZ3VyZSBvciAuL2NvbmZpZy4KICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGluc2VydGVkIGluIGxpYmNyeXB0by5hLgogICAgIC91c3IvbG9jYWwvc3NsL2VuZ2luZXMgaXMgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBkeW5hbWljCiAgICAgZW5naW5lcywgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRlbiBhdCBjb25maWd1cmUgdGltZSB0aHJvdWdoCiAgICAgdGhlIHVzdWFsIHVzZSBvZiAtLXByZWZpeCBhbmQvb3IgLS1vcGVuc3NsZGlyLCBhbmQgYXQgcnVuCiAgICAgdGltZSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUEVOU1NMX0VOR0lORVMuCiAgICAgW0dlb2ZmIFRob3JwZSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgTWFrZWZpbGUuc2hhcmVkLCBhIGhlbHBlciBtYWtlZmlsZSB0byBidWlsZCBzaGFyZWQKICAgICBsaWJyYXJpZXMuICBBZGRhcHQgTWFrZWZpbGUub3JnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB2ZXJzaW9uIGluZm8gdG8gV2luMzIgRExMcy4KICAgICBbUGV0ZXIgJ0x1bmEnIFJ1bmVzdGlnIiA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQWRkIG5ldyAnbWVkaXVtIGxldmVsJyBQS0NTIzEyIEFQSS4gQ2VydGlmaWNhdGVzIGFuZCBrZXlzCiAgICAgY2FuIGJlIGFkZGVkIHVzaW5nIHRoaXMgQVBJIHRvIGNyZWF0ZWQgYXJiaXRyYXJ5IFBLQ1MjMTIKICAgICBmaWxlcyB3aGlsZSBhdm9pZGluZyB0aGUgbG93IGxldmVsIEFQSS4KCiAgICAgTmV3IG9wdGlvbnMgdG8gUEtDUzEyX2NyZWF0ZSgpLCBrZXkgb3IgY2VydCBjYW4gYmUgTlVMTCBhbmQKICAgICB3aWxsIHRoZW4gYmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gVGhlIGVuY3J5cHRpb24KICAgICBhbGdvcml0aG0gTklEcyBjYW4gYmUgc2V0IHRvIC0xIGZvciBubyBlbmNyeXB0aW9uLCB0aGUgbWFjCiAgICAgaXRlcmF0aW9uIGNvdW50IGNhbiBiZSBzZXQgdG8gMCB0byBvbWl0IHRoZSBtYWMuCgogICAgIEVuaGFuY2UgcGtjczEyIHV0aWxpdHkgYnkgbWFraW5nIHRoZSAtbm9rZXlzIGFuZCAtbm9jZXJ0cwogICAgIG9wdGlvbnMgd29yayB3aGVuIGNyZWF0aW5nIGEgUEtDUyMxMiBmaWxlLiBOZXcgb3B0aW9uIC1ub21hYwogICAgIHRvIG9taXQgdGhlIG1hYywgTk9ORSBjYW4gYmUgc2V0IGZvciBhbiBlbmNyeXB0aW9uIGFsZ29yaXRobS4KICAgICBOZXcgY29kZSBpcyBtb2RpZmllZCB0byB1c2UgdGhlIGVuaGFuY2VkIFBLQ1MxMl9jcmVhdGUoKQogICAgIGluc3RlYWQgb2YgdGhlIGxvdyBsZXZlbCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIEFTTjEgZW5jb2RlciB0byBzdXBwb3J0IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkCiAgICAgZW5jb2RpbmcuIFRoaXMgY2FuIG91dHB1dCBzZXF1ZW5jZXMgdGFncyBhbmQgb2N0ZXQgc3RyaW5ncyBpbgogICAgIHRoaXMgZm9ybS4gTW9kaWZ5IHBrN19hc24xLmMgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aAogICAgIGVuY29kaW5nLiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbmVlZHMgYWRkaXRpb25hbCBjb2RlIHRvCiAgICAgYmUgdXNlZnVsLCBzdWNoIGFzIGFuIEFTTjEgYmlvIGFuZCBzb21lIGVuaGFuY2VkIHN0cmVhbWluZwogICAgIFBLQ1MjNyBjb2RlLgoKICAgICBFeHRlbmQgdGVtcGxhdGUgZW5jb2RlIGZ1bmN0aW9uYWxpdHkgc28gdGhhdCB0YWdnaW5nIGlzIHBhc3NlZAogICAgIGRvd24gdG8gdGhlIHRlbXBsYXRlIGVuY29kZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0ICdvcGVuc3NsIHJlcScgZmFpbCBpZiBhbiBhcmd1bWVudCB0byAnLW5ld2tleScgaXMgbm90CiAgICAgcmVjb2duaXplZCBpbnN0ZWFkIG9mIHVzaW5nIFJTQSBhcyBhIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMDEudHh0LgogICAgIEFzIHRoZXNlIGFyZSBub3Qgb2ZmaWNpYWwsIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiAiQUxMIjsKICAgICB0aGUgIkVDQ2RyYWZ0IiBjaXBoZXJzdWl0ZSBncm91cCBhbGlhcyBjYW4gYmUgdXNlZCB0byBzZWxlY3QgdGhlbS4KICAgICBbVmlwdWwgR3VwdGEgYW5kIFN1bWl0IEd1cHRhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBFQ0RIIGVuZ2luZSBzdXBwb3J0LgogICAgIFtOaWxzIEd1cmEgYW5kIERvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RoLy4KICAgICBbRG91Z2xhcyBTdGViaWxhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIExldCBCTl9yYW5kX3JhbmdlKCkgYWJvcnQgd2l0aCBhbiBlcnJvciBhZnRlciAxMDAgaXRlcmF0aW9ucwogICAgIHdpdGhvdXQgc3VjY2VzcyAod2hpY2ggaW5kaWNhdGVzIGEgYnJva2VuIFBSTkcpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBCTl9tb2Rfc3FydCgpIHNvIHRoYXQgaXQgdmVyaWZpZXMgdGhhdCB0aGUgaW5wdXQgdmFsdWUKICAgICBpcyByZWFsbHkgdGhlIHNxdWFyZSBvZiB0aGUgcmV0dXJuIHZhbHVlLiAgKFByZXZpb3VzbHksCiAgICAgQk5fbW9kX3NxcnQgd291bGQgc2hvdyBHSUdPIGJlaGF2aW91ci4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG5hbWVkIGVsbGlwdGljIGN1cnZlcyBvdmVyIGJpbmFyeSBmaWVsZHMgZnJvbSBYOS42MiwgU0VDRywKICAgICBhbmQgV0FQL1dUTFM7IGFkZCBPSURzIHRoYXQgd2VyZSBzdGlsbCBtaXNzaW5nLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgRXh0ZW5kIHRoZSBFQyBsaWJyYXJ5IGZvciBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzCiAgICAgKG5ldyBmaWxlcyBlYzJfc21wbC5jLCBlYzJfc21wdC5jLCBlYzJfbXVsdC5jIGluIGNyeXB0by9lYy8pLgogICAgIE5ldyBFQ19NRVRIT0Q6CgogICAgICAgICAgRUNfR0YybV9zaW1wbGVfbWV0aG9kCgogICAgIE5ldyBBUEkgZnVuY3Rpb25zOgoKICAgICAgICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19HUk9VUF9zZXRfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtCgogICAgIFBvaW50IGNvbXByZXNzaW9uIGZvciBiaW5hcnkgZmllbGRzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yCiAgICAgcGF0ZW50IHJlYXNvbnMgKGNvbXBpbGUgd2l0aCBPUEVOU1NMX0VDX0JJTl9QVF9DT01QIGRlZmluZWQgdG8KICAgICBlbmFibGUgaXQpLgoKICAgICBBcyBiaW5hcnkgcG9seW5vbWlhbHMgYXJlIHJlcHJlc2VudGVkIGFzIEJJR05VTXMsIHZhcmlvdXMgbWVtYmVycwogICAgIG9mIHRoZSBFQ19HUk9VUCBhbmQgRUNfUE9JTlQgZGF0YSBzdHJ1Y3R1cmVzIGNhbiBiZSBzaGFyZWQKICAgICBiZXR3ZWVuIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHByaW1lIGZpZWxkcyBhbmQgYmluYXJ5IGZpZWxkczsKICAgICB0aGUgYWJvdmUgLi4uX0dGMm0gZnVuY3Rpb25zIChleGNlcHQgZm9yIEVYX0dST1VQX25ld19jdXJ2ZV9HRjJtKQogICAgIGFyZSBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gdGhlaXIgLi4uX0dGcCBjb3VudGVycGFydHMuCiAgICAgKEZvciBzaW1wbGljaXR5LCB0aGUgJy4uLl9HRnAnIHByZWZpeCBoYXMgYmVlbiBkcm9wcGVkIGZyb20KICAgICB2YXJpb3VzIGludGVybmFsIG1ldGhvZCBuYW1lcy4pCgogICAgIEFuIGludGVybmFsICdmaWVsZF9kaXYnIG1ldGhvZCAoc2ltaWxhciB0byAnZmllbGRfbXVsJyBhbmQKICAgICAnZmllbGRfc3FyJykgaGFzIGJlZW4gYWRkZWQ7IHRoaXMgaXMgdXNlZCBvbmx5IGZvciBiaW5hcnkgZmllbGRzLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgT3B0aW9uYWxseSBkaXNwYXRjaCBFQ19QT0lOVF9tdWwoKSwgRUNfUE9JTlRfcHJlY29tcHV0ZV9tdWx0KCkKICAgICB0aHJvdWdoIG1ldGhvZHMgKCdtdWwnLCAncHJlY29tcHV0ZV9tdWx0JykuCgogICAgIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyAobm93IGludGVybmFsbHkgY2FsbGVkICdlY193TkFGX211bCcKICAgICBhbmQgJ2VjX3dOQUZfcHJlY29tcHV0ZWRfbXVsdCcpIHJlbWFpbiB0aGUgZGVmYXVsdCBpZiB0aGVzZQogICAgIG1ldGhvZHMgYXJlIHVuZGVmaW5lZC4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbiBFQ19HUk9VUF9nZXRfZGVncmVlLCB3aGljaCBpcyBkZWZpbmVkIHRocm91Z2gKICAgICBFQ19NRVRIT0QuICBGb3IgY3VydmVzIG92ZXIgcHJpbWUgZmllbGRzLCB0aGlzIHJldHVybnMgdGhlIGJpdAogICAgIGxlbmd0aCBvZiB0aGUgbW9kdWx1cy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE5ldyBmdW5jdGlvbnMgRUNfR1JPVVBfZHVwLCBFQ19QT0lOVF9kdXAuCiAgICAgKFRoZXNlIHNpbXBseSBjYWxsIC4uLl9uZXcgIGFuZCAuLi5fY29weSkuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYyBzb2Z0d2FyZSBpbiBjcnlwdG8vYm4vYm5fZ2YybS5jLgogICAgIFBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zICh3aGVyZSB0aGUgc2lnbiBiaXQgaXMgbm90CiAgICAgdXNlZCkgaW4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgW21hY3Jvc106ICAKCiAgICAgICAgICBCTl9HRjJtX2FkZAogICAgICAgICAgQk5fR0YybV9zdWIgICAgICAgICAgICAgWz0gQk5fR0YybV9hZGRdCiAgICAgICAgICBCTl9HRjJtX21vZCAgICAgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2RfbXVsICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX211bF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXIgICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FyX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2ludgogICAgICAgICAgQk5fR0YybV9tb2RfZXhwICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2V4cF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJ0ICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc3FydF9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnJdCiAgICAgICAgICBCTl9HRjJtX2NtcCAgICAgICAgICAgICBbPSBCTl91Y21wXQoKICAgICAoTm90ZSB0aGF0IG9ubHkgdGhlICdtb2QnIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgZm9yIGZpZWxkcyBHRigyXm0pLgogICAgIEJOX0dGMm1fYWRkKCkgaXMgbWlzbm9tZXIsIGJ1dCB0aGlzIGlzIGZvciB0aGUgc2FrZSBvZiBjb25zaXN0ZW5jeS4pCgogICAgIEZvciBzb21lIGZ1bmN0aW9ucywgYW4gdGhlIGlycmVkdWNpYmxlIHBvbHlub21pYWwgZGVmaW5pbmcgYQogICAgIGZpZWxkIGNhbiBiZSBnaXZlbiBhcyBhbiAndW5zaWduZWQgaW50W10nIHdpdGggc3RyaWN0bHkKICAgICBkZWNyZWFzaW5nIGVsZW1lbnRzIGdpdmluZyB0aGUgaW5kaWNlcyBvZiB0aG9zZSBiaXRzIHRoYXQgYXJlIHNldDsKICAgICBpLmUuLCBwW10gcmVwcmVzZW50cyB0aGUgcG9seW5vbWlhbAogICAgICAgICAgZih0KSA9IHRecFswXSArIHRecFsxXSArIC4uLiArIHRecFtrXQogICAgIHdoZXJlCiAgICAgICAgICBwWzBdID4gcFsxXSA+IC4uLiA+IHBba10gPSAwLgogICAgIFRoaXMgYXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX21vZF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX211bF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3Nxcl9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX2ludl9hcnIgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9pbnZdCiAgICAgICAgICBCTl9HRjJtX21vZF9kaXZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfZGl2XQogICAgICAgICAgQk5fR0YybV9tb2RfZXhwX2FycgogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIENvbnZlcnNpb24gY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9HRjJtX3BvbHkyYXJyCiAgICAgICAgICBCTl9HRjJtX2FycjJwb2x5CgogICAgIGJudGVzdC5jIGhhcyBhZGRpdGlvbmFsIHRlc3RzIGZvciBiaW5hcnkgcG9seW5vbWlhbCBhcml0aG1ldGljLgoKICAgICBUd28gaW1wbGVtZW50YXRpb25zIGZvciBCTl9HRjJtX21vZF9kaXYoKSBhcmUgYXZhaWxhYmxlLgogICAgIFRoZSBkZWZhdWx0IGFsZ29yaXRobSBzaW1wbHkgdXNlcyBCTl9HRjJtX21vZF9pbnYoKSBhbmQKICAgICBCTl9HRjJtX21vZF9tdWwoKS4gIFRoZSBhbHRlcm5hdGl2ZSBhbGdvcml0aG0gaXMgY29tcGlsZWQgaW4gb25seQogICAgIGlmIE9QRU5TU0xfU1VOX0dGMk1fRElWIGlzIGRlZmluZWQgKHBhdGVudCBwZW5kaW5nOyByZWFkIHRoZQogICAgIGNvcHlyaWdodCBub3RpY2UgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYyBiZWZvcmUgZW5hYmxpbmcgaXQpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIG5ldyBlcnJvciBjb2RlICdFUlJfUl9ESVNBQkxFRCcgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHNvbWUKICAgICBmdW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGF0IGNvbXBpbGUtdGltZS4KICAgICBbRG91Z2xhcyBTdGViaWxhIDxkb3VnbGFzLnN0ZWJpbGFAc3VuLmNvbT5dCgogICopIENoYW5nZSBkZWZhdWx0IGJlaGF2aW91ciBvZiAnb3BlbnNzbCBhc24xcGFyc2UnIHNvIHRoYXQgbW9yZQogICAgIGluZm9ybWF0aW9uIGlzIHZpc2libGUgd2hlbiB2aWV3aW5nLCBlLmcuLCBhIGNlcnRpZmljYXRlOgoKICAgICBNb2RpZnkgYXNuMV9wYXJzZTIgKGNyeXB0by9hc24xL2FzbjFfcGFyLmMpIHNvIHRoYXQgaW4gbm9uLSdkdW1wJwogICAgIG1vZGUgdGhlIGNvbnRlbnQgb2Ygbm9uLXByaW50YWJsZSBPQ1RFVCBTVFJJTkdzIGlzIG91dHB1dCBpbiBhCiAgICAgc3R5bGUgc2ltaWxhciB0byBJTlRFR0VScywgYnV0IHdpdGggJ1tIRVggRFVNUF0nIHByZXBlbmRlZCB0bwogICAgIGF2b2lkIHRoZSBhcHBlYXJhbmNlIG9mIGEgcHJpbnRhYmxlIHN0cmluZy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCAnYXNuMV9mbGFnJyBhbmQgJ2FzbjFfZm9ybScgbWVtYmVyIHRvIEVDX0dST1VQIHdpdGggYWNjZXNzCiAgICAgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9hc24xX2ZsYWcoKQogICAgICAgICAgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKCkKICAgICBUaGVzZSBjb250cm9sIEFTTjEgZW5jb2RpbmcgZGV0YWlsczoKICAgICAtIEN1cnZlcyAoaS5lLiwgZ3JvdXBzKSBhcmUgZW5jb2RlZCBleHBsaWNpdGx5IHVubGVzcyBhc24xX2ZsYWcKICAgICAgIGhhcyBiZWVuIHNldCB0byBPUEVOU1NMX0VDX05BTUVEX0NVUlZFLgogICAgIC0gUG9pbnRzIGFyZSBlbmNvZGVkIGluIHVuY29tcHJlc3NlZCBmb3JtIGJ5IGRlZmF1bHQ7IG9wdGlvbnMgZm9yCiAgICAgICBhc24xX2ZvciBhcmUgYXMgZm9yIHBvaW50Mm9jdCwgbmFtZWx5CiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQKICAgICAgICAgIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRAoKICAgICBBbHNvIGFkZCAnc2VlZCcgYW5kICdzZWVkX2xlbicgbWVtYmVycyB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X3NlZWQoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0MF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9zZWVkX2xlbigpCiAgICAgVGhpcyBpcyB1c2VkIG9ubHkgZm9yIEFTTjEgcHVycG9zZXMgKHNvIGZhcikuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2ZpZWxkX3R5cGUnIG1lbWJlciB0byBFQ19NRVRIT0QsIHdoaWNoIGhvbGRzIHRoZSBOSUQKICAgICBvZiB0aGUgYXBwcm9wcmlhdGUgZmllbGQgdHlwZSBPSUQuICBUaGUgbmV3IGZ1bmN0aW9uCiAgICAgRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKCkgcmV0dXJucyB0aGlzIHZhbHVlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIGZ1bmN0aW9ucyAKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmJuKCkKICAgICAgICAgIEVDX1BPSU5UX2JuMnBvaW50KCkKICAgICAgICAgIEVDX1BPSU5UX3BvaW50MmhleCgpCiAgICAgICAgICBFQ19QT0lOVF9oZXgycG9pbnQoKQogICAgIHByb3ZpZGluZyB1c2VmdWwgaW50ZXJmYWNlcyB0byBFQ19QT0lOVF9wb2ludDJvY3QoKSBhbmQKICAgICBFQ19QT0lOVF9vY3QycG9pbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIENoYW5nZSBpbnRlcm5hbHMgb2YgdGhlIEVDIGxpYnJhcnkgc28gdGhhdCB0aGUgZnVuY3Rpb25zCiAgICAgICAgICBFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9nZW5lcmF0b3IoKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X29yZGVyKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9jb2ZhY3RvcigpCiAgICAgYXJlIGltcGxlbWVudGVkIGRpcmVjdGx5IGluIGNyeXB0by9lYy9lY19saWIuYyBhbmQgbm90IGRpc3BhdGNoZWQKICAgICB0byBtZXRob2RzLCB3aGljaCB3b3VsZCBsZWFkIHRvIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gd2hlbgogICAgIGFkZGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgY3VydmVzLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB3aXRoIGlucHV0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgSW1wbGVtZW50IGNvbXB1dGVfd05BRiAoY3J5cHRvL2VjL2VjX211bHQuYykgd2l0aG91dCBCSUdOVU0KICAgICBhcml0aG1ldGljLCBhbmQgc3VjaCB0aGF0IG1vZGlmaWVkIHdOQUZzIGFyZSBnZW5lcmF0ZWQKICAgICAod2hpY2ggYXZvaWQgbGVuZ3RoIGV4cGFuc2lvbiBpbiBtYW55IGNhc2VzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKSAoZGVmaW5lZCB2aWEKICAgICBFQ19NRVRIT0QpIHRoYXQgdmVyaWZpZXMgdGhhdCB0aGUgY3VydmUgZGlzY3JpbWluYW50IGlzIG5vbi16ZXJvLgoKICAgICBBZGQgYSBmdW5jdGlvbiBFQ19HUk9VUF9jaGVjaygpIHRoYXQgbWFrZXMgc29tZSBzYW5pdHkgdGVzdHMKICAgICBvbiBhIEVDX0dST1VQLCBpdHMgZ2VuZXJhdG9yIGFuZCBvcmRlci4gIFRoaXMgaW5jbHVkZXMKICAgICBFQ19HUk9VUF9jaGVja19kaXNjcmltaW5hbnQoKS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBFQ0RTQSBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RzYS8uCgogICAgIEFkZCBhcHBsaWNhdGlvbnMgJ29wZW5zc2wgZWNwYXJhbScgYW5kICdvcGVuc3NsIGVjZHNhJwogICAgICh0aGVzZSBhcmUgYmFzZWQgb24gJ29wZW5zc2wgZHNhcGFyYW0nIGFuZCAnb3BlbnNzbCBkc2EnKS4KCiAgICAgRUNEU0Egc3VwcG9ydCBpcyBhbHNvIGluY2x1ZGVkIGluIHZhcmlvdXMgb3RoZXIgZmlsZXMgYWNyb3NzIHRoZQogICAgIGxpYnJhcnkuICBNb3N0IG5vdGFibHksCiAgICAgLSAnb3BlbnNzbCByZXEnIG5vdyBoYXMgYSAnLW5ld2tleSBlY2RzYTpmaWxlJyBvcHRpb247CiAgICAgLSBFVlBfUEtDUzgyUEtFWSAoY3J5cHRvL2V2cC9ldnBfcGtleS5jKSBub3cgY2FuIGhhbmRsZSBFQ0RTQTsKICAgICAtIFg1MDlfUFVCS0VZX2dldCAoY3J5cHRvL2FzbjEveF9wdWJrZXkuYykgYW5kCiAgICAgICBkMmlfUHVibGljS2V5IChjcnlwdG8vYXNuMS9kMmlfcHUuYykgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIG1ha2UKICAgICAgIHRoZW0gc3VpdGFibGUgZm9yIEVDRFNBIHdoZXJlIGRvbWFpbiBwYXJhbWV0ZXJzIG11c3QgYmUKICAgICAgIGV4dHJhY3RlZCBiZWZvcmUgdGhlIHNwZWNpZmljIHB1YmxpYyBrZXk7CiAgICAgLSBFQ0RTQSBlbmdpbmUgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEluY2x1ZGUgc29tZSBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMsIGFuZCBhZGQgT0lEcyBmcm9tIFg5LjYyLAogICAgIFNFQ0csIGFuZCBXQVAvV1RMUy4gIEVhY2ggY3VydmUgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG5ldwogICAgIGZ1bmN0aW9uCiAgICAgICAgICBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSgpLAogICAgIGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbmFtZWQgY3VydmVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCiAgICAgICAgICBFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoKS4KICAgICBBbHNvIGFkZCBhICdjdXJ2ZV9uYW1lJyBtZW1iZXIgdG8gRUNfR1JPVVAgb2JqZWN0cywgd2hpY2ggY2FuIGJlCiAgICAgYWNjZXNzZWQgdmlhCiAgICAgICAgIEVDX0dST1VQX3NldF9jdXJ2ZV9uYW1lKCkKICAgICAgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoKQogICAgIFtOaWxzIExhcnNjaCA8bGFyc2NoQHRydXN0Y2VudGVyLmRlLCBCb2RvIE1vZWxsZXJdCiAKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43bCBhbmQgMC45LjdtICBbMjMgRmViIDIwMDddCgogICopIENsZWFuc2UgUEVNIGJ1ZmZlcnMgYmVmb3JlIGZyZWVpbmcgdGhlbSBzaW5jZSB0aGV5IG1heSBjb250YWluIAogICAgIHNlbnNpdGl2ZSBkYXRhLgogICAgIFtCZW5qYW1pbiBCZW5uZXR0IDxiZW5AcHNjLmVkdT5dCgogICopIEluY2x1ZGUgIiFlTlVMTCIgaW4gU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QgdG8gbWFrZSBzdXJlIHRoYXQKICAgICBhIGNpcGhlcnN1aXRlIHN0cmluZyBzdWNoIGFzICJERUZBVUxUOlJTQSIgY2Fubm90IGVuYWJsZQogICAgIGF1dGhlbnRpY2F0aW9uLW9ubHkgY2lwaGVyc3VpdGVzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNpbmNlIEFFUzEyOCBhbmQgQUVTMjU2IHNoYXJlIGEgc2luZ2xlIG1hc2sgYml0IGluIHRoZSBsb2dpYyBvZgogICAgIHNzbC9zc2xfY2lwaC5jLCB0aGUgY29kZSBmb3IgbWFza2luZyBvdXQgZGlzYWJsZWQgY2lwaGVycyBuZWVkcyBhCiAgICAga2x1ZGdlIHRvIHdvcmsgcHJvcGVybHkgaWYgQUVTMTI4IGlzIGF2YWlsYWJsZSBhbmQgQUVTMjU2IGlzbid0LgogICAgIFtWaWN0b3IgRHVjaG92bmldCgogICopIEV4cGFuZCBzZWN1cml0eSBib3VuZGFyeSB0byBtYXRjaCAxLjEuMSBtb2R1bGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIHJlZHVuZGFudCBmZWF0dXJlczogaGFzaCBmaWxlIHNvdXJjZSwgZWRpdGluZyBvZiB0ZXN0IHZlY3RvcnMKICAgICBtb2RpZnkgZmlwc2xkIHRvIHVzZSBleHRlcm5hbCBmaXBzX3ByZW1haW4uYyBzaWduYXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHBlcmwgc2NyaXB0IG1rZmlwc3Njci5wbCB0byBjcmVhdGUgc2hlbGwgc2NyaXB0cyBvciBiYXRjaCBmaWxlcyB0bwogICAgIHJ1biBhbGdvcml0aG0gdGVzdCBwcm9ncmFtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGFsZ29yaXRobSB0ZXN0IHByb2dyYW1zIG1vcmUgdG9sZXJhbnQgb2Ygd2hpdGVzcGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIFNTTC9UTFMgc2VydmVyIGltcGxlbWVudGF0aW9uIHRvbGVyYXRlICJtaXNtYXRjaGVkIiByZWNvcmQKICAgICBwcm90b2NvbCB2ZXJzaW9uIHdoaWxlIHJlY2VpdmluZyBDbGllbnRIZWxsbyBldmVuIGlmIHRoZQogICAgIENsaWVudEhlbGxvIGlzIGZyYWdtZW50ZWQuICAoVGhlIHNlcnZlciBjYW4ndCBpbnNpc3Qgb24gdGhlCiAgICAgcGFydGljdWxhciBwcm90b2NvbCB2ZXJzaW9uIGl0IGhhcyBjaG9zZW4gYmVmb3JlIHRoZSBTZXJ2ZXJIZWxsbwogICAgIG1lc3NhZ2UgaGFzIGluZm9ybWVkIHRoZSBjbGllbnQgYWJvdXQgaGlzIGNob2ljZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTG9hZCBlcnJvciBjb2RlcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluc3RlYWQgb2YgdXNpbmcgYQogICAgIHN0YXRpYyB2YXJpYWJsZS4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSBjbGVhbmx5IHVubG9hZGVkIGFuZCByZWxvYWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2sgYW5kIDAuOS43bCAgWzI4IFNlcCAyMDA2XQoKICAqKSBJbnRyb2R1Y2UgbGltaXRzIHRvIHByZXZlbnQgbWFsaWNpb3VzIGtleXMgYmVpbmcgYWJsZSB0bwogICAgIGNhdXNlIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjk0MCkKICAgICBbU3RldmUgSGVuc29uLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBBU04uMSBwYXJzaW5nIG9mIGNlcnRhaW4gaW52YWxpZCBzdHJ1Y3R1cmVzIHRoYXQgY2FuIHJlc3VsdAogICAgIGluIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjkzNykgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMX2dldF9zaGFyZWRfY2lwaGVycygpIGZ1bmN0aW9uLiAKICAgICAoQ1ZFLTIwMDYtMzczOCkgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRml4IFNTTCBjbGllbnQgY29kZSB3aGljaCBjb3VsZCBjcmFzaCBpZiBjb25uZWN0aW5nIHRvIGEKICAgICBtYWxpY2lvdXMgU1NMdjIgc2VydmVyLiAgKENWRS0yMDA2LTQzNDMpCiAgICAgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgQ2hhbmdlIGNpcGhlcnN1aXRlIHN0cmluZyBwcm9jZXNzaW5nIHNvIHRoYXQgYW4gZXhwbGljaXQKICAgICBjaXBoZXJzdWl0ZSBzZWxlY3RzIHRoaXMgb25lIGNpcGhlcnN1aXRlIChzbyB0aGF0ICJBRVMyNTYtU0hBIgogICAgIHdpbGwgbm8gbG9uZ2VyIGluY2x1ZGUgIkFFUzEyOC1TSEEiKSwgYW5kIGFueSBvdGhlciBzaW1pbGFyCiAgICAgY2lwaGVyc3VpdGUgKHNhbWUgYml0bWFwKSBmcm9tICpvdGhlciogcHJvdG9jb2wgdmVyc2lvbnMgKHNvIHRoYXQKICAgICAiUkM0LU1ENSIgd2lsbCBzdGlsbCBpbmNsdWRlIGJvdGggdGhlIFNTTCAyLjAgY2lwaGVyc3VpdGUgYW5kIHRoZQogICAgIFNTTCAzLjAvVExTIDEuMCBjaXBoZXJzdWl0ZSkuICBUaGlzIGlzIGEgYmFja3BvcnQgY29tYmluaW5nCiAgICAgY2hhbmdlcyBmcm9tIDAuOS44YiBhbmQgMC45LjhkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aiBhbmQgMC45LjdrICBbMDUgU2VwIDIwMDZdCgogICopIEF2b2lkIFBLQ1MgIzEgdjEuNSBzaWduYXR1cmUgYXR0YWNrIGRpc2NvdmVyZWQgYnkgRGFuaWVsIEJsZWljaGVuYmFjaGVyCiAgICAgKENWRS0yMDA2LTQzMzkpICBbQmVuIExhdXJpZSBhbmQgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIENoYW5nZSB0aGUgVW5peCByYW5kb21uZXNzIGVudHJvcHkgZ2F0aGVyaW5nIHRvIHVzZSBwb2xsKCkgd2hlbgogICAgIHBvc3NpYmxlIGluc3RlYWQgb2Ygc2VsZWN0KCksIHNpbmNlIHRoZSBsYXR0ZXIgaGFzIHNvbWUKICAgICB1bmRlc2lyYWJsZSBsaW1pdGF0aW9ucy4KICAgICBbRGFycnlsIE1pbGVzIHZpYSBSaWNoYXJkIExldml0dGUgYW5kIEJvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSByb2d1ZSBjaXBoZXJzdWl0ZXM6CgogICAgICAtIFNTTHYyIDB4MDggMHgwMCAweDgwICgiUkM0LTY0LU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYxICgiRVhQMTAyNC1SQzItQ0JDLU1ENSIpCiAgICAgIC0gU1NMdjMvVExTdjEgMHgwMCAweDYwICgiRVhQMTAyNC1SQzQtTUQ1IikKCiAgICAgVGhlIGxhdHRlciB0d28gd2VyZSBwdXJwb3J0ZWRseSBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wWzAxXS50eHQsIGJ1dCBkbyBub3QgcmVhbGx5CiAgICAgYXBwZWFyIHRoZXJlLgoKICAgICBBbHNvIGRlYWN0aXZlIHRoZSByZW1haW5pbmcgY2lwaGVyc3VpdGVzIGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAxLnR4dC4gIFRoZXNlIGFyZSBqdXN0IGFzCiAgICAgdW5vZmZpY2lhbCwgYW5kIHRoZSBJRCBoYXMgbG9uZyBleHBpcmVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBSU0EgYmxpbmRpbmcgSGVpc2VuYnVnIChwcm9ibGVtcyBzb21ldGltZXMgb2NjdXJlZCBvbgogICAgIGR1YWwtY29yZSBtYWNoaW5lcykgYW5kIG90aGVyIHBvdGVudGlhbCB0aHJlYWQtc2FmZXR5IGlzc3Vlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2kgYW5kIDAuOS43aiAgWzA0IE1heSAyMDA2XQoKICAqKSBBZGFwdCBmaXBzbGQgYW5kIHRoZSBidWlsZCBzeXN0ZW0gdG8gbGluayBhZ2FpbnN0IHRoZSB2YWxpZGF0ZWQgRklQUwogICAgIG1vZHVsZSBpbiBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgZm9yIFZDKysgMjAwNSBidWlsZCB1bmRlciBXaW5kb3dzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgV2luZG93cyBidWlsZCB0YXJnZXQgVkMtMzItR01BS0UgZm9yIFZDKysuIFRoaXMgdXNlcyBHTlUgbWFrZSAKICAgICBmcm9tIGEgV2luZG93cyBiYXNoIHNoZWxsIHN1Y2ggYXMgTVNZUy4gSXQgaXMgYXV0b2RldGVjdGVkIGZyb20gdGhlCiAgICAgImNvbmZpZyIgc2NyaXB0IHdoZW4gcnVuIGZyb20gYSBWQysrIGVudmlyb25tZW50LiBNb2RpZnkgc3RhbmRhcmQgVkMrKwogICAgIGJ1aWxkIHRvIHVzZSBmaXBzY2FuaXN0ZXIubyBmcm9tIHRoZSBHTlUgbWFrZSBidWlsZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdoIGFuZCAwLjkuN2kgIFsxNCBPY3QgMjAwNV0KCiAgKikgV3JhcHBlZCB0aGUgZGVmaW5pdGlvbiBvZiBFVlBfTUFYX01EX1NJWkUgaW4gYSAjaWZkZWYgT1BFTlNTTF9GSVBTLgogICAgIFRoZSB2YWx1ZSBub3cgZGlmZmVycyBkZXBlbmRpbmcgb24gaWYgeW91IGJ1aWxkIGZvciBGSVBTIG9yIG5vdC4KICAgICBCRVdBUkUhICBBIHByb2dyYW0gbGlua2VkIHdpdGggYSBzaGFyZWQgRklQU2VkIGxpYmNyeXB0byBjYW4ndCBiZQogICAgIHNhZmVseSBydW4gd2l0aCBhIG5vbi1GSVBTZWQgbGliY3J5cHRvLCBhcyBpdCBtYXkgY3Jhc2ggYmVjYXVzZSBvZgogICAgIHRoZSBkaWZmZXJlbmNlIGluZHVjZWQgYnkgdGhpcyBjaGFuZ2UuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZyBhbmQgMC45LjdoICBbMTEgT2N0IDIwMDVdCgogICopIFJlbW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBTU0xfT1BfTVNJRV9TU0xWMl9SU0FfUEFERElORwogICAgIChwYXJ0IG9mIFNTTF9PUF9BTEwpLiAgVGhpcyBvcHRpb24gdXNlZCB0byBkaXNhYmxlIHRoZQogICAgIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgbWFuLWluLXRoZS1taWRkbGUgcHJvdG9jb2wtdmVyc2lvbgogICAgIHJvbGxiYWNrIGluIHRoZSBTU0wgMi4wIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgYSBiYWQKICAgICBpZGVhLiAgKENWRS0yMDA1LTI5NjkpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgWXV0YWthIE9pd2EgKFJlc2VhcmNoIENlbnRlcgogICAgIGZvciBJbmZvcm1hdGlvbiBTZWN1cml0eSwgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEFkdmFuY2VkIEluZHVzdHJpYWwKICAgICBTY2llbmNlIGFuZCBUZWNobm9sb2d5IFtBSVNUXSwgSmFwYW4pXQoKICAqKSBNaW5pbWFsIHN1cHBvcnQgZm9yIFg5LjMxIHNpZ25hdHVyZXMgYW5kIFBTUyBwYWRkaW5nIG1vZGVzLiBUaGlzIGlzCiAgICAgbWFpbmx5IGZvciBGSVBTIGNvbXBsaWFuY2UgYW5kIG5vdCBmdWxseSBpbnRlZ3JhdGVkIGF0IHRoaXMgc3RhZ2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIERTQSBzaWduaW5nLCB1bmxlc3MgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSBpcyBzZXQsIHBlcmZvcm0KICAgICB0aGUgZXhwb25lbnRpYXRpb24gdXNpbmcgYSBmaXhlZC1sZW5ndGggZXhwb25lbnQuICAoT3RoZXJ3aXNlLAogICAgIHRoZSBpbmZvcm1hdGlvbiBsZWFrZWQgdGhyb3VnaCB0aW1pbmcgY291bGQgZXhwb3NlIHRoZSBzZWNyZXQga2V5CiAgICAgYWZ0ZXIgbWFueSBzaWduYXR1cmVzOyBjZi4gQmxlaWNoZW5iYWNoZXIncyBhdHRhY2sgb24gRFNBIHdpdGgKICAgICBiaWFzZWQgay4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBhIG5ldyBmaXhlZC13aW5kb3cgbW9kX2V4cCBpbXBsZW1lbnRhdGlvbiB0aGUgZGVmYXVsdCBmb3IKICAgICBSU0EsIERTQSwgYW5kIERIIHByaXZhdGUta2V5IG9wZXJhdGlvbnMgc28gdGhhdCB0aGUgc2VxdWVuY2Ugb2YKICAgICBzcXVhcmVzIGFuZCBtdWx0aXBsaWVzIGFuZCB0aGUgbWVtb3J5IGFjY2VzcyBwYXR0ZXJuIGFyZQogICAgIGluZGVwZW5kZW50IG9mIHRoZSBwYXJ0aWN1bGFyIHNlY3JldCBrZXkuICBUaGlzIHdpbGwgbWl0aWdhdGUKICAgICBjYWNoZS10aW1pbmcgYW5kIHBvdGVudGlhbCByZWxhdGVkIGF0dGFja3MuCgogICAgIEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKSBpcyB0aGUgbmV3IGV4cG9uZW50aWF0aW9uIGltcGxlbWVudGF0aW9uLAogICAgIGFuZCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgdXNlZCBieSBCTl9tb2RfZXhwX21vbnQoKSBpZiB0aGUgbmV3IGZsYWcKICAgICBCTl9GTEdfRVhQX0NPTlNUVElNRSBpcyBzZXQgZm9yIHRoZSBleHBvbmVudC4gIFJTQSwgRFNBLCBhbmQgREgKICAgICB3aWxsIHVzZSB0aGlzIEJOIGZsYWcgZm9yIHByaXZhdGUgZXhwb25lbnRzIHVubGVzcyB0aGUgZmxhZwogICAgIFJTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUsIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUsIG9yCiAgICAgREhfRkxBR19OT19FWFBfQ09OU1RUSU1FLCByZXNwZWN0aXZlbHksIGlzIHNldC4KCiAgICAgW01hdHRoZXcgRCBXb29kIChJbnRlbCBDb3JwKSwgd2l0aCBzb21lIGNoYW5nZXMgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIGNsaWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgU1NMdjIzX21ldGhvZCgpIGFuZAogICAgIFNTTHYyM19jbGllbnRfbWV0aG9kKCkgc28gdGhhdCBpcyB1c2VzIHRoZSBTU0wgMy4wL1RMUyAxLjAKICAgICBDbGllbnQgSGVsbG8gbWVzc2FnZSBmb3JtYXQgaWYgdGhlIFNTTF9PUF9OT19TU0x2MiBvcHRpb24gaXMgc2V0LgogICAgIChQcmV2aW91c2x5LCB0aGUgU1NMIDIuMCBiYWNrd2FyZHMgY29tcGF0aWJsZSBDbGllbnQgSGVsbG8KICAgICBtZXNzYWdlIGZvcm1hdCB3b3VsZCBiZSB1c2VkIGV2ZW4gd2l0aCBTU0xfT1BfTk9fU1NMdjIuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBzbWltZS10eXBlIE1JTUUgcGFyYW1ldGVyIGluIFMvTUlNRSBtZXNzYWdlcyB3aGljaCBzb21lCiAgICAgY2xpZW50cyBuZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCkgdG8gc2V0IG1vbnRnb21lcnkgcGFyYW1ldGVycyBpbgogICAgIGEgdGhyZWFkc2FmZSBtYW5uZXIuIE1vZGlmeSByc2EgY29kZSB0byB1c2UgbmV3IGZ1bmN0aW9uIGFuZCBhZGQgY2FsbHMKICAgICB0byBkc2EgYW5kIGRoIGNvZGUgKHdoaWNoIGhhZCByYWNlIGNvbmRpdGlvbnMgYmVmb3JlKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbmNsdWRlIHRoZSBmaXhlZCBlcnJvciBsaWJyYXJ5IGNvZGUgaW4gdGhlIEMgZXJyb3IgZmlsZSBkZWZpbml0aW9ucwogICAgIGluc3RlYWQgb2YgZml4aW5nIHRoZW0gdXAgYXQgcnVudGltZS4gVGhpcyBrZWVwcyB0aGUgZXJyb3IgY29kZQogICAgIHN0cnVjdHVyZXMgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdmIGFuZCAwLjkuN2cgIFsxMSBBcHIgMjAwNV0KCiAgW05COiBPcGVuU1NMIDAuOS43aCBhbmQgbGF0ZXIgMC45LjcgcGF0Y2ggbGV2ZWxzIHdlcmUgcmVsZWFzZWQgYWZ0ZXIKICBPcGVuU1NMIDAuOS44Ll0KCiAgKikgRml4ZXMgZm9yIG5ld2VyIGtlcmJlcm9zIGhlYWRlcnMuIE5COiB0aGUgY2FzdHMgYXJlIG5lZWRlZCBiZWNhdXNlCiAgICAgdGhlICdsZW5ndGgnIGZpZWxkIGlzIHNpZ25lZCBvbiBvbmUgdmVyc2lvbiBhbmQgdW5zaWduZWQgb24gYW5vdGhlcgogICAgIHdpdGggbm8gKD8pIG9idmlvdXMgd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UsIHdpdGhvdXQgdGhlc2UgVkMrKwogICAgIGNvbXBsYWlucy4gQWxzbyB0aGUgImRlZmluaXRpb24iIG9mIEZBUiAoYmxhbmspIGlzIG5vIGxvbmdlciBpbmNsdWRlZAogICAgIG5vciBpcyB0aGUgZXJyb3IgRU5PTUVNLiBLUkI1X1BSSVZBVEUgaGFzIHRvIGJlIHNldCB0byAxIHRvIHBpY2sgdXAKICAgICBzb21lIG5lZWRlZCBkZWZpbml0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbmRvIEN5Z3dpbiBjaGFuZ2UuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIHByb3h5IGNlcnRpZmljYXRlcyBhY2NvcmRpbmcgdG8gUkZDIDM4MjAuCiAgICAgQmVjYXVzZSB0aGV5IG1heSBiZSBhIHNlY3VyaXR5IHRocmVhZCB0byB1bmF3YXJlIGFwcGxpY2F0aW9ucywKICAgICB0aGV5IG11c3QgYmUgZXhwbGljaXRlbHkgYWxsb3dlZCBpbiBydW4tdGltZS4gIFNlZQogICAgIGRvY3MvSE9XVE8vcHJveHlfY2VydGlmaWNhdGVzLnR4dCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2UgYW5kIDAuOS43ZiAgWzIyIE1hciAyMDA1XQoKICAqKSBVc2UgKFNTTF9SQU5ET01fVkFMVUUgLSA0KSBieXRlcyBvZiBwc2V1ZG8gcmFuZG9tIGRhdGEgd2hlbiBnZW5lcmF0aW5nCiAgICAgc2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcy4gUHJldmlvdXNseQogICAgIChTU0xfUkFORE9NX1ZBTFVFIC0gc2l6ZW9mKHRpbWVfdCkpIHdvdWxkIGJlIHVzZWQgd2hpY2ggd291bGQgcmVzdWx0IGluCiAgICAgbGVzcyByYW5kb20gZGF0YSB3aGVuIHNpemVvZih0aW1lX3QpID4gNCAoc29tZSA2NCBiaXQgcGxhdGZvcm1zKS4KCiAgICAgVGhpcyBjaGFuZ2UgaGFzIG5lZ2xpZ2libGUgc2VjdXJpdHkgaW1wYWN0IGJlY2F1c2U6CgogICAgIDEuIFNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMgc3RpbGwgaGF2ZSAyNCBieXRlcyBvZiBwc2V1ZG8gcmFuZG9tCiAgICAgICAgZGF0YS4KCiAgICAgMi4gU2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcyBhcmUgc2VudCBpbiB0aGUgY2xlYXIgaW4gdGhlIGluaXRpYWwKICAgICAgICBoYW5kc2hha2UuCgogICAgIDMuIFRoZSBtYXN0ZXIgc2VjcmV0IGlzIGRlcml2ZWQgdXNpbmcgdGhlIHByZW1hc3RlciBzZWNyZXQgKDQ4IGJ5dGVzIGluCiAgICAgICAgc2l6ZSBmb3Igc3RhdGljIFJTQSBjaXBoZXJzdWl0ZXMpIGFzIHdlbGwgYXMgY2xpZW50IHNlcnZlciBhbmQgcmFuZG9tCiAgICAgICAgdmFsdWVzLgoKICAgICBUaGUgT3BlblNTTCB0ZWFtIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIFVLIE5JU0NDIGZvciBicmluZ2luZyB0aGlzIGlzc3VlCiAgICAgdG8gb3VyIGF0dGVudGlvbi4gCgogICAgIFtTdGVwaGVuIEhlbnNvbiwgcmVwb3J0ZWQgYnkgVUsgTklTQ0NdCgogICopIFVzZSBXaW5kb3dzIHJhbmRvbW5lc3MgY29sbGVjdGlvbiBvbiBDeWd3aW4uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBoYW5nIGluIEVHRC9QUk5HRCBxdWVyeSB3aGVuIGNvbW11bmljYXRpb24gc29ja2V0IGlzIGNsb3NlZAogICAgIHByZW1hdHVyZWx5IGJ5IEVHRC9QUk5HRC4KICAgICBbRGFycmVuIFR1Y2tlciA8ZHR1Y2tlckB6aXAuY29tLmF1PiB2aWEgTHV0eiBK5G5pY2tlLCByZXNvbHZlcyAjMTAxNF0KCiAgKikgUHJvbXB0IGZvciBwYXNzIHBocmFzZXMgd2hlbiBhcHByb3ByaWF0ZSBmb3IgUEtDUzEyIGlucHV0IGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCYWNrLXBvcnQgb2Ygc2VsZWN0ZWQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZyb20gZGV2ZWxvcG1lbnQKICAgICBicmFuY2gsIGFzIHdlbGwgYXMgaW1wcm92ZWQgc3VwcG9ydCBmb3IgUG93ZXJQQyBwbGF0Zm9ybXMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBsb3RzIG9mIGNoZWNrcyBmb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgZXJyb3IgY29kZXMgdG8gaW5kaWNhdGUKICAgICBmYWlsdXJlIGFuZCBmcmVlaW5nIHVwIG1lbW9yeSBpZiBhIGZhaWx1cmUgb2NjdXJzLgogICAgIFtOYXV0aWN1cyBOZXR3b3JrcyBTU0wgVGVhbSA8b3BlbnNzbEBuYXV0aWN1c25ldC5jb20+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXBhc3NpbiBhcmd1bWVudCB0byBkZ3N0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBlcmZvcm0gc29tZSBjaGFyYWN0ZXIgY29tcGFyaXNvbnMgb2YgZGlmZmVyZW50IHR5cGVzIGluIFg1MDlfTkFNRV9jbXA6CiAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgY2VydGlmaWNhdGVzIHRoYXQgcmVlbmNvZGUgRE5zIGludG8gVVRGOFN0cmluZ3MKICAgICAoaW4gdmlvbGF0aW9uIG9mIFJGQzMyODApIGFuZCBjYW4ndCBvciB3b250IGlzc3VlIG5hbWUgcm9sbG92ZXIKICAgICBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBhbiBleHBsaWNpdCBjaGVjayBkdXJpbmcgY2VydGlmaWNhdGUgdmFsaWRhdGlvbiB0byBzZWUgdGhhdAogICAgIHRoZSBDQSBzZXR0aW5nIGluIGVhY2ggY2VydGlmaWNhdGUgb24gdGhlIGNoYWluIGlzIGNvcnJlY3QuICBBcyBhCiAgICAgc2lkZSBlZmZlY3QgYWx3YXlzIGRvIHRoZSBmb2xsb3dpbmcgYmFzaWMgY2hlY2tzIG9uIGV4dGVuc2lvbnMsCiAgICAgbm90IGp1c3Qgd2hlbiB0aGVyZSdzIGFuIGFzc29jaWF0ZWQgcHVycG9zZSB0byB0aGUgY2hlY2s6CgogICAgICAtIGlmIHRoZXJlIGlzIGFuIHVuaGFuZGxlZCBjcml0aWNhbCBleHRlbnNpb24gKHVubGVzcyB0aGUgdXNlcgogICAgICAgIGhhcyBjaG9zZW4gdG8gaWdub3JlIHRoaXMgZmF1bHQpCiAgICAgIC0gaWYgdGhlIHBhdGggbGVuZ3RoIGhhcyBiZWVuIGV4Y2VlZGVkIChpZiBvbmUgaXMgc2V0IGF0IGFsbCkKICAgICAgLSB0aGF0IGNlcnRhaW4gZXh0ZW5zaW9ucyBmaXQgdGhlIGFzc29jaWF0ZWQgcHVycG9zZSAoaWYgb25lIGhhcwogICAgICAgIGJlZW4gZ2l2ZW4pCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdkIGFuZCAwLjkuN2UgIFsyNSBPY3QgMjAwNF0KCiAgKikgQXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVuIENSTHMgYXJlIGNoZWNrZWQgaW4gYSBtdWx0aSB0aHJlYWRlZCAKICAgICBlbnZpcm9ubWVudC4gVGhpcyB3b3VsZCBoYXBwZW4gZHVlIHRvIHRoZSByZW9yZGVyaW5nIG9mIHRoZSByZXZva2VkCiAgICAgZW50cmllcyBkdXJpbmcgc2lnbmF0dXJlIGNoZWNraW5nIGFuZCBzZXJpYWwgbnVtYmVyIGxvb2t1cC4gTm93IHRoZQogICAgIGVuY29kaW5nIGlzIGNhY2hlZCBhbmQgdGhlIHNlcmlhbCBudW1iZXIgc29ydCBwZXJmb3JtZWQgdW5kZXIgYSBsb2NrLgogICAgIEFkZCBuZXcgU1RBQ0sgZnVuY3Rpb24gc2tfaXNfc29ydGVkKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIERlbHRhIENSTCB0byB0aGUgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBmaXhlcyB0byBzM19wa3QuYyBzbyBhbGVydHMgYXJlIHNlbnQgcHJvcGVybHkuCiAgICAgW0RhdmlkIEhvbG1lcyA8ZC5ob2xtZXNAZjUuY29tPl0KCiAgKikgUmVkdWNlIHRoZSBjaGFuY2VzIG9mIGR1cGxpY2F0ZSBpc3N1ZXIgbmFtZSBhbmQgc2VyaWFsIG51bWJlcnMgKGluCiAgICAgdmlvbGF0aW9uIG9mIFJGQzMyODApIHVzaW5nIHRoZSBPcGVuU1NMIGNlcnRpZmljYXRlIGNyZWF0aW9uIHV0aWxpdGllcy4KICAgICBUaGlzIGlzIGRvbmUgYnkgY3JlYXRpbmcgYSByYW5kb20gNjQgYml0IHZhbHVlIGZvciB0aGUgaW5pdGlhbCBzZXJpYWwKICAgICBudW1iZXIgd2hlbiBhIHNlcmlhbCBudW1iZXIgZmlsZSBpcyBjcmVhdGVkIG9yIHdoZW4gYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlzIGNyZWF0ZWQgdXNpbmcgJ29wZW5zc2wgcmVxIC14NTA5Jy4gVGhlIGluaXRpYWwgc2VyaWFsCiAgICAgbnVtYmVyIGZpbGUgaXMgY3JlYXRlZCB1c2luZyAnb3BlbnNzbCB4NTA5IC1uZXh0X3NlcmlhbCcgaW4gQ0EucGwKICAgICByYXRoZXIgdGhhbiBiZWluZyBpbml0aWFsaXplZCB0byAxLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YyBhbmQgMC45LjdkICBbMTcgTWFyIDIwMDRdCgogICopIEZpeCBudWxsLXBvaW50ZXIgYXNzaWdubWVudCBpbiBkb19jaGFuZ2VfY2lwaGVyX3NwZWMoKSByZXZlYWxlZCAgICAgICAgICAgCiAgICAgYnkgdXNpbmcgdGhlIENvZGVub21pY29uIFRMUyBUZXN0IFRvb2wgKENWRS0yMDA0LTAwNzkpICAgICAgICAgICAgICAgICAgICAKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dICAgCgogICopIEZpeCBmbGF3IGluIFNTTC9UTFMgaGFuZHNoYWtpbmcgd2hlbiB1c2luZyBLZXJiZXJvcyBjaXBoZXJzdWl0ZXMKICAgICAoQ1ZFLTIwMDQtMDExMikKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dICAgCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUKICAgICBzdWJqZWN0IGluIHRoZSBDQSBpbmRleCBmaWxlLiAgVGhpcyBpcyBkb25lIG9ubHkgaWYgdGhlIGtleXdvcmQKICAgICAndW5pcXVlX3N1YmplY3QnIGlzIHNldCB0byAnbm8nIGluIHRoZSBtYWluIENBIHNlY3Rpb24gKGRlZmF1bHQKICAgICBpZiAnQ0FfZGVmYXVsdCcpIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgdmFsdWUgaXMgc2F2ZWQKICAgICB3aXRoIHRoZSBkYXRhYmFzZSBpdHNlbGYgaW4gYSBzZXBhcmF0ZSBpbmRleCBhdHRyaWJ1dGUgZmlsZSwKICAgICBuYW1lZCBsaWtlIHRoZSBpbmRleCBmaWxlIHdpdGggJy5hdHRyJyBhcHBlbmRlZCB0byB0aGUgbmFtZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBYNTA5IHZlcmlmeSBmaXhlcy4gRGlzYWJsZSBicm9rZW4gY2VydGlmaWNhdGUgd29ya2Fyb3VuZHMgd2hlbiAKICAgICBYNTA5X1ZfRkxBR1NfWDUwOV9TVFJJQ1QgaXMgc2V0LiBDaGVjayBDUkwgaXNzdWVyIGhhcyBjUkxTaWduIHNldCBpZgogICAgIGtleVVzYWdlIGV4dGVuc2lvbiBwcmVzZW50LiBEb24ndCBhY2NlcHQgQ1JMcyB3aXRoIHVuaGFuZGxlZCBjcml0aWNhbAogICAgIGV4dGVuc2lvbnM6IHNpbmNlIHZlcmlmeSBjdXJyZW50bHkgZG9lc24ndCBwcm9jZXNzIENSTCBleHRlbnNpb25zIHRoaXMKICAgICByZWplY3RzIGEgQ1JMIHdpdGggKmFueSogY3JpdGljYWwgZXh0ZW5zaW9ucy4gQWRkIG5ldyB2ZXJpZnkgZXJyb3IgY29kZXMKICAgICBmb3IgdGhlc2UgY2FzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2hlbiBjcmVhdGluZyBhbiBPQ1NQIG5vbmNlIHVzZSBhbiBPQ1RFVCBTVFJJTkcgaW5zaWRlIHRoZSBleHRuVmFsdWUuCiAgICAgQSBjbGFyaWZpY2F0aW9uIG9mIFJGQzI1NjAgd2lsbCByZXF1aXJlIHRoZSB1c2Ugb2YgT0NURVQgU1RSSU5HcyBhbmQgCiAgICAgc29tZSBpbXBsZW1lbnRhdGlvbnMgY2Fubm90IGhhbmRsZSB0aGUgY3VycmVudCByYXcgZm9ybWF0LiBTaW5jZSBPcGVuU1NMCiAgICAgY29waWVzIGFuZCBjb21wYXJlcyBPQ1NQIG5vbmNlcyBhcyBvcGFxdWUgYmxvYnMgd2l0aG91dCBhbnkgYXR0ZW1wdCBhdAogICAgIHBhcnNpbmcgdGhlbSB0aGlzIHNob3VsZCBub3QgY3JlYXRlIGFueSBjb21wYXRpYmlsaXR5IGlzc3Vlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgbWQgZmxhZyBFVlBfTURfQ1RYX0ZMQUdfUkVVU0UgdGhpcyBhbGxvd3MgbWRfZGF0YSB0byBiZSByZXVzZWQgd2hlbgogICAgIGNhbGxpbmcgRVZQX01EX0NUWF9jb3B5X2V4KCkgdG8gYXZvaWQgY2FsbGluZyBPUEVOU1NMX21hbGxvYygpLiBXaXRob3V0CiAgICAgdGhpcyBITUFDIChhbmQgb3RoZXIpIG9wZXJhdGlvbnMgYXJlIHNldmVyYWwgdGltZXMgc2xvd2VyIHRoYW4gT3BlblNTTAogICAgIDwgMC45LjcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJpbnQgb3V0IEdlbmVyYWxpemVkVGltZSBhbmQgVVRDVGltZSBpbiBBU04xX1NUUklOR19wcmludF9leCgpLgogICAgIFtQZXRlciBTeWx2ZXN0ZXIgPFBldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyPl0KCiAgKikgVXNlIHRoZSBjb3JyZWN0IGNvbnRlbnQgd2hlbiBzaWduaW5nIHR5cGUgIm90aGVyIi4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2IgYW5kIDAuOS43YyAgWzMwIFNlcCAyMDAzXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJldmVhbGVkIGJ5IHJ1bm5pbmcgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3Agb3V0IG9mIGJvdW5kcyByZWFkcyBpbiB0aGUgQVNOMSBjb2RlIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBpbnZhbGlkIHRhZ3MgKENWRS0yMDAzLTA1NDMgYW5kIENWRS0yMDAzLTA1NDQpLgogICAgIAogICAgIEZyZWUgdXAgQVNOMV9UWVBFIGNvcnJlY3RseSBpZiBBTlkgdHlwZSBpcyBpbnZhbGlkIChDVkUtMjAwMy0wNTQ1KS4KCiAgICAgSWYgdmVyaWZ5IGNhbGxiYWNrIGlnbm9yZXMgaW52YWxpZCBwdWJsaWMga2V5IGVycm9ycyBkb24ndCB0cnkgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgd2l0aCB0aGUgTlVMTCBwdWJsaWMga2V5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLWlnbm9yZV9lcnIgb3B0aW9uIGluIG9jc3AgYXBwbGljYXRpb24gdG8gc3RvcCB0aGUgc2VydmVyCiAgICAgZXhpdGluZyBvbiB0aGUgZmlyc3QgZXJyb3IgaW4gYSByZXF1ZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfYWNjZXB0KCkgKHNzbC9zM19zcnZyLmMpIG9ubHkgYWNjZXB0IGEgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgaWYgdGhlIHNlcnZlciByZXF1ZXN0ZWQgb25lOiBhcyBzdGF0ZWQgaW4gVExTIDEuMCBhbmQgU1NMIDMuMAogICAgIHNwZWNpZmljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpIChzc2wvczNfc3J2ci5jKSwgdG9sZXJhdGUgYWRkaXRpb25hbAogICAgIGV4dHJhIGRhdGEgYWZ0ZXIgdGhlIGNvbXByZXNzaW9uIG1ldGhvZHMgbm90IG9ubHkgZm9yIFRMUyAxLjAKICAgICBidXQgYWxzbyBmb3IgU1NMIDMuMCAoYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb24pLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWF0dGhpYXMgTG9lcGZlXQoKICAqKSBDaGFuZ2UgWDUwOV9jZXJ0aWZpY2F0ZV90eXBlKCkgdG8gbWFyayB0aGUga2V5IGFzIGV4cG9ydGVkL2V4cG9ydGFibGUKICAgICB3aGVuIGl0J3MgNTEyICpiaXRzKiBsb25nLCBub3QgNTEyIGJ5dGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBBRVNfY2JjX2VuY3J5cHQoKSBzbyBpdCBvdXRwdXRzIGV4YWN0IG11bHRpcGxlIG9mCiAgICAgYmxvY2tzIGR1cmluZyBlbmNyeXB0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFZhcmlvdXMgZml4ZXMgdG8gYmFzZTY0IEJJTyBhbmQgbm9uIGJsb2NraW5nIEkvTy4gT24gd3JpdGUgCiAgICAgZmx1c2hlcyB3ZXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5IGlmIHRoZSBCSU8gcmV0cmllZC4gT24gcmVhZAogICAgIGRhdGEgd2FzIG5vdCBiZWluZyBidWZmZXJlZCBwcm9wZXJseSBhbmQgaGFkIHZhcmlvdXMgbG9naWMgYnVncy4KICAgICBUaGlzIGFsc28gYWZmZWN0cyBibG9ja2luZyBJL08gd2hlbiB0aGUgZGF0YSBiZWluZyBkZWNvZGVkIGlzIGEKICAgICBjZXJ0YWluIHNpemUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBTL01JTUUgYnVnZml4ZXMgYW5kIGNvbXBhdGliaWxpdHkgY2hhbmdlczoKICAgICBvdXRwdXQgY29ycmVjdCBhcHBsaWNhdGlvbi9wa2NzNyBNSU1FIHR5cGUgaWYKICAgICBQS0NTN19OT09MRE1JTUVUWVBFIGlzIHNldC4gVG9sZXJhdGUgc29tZSBicm9rZW4gc2lnbmF0dXJlcy4KICAgICBPdXRwdXQgQ1IrTEYgZm9yIEVPTCBpZiBQS0NTN19DUkxGRU9MIGlzIHNldCAodGhpcyBtYWtlcyBvcGVuaW5nCiAgICAgb2YgZmlsZXMgYXMgLmVtbCB3b3JrKS4gQ29ycmVjdGx5IGhhbmRsZSB2ZXJ5IGxvbmcgbGluZXMgaW4gTUlNRQogICAgIHBhcnNlci4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2EgYW5kIDAuOS43YiAgWzEwIEFwciAyMDAzXQoKICAqKSBDb3VudGVybWVhc3VyZSBhZ2FpbnN0IHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mCiAgICAgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBwYWRkaW5nOiB0cmVhdAogICAgIGEgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgbWlzbWF0Y2ggbGlrZSBhIGRlY3J5cHRpb24gZXJyb3IKICAgICBpbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlIChzc2wvczNfc3J2ci5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIG9uIFJTQSBibGluZGluZyBieSBkZWZhdWx0IGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgdG8gYXZvaWQgYSB0aW1pbmcgYXR0YWNrLiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IGl0IGNhbiBjYWxsCiAgICAgUlNBX2JsaW5kaW5nX29mZigpIG9yIHVzZSB0aGUgbmV3IGZsYWcgUlNBX0ZMQUdfTk9fQkxJTkRJTkcuCiAgICAgVGhleSB3b3VsZCBiZSBpbGwtYWR2aXNlZCB0byBkbyBzbyBpbiBtb3N0IGNhc2VzLgogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb24sIEdlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUlNBIGJsaW5kaW5nIGNvZGUgc28gdGhhdCBpdCB3b3JrcyB3aGVuIHRoZSBQUk5HIGlzIG5vdAogICAgIHNlZWRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgc2VjcmV0IFJTQSBleHBvbmVudCBpcyBhYnVzZWQgYXMKICAgICBhbiB1bnByZWRpY3RhYmxlIHNlZWQgLS0gaWYgaXQgaXMgbm90IHVucHJlZGljdGFibGUsIHRoZXJlCiAgICAgaXMgbm8gcG9pbnQgaW4gYmxpbmRpbmcgYW55d2F5KS4gIE1ha2UgUlNBIGJsaW5kaW5nIHRocmVhZC1zYWZlCiAgICAgYnkgcmVtZW1iZXJpbmcgdGhlIGNyZWF0b3IncyB0aHJlYWQgSUQgaW4gcnNhLT5ibGluZGluZyBhbmQKICAgICBoYXZpbmcgYWxsIG90aGVyIHRocmVhZHMgdXNlIGxvY2FsIG9uZS10aW1lIGJsaW5kaW5nIGZhY3RvcnMKICAgICAodGhpcyByZXF1aXJlcyBtb3JlIGNvbXB1dGF0aW9uIHRoYW4gc2hhcmluZyByc2EtPmJsaW5kaW5nLCBidXQKICAgICBhdm9pZHMgZXhjZXNzaXZlIGxvY2tpbmc7IGFuZCBpZiBhbiBSU0Egb2JqZWN0IGlzIG5vdCBzaGFyZWQKICAgICBiZXR3ZWVuIHRocmVhZHMsIGJsaW5kaW5nIHdpbGwgc3RpbGwgYmUgdmVyeSBmYXN0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXhlZCBhIHR5cG8gYnVnIHRoYXQgd291bGQgY2F1c2UgRU5HSU5FX3NldF9kZWZhdWx0KCkgdG8gc2V0IGFuCiAgICAgRU5HSU5FIGFzIGRlZmF1bHRzIGZvciBhbGwgc3VwcG9ydGVkIGFsZ29yaXRobXMgaXJyZXNwZWN0aXZlIG9mCiAgICAgdGhlICdmbGFncycgcGFyYW1ldGVyLiAnZmxhZ3MnIGlzIG5vdyBob25vdXJlZCwgc28gYXBwbGljYXRpb25zCiAgICAgc2hvdWxkIG1ha2Ugc3VyZSB0aGV5IGFyZSBwYXNzaW5nIGl0IGNvcnJlY3RseS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUYXJnZXQgIm1pbmd3IiBub3cgYWxsb3dzIG5hdGl2ZSBXaW5kb3dzIGNvZGUgdG8gYmUgZ2VuZXJhdGVkIGluCiAgICAgdGhlIEN5Z3dpbiBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdpdGggdGhlIE1pbkdXIGNvbXBpbGVyLgogICAgIFtVbGYgTW9lbGxlcl0gCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43IGFuZCAwLjkuN2EgIFsxOSBGZWIgMjAwM10KCiAgKikgSW4gc3NsM19nZXRfcmVjb3JkIChzc2wvczNfcGt0LmMpLCBtaW5pbWl6ZSBpbmZvcm1hdGlvbiBsZWFrZWQKICAgICB2aWEgdGltaW5nIGJ5IHBlcmZvcm1pbmcgYSBNQUMgY29tcHV0YXRpb24gZXZlbiBpZiBpbmNvcnJyZWN0CiAgICAgYmxvY2sgY2lwaGVyIHBhZGRpbmcgaGFzIGJlZW4gZm91bmQuICBUaGlzIGlzIGEgY291bnRlcm1lYXN1cmUKICAgICBhZ2FpbnN0IGFjdGl2ZSBhdHRhY2tzIHdoZXJlIHRoZSBhdHRhY2tlciBoYXMgdG8gZGlzdGluZ3Vpc2gKICAgICBiZXR3ZWVuIGJhZCBwYWRkaW5nIGFuZCBhIE1BQyB2ZXJpZmljYXRpb24gZXJyb3IuIChDVkUtMjAwMy0wMDc4KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJyaWNlIENhbnZlbCAoRVBGTCksCiAgICAgQWxhaW4gSGlsdGdlbiAoVUJTKSwgU2VyZ2UgVmF1ZGVuYXkgKEVQRkwpLCBhbmQKICAgICBNYXJ0aW4gVnVhZ25vdXggKEVQRkwsIElsaW9uKV0KCiAgKikgTWFrZSB0aGUgbm8tZXJyIG9wdGlvbiB3b3JrIGFzIGludGVuZGVkLiAgVGhlIGludGVudGlvbiB3aXRoIG5vLWVycgogICAgIGlzIG5vdCB0byBoYXZlIHRoZSB3aG9sZSBlcnJvciBzdGFjayBoYW5kbGluZyByb3V0aW5lcyByZW1vdmVkIGZyb20KICAgICBsaWJjcnlwdG8sIGl0J3Mgb25seSBpbnRlbmRlZCB0byByZW1vdmUgYWxsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZAogICAgIHJlYXNvbiB0ZXh0cywgdGhlcmVieSByZW1vdmluZyBzb21lIG9mIHRoZSBmb290cHJpbnQgdGhhdCBtYXkgbm90CiAgICAgYmUgaW50ZXJlc3RpbmcgaWYgdGhvc2UgZXJyb3JzIGFyZW4ndCBkaXNwbGF5ZWQgYW55d2F5LgoKICAgICBOT1RFOiBpdCdzIHN0aWxsIHBvc3NpYmxlIGZvciBhbnkgYXBwbGljYXRpb24gb3IgbW9kdWxlIHRvIGhhdmUgaXQncwogICAgIG93biBzZXQgb2YgZXJyb3IgdGV4dHMgaW5zZXJ0ZWQuICBUaGUgcm91dGluZXMgYXJlIHRoZXJlLCBqdXN0IG5vdAogICAgIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vLWVyciBpcyBnaXZlbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCBvbiBJQTY0LgogICAgIFtkaXJrLm1leWVyQGRpbm9leC5zdWIub3JnIHZpYSBSaWNoYXJkIExldml0dGUsIHJlc29sdmVzICM0NTRdCgogICopIEFkanVzdCBERVNfY2JjX2Nrc3VtKCkgc28gaXQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgTUlUCiAgICAgS2VyYmVyb3MgZnVuY3Rpb24gbWl0X2Rlc19jYmNfY2tzdW0oKS4gIEJlZm9yZSB0aGlzIGNoYW5nZSwKICAgICB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgREVTX2NiY19ja3N1bSgpIHdhcyBsaWtlIHRoZSBvbmUgZnJvbQogICAgIG1pdF9kZXNfY2JjX2Nrc3VtKCksIGV4Y2VwdCB0aGUgYnl0ZXMgd2VyZSBzd2FwcGVkLgogICAgIFtLZXZpbiBHcmVhbmV5IDxLZXZpbi5HcmVhbmV5QGhwLmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIFNTTCBjaGFpbiBidWlsZGluZy4KICAgICBCZWZvcmUgdGhpcyBhIHJhdGhlciBwcmltaXRpdmUgY2hhaW4gYnVpbGQgd2FzIGFsd2F5cyBwZXJmb3JtZWQgaW4KICAgICBzc2wzX291dHB1dF9jZXJ0X2NoYWluKCk6IGFuIGFwcGxpY2F0aW9uIGhhZCBubyB3YXkgdG8gc2VuZCB0aGUgCiAgICAgY29ycmVjdCBjaGFpbiBpZiB0aGUgYXV0b21hdGljIG9wZXJhdGlvbiBwcm9kdWNlZCBhbiBpbmNvcnJlY3QgcmVzdWx0LgoKICAgICBOb3cgdGhlIGNoYWluIGJ1aWxkZXIgaXMgZGlzYWJsZWQgaWYgZWl0aGVyOgoKICAgICAxLiBFeHRyYSBjZXJ0aWZpY2F0ZXMgYXJlIGFkZGVkIHZpYSBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkuCgogICAgIDIuIFRoZSBtb2RlIGZsYWcgU1NMX01PREVfTk9fQVVUT19DSEFJTiBpcyBzZXQuCgogICAgIFRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgaXMgdGhhdCBhbiBhcHBsaWNhdGlvbiB3b3VsZCBub3Qgd2FudCB0aGUKICAgICBhdXRvIGNoYWluIGJ1aWxkaW5nIHRvIHRha2UgcGxhY2UgaWYgZXh0cmEgY2hhaW4gY2VydGlmaWNhdGVzIGFyZQogICAgIHByZXNlbnQgYW5kIGl0IG1pZ2h0IGFsc28gd2FudCBhIG1lYW5zIG9mIHNlbmRpbmcgbm8gYWRkaXRpb25hbAogICAgIGNlcnRpZmljYXRlcyAoZm9yIGV4YW1wbGUgdGhlIGNoYWluIGhhcyB0d28gY2VydGlmaWNhdGVzIGFuZCB0aGUKICAgICByb290IGlzIG9taXR0ZWQpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gYnVpbGQgd2l0aG91dCB0aGUgRU5HSU5FIGZyYW1ld29yay4KICAgICBbU3RldmVuIFJlZGRpZSA8c21yQGVzc2VtZXIuY29tLmF1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBVbmRlciBXaW4zMiBnbXRpbWUoKSBjYW4gcmV0dXJuIE5VTEw6IGNoZWNrIHJldHVybiB2YWx1ZSBpbgogICAgIE9QRU5TU0xfZ210aW1lKCkuIEFkZCBlcnJvciBjb2RlIGZvciBjYXNlIHdoZXJlIGdtdGltZSgpIGZhaWxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERTQSByb3V0aW5lczogdW5kZXIgY2VydGFpbiBlcnJvciBjb25kaXRpb25zIHVuaW5pdGlhbGl6ZWQgQk4gb2JqZWN0cwogICAgIGNvdWxkIGJlIGZyZWVkLiBTb2x1dGlvbjogbWFrZSBzdXJlIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBlYXJseQogICAgIGVub3VnaC4gKFJlcG9ydGVkIGFuZCBmaXggc3VwcGxpZWQgYnkgSXZhbiBEIE5lc3RsZXJvZGUgPG5lc3RsZXJATUlULkVEVT4sCiAgICAgTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT4gdmlhIFBSIzQ1OSkKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQW5vdGhlciBmaXggZm9yIFNTTHYyIHNlc3Npb24gSUQgaGFuZGxpbmc6IHRoZSBzZXNzaW9uIElEIHdhcyBpbmNvcnJlY3RseQogICAgIGNoZWNrZWQgb24gcmVjb25uZWN0IG9uIHRoZSBjbGllbnQgc2lkZSwgdGhlcmVmb3JlIHNlc3Npb24gcmVzdW1wdGlvbgogICAgIGNvdWxkIHN0aWxsIGZhaWwgd2l0aCBhICJzc2wgc2Vzc2lvbiBpZCBpcyBkaWZmZXJlbnQiIGVycm9yLiBUaGlzCiAgICAgYmVoYXZpb3VyIGlzIG1hc2tlZCB3aGVuIFNTTF9PUF9BTEwgaXMgdXNlZCBkdWUgdG8KICAgICBTU0xfT1BfTUlDUk9TT0ZUX1NFU1NfSURfQlVHIGJlaW5nIHNldC4KICAgICBCZWhhdmlvdXIgb2JzZXJ2ZWQgYnkgQ3Jpc3BpbiBGbG93ZXJkYXkgPGNyaXNwaW5AZmxvd2VyZGF5LmN4PiBhcwogICAgIGZvbGxvd3VwIHRvIFBSICMzNzcuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIElBLTMyIGFzc2VtYmxlciBzdXBwb3J0IGVuaGFuY2VtZW50czogdW5pZmllZCBFTEYgdGFyZ2V0cywgc3VwcG9ydAogICAgIGZvciBTQ08vQ2FsZGVyYSBwbGF0Zm9ybXMsIGZpeCBmb3IgQ3lnd2luIHNoYXJlZCBidWlsZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEZyZWVCU0Qgb24gc3BhcmM2NC4gIEFzIGEgY29uc2VxdWVuY2UsIHN1cHBvcnQgZm9yCiAgICAgRnJlZUJTRCBvbiBub24teDg2IHByb2Nlc3NvcnMgaXMgc2VwYXJhdGUgZnJvbSB4ODYgcHJvY2Vzc29ycyBvbgogICAgIHRoZSBjb25maWcgc2NyaXB0LCBtdWNoIGxpa2UgdGhlIE5ldEJTRCBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGUgJiBLcmlzIEtlbm5hd2F5IDxrcmlzQG9ic2VjdXJpdHkub3JnPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZoIGFuZCAwLjkuNyAgWzMxIERlYyAyMDAyXQoKICBbTkI6IE9wZW5TU0wgMC45LjZpIGFuZCBsYXRlciAwLjkuNiBwYXRjaCBsZXZlbHMgd2VyZSByZWxlYXNlZCBhZnRlcgogIE9wZW5TU0wgMC45LjcuXQoKICAqKSBGaXggc2Vzc2lvbiBJRCBoYW5kbGluZyBpbiBTU0x2MiBjbGllbnQgY29kZTogdGhlIFNFUlZFUiBGSU5JU0hFRAogICAgIGNvZGUgKDA2KSB3YXMgdGFrZW4gYXMgdGhlIGZpcnN0IG9jdGV0IG9mIHRoZSBzZXNzaW9uIElEIGFuZCB0aGUgbGFzdAogICAgIG9jdGV0IHdhcyBpZ25vcmVkIGNvbnNlcXVlbnRseS4gQXMgYSByZXN1bHQgU1NMdjIgY2xpZW50IHNpZGUgc2Vzc2lvbgogICAgIGNhY2hpbmcgY291bGQgbm90IGhhdmUgd29ya2VkIGR1ZSB0byB0aGUgc2Vzc2lvbiBJRCBtaXNtYXRjaCBiZXR3ZWVuCiAgICAgY2xpZW50IGFuZCBzZXJ2ZXIuCiAgICAgQmVoYXZpb3VyIG9ic2VydmVkIGJ5IENyaXNwaW4gRmxvd2VyZGF5IDxjcmlzcGluQGZsb3dlcmRheS5jeD4gYXMKICAgICBQUiAjMzc3LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBDaGFuZ2UgdGhlIGRlY2xhcmF0aW9uIG9mIG5lZWRlZCBLZXJiZXJvcyBsaWJyYXJpZXMgdG8gdXNlIEVYX0xJQlMKICAgICBpbnN0ZWFkIG9mIHRoZSBzcGVjaWFsIChhbmQgYmFkbHkgc3VwcG9ydGVkKSBMSUJLUkI1LiAgTElCS1JCNSBpcwogICAgIHJlbW92ZWQgZW50aXJlbHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIGh3X25jaXBoZXIuYyBlbmdpbmUgcmVxdWlyZXMgZHluYW1pYyBsb2Nrcy4gIFVuZm9ydHVuYXRlbHksIGl0CiAgICAgc2VlbXMgdGhhdCBpbiBzcGl0ZSBvZiBleGlzdGluZyBmb3IgbW9yZSB0aGFuIGEgeWVhciwgbWFueSBhcHBsaWNhdGlvbgogICAgIGF1dGhvciBoYXZlIGRvbmUgbm90aGluZyB0byBwcm92aWRlIHRoZSBuZWNlc3NhcnkgY2FsbGJhY2tzLCB3aGljaAogICAgIG1lYW5zIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGVuZ2luZSB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IGFueXdoZXJlLgogICAgIFRoaXMgaXMgYSB2ZXJ5IHVuZm9ydHVuYXRlIHNpdHVhdGlvbiB3aGljaCBmb3JjZXMgdXMsIGluIHRoZSBuYW1lCiAgICAgb2YgdXNhYmlsaXR5LCB0byBnaXZlIHRoZSBod19uY2lwaGVyLmMgYSBzdGF0aWMgbG9jaywgd2hpY2ggaXMgcGFydAogICAgIG9mIGxpYmNyeXB0by4KICAgICBOT1RFOiBUaGlzIGlzIGZvciB0aGUgMC45Ljcgc2VyaWVzIE9OTFkuICBUaGlzIGhhY2sgd2lsbCBuZXZlcgogICAgIGFwcGVhciBpbiAwLjkuOCBvciBsYXRlci4gIFdlIEVYUEVDVCBhcHBsaWNhdGlvbiBhdXRob3JzIHRvIGhhdmUKICAgICBkZWFsdCBwcm9wZXJseSB3aXRoIHRoaXMgd2hlbiAwLjkuOCBpcyByZWxlYXNlZCAodW5sZXNzIHdlIGFjdHVhbGx5CiAgICAgbWFrZSBzdWNoIGNoYW5nZXMgaW4gdGhlIGxpYmNyeXB0byBsb2NraW5nIGNvZGUgdGhhdCBjaGFuZ2VzIHdpbGwKICAgICBoYXZlIHRvIGJlIG1hZGUgYW55d2F5KS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBhc24xX2QyaV9yZWFkX2JpbygpIHJlcGVhdGVkbHkgY2FsbCBCSU9fcmVhZCgpIHVudGlsIGFsbCBjb250ZW50CiAgICAgb2N0ZXRzIGhhdmUgYmVlbiByZWFkLCBFT0Ygb3IgYW4gZXJyb3Igb2NjdXJzLiBXaXRob3V0IHRoaXMgY2hhbmdlCiAgICAgc29tZSB0cnVuY2F0ZWQgQVNOMSBzdHJ1Y3R1cmVzIHdpbGwgbm90IHByb2R1Y2UgYW4gZXJyb3IuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGlzYWJsZSBIZWltZGFsIHN1cHBvcnQsIHNpbmNlIGl0IGhhc24ndCBiZWVuIGZ1bGx5IGltcGxlbWVudGVkLgogICAgIFN0aWxsIGdpdmUgdGhlIHBvc3NpYmlsaXR5IHRvIGZvcmNlIHRoZSB1c2Ugb2YgSGVpbWRhbCwgYnV0IHdpdGgKICAgICB3YXJuaW5ncyBhbmQgYSByZXF1ZXN0IHRoYXQgcGF0Y2hlcyBnZXQgc2VudCB0byBvcGVuc3NsLWRldi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIFZDLUNFIHRhcmdldCwgaW50cm9kdWNlIHRoZSBXSU5DRSBzeXNuYW1lLCBhbmQgYWRkCiAgICAgSU5TVEFMTC5XQ0UgYW5kIGFwcHJvcHJpYXRlIGNvbmRpdGlvbmFscyB0byBtYWtlIGl0IGJ1aWxkLgogICAgIFtTdGV2ZW4gUmVkZGllIDxzbXJAZXNzZW1lci5jb20uYXU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSB0aGUgRExMIG5hbWVzIGZvciBDeWd3aW4gdG8gY3lnY3J5cHRvLXgueS56LmRsbCBhbmQKICAgICBjeWdzc2wteC55LnouZGxsLCB3aGVyZSB4LCB5IGFuZCB6IGFyZSB0aGUgbWFqb3IsIG1pbm9yIGFuZAogICAgIGVkaXQgbnVtYmVycyBvZiB0aGUgdmVyc2lvbi4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW50cm9kdWNlIHNhZmUgc3RyaW5nIGNvcHkgYW5kIGNhdGVuYXRpb24gZnVuY3Rpb25zCiAgICAgKEJVRl9zdHJsY3B5KCkgYW5kIEJVRl9zdHJsY2F0KCkpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUykgYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQXZvaWQgdXNpbmcgZml4ZWQtc2l6ZSBidWZmZXJzIGZvciBvbmUtbGluZSBETnMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIEJVRl9NRU1fZ3Jvd19jbGVhbigpIHRvIGF2b2lkIGluZm9ybWF0aW9uIGxlYWthZ2Ugd2hlbgogICAgIHJlc2l6aW5nIGJ1ZmZlcnMgY29udGFpbmluZyBzZWNyZXRzLCBhbmQgdXNlIHdoZXJlIGFwcHJvcHJpYXRlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEF2b2lkIHVzaW5nIGZpeGVkIHNpemUgYnVmZmVycyBmb3IgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEF2b2lkIGZpbGVuYW1lIHRydW5jYXRpb24gZm9yIHZhcmlvdXMgQ0EgZmlsZXMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgVXNlIHNpemVvZiBpbiBwcmVmZXJlbmNlIHRvIG1hZ2ljIG51bWJlcnMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgZmlsZW5hbWUgdHJ1bmNhdGlvbiBpbiBjZXJ0IHJlcXVlc3RzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBhc3NlcnRpb25zIHRvIGNoZWNrIGZvciAoc3VwcG9zZWRseSBpbXBvc3NpYmxlKSBidWZmZXIKICAgICBvdmVyZmxvd3MuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRG9uJ3QgY2FjaGUgdHJ1bmNhdGVkIEROUyBlbnRyaWVzIGluIHRoZSBsb2NhbCBjYWNoZSAodGhpcyBjb3VsZAogICAgIHBvdGVudGlhbGx5IGxlYWQgdG8gYSBzcG9vZmluZyBhdHRhY2spLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEZpeCB2YXJpb3VzIGJ1ZmZlcnMgdG8gYmUgbGFyZ2UgZW5vdWdoIGZvciBoZXgvZGVjaW1hbAogICAgIHJlcHJlc2VudGF0aW9ucyBpbiBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hbm5lci4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQ1JZUFRPX3JlYWxsb2NfY2xlYW4oKSB0byBhdm9pZCBpbmZvcm1hdGlvbiBsZWFrYWdlIHdoZW4KICAgICByZXNpemluZyBidWZmZXJzIGNvbnRhaW5pbmcgc2VjcmV0cywgYW5kIHVzZSB3aGVyZSBhcHByb3ByaWF0ZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQklPX2luZGVudCgpIHRvIGF2b2lkIG11Y2ggc2xpZ2h0bHkgd29ycnlpbmcgY29kZSB0byBkbwogICAgIGluZGVudHMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQ29udmVydCBzcHJpbnRmKCkvQklPX3B1dHMoKSB0byBCSU9fcHJpbnRmKCkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgYnVmZmVyX2dldHMoKSBjb3VsZCB0ZXJtaW5hdGUgd2l0aCB0aGUgYnVmZmVyIG9ubHkgaGFsZgogICAgIGZ1bGwuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBhc3NlcnRpb25zIHRvIHByZXZlbnQgdXNlci1zdXBwbGllZCBjcnlwdG8gZnVuY3Rpb25zIGZyb20KICAgICBvdmVyZmxvd2luZyBpbnRlcm5hbCBidWZmZXJzIGJ5IGhhdmluZyBsYXJnZSBibG9jayBzaXplcywgZXRjLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIE5ldyBPUEVOU1NMX2Fzc2VydCgpIG1hY3JvIChzaW1pbGFyIHRvIGFzc2VydCgpLCBidXQgZW5hYmxlZAogICAgIHVuY29uZGl0aW9uYWxseSkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBjb3B5IG9mIGtleSBpbiBSQzQuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgaW5jb3JyZWN0bHkgc2l6ZWQgYnVmZmVycyBmb3IgSVYgaW4gcGVtLmguCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gRUdEIHBhdGguCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgSWYgUkFOREZJTEUgcGF0aCBpcyB0b28gbG9uZywgaWdub3JlIGluc3RlYWQgb2YgdHJ1bmNhdGluZy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBpbmNvcnJlY3RseSBzaXplZCBYLjUwOSBzdHJ1Y3R1cmUKICAgICBDQkNQYXJhbWV0ZXIuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgZGFuZ2Vyb3VzIGZ1bmN0aW9uIGtudW1iZXIoKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBkYW5nZXJvdXMgc3RydWN0dXJlLCBLU1NMX0VSUi4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBQcm90ZWN0IGFnYWluc3Qgb3Zlcmxvbmcgc2Vzc2lvbiBJRCBjb250ZXh0IGxlbmd0aCBpbiBhbiBlbmNvZGVkCiAgICAgc2Vzc2lvbiBvYmplY3QuIFNpbmNlIHRoZXNlIGFyZSBsb2NhbCwgdGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKICAgICBleHBsb2l0YWJsZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDaGFuZ2UgZnJvbSBzZWN1cml0eSBwYXRjaCAoc2VlIDAuOS42ZSBiZWxvdykgdGhhdCBkaWQgbm90IGFmZmVjdAogICAgIHRoZSAwLjkuNiByZWxlYXNlIHNlcmllczoKCiAgICAgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wzIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIG1hc3RlciBrZXkgaW4gS2VyYmVyb3MtZW5hYmxlZCB2ZXJzaW9ucy4KICAgICAoQ1ZFLTIwMDItMDY1NykKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDaGFuZ2UgdGhlIFNTTCBrZXJiNSBjb2RlcyB0byBtYXRjaCBSRkMgMjcxMi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIC1uYW1lb3B0IHdvcmsgZnVsbHkgZm9yIHJlcSBhbmQgYWRkIC1yZXFvcHQgc3dpdGNoLgogICAgIFtNaWNoYWVsIEJlbGwgPG1pY2hhZWwuYmVsbEByei5odS1iZXJsaW4uZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIFRoZSAiYmxvY2sgc2l6ZSIgZm9yIGJsb2NrIGNpcGhlcnMgaW4gQ0ZCIGFuZCBPRkIgbW9kZSBzaG91bGQgYmUgMS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBZbmd2ZSBOeXNhZXRlciBQZXR0ZXJzZW4gPHluZ3ZlQG9wZXJhLmNvbT5dCgogICopIE1ha2Ugc3VyZSB0ZXN0cyBjYW4gYmUgcGVyZm9ybWVkIGV2ZW4gaWYgdGhlIGNvcnJlc3BvbmRpbmcgYWxnb3JpdGhtcwogICAgIGhhdmUgYmVlbiByZW1vdmVkIGVudGlyZWx5LiAgVGhpcyB3YXMgYWxzbyB0aGUgbGFzdCBzdGVwIHRvIG1ha2UKICAgICBPcGVuU1NMIGNvbXBpbGFibGUgd2l0aCBESkdQUCB1bmRlciBhbGwgcmVhc29uYWJsZSBjb25kaXRpb25zLgogICAgIFtSaWNoYXJkIExldml0dGUsIERvdWcgS2F1Zm1hbiA8ZGthdWZtYW5AcmFodWwubmV0Pl0KCiAgKikgQWRkIGNpcGhlciBzZWxlY3Rpb24gcnVsZXMgQ09NUExFTUVOVE9GQUxMIGFuZCBDT01QTEVNRU5UT0ZERUZBVUxUCiAgICAgdG8gYWxsb3cgdmVyc2lvbiBpbmRlcGVuZGVudCBkaXNhYmxpbmcgb2Ygbm9ybWFsbHkgdW5zZWxlY3RlZCBjaXBoZXJzLAogICAgIHdoaWNoIG1heSBiZSBhY3RpdmF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBzZWxlY3RpbmcgYSBzaW5nbGUgY2lwaGVyLgoKICAgICAoRS5nLiwgY2lwaGVyIGxpc3Qgc3RyaW5nICJSU0EiIGVuYWJsZXMgY2lwaGVyc3VpdGVzIHRoYXQgYXJlIGxlZnQKICAgICBvdXQgb2YgIkFMTCIgYmVjYXVzZSB0aGV5IGRvIG5vdCBwcm92aWRlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLgogICAgICJSU0E6IUNPTVBMRU1FTUVOVE9GQUxMIiBhdm9pZHMgdGhlc2UgdW5zYWZlIGNpcGhlcnN1aXRlcy4pCiAgICAgW0x1dHogSmFlbmlja2UsIEJvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFwcHJvcHJpYXRlIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHBsYXRmb3JtLWRlcGVuZGVudCBidWlsZAogICAgIGRpcmVjdG9yaWVzLiAgVGhlIHJlY29tbWVuZGVkIHdheSB0byBtYWtlIGEgcGxhdGZvcm0tZGVwZW5kZW50CiAgICAgYnVpbGQgZGlyZWN0b3J5IGlzIHRoZSBmb2xsb3dpbmcgKHRlc3RlZCBvbiBMaW51eCksIG1heWJlIHdpdGgKICAgICBzb21lIGxvY2FsIHR3ZWFrczoKCgkjIFBsYWNlIHlvdXJzZWxmIG91dHNpZGUgb2YgdGhlIE9wZW5TU0wgc291cmNlIHRyZWUuICBJbgoJIyB0aGlzIGV4YW1wbGUsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUEVOU1NMX1NPVVJDRQoJIyBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGFic29sdXRlIE9wZW5TU0wgc291cmNlIGRpcmVjdG9yeS4KCW1rZGlyIC1wIG9ianRyZWUvImB1bmFtZSAtc2AtYHVuYW1lIC1yYC1gdW5hbWUgLW1gIgoJY2Qgb2JqdHJlZS8iYHVuYW1lIC1zYC1gdW5hbWUgLXJgLWB1bmFtZSAtbWAiCgkoY2QgJE9QRU5TU0xfU09VUkNFOyBmaW5kIC4gLXR5cGUgZikgfCB3aGlsZSByZWFkIEY7IGRvCgkJbWtkaXIgLXAgYGRpcm5hbWUgJEZgCgkJbG4gLXMgJE9QRU5TU0xfU09VUkNFLyRGICRGCglkb25lCgogICAgIFRvIGJlIGFic29sdXRlbHkgc3VyZSBub3QgdG8gZGlzdHVyYiB0aGUgc291cmNlIHRyZWUsIGEgIm1ha2UgY2xlYW4iCiAgICAgaXMgYSBnb29kIHRoaW5nLiAgSWYgaXQgaXNuJ3Qgc3VjY2Vzc2Z1bGwsIGRvbid0IHdvcnJ5IGFib3V0IGl0LAogICAgIGl0IHByb2JhYmx5IG1lYW5zIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHZlcnkgY2xlYW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBzdXJlIGFueSBFTkdJTkUgY29udHJvbCBjb21tYW5kcyBtYWtlIGxvY2FsIGNvcGllcyBvZiBzdHJpbmcKICAgICBwb2ludGVycyBwYXNzZWQgdG8gdGhlbSB3aGVuZXZlciBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCBpcyBwb3NzaWJsZQogICAgIHRoZSBjYWxsZXIgbWF5IGhhdmUgb3ZlcndyaXR0ZW4gKG9yIGRlYWxsb2NhdGVkKSB0aGUgb3JpZ2luYWwgc3RyaW5nCiAgICAgZGF0YSB3aGVuIGEgbGF0ZXIgRU5HSU5FIG9wZXJhdGlvbiB0cmllcyB0byB1c2UgdGhlIHN0b3JlZCB2YWx1ZXMuCiAgICAgW0f2dHogQmFiaW4tRWJlbGwgPGJhYmluZWJlbGxAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBJbXByb3ZlIGRpYWdub3N0aWNzIGluIGZpbGUgcmVhZGluZyBhbmQgY29tbWFuZC1saW5lIGRpZ2VzdHMuCiAgICAgW0JlbiBMYXVyaWUgYWlkZWQgYW5kIGFiZXR0ZWQgYnkgU29sYXIgRGVzaWduZXIgPHNvbGFyQG9wZW53YWxsLmNvbT5dCgogICopIEFkZCBBRVMgbW9kZXMgQ0ZCIGFuZCBPRkIgdG8gdGhlIG9iamVjdCBkYXRhYmFzZS4gIENvcnJlY3QgYW4KICAgICBlcnJvciBpbiBBRVMtQ0ZCIGRlY3J5cHRpb24uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVtb3ZlIG1vc3QgY2FsbHMgdG8gRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgpIGluIGV2cF9lbmMuYywgdGhpcyAKICAgICBhbGxvd3MgZXhpc3RpbmcgRVZQX0NJUEhFUl9DVFggc3RydWN0dXJlcyB0byBiZSByZXVzZWQgYWZ0ZXIKICAgICBjYWxsaW5nIEVWUF8qRmluYWwoKS4gVGhpcyBiZWhhdmlvdXIgaXMgdXNlZCBieSBlbmNyeXB0aW9uCiAgICAgQklPcyBhbmQgc29tZSBhcHBsaWNhdGlvbnMuIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0CiAgICAgYXBwbGljYXRpb25zIG11c3QgZXhwbGljaXRseSBjbGVhbiB1cCBjaXBoZXIgY29udGV4dHMgd2l0aAogICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoKSBvciB0aGV5IHdpbGwgbGVhayBtZW1vcnkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hlY2sgdGhlIHZhbHVlcyBvZiBkbmEgYW5kIGRuYiBpbiBibl9tdWxfcmVjdXJzaXZlIGJlZm9yZSBjYWxsaW5nCiAgICAgYm5fbXVsX2NvbWJhIChhIG5vbiB6ZXJvIHZhbHVlIG1lYW5zIHRoZSBhIG9yIGIgYXJyYXlzIGRvIG5vdCBjb250YWluCiAgICAgbjIgZWxlbWVudHMpIGFuZCBmYWxsYmFjayB0byBibl9tdWxfbm9ybWFsIGlmIGVpdGhlciBpcyBub3QgemVyby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZXNjYXBpbmcgb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlcnMgd2hlbiB1c2luZyB0aGUgLXN1Ymogb3B0aW9uCiAgICAgb2YgdGhlICJvcGVuc3NsIHJlcSIgY29tbWFuZCBsaW5lIHRvb2wuIChSb2JlcnQgSm9vcCA8am9vcEBmb2t1cy5nbWQuZGU+KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBNYWtlIG9iamVjdCBkZWZpbml0aW9ucyBjb21wbGlhbnQgdG8gTERBUCAoUkZDMjI1Nik6IFNOIGlzIHRoZSBzaG9ydAogICAgIGZvcm0gZm9yICJzdXJuYW1lIiwgc2VyaWFsTnVtYmVyIGhhcyBubyBzaG9ydCBmb3JtLgogICAgIFVzZSAibWFpbCIgYXMgdGhlIHNob3J0IG5hbWUgZm9yICJyZmM4MjJNYWlsYm94IiBhY2NvcmRpbmcgdG8gUkZDMjc5ODsKICAgICB0aGVyZWZvcmUgcmVtb3ZlICJtYWlsIiBzaG9ydCBuYW1lIGZvciAiaW50ZXJuZXQgNyIuCiAgICAgVGhlIE9JRCBmb3IgdW5pcXVlIGlkZW50aWZpZXJzIGluIFg1MDkgY2VydGlmaWNhdGVzIGlzCiAgICAgeDUwMFVuaXF1ZUlkZW50aWZpZXIsIG5vdCB1bmlxdWVJZGVudGlmaWVyLgogICAgIFNvbWUgbW9yZSBPSUQgYWRkaXRpb25zLiAoTWljaGFlbCBCZWxsIDxtaWNoYWVsLmJlbGxAcnouaHUtYmVybGluLmRlPikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGFuICJpbml0IiBjb21tYW5kIHRvIHRoZSBFTkdJTkUgY29uZmlnIG1vZHVsZSBhbmQgYXV0byBpbml0aWFsaXplCiAgICAgRU5HSU5Fcy4gV2l0aG91dCBhbnkgImluaXQiIGNvbW1hbmQgdGhlIEVOR0lORSB3aWxsIGJlIGluaXRpYWxpemVkIAogICAgIGFmdGVyIGFsbCBjdHJsIGNvbW1hbmRzIGhhdmUgYmVlbiBleGVjdXRlZCBvbiBpdC4gSWYgaW5pdD0xIHRoZSAKICAgICBFTkdJTkUgaXMgaW5pdGFpbGl6ZWQgYXQgdGhhdCBwb2ludCAoY3RybHMgYmVmb3JlIHRoYXQgcG9pbnQgYXJlIHJ1bgogICAgIG9uIHRoZSB1bmluaXRpYWxpemVkIEVOR0lORSBhbmQgYWZ0ZXIgb24gdGhlIGluaXRpYWxpemVkIG9uZSkuIElmCiAgICAgaW5pdD0wIHRoZW4gdGhlIEVOR0lORSB3aWxsIG5vdCBiZSBpbmlhdGlhbGl6ZWQgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgJ2FwcF92ZXJpZnlfY2FsbGJhY2snIGludGVyZmFjZSBzbyB0aGF0IHRoZSB1c2VyLWRlZmluZWQKICAgICBhcmd1bWVudCBpcyBhY3R1YWxseSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrOiBJbiB0aGUKICAgICBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaygpIHByb3RvdHlwZSwgdGhlIGNhbGxiYWNrCiAgICAgZGVjbGFyYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBmcm9tCiAgICAgICAgICBpbnQgKCpjYikoKQogICAgIGludG8KICAgICAgICAgIGludCAoKmNiKShYNTA5X1NUT1JFX0NUWCAqLHZvaWQgKik7CiAgICAgaW4gc3NsX3ZlcmlmeV9jZXJ0X2NoYWluIChzc2wvc3NsX2NlcnQuYyksIHRoZSBjYWxsCiAgICAgICAgICBpPXMtPmN0eC0+YXBwX3ZlcmlmeV9jYWxsYmFjaygmY3R4KQogICAgIGhhcyBiZWVuIGNoYW5nZWQgaW50bwogICAgICAgICAgaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCwgcy0+Y3R4LT5hcHBfdmVyaWZ5X2FyZykuCgogICAgIFRvIHVwZGF0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soKSwKICAgICBhIGR1bW15IGFyZ3VtZW50IGNhbiBiZSBhZGRlZCB0byB0aGVpciBjYWxsYmFjayBmdW5jdGlvbnMuCiAgICAgW0QuIEsuIFNtZXR0ZXJzIDxzbWV0dGVyc0BwYXJjLnhlcm94LmNvbT5dCgogICopIEFkZGVkIHRoZSAnNDc1OGNjYScgRU5HSU5FIHRvIHN1cHBvcnQgSUJNIDQ3NTggY2FyZHMuCiAgICAgW01hdXJpY2UgR2l0dGVucyA8bWF1cmljZUBnaXR0ZW5zLm5sPiwgdG91Y2h1cHMgYnkgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYW5kIE9QRU5TU0xfTE9BRF9DT05GIGRlZmluZSB3aGljaCB3aWxsIGNhdXNlCiAgICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSB0byBsb2FkIHRoZSBvcGVuc3NsLmNuZiBjb25maWcgZmlsZS4KICAgICBUaGlzIGFsbG93cyBvbGRlciBhcHBsaWNhdGlvbnMgdG8gdHJhbnNwYXJlbnRseSBzdXBwb3J0IGNlcnRhaW4KICAgICBPcGVuU1NMIGZlYXR1cmVzOiBzdWNoIGFzIGNyeXB0byBhY2NlbGVyYXRpb24gYW5kIGR5bmFtaWMgRU5HSU5FIGxvYWRpbmcuCiAgICAgVHdvIG5ldyBmdW5jdGlvbnMgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfbm9jb25mKCkgd2hpY2ggd2lsbCBuZXZlcgogICAgIGxvYWQgdGhlIGNvbmZpZyBmaWxlIGFuZCBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19jb25mKCkgd2hpY2ggd2lsbAogICAgIGFsd2F5cyBsb2FkIGl0IGhhdmUgYWxzbyBiZWVuIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgT0ZCLCBDRkIgYW5kIENUUiAoYWxsIHdpdGggMTI4IGJpdCBmZWVkYmFjaykgdG8gQUVTLgogICAgIEFkanVzdCBOSURzIGFuZCBFVlAgbGF5ZXIuCiAgICAgW1N0ZXBoZW4gU3BydW5rIDxzdGVwaGVuQHNwcnVuay5vcmc+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIENvbmZpZyBtb2R1bGVzIHN1cHBvcnQgaW4gb3BlbnNzbCB1dGlsaXR5LgoKICAgICBNb3N0IGNvbW1hbmRzIG5vdyBsb2FkIG1vZHVsZXMgZnJvbSB0aGUgY29uZmlnIGZpbGUsCiAgICAgdGhvdWdoIGluIGEgZmV3IChzdWNoIGFzIHZlcnNpb24pIHRoaXMgaXNuJ3QgZG9uZSAKICAgICBiZWNhdXNlIGl0IGNvdWxkbid0IGJlIHVzZWQgZm9yIGFueXRoaW5nLgoKICAgICBJbiB0aGUgY2FzZSBvZiBjYSBhbmQgcmVxIHRoZSBjb25maWcgZmlsZSB1c2VkIGlzCiAgICAgdGhlIHNhbWUgYXMgdGhlIHV0aWxpdHkgaXRzZWxmOiB0aGF0IGlzIHRoZSAtY29uZmlnCiAgICAgY29tbWFuZCBsaW5lIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuCiAgICAgYWx0ZXJuYXRpdmUgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIGRlZmF1bHQgYmVoYXZpb3VyIGZyb20gT1BFTlNTTF9jb25maWcoKS4gSWYgYXBwbmFtZSBpcyBOVUxMCiAgICAgdXNlICJvcGVuc3NsX2NvbmYiIGlmIGZpbGVuYW1lIGlzIE5VTEwgdXNlIGRlZmF1bHQgb3BlbnNzbCBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYW4gYXJndW1lbnQgdG8gT1BFTlNTTF9jb25maWcoKSB0byBhbGxvdyB0aGUgdXNlIG9mIGFuIGFsdGVybmF0aXZlCiAgICAgY29uZmlnIHNlY3Rpb24gbmFtZS4gQWRkIGEgbmV3IGZsYWcgdG8gdG9sZXJhdGUgYSBtaXNzaW5nIGNvbmZpZyBmaWxlCiAgICAgYW5kIG1vdmUgY29kZSB0byBDT05GX21vZHVsZXNfbG9hZF9maWxlKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQWNjZWxlcmF0ZWQgRW5jcnlwdGlvbgogICAgIFByb2Nlc3NpbmcsIHd3dy5hZXAuaWUuICAoVXNlIGVuZ2luZSAnYWVwJykKICAgICBUaGUgc3VwcG9ydCB3YXMgY29waWVkIGZyb20gMC45LjZjIFtlbmdpbmVdIGFuZCBhZGFwdGVkL2NvcnJlY3RlZAogICAgIHRvIHdvcmsgd2l0aCB0aGUgbmV3IGVuZ2luZSBmcmFtZXdvcmsuCiAgICAgW0FFUCBJbmMuIGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFN1cHBvcnQgZm9yIFN1cmVXYXJlIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEJhbHRpbW9yZQogICAgIFRlY2hub2xvZ2llcy4gIChVc2UgZW5naW5lICdzdXJld2FyZScpCiAgICAgVGhlIHN1cHBvcnQgd2FzIGNvcGllZCBmcm9tIDAuOS42YyBbZW5naW5lXSBhbmQgYWRhcHRlZAogICAgIHRvIHdvcmsgd2l0aCB0aGUgbmV3IGVuZ2luZSBmcmFtZXdvcmsuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSGF2ZSB0aGUgQ0hJTCBlbmdpbmUgZm9yay1zYWZlIChhcyBkZWZpbmVkIGJ5IG5DaXBoZXIpIGFuZCBhY3R1YWxseQogICAgIG1ha2UgdGhlIG5ld2VyIEVOR0lORSBmcmFtZXdvcmsgY29tbWFuZHMgZm9yIHRoZSBDSElMIGVuZ2luZSB3b3JrLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBwcm9kdWNlIHNoYXJlZCBsaWJyYXJpZXMgb24gUmVsaWFudFVOSVguCiAgICAgW1JvYmVydCBEYWhsZW0gPFJvYmVydC5EYWhsZW1AZmZtMi5zaWVtZW5zLmRlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdGFyZ2V0IGRlYnVnLWxpbnV4LXBwcm8uCiAgICAgTWFrZSAnb3BlbnNzbCByc2EnIHVzZSB0aGUgZ2VuZXJhbCBrZXkgbG9hZGluZyByb3V0aW5lcwogICAgIGltcGxlbWVudGVkIGluIGFwcHMuYywgYW5kIG1ha2UgdGhvc2Ugcm91dGluZXMgYWJsZSB0bwogICAgIGhhbmRsZSB0aGUga2V5IGZvcm1hdCBGT1JNQVRfTkVUU0NBUEUgYW5kIHRoZSB2YXJpYW50CiAgICAgRk9STUFUX0lJU1NHQy4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogKikgRml4IGEgY3Jhc2hidWcgYW5kIGEgbG9naWMgYnVnIGluIGh3Y3Joa19sb2FkX3B1YmtleSgpLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIC1rZXlmb3JtIHRvIHJzYXV0bCwgYW5kIGRvY3VtZW50IC1lbmdpbmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgaW5zcGlyZWQgYnkgVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+XQoKICAqKSBDaGFuZ2UgQklPX25ld19maWxlIChjcnlwdG8vYmlvL2Jzc19maWxlLmMpIHRvIHVzZSBuZXcKICAgICBCSU9fUl9OT19TVUNIX0ZJTEUgZXJyb3IgY29kZSByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYwogICAgIEVSUl9SX1NZU19MSUIgZXJyb3IgY29kZSBpZiBmb3BlbigpIGZhaWxzIHdpdGggRU5PRU5ULgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9ucwogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcgogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmVfZGF0YS4KICAgICBUaGVzZSBhcmUgc2ltaWxhciB0bwogICAgICAgICAgRVJSX3BlZWtfZXJyb3IKICAgICAgICAgIEVSUl9wZWVrX2Vycm9yX2xpbmUKICAgICAgICAgIEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YSwKICAgICBidXQgcmVwb3J0IG9uIHRoZSBsYXRlc3QgZXJyb3IgcmVjb3JkZWQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IG9uZQogICAgIHN0aWxsIGluIHRoZSBlcnJvciBxdWV1ZS4KICAgICBbQmVuIExhdXJpZSwgQm9kbyBNb2VsbGVyXQogICAgICAgIAogICopIGRlZmF1bHRfYWxnb3JpdGhtcyBvcHRpb24gaW4gRU5HSU5FIGNvbmZpZyBtb2R1bGUuIFRoaXMgYWxsb3dzIHRoaW5ncwogICAgIGxpa2U6CiAgICAgZGVmYXVsdF9hbGdvcml0aG1zID0gQUxMCiAgICAgZGVmYXVsdF9hbGdvcml0aG1zID0gUlNBLCBEU0EsIFJBTkQsIENJUEhFUlMsIERJR0VTVFMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmVsbWluYXJ5IEVOR0lORSBjb25maWcgbW9kdWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHBlcmltZW50YWwgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgQUVTIGNvZGUgdG8gZm9sbG93IHRoZSBzYW1lIG5hbWUgc3RydWN0dXJlIGFzIGFsbCBvdGhlcgogICAgIHN5bW1ldHJpYyBjaXBoZXJzLCBhbmQgYmVoYXZlIHRoZSBzYW1lIHdheS4gIE1vdmUgZXZlcnl0aGluZyB0bwogICAgIHRoZSBkaXJlY3RvcnkgY3J5cHRvL2FlcywgdGhlcmVieSBvYnNvbGV0aW5nIGNyeXB0by9yaWpuZGFlbC4KICAgICBbU3RlcGhlbiBTcHJ1bmsgPHN0ZXBoZW5Ac3BydW5rLm9yZz4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU0VDVVJJVFk6IHJlbW92ZSB1bnNhZmUgc2V0am1wL3NpZ25hbCBpbnRlcmFjdGlvbiBmcm9tIHVpX29wZW5zc2wuYy4KICAgICBbQmVuIExhdXJpZSBhbmQgVGhlbyBkZSBSYWFkdF0KCiAgKikgQWRkIG9wdGlvbiB0byBvdXRwdXQgcHVibGljIGtleXMgaW4gcmVxIGNvbW1hbmQuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIG1hZHdvbGZAb3BlbmNhLm9yZ10KCiAgKikgVXNlIHdOQUZzIGluIEVDX1BPSU5Uc19tdWwoKSBmb3IgaW1wcm92ZWQgZWZmaWNpZW5jeQogICAgICh1cCB0byBhYm91dCAxMCUgYmV0dGVyIHRoYW4gYmVmb3JlIGZvciBQLTE5MiBhbmQgUC0yMjQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMvbWFjcm9zCgogICAgICAgICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrKGN0eCwgY2IpCiAgICAgICAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnKGN0eCwgYXJnKQogICAgICAgICAgU1NMX3NldF9tc2dfY2FsbGJhY2soc3NsLCBjYikKICAgICAgICAgIFNTTF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhzc2wsIGFyZykKCiAgICAgdG8gcmVxdWVzdCBjYWxsaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24KCiAgICAgICAgICB2b2lkIGNiKGludCB3cml0ZV9wLCBpbnQgdmVyc2lvbiwgaW50IGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBTU0wgKnNzbCwgdm9pZCAqYXJnKQoKICAgICB3aGVuZXZlciBhIHByb3RvY29sIG1lc3NhZ2UgaGFzIGJlZW4gY29tcGxldGVseSByZWNlaXZlZAogICAgICh3cml0ZV9wID09IDApIG9yIHNlbnQgKHdyaXRlX3AgPT0gMSkuICBIZXJlICd2ZXJzaW9uJyBpcyB0aGUKICAgICBwcm90b2NvbCB2ZXJzaW9uICBhY2NvcmRpbmcgdG8gd2hpY2ggdGhlIFNTTCBsaWJyYXJ5IGludGVycHJldHMKICAgICB0aGUgY3VycmVudCBwcm90b2NvbCBtZXNzYWdlIChTU0wyX1ZFUlNJT04sIFNTTDNfVkVSU0lPTiwgb3IKICAgICBUTFMxX1ZFUlNJT04pLiAgJ2NvbnRlbnRfdHlwZScgaXMgMCBpbiB0aGUgY2FzZSBvZiBTU0wgMi4wLCBvcgogICAgIHRoZSBjb250ZW50IHR5cGUgYXMgZGVmaW5lZCBpbiB0aGUgU1NMIDMuMC9UTFMgMS4wIHByb3RvY29sCiAgICAgc3BlY2lmaWNhdGlvbiAoY2hhbmdlX2NpcGhlcl9zcGVjKDIwKSwgYWxlcnQoMjEpLCBoYW5kc2hha2UoMjIpKS4KICAgICAnYnVmJyBhbmQgJ2xlbicgcG9pbnQgdG8gdGhlIGFjdHVhbCBtZXNzYWdlLCAnc3NsJyB0byB0aGUKICAgICBTU0wgb2JqZWN0LCBhbmQgJ2FyZycgaXMgdGhlIGFwcGxpY2F0aW9uLWRlZmluZWQgdmFsdWUgc2V0IGJ5CiAgICAgU1NMW19DVFhdX3NldF9tc2dfY2FsbGJhY2tfYXJnKCkuCgogICAgICdvcGVuc3NsIHNfY2xpZW50JyBhbmQgJ29wZW5zc2wgc19zZXJ2ZXInIGhhdmUgbmV3ICctbXNnJyBvcHRpb25zCiAgICAgdG8gZW5hYmxlIGEgY2FsbGJhY2sgdGhhdCBkaXNwbGF5cyBhbGwgcHJvdG9jb2wgbWVzc2FnZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHNvIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGFzCiAgICAgc29vbiBhcyB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgbGlicmFyeSBpcyBmaW5pc2hlZCwgYW5kIHRoZXJlYnkgZ2V0CiAgICAgb3BlbnNzbCBhbmQgdGhlIHRlc3QgcHJvZ3JhbXMgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJ5LgogICAgIFRoaXMgc3RpbGwgb25seSBoYXBwZW5zIHdoZW4gdGhlIGtleXdvcmQgInNoYXJkIiBoYXMgYmVlbiBnaXZlbiB0bwogICAgIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdHMuCgogICAgIE5PVEU6IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgaXMgc3RpbGwgYW4gZXhwZXJpbWVudGFsIHRoaW5nLCBhbmQKICAgICBiYWNrd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eSBpcyBzdGlsbCBub3QgZ3VhcmFudGVlZC4KICAgICBbIk1hY2llaiBXLiBSb3p5Y2tpIiA8bWFjcm9AZHMyLnBnLmdkYS5wbD4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFN1YmplY3QgSW5mb3JtYXRpb24gQWNjZXNzIGV4dGVuc2lvbi4KICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcj5dCgogICopIE1ha2UgQlVGX01FTV9ncm93KCkgYmVoYXZpb3VyIG1vcmUgY29uc2lzdGVudDogSW5pdGlhbGlzZSB0byB6ZXJvCiAgICAgYWRkaXRpb25hbCBieXRlcyB3aGVuIG5ldyBtZW1vcnkgaGFkIHRvIGJlIGFsbG9jYXRlZCwgbm90IGp1c3QKICAgICB3aGVuIHJldXNpbmcgYW4gZXhpc3RpbmcgYnVmZmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBjb21tYW5kIGxpbmUgYW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9uICd1dGY4JyBmb3IgdGhlIHJlcSBjb21tYW5kLgogICAgIFRoaXMgYWxsb3dzIGZpZWxkIHZhbHVlcyB0byBiZSBzcGVjaWZpZWQgYXMgVVRGOCBzdHJpbmdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtbXVsdGkgYW5kIC1tciBvcHRpb25zIHRvICJvcGVuc3NsIHNwZWVkIiAtIGdpdmluZyBtdWx0aXBsZSBwYXJhbGxlbAogICAgIHJ1bnMgZm9yIHRoZSBmb3JtZXIgYW5kIG1hY2hpbmUtcmVhZGFibGUgb3V0cHV0IGZvciB0aGUgbGF0dGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgJy1ub2VtYWlsRE4nIG9wdGlvbiB0byAnb3BlbnNzbCBjYScuICBUaGlzIHByZXZlbnRzIGluY2x1c2lvbgogICAgIG9mIHRoZSBlLW1haWwgYWRkcmVzcyBpbiB0aGUgRE4gKGkuZS4sIGl0IHdpbGwgZ28gaW50byBhIGNlcnRpZmljYXRlCiAgICAgZXh0ZW5zaW9uIG9ubHkpLiAgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uICdlbWFpbF9pbl9kbiA9IG5vJwogICAgIGhhcyB0aGUgc2FtZSBlZmZlY3QuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIG1hZHdvbGZAb3BlbmNhLm9yZ10KCiAgKikgQ2hhbmdlIGFsbCBmdW5jdGlvbnMgd2l0aCBuYW1lcyBzdGFydGluZyB3aXRoIGRlc18gdG8gYmUgc3RhcnRpbmcKICAgICB3aXRoIERFU18gaW5zdGVhZC4gIEFkZCB3cmFwcGVycyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggbGliZGVzLAogICAgIGJ1dCBhcmUgbmFtZWQgX29zc2xfb2xkX2Rlc18qLiAgRmluYWxseSwgYWRkIG1hY3JvcyB0aGF0IG1hcCB0aGUKICAgICBkZXNfKiBzeW1ib2xzIHRvIHRoZSBjb3JyZXNwb25kaW5nIF9vc3NsX29sZF9kZXNfKiBpZiBsaWJkZXMKICAgICBjb21wYXRpYmlsaXR5IGlzIGRlc2lyZWQuICBJZiBPcGVuU1NMIDAuOS42YyBjb21wYXRpYmlsaXR5IGlzCiAgICAgZGVzaXJlZCwgdGhlIGRlc18qIHN5bWJvbHMgd2lsbCBiZSBtYXBwZWQgdG8gREVTXyosIHdpdGggb25lCiAgICAgZXhjZXB0aW9uLgoKICAgICBTaW5jZSB3ZSBwcm92aWRlIHR3byBjb21wYXRpYmlsaXR5IG1hcHBpbmdzLCB0aGUgdXNlciBuZWVkcyB0bwogICAgIGRlZmluZSB0aGUgbWFjcm8gT1BFTlNTTF9ERVNfTElCREVTX0NPTVBBVElCSUxJVFkgaWYgbGliZGVzCiAgICAgY29tcGF0aWJpbGl0eSBpcyBkZXNpcmVkLiAgVGhlIGRlZmF1bHQgKGkuZS4sIHdoZW4gdGhhdCBtYWNybwogICAgIGlzbid0IGRlZmluZWQpIGlzIE9wZW5TU0wgMC45LjZjIGNvbXBhdGliaWxpdHkuCgogICAgIFRoZXJlIGFyZSBhbHNvIG1hY3JvcyB0aGF0IGVuYWJsZSBhbmQgZGlzYWJsZSB0aGUgc3VwcG9ydCBvZiBvbGQKICAgICBkZXMgZnVuY3Rpb25zIGFsdG9nZXRoZXIuICBUaG9zZSBhcmUgT1BFTlNTTF9FTkFCTEVfT0xEX0RFU19TVVBQT1JUCiAgICAgYW5kIE9QRU5TU0xfRElTQUJMRV9PTERfREVTX1NVUFBPUlQuICBJZiBub25lIG9yIGJvdGggb2YgdGhvc2UKICAgICBhcmUgZGVmaW5lZCwgdGhlIGRlZmF1bHQgd2lsbCBhcHBseTogdG8gc3VwcG9ydCB0aGUgb2xkIGRlcyByb3V0aW5lcy4KCiAgICAgSW4gZWl0aGVyIGNhc2UsIG9uZSBtdXN0IGluY2x1ZGUgb3BlbnNzbC9kZXMuaCB0byBnZXQgdGhlIGNvcnJlY3QKICAgICBkZWZpbml0aW9ucy4gIERvIG5vdCB0cnkgdG8ganVzdCBpbmNsdWRlIG9wZW5zc2wvZGVzX29sZC5oLCB0aGF0CiAgICAgd29uJ3Qgd29yay4KCiAgICAgTk9URTogVGhpcyBpcyBhIG1ham9yIGJyZWFrIG9mIGFuIG9sZCBBUEkgaW50byBhIG5ldyBvbmUuICBTb2Z0d2FyZQogICAgIGF1dGhvcnMgYXJlIGVuY291cmFnZWQgdG8gc3dpdGNoIHRvIHRoZSBERVNfIHN0eWxlIGZ1bmN0aW9ucy4gIFNvbWUKICAgICB0aW1lIGluIHRoZSBmdXR1cmUsIGRlc19vbGQuaCBhbmQgdGhlIGxpYmRlcyBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucwogICAgIHdpbGwgYmUgZGlzYWJsZSAoaS5lLiBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JUIHdpbGwgYmUgdGhlCiAgICAgZGVmYXVsdCksIGFuZCB0aGVuIGNvbXBsZXRlbHkgcmVtb3ZlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUZXN0IGZvciBjZXJ0aWZpY2F0ZXMgd2hpY2ggY29udGFpbiB1bnN1cHBvcnRlZCBjcml0aWNhbCBleHRlbnNpb25zLgogICAgIElmIHN1Y2ggYSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZCBkdXJpbmcgYSB2ZXJpZnkgb3BlcmF0aW9uIGl0IGlzIAogICAgIHJlamVjdGVkIGJ5IGRlZmF1bHQ6IHRoaXMgYmVoYXZpb3VyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGVpdGhlcgogICAgIGhhbmRsaW5nIHRoZSBuZXcgZXJyb3IgWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OIG9yCiAgICAgYnkgc2V0dGluZyB0aGUgdmVyaWZ5IGZsYWcgWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMLiBBIG5ldyBmdW5jdGlvbgogICAgIFg1MDlfc3VwcG9ydGVkX2V4dGVuc2lvbigpIGhhcyBhbHNvIGJlZW4gYWRkZWQgd2hpY2ggcmV0dXJucyAxIGlmIGEKICAgICBwYXJ0aWN1bGFyIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgRVZQIGNpcGhlciBmdW5jdGlvbnMgaW4gc2ltaWxhciB3YXkgdG8gZGlnZXN0cwogICAgIHRvIHJldGFpbiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIGJlaGF2aW91ciBvZiBFVlBfRGlnZXN0SW5pdCgpIGFuZCBFVlBfRGlnZXN0RmluYWwoKSB0byByZXRhaW4KICAgICBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZS4gSW4gcGFydGljdWxhciB0aGUgJ2N0eCcgcGFyYW1ldGVyIGRvZXMKICAgICBub3QgaGF2ZSB0byBiZSB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGNhbGwgdG8gRVZQX0RpZ2VzdEluaXQoKSBhbmQKICAgICBpdCBpcyB0aWRpZWQgdXAgYWZ0ZXIgYSBjYWxsIHRvIEVWUF9EaWdlc3RGaW5hbCgpLiBOZXcgZnVuY3Rpb24KICAgICBFVlBfRGlnZXN0RmluYWxfZXgoKSB3aGljaCBkb2VzIG5vdCB0aWR5IHVwIHRoZSBjdHguIFNpbWlsYXJseSBmdW5jdGlvbgogICAgIEVWUF9NRF9DVFhfY29weSgpIGNoYW5nZWQgdG8gbm90IHJlcXVpcmUgdGhlIGRlc3RpbmF0aW9uIHRvIGJlCiAgICAgaW5pdGlhbGl6ZWQgdmFsaWQgYW5kIG5ldyBmdW5jdGlvbiBFVlBfTURfQ1RYX2NvcHlfZXgoKSBhZGRlZCB3aGljaAogICAgIHJlcXVpcmVzIHRoZSBkZXN0aW5hdGlvbiB0byBiZSB2YWxpZC4KCiAgICAgTW9kaWZ5IGFsbCB0aGUgT3BlblNTTCBkaWdlc3QgY2FsbHMgdG8gdXNlIEVWUF9EaWdlc3RJbml0X2V4KCksCiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCkgYW5kIEVWUF9NRF9DVFhfY29weV9leCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSBhbmQgdGhlIGZ1bmN0aW9ucyB1c2luZyBpdAogICAgIHNvIHRoYXQgY29tcGxldGUgJ0hhbmRzaGFrZScgcHJvdG9jb2wgc3RydWN0dXJlcyBhcmUga2VwdCBpbiBtZW1vcnkKICAgICBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nICdtc2dfdHlwZScgYW5kICdsZW5ndGgnIHdpdGggJ2JvZHknIGRhdGEuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFuIGltcGxlbWVudGF0aW9uIG9mIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sgZm9yIFdpbjMyLgogICAgIFtNYXNzaW1vIFNhbnRpbiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWpvciByZXN0cnVjdHVyaW5nIHRvIHRoZSB1bmRlcmx5aW5nIEVOR0lORSBjb2RlLiBUaGlzIGluY2x1ZGVzCiAgICAgcmVkdWN0aW9uIG9mIGxpbmtlciBibG9hdCwgc2VwYXJhdGlvbiBvZiBwdXJlICJFTkdJTkUiIG1hbmlwdWxhdGlvbgogICAgIChpbml0aWFsaXNhdGlvbiwgZXRjKSBmcm9tIGZ1bmN0aW9uYWxpdHkgZGVhbGluZyB3aXRoIGltcGxlbWVudGF0aW9ucwogICAgIG9mIHNwZWNpZmljIGNyeXB0byBpdGVyZmFjZXMuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyBpbnRlZ3JhdGVkCiAgICAgc3VwcG9ydCBmb3Igc3ltbWV0cmljIGNpcGhlcnMgYW5kIGRpZ2VzdCBpbXBsZW1lbnRhdGlvbnMgLSBzbyBFTkdJTkVzCiAgICAgY2FuIG5vdyBhY2NlbGVyYXRlIHRoZXNlIGJ5IHByb3ZpZGluZyBFVlBfQ0lQSEVSIGFuZCBFVlBfTUQKICAgICBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlaXIgb3duLiBUaGlzIGlzIGRldGFpbGVkIGluIGNyeXB0by9lbmdpbmUvUkVBRE1FCiAgICAgYXMgaXQgY291bGRuJ3QgYmUgYWRlcXVhdGVseSBkZXNjcmliZWQgaGVyZS4gSG93ZXZlciwgdGhlcmUgYXJlIGEgZmV3CiAgICAgQVBJIGNoYW5nZXMgd29ydGggbm90aW5nIC0gc29tZSBSU0EsIERTQSwgREgsIGFuZCBSQU5EIGZ1bmN0aW9ucyB0aGF0CiAgICAgd2VyZSBjaGFuZ2VkIGluIHRoZSBvcmlnaW5hbCBpbnRyb2R1Y3Rpb24gb2YgRU5HSU5FIGNvZGUgaGF2ZSBub3cKICAgICByZXZlcnRlZCBiYWNrIC0gdGhlIGhvb2tpbmcgZnJvbSB0aGlzIGNvZGUgdG8gRU5HSU5FIGlzIG5vdyBhIGdvb2QKICAgICBkZWFsIG1vcmUgcGFzc2l2ZSBhbmQgYXQgcnVuLXRpbWUsIG9wZXJhdGlvbnMgZGVhbCBkaXJlY3RseSB3aXRoCiAgICAgUlNBX01FVEhPRHMsIERTQV9NRVRIT0RzIChldGMpIGFzIHRoZXkgZGlkIGJlZm9yZSwgcmF0aGVyIHRoYW4KICAgICBkZXJlZmVyZW5jaW5nIHRocm91Z2ggYW4gRU5HSU5FIHBvaW50ZXIgYW55IG1vcmUuIEFsc28sIHRoZSBFTkdJTkUKICAgICBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIEJOX01PRF9FWFBbX0NSVF0gaGFuZGxlcnMgaGF2ZSBiZWVuIHJlbW92ZWQgLQogICAgIHRoZXkgd2VyZSBub3QgYmVpbmcgdXNlZCBieSB0aGUgZnJhbWV3b3JrIGFzIHRoZXJlIGlzIG5vIGNvbmNlcHQgb2YgYQogICAgIEJJR05VTV9NRVRIT0QgYW5kIHRoZXkgY291bGQgbm90IGJlIGdlbmVyYWxpc2VkIHRvIHRoZSBuZXcKICAgICAnRU5HSU5FX1RBQkxFJyBtZWNoYW5pc20gdGhhdCB1bmRlcmxpZXMgdGhlIG5ldyBjb2RlLiBTaW1pbGFybHksCiAgICAgRU5HSU5FX2NweSgpIGhhcyBiZWVuIHJlbW92ZWQgYXMgaXQgY2Fubm90IGJlIGNvbnNpc3RlbnRseSBkZWZpbmVkIGluCiAgICAgdGhlIG5ldyBjb2RlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjaygpIHRvIGFsbG93IGZyYWN0aW9uYWwgc2Vjb25kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbWtkZWYucGwgdG8gc29ydCBzeW1ib2xzIHRoYXQgZ2V0IHRoZSBzYW1lIGVudHJ5IG51bWJlciwKICAgICBhbmQgbWFrZSBzdXJlIHRoZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgRVJSX2xvYWRfKgogICAgIGJlY29tZSBwYXJ0IG9mIGxpYmVheS5udW0gYXMgd2VsbC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcoKS4gIFRoaXMgcmV0dXJucyB0cnVlIG9uY2UKICAgICByZW5lZ290aWF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZCAoZWl0aGVyIFNTTF9yZW5lZ290aWF0ZSgpIGNhbGwKICAgICBvciBIZWxsb1JlcXVlc3QvQ2xpZW50SGVsbG8gcmVjZXZlaXZlZCBmcm9tIHRoZSBwZWVyKSBhbmQgYmVjb21lcwogICAgIGZhbHNlIG9uY2UgYSBoYW5kc2hha2UgaGFzIGJlZW4gY29tcGxldGVkLgogICAgIChGb3Igc2VydmVycywgU1NMX3JlbmVnb3RpYXRlKCkgZm9sbG93ZWQgYnkgU1NMX2RvX2hhbmRzaGFrZSgpCiAgICAgc2VuZHMgYSBIZWxsb1JlcXVlc3QsIGJ1dCBkb2VzIG5vdCBlbnN1cmUgdGhhdCBhIGhhbmRzaGFrZSB0YWtlcwogICAgIHBsYWNlLiAgU1NMX3JlbmVnb3RpYXRlX3BlbmRpbmcoKSBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIGlmIHRoZQogICAgIGNsaWVudCBoYXMgZm9sbG93ZWQgdGhlIHJlcXVlc3QuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBTU0wgb3B0aW9uIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTi4KICAgICBCeSBkZWZhdWx0LCBjbGllbnRzIG1heSByZXF1ZXN0IHNlc3Npb24gcmVzdW1wdGlvbiBldmVuIGR1cmluZwogICAgIHJlbmVnb3RpYXRpb24gKGlmIHNlc3Npb24gSUQgY29udGV4dHMgcGVybWl0KTsgd2l0aCB0aGlzIG9wdGlvbiwKICAgICBzZXNzaW9uIHJlc3VtcHRpb24gaXMgcG9zc2libGUgb25seSBpbiB0aGUgZmlyc3QgaGFuZHNoYWtlLgoKICAgICBTU0xfT1BfQUxMIGlzIG5vdyAweDAwMDAwRkZGTCBpbnN0ZWFkIG9mIDB4MDAwRkZGRkZMLiAgVGhpcyBtYWtlcwogICAgIG1vcmUgYml0cyBhdmFpbGFibGUgZm9yIG9wdGlvbnMgdGhhdCBzaG91bGQgbm90IGJlIHBhcnQgb2YKICAgICBTU0xfT1BfQUxMIChzdWNoIGFzIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHNvbWUgZGVtb3MgZm9yIGNlcnRpZmljYXRlIGFuZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGNyZWF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgbWF4aW11bSBjZXJ0aWZpY2F0ZSBjaGFpbiBzaXplIGFjY2VwdGVkIGZyb20gdGhlIHBlZXIgYXBwbGljYXRpb24KICAgICBzZXR0YWJsZSAoU1NMKl9nZXQvc2V0X21heF9jZXJ0X2xpc3QoKSksIGFzIHByb3Bvc2VkIGJ5CiAgICAgIkRvdWdsYXMgRS4gRW5nZXJ0IiA8ZGVlbmdlcnRAYW5sLmdvdj4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGZvciBVbml4d2FyZS03CiAgICAgKEJveWQgTHlubiBHZXJiZXIgPGdlcmJlcmJAemVuZXouY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhICJkZXN0cm95IiBoYW5kbGVyIHRvIEVOR0lORXMgdGhhdCBhbGxvd3Mgc3RydWN0dXJhbCBjbGVhbnVwIHRvCiAgICAgYmUgZG9uZSBwcmlvciB0byBkZXN0cnVjdGlvbi4gVXNlIHRoaXMgdG8gdW5sb2FkIGVycm9yIHN0cmluZ3MgZnJvbQogICAgIEVOR0lORXMgdGhhdCBsb2FkIHRoZWlyIG93biBlcnJvciBzdHJpbmdzLiBOQjogVGhpcyBhZGRzIHR3byBuZXcgQVBJCiAgICAgZnVuY3Rpb25zIHRvICJnZXQiIGFuZCAic2V0IiB0aGlzIGRlc3Ryb3kgaGFuZGxlciBpbiBhbiBFTkdJTkUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWx0ZXIgYWxsIGV4aXN0aW5nIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgKGV4Y2VwdCAib3BlbnNzbCIgYW5kCiAgICAgIm9wZW5ic2QiKSB0byBkeW5hbWljYWxseSBpbnN0YW50aWF0ZSB0aGVpciBvd24gZXJyb3Igc3RyaW5ncy4gVGhpcwogICAgIG1ha2VzIHRoZW0gbW9yZSBmbGV4aWJsZSB0byBiZSBidWlsdCBib3RoIGFzIHN0YXRpY2FsbHktbGlua2VkIEVOR0lORXMKICAgICBhbmQgc2VsZi1jb250YWluZWQgc2hhcmVkLWxpYnJhcmllcyBsb2FkYWJsZSB2aWEgdGhlICJkeW5hbWljIiBFTkdJTkUuCiAgICAgQWxzbywgYWRkIHN0dWIgY29kZSB0byBlYWNoIHRoYXQgbWFrZXMgYnVpbGRpbmcgdGhlbSBhcyBzZWxmLWNvbnRhaW5lZAogICAgIHNoYXJlZC1saWJyYXJpZXMgZWFzaWVyIChzZWUgUkVBRE1FLkVOR0lORSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgImR5bmFtaWMiIEVOR0lORSB0aGF0IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBiaW5kaW5nIEVOR0lORQogICAgIGltcGxlbWVudGF0aW9ucyBpbnRvIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBjb21wbGV0ZWx5IGltcGxlbWVudGVkIGluCiAgICAgc2VsZi1jb250YWluZWQgc2hhcmVkLWxpYnJhcmllcy4gVGhlICJkeW5hbWljIiBFTkdJTkUgZXhwb3NlcyBjb250cm9sCiAgICAgY29tbWFuZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgd2hhdCBzaGFyZWQtbGlicmFyeSB0byBsb2FkIGFuZAogICAgIHRvIGNvbnRyb2wgYXNwZWN0cyBvZiB0aGUgd2F5IGl0IGlzIGhhbmRsZWQuIEFsc28sIG1hZGUgYW4gdXBkYXRlIHRvCiAgICAgdGhlIFJFQURNRS5FTkdJTkUgZmlsZSB0aGF0IGJyaW5ncyBpdHMgaW5mb3JtYXRpb24gdXAtdG8tZGF0ZSBhbmQKICAgICBwcm92aWRlcyBzb21lIGluZm9ybWF0aW9uIGFuZCBpbnN0cnVjdGlvbnMgb24gdGhlICJkeW5hbWljIiBFTkdJTkUKICAgICAoaWUuIGhvdyB0byB1c2UgaXQsIGhvdyB0byBidWlsZCAiZHluYW1pYyItbG9hZGFibGUgRU5HSU5FcywgZXRjKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHVubG9hZCByYW5nZXMgb2YgRVJSIHN0cmluZ3Mgd2l0aCBhIG5ldwogICAgICJFUlJfdW5sb2FkX3N0cmluZ3MiIGZ1bmN0aW9uLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIGNvcHkoKSBmdW5jdGlvbiB0byBFVlBfTUQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgRVZQX01EIHJvdXRpbmVzIHRha2UgYSBjb250ZXh0IHBvaW50ZXIgaW5zdGVhZCBvZiBqdXN0IHRoZQogICAgIG1kX2RhdGEgdm9pZCBwb2ludGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgZmxhZ3MgdG8gRVZQX01EIGFuZCBFVlBfTURfQ1RYLiBFVlBfTURfRkxBR19PTkVTSE9UIGluZGljYXRlcwogICAgIHRoYXQgdGhlIGRpZ2VzdCBjYW4gb25seSBwcm9jZXNzIGEgc2luZ2xlIGNodW5rIG9mIGRhdGEKICAgICAodHlwaWNhbGx5IGJlY2F1c2UgaXQgaXMgcHJvdmlkZWQgYnkgYSBwaWVjZSBvZgogICAgIGhhcmR3YXJlKS4gRVZQX01EX0NUWF9GTEFHX09ORVNIT1QgaW5kaWNhdGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uCiAgICAgaXMgb25seSBnb2luZyB0byBwcm92aWRlIGEgc2luZ2xlIGNodW5rIG9mIGRhdGEsIGFuZCBoZW5jZSB0aGUKICAgICBmcmFtZXdvcmsgbmVlZG4ndCBhY2N1bXVsYXRlIHRoZSBkYXRhIGZvciBvbmVzaG90IGRyaXZlcnMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFzIHdpdGggIkVSUiIsIG1ha2UgaXQgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUgdW5kZXJseWluZyAiZXhfZGF0YSIKICAgICBmdW5jdGlvbnMuIFRoaXMgY2hhbmdlIGFsc28gYWx0ZXJzIHRoZSBzdG9yYWdlIGFuZCBtYW5hZ2VtZW50IG9mIGdsb2JhbAogICAgIGV4X2RhdGEgc3RhdGUgLSBpdCdzIG5vdyBhbGwgaW5zaWRlIGV4X2RhdGEuYyBhbmQgYWxsICJjbGFzcyIgY29kZSAoZWcuCiAgICAgUlNBLCBCSU8sIFNTTF9DVFgsIGV0Yykgbm8gbG9uZ2VyIHN0b3JlcyBpdHMgb3duIFNUQUNLUyBhbmQgcGVyLWNsYXNzCiAgICAgaW5kZXggY291bnRlcnMuIFRoZSBBUEkgZnVuY3Rpb25zIHRoYXQgdXNlIHRoaXMgc3RhdGUgaGF2ZSBiZWVuIGNoYW5nZWQKICAgICB0byB0YWtlIGEgImNsYXNzX2luZGV4IiByYXRoZXIgdGhhbiBwb2ludGVycyB0byB0aGUgY2xhc3MncyBsb2NhbCBTVEFDSwogICAgIGFuZCBjb3VudGVyLCBhbmQgdGhlcmUgaXMgbm93IGFuIEFQSSBmdW5jdGlvbiB0byBkeW5hbWljYWxseSBjcmVhdGUgbmV3CiAgICAgY2xhc3Nlcy4gVGhpcyBjZW50cmFsaXNhdGlvbiBhbGxvd3MgdXMgdG8gKGEpIHBsdWcgYSBsb3Qgb2YgdGhlCiAgICAgdGhyZWFkLXNhZmV0eSBwcm9ibGVtcyB0aGF0IGV4aXN0ZWQsIGFuZCAoYikgbWFrZXMgaXQgcG9zc2libGUgdG8gY2xlYW4KICAgICB1cCBhbGwgYWxsb2NhdGVkIHN0YXRlIHVzaW5nICJDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpIi4gVy5yLnQuIChiKQogICAgIHN1Y2ggZGF0YSB3b3VsZCBwcmV2aW91c2x5IGhhdmUgYWx3YXlzIGxlYWtlZCBpbiBhcHBsaWNhdGlvbiBjb2RlIGFuZAogICAgIHdvcmthcm91bmRzIHdlcmUgaW4gcGxhY2UgdG8gbWFrZSB0aGUgbWVtb3J5IGRlYnVnZ2luZyB0dXJuIGEgYmxpbmQgZXllCiAgICAgdG8gaXQuIEFwcGxpY2F0aW9uIGNvZGUgdGhhdCBkb2Vzbid0IHVzZSB0aGlzIG5ldyBmdW5jdGlvbiB3aWxsIHN0aWxsCiAgICAgbGVhayBhcyBiZWZvcmUsIGJ1dCB0aGVpciBtZW1vcnkgZGVidWdnaW5nIG91dHB1dCB3aWxsIGFubm91bmNlIGl0IG5vdwogICAgIHJhdGhlciB0aGFuIGxldHRpbmcgaXQgc2xpZGUuCgogICAgIEJlc2lkZXMgdGhlIGFkZGl0aW9uIG9mIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCksIGFub3RoZXIgQVBJIGNoYW5nZQogICAgIGluZHVjZWQgYnkgdGhlICJleF9kYXRhIiBvdmVyaGF1bCBpcyB0aGF0IFg1MDlfU1RPUkVfQ1RYX2luaXQoKSBub3cKICAgICBoYXMgYSByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgc3VjY2VzcyBvciBmYWlsdXJlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcmVwbGFjZSB0aGUgdW5kZXJseWluZyAiRVJSIiBmdW5jdGlvbnMgc3VjaCB0aGF0IHRoZQogICAgIGdsb2JhbCBzdGF0ZSAoMiBMSEFTSCB0YWJsZXMgYW5kIDIgbG9ja3MpIGlzIG9ubHkgdXNlZCBieSB0aGUgImRlZmF1bHQiCiAgICAgaW1wbGVtZW50YXRpb24uIFRoaXMgY2hhbmdlIGFsc28gYWRkcyB0d28gZnVuY3Rpb25zIHRvICJnZXQiIGFuZCAic2V0IgogICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmlvciB0byBpdCBiZWluZyBhdXRvbWF0aWNhbGx5IHNldCB0aGUgZmlyc3QgdGltZQogICAgIGFueSBvdGhlciBFUlIgZnVuY3Rpb24gdGFrZXMgcGxhY2UuIEllLiBhbiBhcHBsaWNhdGlvbiBjYW4gY2FsbCAiZ2V0IiwKICAgICBwYXNzIHRoZSByZXR1cm4gdmFsdWUgdG8gYSBtb2R1bGUgaXQgaGFzIGp1c3QgbG9hZGVkLCBhbmQgdGhhdCBtb2R1bGUKICAgICBjYW4gY2FsbCBpdHMgb3duICJzZXQiIGZ1bmN0aW9uIHVzaW5nIHRoYXQgdmFsdWUuIFRoaXMgbWVhbnMgdGhlCiAgICAgbW9kdWxlJ3MgIkVSUiIgb3BlcmF0aW9ucyB3aWxsIHVzZSAoYW5kIG1vZGlmeSkgdGhlIGVycm9yIHN0YXRlIGluIHRoZQogICAgIGFwcGxpY2F0aW9uIGFuZCBub3QgaW4gaXRzIG93biBzdGF0aWNhbGx5IGxpbmtlZCBjb3B5IG9mIE9wZW5TU0wgY29kZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBHaXZlIERILCBEU0EsIGFuZCBSU0EgdHlwZXMgdGhlaXIgb3duICIqKl91cF9yZWYoKSIgZnVuY3Rpb24gdG8gaW5jcmVtZW50CiAgICAgcmVmZXJlbmNlIGNvdW50cy4gVGhpcyBwZXJmb3JtcyBub3JtYWwgUkVGX1BSSU5UL1JFRl9DSEVDSyBtYWNyb3Mgb24KICAgICB0aGUgb3BlcmF0aW9uLCBhbmQgcHJvdmlkZXMgYSBtb3JlIGVuY2Fwc3VsYXRlZCB3YXkgZm9yIGV4dGVybmFsIGNvZGUKICAgICAoY3J5cHRvL2V2cC8gYW5kIHNzbC8pIHRvIGRvIHRoaXMuIEFsc28gY2hhbmdlZCB0aGUgZXZwIGFuZCBzc2wgY29kZQogICAgIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gbWFudWFsbHkgaW5jcmVtZW50aW5nIHRoZSBjb3VudHMuCgogICAgIEFsc28gcmVuYW1lICJEU09fdXAoKSIgZnVuY3Rpb24gdG8gbW9yZSBkZXNjcmlwdGl2ZSAiRFNPX3VwX3JlZigpIi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgRVZQIHRlc3QgcHJvZ3JhbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN5bW1ldHJpYyBjaXBoZXIgc3VwcG9ydCB0byBFTkdJTkUuIEV4cGVjdCB0aGUgQVBJIHRvIGNoYW5nZSEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IENSTCBmdW5jdGlvbnM6IFg1MDlfQ1JMX3NldF92ZXJzaW9uKCksIFg1MDlfQ1JMX3NldF9pc3N1ZXJfbmFtZSgpCiAgICAgWDUwOV9DUkxfc2V0X2xhc3RVcGRhdGUoKSwgWDUwOV9DUkxfc2V0X25leHRVcGRhdGUoKSwgWDUwOV9DUkxfc29ydCgpLAogICAgIFg1MDlfUkVWT0tFRF9zZXRfc2VyaWFsTnVtYmVyKCksIGFuZCBYNTA5X1JFVk9LRURfc2V0X3Jldm9jYXRpb25EYXRlKCkuCiAgICAgVGhlc2UgYWxsb3cgYSBDUkwgdG8gYmUgYnVpbHQgd2l0aG91dCBoYXZpbmcgdG8gYWNjZXNzIFg1MDlfQ1JMIGZpZWxkcwogICAgIGRpcmVjdGx5LiBNb2RpZnkgJ2NhJyBhcHBsaWNhdGlvbiB0byB1c2UgbmV3IGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHIG91dCBvZiB0aGUgU1NMX09QX0FMTCBsaXN0IG9mIHJlY29tbWVuZGVkCiAgICAgYnVnIHdvcmthcm91bmRzLiBSb2xsYmFjayBhdHRhY2sgZGV0ZWN0aW9uIGlzIGEgc2VjdXJpdHkgZmVhdHVyZS4KICAgICBUaGUgcHJvYmxlbSB3aWxsIG9ubHkgYXJpc2Ugb24gT3BlblNTTCBzZXJ2ZXJzIHdoZW4gVExTdjEgaXMgbm90CiAgICAgYXZhaWxhYmxlIChzc2x2M19zZXJ2ZXJfbWV0aG9kKCkgb3IgU1NMX09QX05PX1RMU3YxKS4KICAgICBTb2Z0d2FyZSBhdXRob3JzIG5vdCB3YW50aW5nIHRvIHN1cHBvcnQgVExTdjEgd2lsbCBoYXZlIHNwZWNpYWwgcmVhc29ucwogICAgIGZvciB0aGVpciBjaG9pY2UgYW5kIGNhbiBleHBsaWNpdGx5IGVuYWJsZSB0aGlzIG9wdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyLCBMdXR6IEphZW5pY2tlXQoKICAqKSBSYXRpb25hbGlzZSBFVlAgc28gaXQgY2FuIGJlIGV4dGVuZGVkOiBkb24ndCBpbmNsdWRlIGEgdW5pb24gb2YKICAgICBjaXBoZXIvZGlnZXN0IHN0cnVjdHVyZXMsIGFkZCBpbml0L2NsZWFudXAgZnVuY3Rpb25zIGZvciBFVlBfTURfQ1RYCiAgICAgKHNpbWlsYXIgdG8gdGhvc2UgZXhpc3RpbmcgZm9yIEVWUF9DSVBIRVJfQ1RYKS4KICAgICBVc2FnZSBleGFtcGxlOgoKICAgICAgICAgRVZQX01EX0NUWCBtZDsKCiAgICAgICAgIEVWUF9NRF9DVFhfaW5pdCgmbWQpOyAgICAgICAgICAgICAvKiBuZXcgZnVuY3Rpb24gY2FsbCAqLwogICAgICAgICBFVlBfRGlnZXN0SW5pdCgmbWQsIEVWUF9zaGExKCkpOwogICAgICAgICBFVlBfRGlnZXN0VXBkYXRlKCZtZCwgaW4sIGxlbik7CiAgICAgICAgIEVWUF9EaWdlc3RGaW5hbCgmbWQsIG91dCwgTlVMTCk7CiAgICAgICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmbWQpOyAgICAgICAgICAvKiBuZXcgZnVuY3Rpb24gY2FsbCAqLwoKICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBERVMga2V5IHNjaGVkdWxlIGNvbmZvcm0gdG8gdGhlIHVzdWFsIHNjaGVtZSwgYXMgd2VsbCBhcwogICAgIGNvcnJlY3RpbmcgaXRzIHN0cnVjdHVyZS4gVGhpcyBtZWFucyB0aGF0IGNhbGxzIHRvIERFUyBmdW5jdGlvbnMKICAgICBub3cgaGF2ZSB0byBwYXNzIGEgcG9pbnRlciB0byBhIGRlc19rZXlfc2NoZWR1bGUgaW5zdGVhZCBvZiBhCiAgICAgcGxhaW4gZGVzX2tleV9zY2hlZHVsZSAod2hpY2ggd2FzIGFjdHVhbGx5IGFsd2F5cyBhIHBvaW50ZXIKICAgICBhbnl3YXkpOiBFLmcuLAoKICAgICAgICAgZGVzX2tleV9zY2hlZHVsZSBrczsKCgkgZGVzX3NldF9rZXlfY2hlY2tlZCguLi4sICZrcyk7CgkgZGVzX25jYmNfZW5jcnlwdCguLi4sICZrcywgLi4uKTsKCiAgICAgKE5vdGUgdGhhdCBhIGxhdGVyIGNoYW5nZSByZW5hbWVzICdkZXNfLi4uJyBpbnRvICdERVNfLi4uJy4pCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEluaXRpYWwgcmVkdWN0aW9uIG9mIGxpbmtlciBibG9hdDogdGhlIHVzZSBvZiBzb21lIGZ1bmN0aW9ucywgc3VjaCBhcwogICAgIFBFTSBjYXVzZXMgbGFyZ2UgYW1vdW50cyBvZiB1bnVzZWQgZnVuY3Rpb25zIHRvIGJlIGxpbmtlZCBpbiBkdWUgdG8KICAgICBwb29yIG9yZ2FuaXNhdGlvbi4gRm9yIGV4YW1wbGUgcGVtX2FsbC5jIGNvbnRhaW5zIGV2ZXJ5IFBFTSBmdW5jdGlvbgogICAgIHdoaWNoIGhhcyBhIGtub2NrIG9uIGVmZmVjdCBvZiBsaW5raW5nIGluIGxhcmdlIGFtb3VudHMgb2YgKHVudXNlZCkKICAgICBBU04xIGNvZGUuIEdyb3VwaW5nIHRvZ2V0aGVyIHNpbWlsYXIgZnVuY3Rpb25zIGFuZCBzcGxpdHRpbmcgdW5yZWxhdGVkCiAgICAgZnVuY3Rpb25zIHByZXZlbnRzIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW51cCBvZiBFVlAgbWFjcm9zLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgaGlzdG9yaWNhbCByZWZlcmVuY2VzIHRvIHtOSUQsU04sTE59X2Rlc19lZGUgYW5kIGVkZTMgdG8gYWRkIHRoZQogICAgIGNvcnJlY3QgX2VjYiBzdWZmaXguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBpbml0aWFsIE9DU1AgcmVzcG9uZGVyIHN1cHBvcnQgdG8gb2NzcCBhcHBsaWNhdGlvbi4gVGhlCiAgICAgcmV2b2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBoYW5kbGVkIHVzaW5nIHRoZSB0ZXh0IGJhc2VkIGluZGV4CiAgICAgdXNlIGJ5IHRoZSBjYSBhcHBsaWNhdGlvbi4gVGhlIHJlc3BvbmRlciBjYW4gZWl0aGVyIGhhbmRsZQogICAgIHJlcXVlc3RzIGdlbmVyYXRlZCBpbnRlcm5hbGx5LCBzdXBwbGllZCBpbiBmaWxlcyAoZm9yIGV4YW1wbGUKICAgICB2aWEgYSBDR0kgc2NyaXB0KSBvciB1c2luZyBhbiBpbnRlcm5hbCBtaW5pbWFsIHNlcnZlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29uZmlndXJhdGlvbiBjaG9pY2VzIHRvIGdldCB6bGliIGNvbXByZXNzaW9uIGZvciBUTFMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlcyB0byBLZXJiZXJvcyBTU0wgZm9yIFJGQyAyNzEyIGNvbXBsaWFuY2U6CiAgICAgMS4gIEltcGxlbWVudGVkIHJlYWwgS2VyYmVyb3NXcmFwcGVyLCBpbnN0ZWFkIG9mIGp1c3QgdXNpbmcKICAgICAgICAgS1JCNSBBUF9SRVEgbWVzc2FnZS4gIFtUaGFua3MgdG8gU2ltb24gV2lsa2luc29uIDxzeHdAc3h3Lm9yZy51az5dCiAgICAgMi4gIEltcGxlbWVudGVkIG9wdGlvbmFsIGF1dGhlbnRpY2F0b3IgZmllbGQgb2YgS2VyYmVyb3NXcmFwcGVyLgoKICAgICBBZGRlZCBvcGVuc3NsLXN0eWxlIEFTTi4xIG1hY3JvcyBmb3IgS2VyYmVyb3MgdGlja2V0LCBhcF9yZXEsCiAgICAgYW5kIGF1dGhlbnRpY2F0b3Igc3RydWN0czsgc2VlIGNyeXB0by9rcmI1Ly4KCiAgICAgR2VuZXJhbGl6ZWQgS2VyYmVyb3MgY2FsbHMgdG8gc3VwcG9ydCBtdWx0aXBsZSBLZXJiZXJvcyBsaWJyYXJpZXMuCiAgICAgW1Zlcm4gU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4sCiAgICAgIEplZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT4KICAgICAgdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2F1c2UgJ29wZW5zc2wgc3BlZWQnIHRvIHVzZSBmdWxseSBoYXJkLWNvZGVkIERTQSBrZXlzIGFzIGl0CiAgICAgYWxyZWFkeSBkb2VzIHdpdGggUlNBLiB0ZXN0ZHNhLmggbm93IGhhcyAncHJpdl9rZXkvcHViX2tleScKICAgICB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlIGtleSBzaXplcyByYXRoZXIgdGhhbiBoYXZpbmcganVzdAogICAgIHBhcmFtZXRlcnMgKGFuZCAnc3BlZWQnIGdlbmVyYXRpbmcga2V5cyBlYWNoIHRpbWUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFNwZWVkIHVwIEVWUCByb3V0aW5lcy4KICAgICBCZWZvcmU6CmVuY3J5cHQKdHlwZSAgICAgICAgICAgICAgOCBieXRlcyAgICAgNjQgYnl0ZXMgICAgMjU2IGJ5dGVzICAgMTAyNCBieXRlcyAgIDgxOTIgYnl0ZXMKZGVzLWNiYyAgICAgICAgICAgNDQwOC44NWsgICAgIDU1NjAuNTFrICAgICA1Nzc4LjQ2ayAgICAgNTg2Mi4yMGsgICAgIDU4MjUuMTZrCmRlcy1jYmMgICAgICAgICAgIDQzODkuNTVrICAgICA1NTcxLjE3ayAgICAgNTc5Mi4yM2sgICAgIDU4NDYuOTFrICAgICA1ODMyLjExawpkZXMtY2JjICAgICAgICAgICA0Mzk0LjMyayAgICAgNTU3NS45MmsgICAgIDU4MDcuNDRrICAgICA1ODQ4LjM3ayAgICAgNTg0MS4zMGsKZGVjcnlwdApkZXMtY2JjICAgICAgICAgICAzNDgyLjY2ayAgICAgNTA2OS40OWsgICAgIDU0OTYuMzlrICAgICA1NjE0LjE2ayAgICAgNTYzOS4yOGsKZGVzLWNiYyAgICAgICAgICAgMzQ4MC43NGsgICAgIDUwNjguNzZrICAgICA1NTEwLjM0ayAgICAgNTYwOS44N2sgICAgIDU2MzUuNTJrCmRlcy1jYmMgICAgICAgICAgIDM0ODMuNzJrICAgICA1MDY3LjYyayAgICAgNTUwNC42MGsgICAgIDU3MDguMDFrICAgICA1NzI0LjgwawogICAgIEFmdGVyOgplbmNyeXB0CmRlcy1jYmMgICAgICAgICAgIDQ2NjAuMTZrICAgICA1NjUwLjE5ayAgICAgNTgwNy4xOWsgICAgIDU4MjcuMTNrICAgICA1NzgzLjMyawpkZWNyeXB0CmRlcy1jYmMgICAgICAgICAgIDM2MjQuOTZrICAgICA1MjU4LjIxayAgICAgNTUzMC45MWsgICAgIDU2MjQuMzBrICAgICA1NjI4LjI2awogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGRlZCB0aGUgT1MyLUVNWCB0YXJnZXQuCiAgICAgWyJCcmlhbiBIYXZhcmQiIDxicmlhbmhAa2hlbGRhci5hcGFuYS5vcmcuYXU+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFJld3JpdGUgYXBwcyB0byB1c2UgTkNPTkYgcm91dGluZXMgaW5zdGVhZCBvZiB0aGUgb2xkIENPTkYuIE5ldyBmdW5jdGlvbnMKICAgICB0byBzdXBwb3J0IE5DT05GIHJvdXRpbmVzIGluIGV4dGVuc2lvbiBjb2RlLiBOZXcgZnVuY3Rpb24gQ09ORl9zZXRfbmNvbmYoKQogICAgIHRvIGFsbG93IGZ1bmN0aW9ucyB3aGljaCB0YWtlIGFuIE5DT05GIHRvIGFsc28gaGFuZGxlIHRoZSBvbGQgTEhBU0gKICAgICBzdHJ1Y3R1cmU6IHRoaXMgbWVhbnMgdGhhdCB0aGUgb2xkIENPTkYgY29tcGF0aWJsZSByb3V0aW5lcyBjYW4gYmUKICAgICByZXRhaW5lZCAoaW4gcGFydGljdWxhciB3cnQgZXh0ZW5zaW9ucykgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIHRoZQogICAgIGNvZGUuIE5ldyBmdW5jdGlvbiBYNTA5VjNfYWRkX2V4dF9uY29uZl9zayB0byBhZGQgZXh0ZW5zaW9ucyB0byBhIHN0YWNrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIGdlbmVyYWwgdXNlciBpbnRlcmZhY2Ugd2l0aCBtZWNoYW5pc21zIGZvciBpbm5lciBjb250cm9sCiAgICAgYW5kIHdpdGggcG9zc2liaWxpdGllcyB0byBoYXZlIHllcy9ubyBraW5kIG9mIHByb21wdHMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIGFsbCBjYWxscyB0byBsb3cgbGV2ZWwgZGlnZXN0IHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IGFuZAogICAgIGFwcGxpY2F0aW9ucyB0byB1c2UgRVZQLiBBZGQgbWlzc2luZyBjYWxscyB0byBITUFDX2NsZWFudXAoKSBhbmQKICAgICBkb24ndCBhc3N1bWUgSE1BQ19DVFggY2FuIGJlIGNvcGllZCB1c2luZyBtZW1jcHkoKS4KICAgICBbVmVyZG9uIFdhbGtlciA8VldhbGtlckBub3ZlbGwuY29tPiwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGNvbnRyb2wgZW5naW5lcyB0aHJvdWdoIGNvbnRyb2wgbmFtZXMgYnV0IHdpdGgKICAgICBhcmJpdHJhcnkgYXJndW1lbnRzIGluc3RlYWQgb2YganVzdCBhIHN0cmluZy4KICAgICBDaGFuZ2UgdGhlIGtleSBsb2FkZXJzIHRvIHRha2UgYSBVSV9NRVRIT0QgaW5zdGVhZCBvZiBhIGNhbGxiYWNrCiAgICAgZnVuY3Rpb24gcG9pbnRlci4gIE5PVEU6IHRoaXMgYnJlYWtzIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllcgogICAgIHZlcnNpb25zIG9mIE9wZW5TU0wgW2VuZ2luZV0uCiAgICAgQWRhcHQgdGhlIG5DaXBoZXIgY29kZSBmb3IgdGhlc2UgbmV3IGNvbmRpdGlvbnMgYW5kIGFkZCBhIGNhcmQgaW5zZXJ0aW9uCiAgICAgY2FsbGJhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRW5oYW5jZSB0aGUgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSB3aXRoIG1lY2hhbmlzbXMgdG8gYmV0dGVyIHN1cHBvcnQKICAgICBkaWFsb2cgYm94IGludGVyZmFjZXMsIGFwcGxpY2F0aW9uLWRlZmluZWQgcHJvbXB0cywgdGhlIHBvc3NpYmlsaXR5CiAgICAgdG8gdXNlIGRlZmF1bHRzIChmb3IgZXhhbXBsZSBkZWZhdWx0IHBhc3N3b3JkcyBmcm9tIHNvbWV3aGVyZSBlbHNlKQogICAgIGFuZCBpbnRlcnJ1cHRzL2NhbmNlbGxhdGlvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGlkeSB1cCBQS0NTIzEyIGF0dHJpYnV0ZSBoYW5kbGluZy4gQWRkIHN1cHBvcnQgZm9yIHRoZSBDU1AgbmFtZQogICAgIGF0dHJpYnV0ZSBpbiBQS0NTIzEyIGZpbGVzLCBhZGQgbmV3IC1DU1Agb3B0aW9uIHRvIHBrY3MxMiB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhIG1lbW9yeSBsZWFrIGluICdza19kdXAoKScgaW4gdGhlIGNhc2UgcmVhbGxvY2F0aW9uIGZhaWxzLiAoQWxzbwogICAgIHRpZHkgdXAgc29tZSB1bm5lY2Vzc2FyaWx5IHdlaXJkIGNvZGUgaW4gJ3NrX25ldygpJykuCiAgICAgW0dlb2ZmLCByZXBvcnRlZCBieSBEaWVnbyBUYXJ0YXJhIDxkdGFydGFyYUBub3ZhbWVucy5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIGtleSBsb2FkaW5nIHJvdXRpbmVzIGZvciBFTkdJTkVzIHRvIHVzZSB0aGUgc2FtZSBraW5kCiAgICAgY2FsbGJhY2sgKHBlbV9wYXNzd29yZF9jYikgYXMgYWxsIG90aGVyIHJvdXRpbmVzIHRoYXQgbmVlZCB0aGlzCiAgICAga2luZCBvZiBjYWxsYmFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbmNyZWFzZSBFTlRST1BZX05FRURFRCB0byAzMiBieXRlcywgYXMgUmlqbmRhZWwgY2FuIG9wZXJhdGUgd2l0aAogICAgIDI1NiBiaXQgKD0zMiBieXRlKSBrZXlzLiBPZiBjb3Vyc2Ugc2VlZGluZyB3aXRoIG1vcmUgZW50cm9weSBieXRlcwogICAgIHRoYW4gdGhpcyBtaW5pbXVtIHZhbHVlIGlzIHJlY29tbWVuZGVkLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBOZXcgcmFuZG9tIHNlZWRlciBmb3IgT3BlblZNUywgdXNpbmcgdGhlIHN5c3RlbSBwcm9jZXNzIHN0YXRpc3RpY3MKICAgICB0aGF0IGFyZSBlYXNpbHkgcmVhY2hhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFdpbmRvd3MgYXBwYXJlbnRseSBjYW4ndCB0cmFuc3BhcmVudGx5IGhhbmRsZSBnbG9iYWwKICAgICB2YXJpYWJsZXMgZGVmaW5lZCBpbiBETExzLiBJbml0aWFsaXNhdGlvbnMgc3VjaCBhczoKCiAgICAgICAgY29uc3QgQVNOMV9JVEVNICppdCA9ICZBU04xX0lOVEVHRVJfaXQ7CgogICAgIHdvbnQgY29tcGlsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhbnkgYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0bwogICAgIGRlY2xhcmUgdGhlaXIgb3duIEFTTjEgbW9kdWxlcy4gVGhpcyB3YXMgZml4ZWQgYnkgYWRkaW5nIHRoZSBvcHRpb24KICAgICBFWFBPUlRfVkFSX0FTX0ZOIHRvIGFsbCBXaW4zMiBwbGF0Zm9ybXMsIGFsdGhvdWdoIHRoaXMgaXNuJ3Qgc3RyaWN0bHkKICAgICBuZWVkZWQgZm9yIHN0YXRpYyBsaWJyYXJpZXMgdW5kZXIgV2luMzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBYNTA5X1BVUlBPU0Vfc2V0KCkgYW5kIFg1MDlfVFJVU1Rfc2V0KCkgdG8gaGFuZGxlCiAgICAgc2V0dGluZyBvZiBwdXJwb3NlIGFuZCB0cnVzdCBmaWVsZHMuIE5ldyBYNTA5X1NUT1JFIHRydXN0IGFuZAogICAgIHB1cnBvc2UgZnVuY3Rpb25zIGFuZCB0aWR5IHVwIHNldHRpbmcgaW4gb3RoZXIgU1NMIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29waWVzIG9mIFg1MDlfU1RPUkVfQ1RYIGZpZWxkcyBhbmQgY2FsbGJhY2tzIHRvIFg1MDlfU1RPUkUKICAgICBzdHJ1Y3R1cmUuIFRoZXNlIGFyZSBpbmhlcml0ZWQgYnkgWDUwOV9TVE9SRV9DVFggd2hlbiBpdCBpcyAKICAgICBpbml0aWFsaXNlZC4gVGhpcyBhbGxvd3MgdmFyaW91cyBkZWZhdWx0cyB0byBiZSBzZXQgaW4gdGhlCiAgICAgWDUwOV9TVE9SRSBzdHJ1Y3R1cmUgKHN1Y2ggYXMgZmxhZ3MgZm9yIENSTCBjaGVja2luZyBhbmQgY3VzdG9tCiAgICAgcHVycG9zZSBvciB0cnVzdCBzZXR0aW5ncykgZm9yIGZ1bmN0aW9ucyB3aGljaCBvbmx5IHVzZSBYNTA5X1NUT1JFX0NUWAogICAgIGludGVybmFsbHkgc3VjaCBhcyBTL01JTUUuCgogICAgIE1vZGlmeSBYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQoKSBzbyBpdCBvbmx5IHNldHMgcHVycG9zZXMgYW5kCiAgICAgdHJ1c3Qgc2V0dGluZ3MgaWYgdGhleSBhcmUgbm90IHNldCBpbiBYNTA5X1NUT1JFLiBUaGlzIGFsbG93cyBYNTA5X1NUT1JFCiAgICAgcHVycG9zZXMgYW5kIHRydXN0IChpbiBTL01JTUUgZm9yIGV4YW1wbGUpIHRvIG92ZXJyaWRlIGFueSBzZXQgYnkgZGVmYXVsdC4KCiAgICAgQWRkIGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBDUkwgY2hlY2tpbmcgdG8gc21pbWUsIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIGFwcGxpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIENSTCBiYXNlZCByZXZvY2F0aW9uIGNoZWNraW5nLiBJZiB0aGUgQ1JMIGNoZWNraW5nIGZsYWcocykKICAgICBhcmUgc2V0IHRoZW4gdGhlIENSTCBpcyBsb29rZWQgdXAgaW4gdGhlIFg1MDlfU1RPUkUgc3RydWN0dXJlIGFuZAogICAgIGl0cyB2YWxpZGl0eSBhbmQgc2lnbmF0dXJlIGNoZWNrZWQsIHRoZW4gaWYgdGhlIGNlcnRpZmljYXRlIGlzIGZvdW5kCiAgICAgaW4gdGhlIENSTCB0aGUgdmVyaWZ5IGZhaWxzIHdpdGggYSByZXZva2VkIGVycm9yLgoKICAgICBWYXJpb3VzIG5ldyBDUkwgcmVsYXRlZCBjYWxsYmFja3MgYWRkZWQgdG8gWDUwOV9TVE9SRV9DVFggc3RydWN0dXJlLgoKICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhZGRlZCB0byAndmVyaWZ5JyBhcHBsaWNhdGlvbiB0byBzdXBwb3J0IHRoaXMuCgogICAgIFRoaXMgbmVlZHMgc29tZSBhZGRpdGlvbmFsIHdvcmssIHN1Y2ggYXMgYmVpbmcgYWJsZSB0byBoYW5kbGUgbXVsdGlwbGUKICAgICBDUkxzIHdpdGggZGlmZmVyZW50IHRpbWVzLCBleHRlbnNpb24gYmFzZWQgbG9va3VwIChyYXRoZXIgdGhhbiBqdXN0CiAgICAgYnkgc3ViamVjdCBuYW1lKSBhbmQgdWx0aW1hdGVseSBtb3JlIGNvbXBsZXRlIFYyIENSTCBleHRlbnNpb24KICAgICBoYW5kbGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIEFQSSAoY3J5cHRvL3VpLykuICBUaGlzIGlzIGRlc2lnbmVkCiAgICAgdG8gcmVwbGFjZSB0aGluZ3MgbGlrZSBkZXNfcmVhZF9wYXNzd29yZCBhbmQgZnJpZW5kcyAoYmFja3dhcmQKICAgICBjb21wYXRpYmlsaXR5IGZ1bmN0aW9ucyB1c2luZyB0aGlzIG5ldyBBUEkgYXJlIHByb3ZpZGVkKS4KICAgICBUaGUgcHVycG9zZSBpcyB0byByZW1vdmUgcHJvbXB0aW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBERVMgY29kZQogICAgIHNlY3Rpb24gYXMgd2VsbCBhcyBwcm92aWRlIGZvciBwcm9tcHRpbmcgdGhyb3VnaCBkaWFsb2cgYm94ZXMgaW4KICAgICBhIHdpbmRvdyBzeXN0ZW0gYW5kIHRoZSBsaWtlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAiZXhfZGF0YSIgc3VwcG9ydCB0byBFTkdJTkUgc28gaW1wbGVtZW50YXRpb25zIGNhbiBhZGQgc3RhdGUgYXQgYQogICAgIHBlci1zdHJ1Y3R1cmUgbGV2ZWwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHN0b3JlIGl0IGdsb2JhbGx5LgogICAgIFtHZW9mZl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSBmb3IgRU5HSU5FIHN0cnVjdHVyZXMgdG8gYmUgY29waWVkIHdoZW4gcmV0cmlldmVkIGJ5CiAgICAgRU5HSU5FX2J5X2lkKCkgaWYgdGhlIEVOR0lORSBzcGVjaWZpZXMgYSBuZXcgZmxhZzogRU5HSU5FX0ZMQUdTX0JZX0lEX0NPUFkuCiAgICAgVGhpcyBjYXVzZXMgdGhlICJvcmlnaW5hbCIgRU5HSU5FIHN0cnVjdHVyZSB0byBhY3QgbGlrZSBhIHRlbXBsYXRlLAogICAgIGFuYWxvZ291cyB0byB0aGUgUlNBIHZzLiBSU0FfTUVUSE9EIHR5cGUgb2Ygc2VwYXJhdGlvbi4gQmVjYXVzZSBvZiB0aGlzCiAgICAgb3BlcmF0aW9uYWwgc3RhdGUgY2FuIGJlIGxvY2FsaXNlZCB0byBlYWNoIEVOR0lORSBzdHJ1Y3R1cmUsIGRlc3BpdGUgdGhlCiAgICAgZmFjdCB0aGV5IGFsbCBzaGFyZSB0aGUgc2FtZSAibWV0aG9kcyIuIE5ldyBFTkdJTkUgc3RydWN0dXJlcyByZXR1cm5lZCBpbgogICAgIHRoaXMgY2FzZSBoYXZlIG5vIGZ1bmN0aW9uYWwgcmVmZXJlbmNlcyBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgc2luZ2xlCiAgICAgc3RydWN0dXJhbCByZWZlcmVuY2UuIFRoaXMgbWF0Y2hlcyB0aGUgc2luZ2xlIHN0cnVjdHVyYWwgcmVmZXJlbmNlIHJldHVybmVkCiAgICAgYnkgRU5HSU5FX2J5X2lkKCkgbm9ybWFsbHksIHdoZW4gaXQgaXMgaW5jcmVtZW50ZWQgb24gdGhlIHByZS1leGlzdGluZwogICAgIEVOR0lORSBzdHJ1Y3R1cmUuCiAgICAgW0dlb2ZmXQoKICAqKSBGaXggQVNOMSBkZWNvZGVyIHdoZW4gZGVjb2RpbmcgdHlwZSBBTlkgYW5kIFZfQVNOMV9PVEhFUjogc2luY2UgdGhpcwogICAgIG5lZWRzIHRvIG1hdGNoIGFueSBvdGhlciB0eXBlIGF0IGFsbCB3ZSBuZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHRoZQogICAgIHRhZyBjYWNoZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIHRvIHRoZSAib3BlbnNzbCBlbmdpbmUiIHV0aWxpdHkgdG8gaW5jbHVkZTsKICAgICAtIHZlcmJvc2l0eSBsZXZlbHMgKCctdicsICctdnYnLCBhbmQgJy12dnYnKSB0aGF0IHByb3ZpZGUgaW5mb3JtYXRpb24KICAgICAgIGFib3V0IGFuIEVOR0lORSdzIGF2YWlsYWJsZSBjb250cm9sIGNvbW1hbmRzLgogICAgIC0gZXhlY3V0aW5nIGNvbnRyb2wgY29tbWFuZHMgZnJvbSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIHVzaW5nIHRoZQogICAgICAgJy1wcmUnIGFuZCAnLXBvc3QnIHN3aXRjaGVzLiAnLXBvc3QnIGlzIG9ubHkgdXNlZCBpZiAnLXQnIGlzCiAgICAgICBzcGVjaWZpZWQgYW5kIHRoZSBFTkdJTkUgaXMgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpc2VkLiBUaGUgc3ludGF4IGZvcgogICAgICAgdGhlIGluZGl2aWR1YWwgY29tbWFuZHMgYXJlIGNvbG9uLXNlcGFyYXRlZCwgZm9yIGV4YW1wbGU7Cgkgb3BlbnNzbCBlbmdpbmUgY2hpbCAtcHJlIEZPUktfQ0hFQ0s6MCAtcHJlIFNPX1BBVEg6L2xpYi90ZXN0LnNvCiAgICAgW0dlb2ZmXQoKICAqKSBOZXcgZHluYW1pYyBjb250cm9sIGNvbW1hbmQgc3VwcG9ydCBmb3IgRU5HSU5Fcy4gRU5HSU5FcyBjYW4gbm93CiAgICAgZGVjbGFyZSB0aGVpciBvd24gY29tbWFuZHMgKG51bWJlcnMpLCBuYW1lcyAoc3RyaW5ncyksIGRlc2NyaXB0aW9ucywKICAgICBhbmQgaW5wdXQgdHlwZXMgZm9yIHJ1bi10aW1lIGRpc2NvdmVyeSBieSBjYWxsaW5nIGFwcGxpY2F0aW9ucy4gQQogICAgIHN1YnNldCBvZiB0aGVzZSBjb21tYW5kcyBhcmUgaW1wbGljaXRseSBjbGFzc2VkIGFzICJleGVjdXRhYmxlIgogICAgIGRlcGVuZGluZyBvbiB0aGVpciBpbnB1dCB0eXBlLCBhbmQgb25seSB0aGVzZSBjYW4gYmUgaW52b2tlZCB0aHJvdWdoCiAgICAgdGhlIG5ldyBzdHJpbmctYmFzZWQgQVBJIGZ1bmN0aW9uIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKS4gKEVnLiB0aGlzCiAgICAgY2FuIGJlIGJhc2VkIG9uIHVzZXIgaW5wdXQsIGNvbmZpZyBmaWxlcywgZXRjKS4gVGhlIGRpc3RpbmN0aW9uIGlzCiAgICAgdGhhdCAiZXhlY3V0YWJsZSIgY29tbWFuZHMgY2Fubm90IHJldHVybiBhbnl0aGluZyBvdGhlciB0aGFuIGEgYm9vbGVhbgogICAgIHJlc3VsdCBhbmQgY2FuIG9ubHkgc3VwcG9ydCBudW1lcmljIG9yIHN0cmluZyBpbnB1dCwgd2hlcmVhcyBzb21lCiAgICAgZGlzY292ZXJhYmxlIGNvbW1hbmRzIG1heSBvbmx5IGJlIGZvciBkaXJlY3QgdXNlIHRocm91Z2gKICAgICBFTkdJTkVfY3RybCgpLCBlZy4gc3VwcG9ydGluZyB0aGUgZXhjaGFuZ2Ugb2YgYmluYXJ5IGRhdGEsIGZ1bmN0aW9uCiAgICAgcG9pbnRlcnMsIG9yIG90aGVyIGN1c3RvbSB1c2VzLiBUaGUgImV4ZWN1dGFibGUiIGNvbW1hbmRzIGFyZSB0bwogICAgIHN1cHBvcnQgcGFyYW1ldGVyaXNhdGlvbnMgb2YgRU5HSU5FIGJlaGF2aW91ciB0aGF0IGNhbiBiZQogICAgIHVuYW1iaWd1b3VzbHkgZGVmaW5lZCBieSBFTkdJTkVzIGFuZCB1c2VkIGNvbnNpc3RlbnRseSBhY3Jvc3MgYW55CiAgICAgT3BlblNTTC1iYXNlZCBhcHBsaWNhdGlvbi4gQ29tbWFuZHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGFsbCB0aGUKICAgICBleGlzdGluZyBoYXJkd2FyZS1zdXBwb3J0aW5nIEVOR0lORXMsIG5vdGljZWFibHkgIlNPX1BBVEgiIHRvIGFsbG93CiAgICAgY29udHJvbCBvdmVyIHNoYXJlZC1saWJyYXJ5IHBhdGhzIHdpdGhvdXQgc291cmNlIGNvZGUgYWx0ZXJhdGlvbnMuCiAgICAgW0dlb2ZmXQoKICAqKSBDaGFuZ2VkIGFsbCBFTkdJTkUgaW1wbGVtZW50YXRpb25zIHRvIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZWlyCiAgICAgRU5HSU5FcyByYXRoZXIgdGhhbiBkZWNsYXJpbmcgdGhlbSBzdGF0aWNhbGx5LiBBcGFydCBmcm9tIHRoaXMgYmVpbmcKICAgICBuZWNlc3Nhcnkgd2l0aCB0aGUgcmVtb3ZhbCBvZiB0aGUgRU5HSU5FX0ZMQUdTX01BTExPQ0VEIGRpc3RpbmN0aW9uLAogICAgIHRoaXMgYWxzbyBhbGxvd3MgdGhlIGltcGxlbWVudGF0aW9ucyB0byBjb21waWxlIHdpdGhvdXQgdXNpbmcgdGhlCiAgICAgaW50ZXJuYWwgZW5naW5lX2ludC5oIGhlYWRlci4KICAgICBbR2VvZmZdCgogICopIE1pbm9yIGFkanVzdG1lbnQgdG8gInJhbmQiIGNvZGUuIFJBTkRfZ2V0X3JhbmRfbWV0aG9kKCkgbm93IHJldHVybnMgYQogICAgICdjb25zdCcgdmFsdWUuIEFueSBjb2RlIHRoYXQgc2hvdWxkIGJlIGFibGUgdG8gbW9kaWZ5IGEgUkFORF9NRVRIT0QKICAgICBzaG91bGQgYWxyZWFkeSBoYXZlIG5vbi1jb25zdCBwb2ludGVycyB0byBpdCAoaWUuIHRoZXkgc2hvdWxkIG9ubHkKICAgICBtb2RpZnkgdGhlaXIgb3duIG9uZXMpLgogICAgIFtHZW9mZl0KCiAgKikgTWFkZSBhIHZhcmlldHkgb2YgbGl0dGxlIHR3ZWFrcyB0byB0aGUgRU5HSU5FIGNvZGUuCiAgICAgLSAiYXRhbGxhIiBhbmQgInVic2VjIiBzdHJpbmcgZGVmaW5pdGlvbnMgd2VyZSBtb3ZlZCBmcm9tIGhlYWRlciBmaWxlcwogICAgICAgdG8gQyBjb2RlLiAibnVyb24iIHN0cmluZyBkZWZpbml0aW9ucyB3ZXJlIHBsYWNlZCBpbiB2YXJpYWJsZXMKICAgICAgIHJhdGhlciB0aGFuIGhhcmQtY29kZWQgLSBhbGxvd2luZyBwYXJhbWV0ZXJpc2F0aW9uIG9mIHRoZXNlIHZhbHVlcwogICAgICAgbGF0ZXIgb24gdmlhIGN0cmwoKSBjb21tYW5kcy4KICAgICAtIFJlbW92ZWQgdW51c2VkICIjaWYgMCInZCBjb2RlLgogICAgIC0gRml4ZWQgZW5naW5lIGxpc3QgaXRlcmF0aW9uIGNvZGUgc28gaXQgdXNlcyBFTkdJTkVfZnJlZSgpIHRvIHJlbGVhc2UKICAgICAgIHN0cnVjdHVyYWwgcmVmZXJlbmNlcy4KICAgICAtIENvbnN0aWZpZWQgdGhlIFJBTkRfTUVUSE9EIGVsZW1lbnQgb2YgRU5HSU5FIHN0cnVjdHVyZXMuCiAgICAgLSBDb25zdGlmaWVkIHZhcmlvdXMgZ2V0L3NldCBmdW5jdGlvbnMgYXMgYXBwcm9wcmlhdGUgYW5kIGFkZGVkCiAgICAgICBtaXNzaW5nIGZ1bmN0aW9ucyAoaW5jbHVkaW5nIGEgY2F0Y2gtYWxsIEVOR0lORV9jcHkgdGhhdCBkdXBsaWNhdGVzCiAgICAgICBhbGwgRU5HSU5FIHZhbHVlcyBvbnRvIGEgbmV3IEVOR0lORSBleGNlcHQgcmVmZXJlbmNlIGNvdW50cy9zdGF0ZSkuCiAgICAgLSBSZW1vdmVkIE5VTEwgcGFyYW1ldGVyIGNoZWNrcyBpbiBnZXQvc2V0IGZ1bmN0aW9ucy4gU2V0dGluZyBhIG1ldGhvZAogICAgICAgb3IgZnVuY3Rpb24gdG8gTlVMTCBpcyBhIHdheSBvZiBjYW5jZWxsaW5nIG91dCBhIHByZXZpb3VzbHkgc2V0CiAgICAgICB2YWx1ZS4gIFBhc3NpbmcgYSBOVUxMIEVOR0lORSBwYXJhbWV0ZXIgaXMganVzdCBwbGFpbiBzdHVwaWQgYW55d2F5CiAgICAgICBhbmQgZG9lc24ndCBqdXN0aWZ5IHRoZSBleHRyYSBlcnJvciBzeW1ib2xzIGFuZCBjb2RlLgogICAgIC0gRGVwcmVjYXRlIHRoZSBFTkdJTkVfRkxBR1NfTUFMTE9DRUQgZGVmaW5lIGFuZCBtb3ZlIHRoZSBhcmVhIGZvcgogICAgICAgZmxhZ3MgZnJvbSBlbmdpbmVfaW50LmggdG8gZW5naW5lLmguCiAgICAgLSBDaGFuZ2VkIHByb3RvdHlwZXMgZm9yIEVOR0lORSBoYW5kbGVyIGZ1bmN0aW9ucyAoaW5pdCgpLCBmaW5pc2goKSwKICAgICAgIGN0cmwoKSwga2V5LWxvYWQgZnVuY3Rpb25zLCBldGMpIHRvIHRha2UgYW4gKEVOR0lORSopIHBhcmFtZXRlci4KICAgICBbR2VvZmZdCgogICopIEltcGxlbWVudCBiaW5hcnkgaW52ZXJzaW9uIGFsZ29yaXRobSBmb3IgQk5fbW9kX2ludmVyc2UgaW4gYWRkaXRpb24KICAgICB0byB0aGUgYWxnb3JpdGhtIHVzaW5nIGxvbmcgZGl2aXNpb24uICBUaGUgYmluYXJ5IGFsZ29yaXRobSBjYW4gYmUKICAgICB1c2VkIG9ubHkgaWYgdGhlIG1vZHVsdXMgaXMgb2RkLiAgT24gMzItYml0IHN5c3RlbXMsIGl0IGlzIGZhc3RlcgogICAgIG9ubHkgZm9yIHJlbGF0aXZlbHkgc21hbGwgbW9kdWxpIChyb3VnaGx5IDIwLTMwJSBmb3IgMTI4LWJpdCBtb2R1bGksCiAgICAgcm91Z2hseSA1LTE1JSBmb3IgMjU2LWJpdCBtb2R1bGkpLCBzbyB3ZSB1c2UgaXQgb25seSBmb3IgbW9kdWxpCiAgICAgdXAgdG8gNDUwIGJpdHMuICBJbiA2NC1iaXQgZW52aXJvbm1lbnRzLCB0aGUgYmluYXJ5IGFsZ29yaXRobQogICAgIGFwcGVhcnMgdG8gYmUgYWR2YW50YWdlb3VzIGZvciBtdWNoIGxvbmdlciBtb2R1bGk7IGhlcmUgd2UgdXNlIGl0CiAgICAgZm9yIG1vZHVsaSB1cCB0byAyMDQ4IGJpdHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSBDSE9JQ0UgZmllbGQgc2V0dGluZyBpbiBBU04xX2l0ZW1fZXhfZDJpKCkuIFRoZSBvbGQgY29kZQogICAgIGNvdWxkIG5vdCBzdXBwb3J0IHRoZSBjb21iaW5lIGZsYWcgaW4gY2hvaWNlIGZpZWxkcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSAnY29weV9leHRlbnNpb25zJyBvcHRpb24gdG8gdGhlICdjYScgdXRpbGl0eS4gVGhpcyBjb3BpZXMKICAgICBleHRlbnNpb25zIGZyb20gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRvIHRoZSBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBtdWx0aXBsZSAnY2VydG9wdCcgYW5kICduYW1lb3B0JyBvcHRpb25zIHRvIGJlIHNlcGFyYXRlZAogICAgIGJ5IGNvbW1hcy4gQWRkICduYW1vcHQnIGFuZCAnY2VydG9wdCcgb3B0aW9ucyB0byB0aGUgJ2NhJyBjb25maWcKICAgICBmaWxlOiB0aGlzIGFsbG93cyB0aGUgZGlzcGxheSBvZiB0aGUgY2VydGlmaWNhdGUgYWJvdXQgdG8gYmUKICAgICBzaWduZWQgdG8gYmUgY3VzdG9taXNlZCwgdG8gYWxsb3cgY2VydGFpbiBmaWVsZHMgdG8gYmUgaW5jbHVkZWQKICAgICBvciBleGNsdWRlZCBhbmQgZXh0ZW5zaW9uIGRldGFpbHMuIFRoZSBvbGQgc3lzdGVtIGRpZG4ndCBkaXNwbGF5CiAgICAgbXVsdGljaGFyYWN0ZXIgc3RyaW5ncyBwcm9wZXJseSwgb21pdHRlZCBmaWVsZHMgbm90IGluIHRoZSBwb2xpY3kKICAgICBhbmQgY291bGRuJ3QgZGlzcGxheSBhZGRpdGlvbmFsIGRldGFpbHMgc3VjaCBhcyBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9uIEVDX1BPSU5Uc19tdWwgZm9yIG11bHRpcGxlIHNjYWxhciBtdWx0aXBsaWNhdGlvbgogICAgIG9mIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgZWxsaXB0aWMgY3VydmUgcG9pbnRzCiAgICAgICAgICBcc3VtIHNjYWxhcnNbaV0qcG9pbnRzW2ldLAogICAgIG9wdGlvbmFsbHkgaW5jbHVkaW5nIHRoZSBnZW5lcmF0b3IgZGVmaW5lZCBmb3IgdGhlIEVDX0dST1VQOgogICAgICAgICAgc2NhbGFyKmdlbmVyYXRvciArICBcc3VtIHNjYWxhcnNbaV0qcG9pbnRzW2ldLgoKICAgICBFQ19QT0lOVF9tdWwgaXMgYSBzaW1wbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhlIHR5cGljYWwgY2FzZQogICAgIHRoYXQgdGhlIHBvaW50IGxpc3QgaGFzIGp1c3Qgb25lIGl0ZW0gKGJlc2lkZXMgdGhlIG9wdGlvbmFsCiAgICAgZ2VuZXJhdG9yKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXJzdCBFQ19NRVRIT0RzIGZvciBjdXJ2ZXMgb3ZlciBHRihwKToKCiAgICAgRUNfR0ZwX3NpbXBsZV9tZXRob2QoKSB1c2VzIHRoZSBiYXNpYyBCTl9tb2RfbXVsIGFuZCBCTl9tb2Rfc3FyCiAgICAgb3BlcmF0aW9ucyBhbmQgcHJvdmlkZXMgdmFyaW91cyBtZXRob2QgZnVuY3Rpb25zIHRoYXQgY2FuIGFsc28KICAgICBvcGVyYXRlIHdpdGggZmFzdGVyIGltcGxlbWVudGF0aW9ucyBvZiBtb2R1bGFyIGFyaXRobWV0aWMuICAgICAKCiAgICAgRUNfR0ZwX21vbnRfbWV0aG9kKCkgcmV1c2VzIG1vc3QgZnVuY3Rpb25zIHRoYXQgYXJlIHBhcnQgb2YKICAgICBFQ19HRnBfc2ltcGxlX21ldGhvZCwgYnV0IHVzZXMgTW9udGdvbWVyeSBhcml0aG1ldGljLgoKICAgICBbQm9kbyBNb2VsbGVyOyBwb2ludCBhZGRpdGlvbiBhbmQgcG9pbnQgZG91YmxpbmcKICAgICBpbXBsZW1lbnRhdGlvbiBkaXJlY3RseSBkZXJpdmVkIGZyb20gc291cmNlIGNvZGUgcHJvdmlkZWQgYnkKICAgICBMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPl0KCiAgKikgRnJhbWV3b3JrIGZvciBlbGxpcHRpYyBjdXJ2ZXMgKGNyeXB0by9lYy9lYy5oLCBjcnlwdG8vZWMvZWNfbGNsLmgsCiAgICAgY3J5cHRvL2VjL2VjX2xpYi5jKToKCiAgICAgQ3VydmVzIGFyZSBFQ19HUk9VUCBvYmplY3RzICh3aXRoIGFuIG9wdGlvbmFsIGdyb3VwIGdlbmVyYXRvcikKICAgICBiYXNlZCBvbiBFQ19NRVRIT0RzIHRoYXQgYXJlIGJ1aWx0IGludG8gdGhlIGxpYnJhcnkuCgogICAgIFBvaW50cyBhcmUgRUNfUE9JTlQgb2JqZWN0cyBiYXNlZCBvbiBFQ19HUk9VUCBvYmplY3RzLgoKICAgICBNb3N0IG9mIHRoZSBmcmFtZXdvcmsgd291bGQgYmUgYWJsZSB0byBoYW5kbGUgY3VydmVzIG92ZXIgYXJiaXRyYXJ5CiAgICAgZmluaXRlIGZpZWxkcywgYnV0IGFzIHRoZXJlIGFyZSBubyBvYnZpb3VzIHR5cGVzIGZvciBmaWVsZHMgb3RoZXIKICAgICB0aGFuIEdGKHApLCBzb21lIGZ1bmN0aW9ucyBhcmUgbGltaXRlZCB0byB0aGF0IGZvciBub3cuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHRoZSAtSFRUUCBvcHRpb24gdG8gc19zZXJ2ZXIuICBJdCBpcyBzaW1pbGFyIHRvIC1XV1csIGJ1dCByZXF1aXJlcwogICAgIHRoYXQgdGhlIGZpbGUgY29udGFpbnMgYSBjb21wbGV0ZSBIVFRQIHJlc3BvbnNlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZWMgZGlyZWN0b3J5IHRvIG1rZGVmLnBsIGFuZCBta2ZpbGVzLnBsLiBJbiBta2RlZi5wbAogICAgIGNoYW5nZSB0aGUgZGVmIGFuZCBudW0gZmlsZSBwcmludGYgZm9ybWF0IHNwZWNpZmllciBmcm9tICIlLTQwc1hYWCIKICAgICB0byAiJS0zOXMgWFhYIi4gVGhlIGxhdHRlciB3aWxsIGFsd2F5cyBndWFyYW50ZWUgYSBzcGFjZSBhZnRlciB0aGUKICAgICBmaWVsZCB3aGlsZSB0aGUgZm9ybWVyIHdpbGwgY2F1c2UgdGhlbSB0byBydW4gdG9nZXRoZXIgaWYgdGhlIGZpZWxkCiAgICAgaXMgNDAgb2YgbW9yZSBjaGFyYWN0ZXJzIGxvbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29uc3RpZnkgdGhlIGNpcGhlciBhbmQgZGlnZXN0ICdtZXRob2QnIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcwogICAgIGFuZCBtb2RpZnkgcmVsYXRlZCBmdW5jdGlvbnMgdG8gdGFrZSBjb25zdGFudCBFVlBfTUQgYW5kIEVWUF9DSVBIRVIKICAgICBwb2ludGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIaWRlIEJOX0NUWCBzdHJ1Y3R1cmUgZGV0YWlscyBpbiBibl9sY2wuaCBpbnN0ZWFkIG9mIHB1Ymxpc2hpbmcgdGhlbQogICAgIGluIDxvcGVuc3NsL2JuLmg+LiAgQWxzbyBmdXJ0aGVyIGluY3JlYXNlIEJOX0NUWF9OVU0gdG8gMzIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW9kaWZ5IEVWUF9EaWdlc3QqKCkgcm91dGluZXMgc28gdGhleSBub3cgcmV0dXJuIHZhbHVlcy4gQWx0aG91Z2ggdGhlCiAgICAgaW50ZXJuYWwgc29mdHdhcmUgcm91dGluZXMgY2FuIG5ldmVyIGZhaWwgYWRkaXRpb25hbCBoYXJkd2FyZSB2ZXJzaW9ucwogICAgIG1pZ2h0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIHVwIGNyeXB0by9lcnIvZXJyLmggYW5kIGNoYW5nZSBzb21lIGVycm9yIGNvZGVzIHRvIGF2b2lkIGNvbmZsaWN0czoKCiAgICAgUHJldmlvdXNseSBFUlJfUl9GQVRBTCB3YXMgdG9vIHNtYWxsIGFuZCBjb2luY2lkZWQgd2l0aCBFUlJfTElCX1BLQ1M3CiAgICAgKD0gRVJSX1JfUEtDUzdfTElCKTsgaXQgaXMgbm93IDY0IGluc3RlYWQgb2YgMzIuCgogICAgIEFTTjEgZXJyb3IgY29kZXMKICAgICAgICAgIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SCiAgICAgICAgICAuLi4KICAgICAgICAgIEVSUl9SX01JU1NJTkdfQVNOMV9FT1MKICAgICB3ZXJlIDQgLi4gOSwgY29uZmxpY3Rpbmcgd2l0aAogICAgICAgICAgRVJSX0xJQl9SU0EgKD0gRVJSX1JfUlNBX0xJQikKICAgICAgICAgIC4uLgogICAgICAgICAgRVJSX0xJQl9QRU0gKD0gRVJSX1JfUEVNX0xJQikuCiAgICAgVGhleSBhcmUgbm93IDU4IC4uIDYzIChpLmUuLCBqdXN0IGJlbG93IEVSUl9SX0ZBVEFMKS4KCiAgICAgQWRkIG5ldyBlcnJvciBjb2RlICdFUlJfUl9JTlRFUk5BTF9FUlJPUicuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3Qgb3ZlcnVzZSBsb2NrcyBpbiBjcnlwdG8vZXJyL2Vyci5jOiBGb3IgZGF0YSByZXRyaWV2YWwsIENSWVBUT19yX2xvY2sKICAgICBzdWZmaWNlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgb3B0aW9uICctc3ViaiBhcmcnIGZvciAnb3BlbnNzbCByZXEnIGFuZCAnb3BlbnNzbCBjYScuICBUaGlzCiAgICAgc2V0cyB0aGUgc3ViamVjdCBuYW1lIGZvciBhIG5ldyByZXF1ZXN0IG9yIHN1cGVyc2VkZXMgdGhlCiAgICAgc3ViamVjdCBuYW1lIGluIGEgZ2l2ZW4gcmVxdWVzdC4gRm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQgYXJlCiAgICAgICAgICAnQ049U29tZSBOYW1lLCBPVT1teU9VLCBDPUlUJwogICAgIGFuZAogICAgICAgICAgJ0NOPVNvbWUgTmFtZS9PVT1teU9VL0M9SVQnLgoKICAgICBBZGQgb3B0aW9ucyAnLWJhdGNoJyBhbmQgJy12ZXJib3NlJyB0byAnb3BlbnNzbCByZXEnLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBoYWNrbWFzdGVycy5uZXQ+XQoKICAqKSBJbnRyb2R1Y2UgdGhlIHBvc3NpYmlsaXR5IHRvIGFjY2VzcyBnbG9iYWwgdmFyaWFibGVzIHRocm91Z2gKICAgICBmdW5jdGlvbnMgb24gcGxhdGZvcm0gd2VyZSB0aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIGhhbmRsZSBleHBvcnRpbmcKICAgICBnbG9iYWwgdmFyaWFibGVzIGluIHNoYXJlZCBsaWJyYXJpZXMuICBUbyBlbmFibGUgdGhpcyBmdW5jdGlvbmFsaXR5LAogICAgIG9uZSBtdXN0IGNvbmZpZ3VyZSB3aXRoICJFWFBPUlRfVkFSX0FTX0ZOIiBvciBkZWZpbmVkIHRoZSBDIG1hY3JvCiAgICAgIk9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTiIgaW4gY3J5cHRvL29wZW5zc2xjb25mLmggKHRoZSBsYXR0ZXIKICAgICBpcyBub3JtYWxseSBkb25lIGJ5IENvbmZpZ3VyZSBvciBzb21ldGhpbmcgc2ltaWxhcikuCgogICAgIFRvIGltcGxlbWVudCBhIGdsb2JhbCB2YXJpYWJsZSwgdXNlIHRoZSBtYWNybyBPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwKICAgICBpbiB0aGUgc291cmNlIGZpbGUgKGZvby5jKSBsaWtlIHRoaXM6CgoJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGludCxmb28pPTE7CglPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwoZG91YmxlLGJhcik7CgogICAgIFRvIGRlY2xhcmUgYSBnbG9iYWwgdmFyaWFibGUsIHVzZSB0aGUgbWFjcm9zIE9QRU5TU0xfREVDTEFSRV9HTE9CQUwKICAgICBhbmQgT1BFTlNTTF9HTE9CQUxfUkVGIGluIHRoZSBoZWFkZXIgZmlsZSAoZm9vLmgpIGxpa2UgdGhpczoKCglPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGludCxmb28pOwoJI2RlZmluZSBmb28gT1BFTlNTTF9HTE9CQUxfUkVGKGZvbykKCU9QRU5TU0xfREVDTEFSRV9HTE9CQUwoZG91YmxlLGJhcik7CgkjZGVmaW5lIGJhciBPUEVOU1NMX0dMT0JBTF9SRUYoYmFyKQoKICAgICBUaGUgI2RlZmluZXMgYXJlIHZlcnkgaW1wb3J0YW50LCBhbmQgdGhlcmVmb3JlIHNvIGlzIGluY2x1ZGluZyB0aGUKICAgICBoZWFkZXIgZmlsZSBldmVyeXdoZXJlIHdoZXJlIHRoZSBkZWZpbmVkIGdsb2JhbHMgYXJlIHVzZWQuCgogICAgIFRoZSBtYWNybyBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04gYWxzbyBhZmZlY3RzIHRoZSBkZWZpbml0aW9uCiAgICAgb2YgQVNOLjEgaXRlbXMsIGJ1dCB0aGF0IHN0cnVjdHVyZSBpcyBhIGJpdCBkaWZmZXJlbnQuCgogICAgIFRoZSBsYXJnZXN0IGNoYW5nZSBpcyBpbiB1dGlsL21rZGVmLnBsIHdoaWNoIGhhcyBiZWVuIGVuaGFuY2VkIHdpdGgKICAgICBiZXR0ZXIgYW5kIGVhc2llciB0byB1bmRlcnN0YW5kIGxvZ2ljIHRvIGNob29zZSB3aGljaCBzeW1ib2xzIHNob3VsZAogICAgIGdvIGludG8gdGhlIFdpbmRvd3MgLmRlZiBmaWxlcyBhcyB3ZWxsIGFzIGEgbnVtYmVyIG9mIGZpeGVzIGFuZCBjb2RlCiAgICAgY2xlYW51cCAoYW1vbmcgb3RoZXJzLCBhbGdvcml0aG0ga2V5d29yZHMgYXJlIG5vdyBzb3J0ZWQKICAgICBsZXhpY29ncmFwaGljYWxseSB0byBhdm9pZCBjb25zdGFudCByZXdyaXRlcykuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gQk5fZGl2KCkga2VlcCBhIGNvcHkgb2YgdGhlIHNpZ24gb2YgJ251bScgYmVmb3JlIHdyaXRpbmcgdGhlCiAgICAgcmVzdWx0IHRvICdybScgYmVjYXVzZSBpZiBybT09bnVtIHRoZSB2YWx1ZSB3aWxsIGJlIG92ZXJ3cml0dGVuCiAgICAgYW5kIHByb2R1Y2UgdGhlIHdyb25nIHJlc3VsdCBpZiAnbnVtJyBpcyBuZWdhdGl2ZTogdGhpcyBjYXVzZWQKICAgICBwcm9ibGVtcyB3aXRoIEJOX21vZCgpIGFuZCBCTl9ubm1vZCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9uIE9DU1BfcmVxdWVzdF92ZXJpZnkoKS4gVGhpcyBjaGVja3MgdGhlIHNpZ25hdHVyZSBvbiBhbgogICAgIE9DU1AgcmVxdWVzdCBhbmQgdmVyaWZpZXMgdGhlIHNpZ25lciBjZXJ0aWZpY2F0ZS4gVGhlIHNpZ25lcgogICAgIGNlcnRpZmljYXRlIGlzIGp1c3QgY2hlY2tlZCBmb3IgYSBnZW5lcmljIHB1cnBvc2UgYW5kIE9DU1AgcmVxdWVzdAogICAgIHRydXN0IHNldHRpbmdzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQ1NQX2NoZWNrX3ZhbGlkaXR5KCkgZnVuY3Rpb24gdG8gY2hlY2sgdGhlIHZhbGlkaXR5IG9mIE9DU1AKICAgICByZXNwb25zZXMuIE9DU1AgcmVzcG9uc2VzIGFyZSBwcmVwYXJlZCBpbiByZWFsIHRpbWUgYW5kIG1heSBvbmx5CiAgICAgYmUgYSBmZXcgc2Vjb25kcyBvbGQuIFNpbXBseSBjaGVja2luZyB0aGF0IHRoZSBjdXJyZW50IHRpbWUgbGllcwogICAgIGJldHdlZW4gdGhpc1VwZGF0ZSBhbmQgbmV4dFVwZGF0ZSBtYXggcmVqZWN0IG90aGVyd2lzZSB2YWxpZCByZXNwb25zZXMKICAgICBjYXVzZWQgYnkgZWl0aGVyIE9DU1AgcmVzcG9uZGVyIG9yIGNsaWVudCBjbG9jayBpbmFjY3VyYWN5LiBJbnN0ZWFkCiAgICAgd2UgYWxsb3cgdGhpc1VwZGF0ZSBhbmQgbmV4dFVwZGF0ZSB0byBmYWxsIHdpdGhpbiBhIGNlcnRhaW4gcGVyaW9kIG9mCiAgICAgdGhlIGN1cnJlbnQgdGltZS4gVGhlIGFnZSBvZiB0aGUgcmVzcG9uc2UgY2FuIGFsc28gb3B0aW9uYWxseSBiZQogICAgIGNoZWNrZWQuIFR3byBuZXcgb3B0aW9ucyAtdmFsaWRpdHlfcGVyaW9kIGFuZCAtc3RhdHVzX2FnZSBhZGRlZCB0bwogICAgIG9jc3AgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBzaWduYXR1cmUgb3IgcHVibGljIGtleSBhbGdvcml0aG0gaXMgdW5yZWNvZ25pemVkIHByaW50IG91dCBpdHMKICAgICBPSUQgcmF0aGVyIHRoYXQganVzdCBVTktOT1dOLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBPQ1NQX2NlcnRfdG9faWQoKSB0byB0b2xlcmF0ZSBhIE5VTEwgc3ViamVjdCBjZXJ0aWZpY2F0ZSBhbmQKICAgICBPQ1NQX2NlcnRfaWRfbmV3KCkgYSBOVUxMIHNlcmlhbE51bWJlci4gVGhpcyBhbGxvd3MgYSBwYXJ0aWFsIGNlcnRpZmljYXRlCiAgICAgSUQgdG8gYmUgZ2VuZXJhdGVkIGZyb20gdGhlIGlzc3VlciBjZXJ0aWZpY2F0ZSBhbG9uZSB3aGljaCBjYW4gdGhlbiBiZQogICAgIHBhc3NlZCB0byBPQ1NQX2lkX2lzc3Vlcl9jbXAoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY29tcGlsYXRpb24gb3B0aW9uIEFTTjFfSVRFTV9GVU5DVElPTlMuIFRoaXMgY2F1c2VzIHRoZSBuZXcKICAgICBBU04xIG1vZHVsZXMgdG8gZXhwb3J0IGZ1bmN0aW9ucyByZXR1cm5pbmcgQVNOMV9JVEVNIHBvaW50ZXJzCiAgICAgaW5zdGVhZCBvZiB0aGUgQVNOMV9JVEVNIHN0cnVjdHVyZXMgdGhlbXNlbHZlcy4gVGhpcyBhZGRzIHNldmVyYWwKICAgICBuZXcgbWFjcm9zIHdoaWNoIGFsbG93IHRoZSB1bmRlcmx5aW5nIEFTTjEgZnVuY3Rpb24vc3RydWN0dXJlIHRvCiAgICAgYmUgYWNjZXNzZWQgdHJhbnNwYXJlbnRseS4gQXMgYSByZXN1bHQgY29kZSBzaG91bGQgbm90IHVzZSBBU04xX0lURU0KICAgICByZWZlcmVuY2VzIGRpcmVjdGx5IChzdWNoIGFzICZYNTA5X2l0KSBidXQgaW5zdGVhZCB1c2UgdGhlIHJlbGV2YW50CiAgICAgbWFjcm9zIChzdWNoIGFzIEFTTjFfSVRFTV9ycHRyKFg1MDkpKS4gVGhpcyBvcHRpb24gaXMgdG8gYWxsb3cKICAgICB1c2Ugb2YgdGhlIG5ldyBBU04xIGNvZGUgb24gcGxhdGZvcm1zIHdoZXJlIGV4cG9ydGluZyBzdHJ1Y3R1cmVzCiAgICAgaXMgcHJvYmxlbWF0aWNhbCAoZm9yIGV4YW1wbGUgaW4gc2hhcmVkIGxpYnJhcmllcykgYnV0IGV4cG9ydGluZwogICAgIGZ1bmN0aW9ucyByZXR1cm5pbmcgcG9pbnRlcnMgdG8gc3RydWN0dXJlcyBpcyBub3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG92ZXJyaWRpbmcgdGhlIGdlbmVyYXRpb24gb2YgU1NML1RMUyBzZXNzaW9uIElEcy4KICAgICBUaGVzZSBjYWxsYmFja3MgY2FuIGJlIHJlZ2lzdGVyZWQgZWl0aGVyIGluIGFuIFNTTF9DVFggb3IgcGVyIFNTTC4KICAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBjb250cm9sLCBpZiB0aGV5IHdpc2gsCiAgICAgdGhlIGFyYml0cmFyeSB2YWx1ZXMgY2hvc2VuIGZvciB1c2UgYXMgc2Vzc2lvbiBJRHMsIHBhcnRpY3VsYXJseSBhcyBpdAogICAgIGNhbiBiZSB1c2VmdWwgZm9yIHNlc3Npb24gY2FjaGluZyBpbiBtdWx0aXBsZS1zZXJ2ZXIgZW52aXJvbm1lbnRzLiBBCiAgICAgY29tbWFuZC1saW5lIHN3aXRjaCBmb3IgdGVzdGluZyB0aGlzIChhbmQgYW55IGNsaWVudCBjb2RlIHRoYXQgd2lzaGVzCiAgICAgdG8gdXNlIHN1Y2ggYSBmZWF0dXJlKSBoYXMgYmVlbiBhZGRlZCB0byAic19zZXJ2ZXIiLgogICAgIFtHZW9mZiBUaG9ycGUsIEx1dHogSmFlbmlja2VdCgogICopIE1vZGlmeSBta2RlZi5wbCB0byByZWNvZ25pc2UgYW5kIHBhcnNlIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMKICAgICBvZiB0aGUgZm9ybSAnI2lmIGRlZmluZWQoLi4uKSB8fCBkZWZpbmVkKC4uLikgfHwgLi4uJyBhbmQKICAgICAnI2lmICFkZWZpbmVkKC4uLikgJiYgIWRlZmluZWQoLi4uKSAmJiAuLi4nLiAgVGhpcyBhbHNvIGF2b2lkcwogICAgIHRoZSBncm93aW5nIG51bWJlciBvZiBzcGVjaWFsIGNhc2VzIGl0IHdhcyBwcmV2aW91c2x5IGhhbmRsaW5nLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgYWxsIGNvbmZpZ3VyYXRpb24gbWFjcm9zIGF2YWlsYWJsZSBmb3IgYXBwbGljYXRpb24gYnkgbWFraW5nCiAgICAgc3VyZSB0aGV5IGFyZSBhdmFpbGFibGUgaW4gb3BlbnNzbGNvbmYuaCwgYnkgZ2l2aW5nIHRoZW0gbmFtZXMgc3RhcnRpbmcKICAgICB3aXRoICJPUEVOU1NMXyIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIgcGFja2FnZXMgYW5kIGJ5IG1ha2luZwogICAgIHN1cmUgZV9vczIuaCB3aWxsIGNvdmVyIGFsbCBwbGF0Zm9ybS1zcGVjaWZpYyBjYXNlcyB0b2dldGhlciB3aXRoCiAgICAgb3BlbnNzbGNvbmYuaC4KICAgICBBZGRpdGlvbmFsbHksIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBkZWZpbmUgY29uZmlndXJhdGlvbi9wbGF0Zm9ybS0KICAgICBzcGVjaWZpYyBuYW1lcyAoY2FsbGVkICJzeXN0ZW0gaWRlbnRpdGllcyIpLiAgSW4gdGhlIEMgY29kZSwgdGhlc2UKICAgICBhcmUgcHJlZml4ZWQgd2l0aCAiT1BFTlNTTF9TWVNOQU1FXyIuICBlX29zMi5oIHdpbGwgY3JlYXRlIGFub3RoZXIKICAgICBtYWNybyB3aXRoIHRoZSBuYW1lIGJlZ2lubmluZyB3aXRoICJPUEVOU1NMX1NZU18iLCB3aGljaCBpcyBkZXRlcm1pbmVkCiAgICAgZnJvbSAiT1BFTlNTTF9TWVNOQU1FXyoiIG9yIGNvbXBpbGVyLXNwZWNpZmljIG1hY3JvcyBkZXBlbmRpbmcgb24KICAgICB3aGF0IGlzIGF2YWlsYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgb3B0aW9uIC1zZXRfc2VyaWFsIHRvICdyZXEnIGFuZCAneDUwOScgdGhpcyBhbGxvd3MgdGhlIHNlcmlhbAogICAgIG51bWJlciB0byB1c2UgdG8gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIFByZXZpb3VzbHkgc2VsZgogICAgIHNpZ25lZCBjZXJ0aWZpY2F0ZXMgd2VyZSBoYXJkIGNvZGVkIHdpdGggc2VyaWFsIG51bWJlciAwIGFuZCB0aGUgCiAgICAgQ0Egb3B0aW9ucyBvZiAneDUwOScgaGFkIHRvIHVzZSBhIHNlcmlhbCBudW1iZXIgaW4gYSBmaWxlIHdoaWNoIHdhcwogICAgIGF1dG8gaW5jcmVtZW50ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gJ2NhJyB1dGlsaXR5IHRvIHN1cHBvcnQgVjIgQ1JMIGVudHJ5IGV4dGVuc2lvbnMuCiAgICAgQ3VycmVudGx5IENSTCByZWFzb24sIGludmFsaWRpdHkgZGF0ZSBhbmQgaG9sZCBpbnN0cnVjdGlvbiBhcmUKICAgICBzdXBwb3J0ZWQuIEFkZCBuZXcgQ1JMIGV4dGVuc2lvbnMgdG8gVjMgY29kZSBhbmQgc29tZSBuZXcgb2JqZWN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoKSB0aGlzIGlzIHVzZWQgdG8KICAgICBkaXNhYmxlIHN0YW5kYXJkIGJsb2NrIHBhZGRpbmcgKGFrYSBQS0NTIzUgcGFkZGluZykgaW4gdGhlIEVWUAogICAgIEFQSSwgd2hpY2ggd2FzIHByZXZpb3VzbHkgbWFuZGF0b3J5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGRhdGEgaXMKICAgICBub3QgcGFkZGVkIGluIGFueSB3YXkgYW5kIHNvIHRoZSB0b3RhbCBsZW5ndGggbXVjaCBiZSBhIG11bHRpcGxlCiAgICAgb2YgdGhlIGJsb2NrIHNpemUsIG90aGVyd2lzZSBhbiBlcnJvciBvY2N1cnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCAoaW5jb21wbGV0ZSkgT0NTUCBTU0wgc3VwcG9ydC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0NTUF9wYXJzZV91cmwoKS4gVGhpcyBzcGxpdHMgdXAgYSBVUkwgaW50byBpdHMgaG9zdCwKICAgICBwb3J0IGFuZCBwYXRoIGNvbXBvbmVudHM6IHByaW1hcmlseSB0byBwYXJzZSBPQ1NQIFVSTHMuIE5ldyAtdXJsCiAgICAgb3B0aW9uIHRvIG9jc3AgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgbm9uY2UgYmVoYXZpb3IuIFRoZSByZXR1cm4gdmFsdWUgb2YgT0NTUF9jaGVja19ub25jZSgpIG5vdyAKICAgICByZWZsZWN0cyB0aGUgdmFyaW91cyBjaGVja3MgcGVyZm9ybWVkLiBBcHBsaWNhdGlvbnMgY2FuIGRlY2lkZQogICAgIHdoZXRoZXIgdG8gdG9sZXJhdGUgY2VydGFpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYW4gYWJzZW50IG5vbmNlCiAgICAgaW4gYSByZXNwb25zZSB3aGVuIG9uZSB3YXMgcHJlc2VudCBpbiBhIHJlcXVlc3Q6IHRoZSBvY3NwIGFwcGxpY2F0aW9uCiAgICAganVzdCBwcmludHMgb3V0IGEgd2FybmluZy4gTmV3IGZ1bmN0aW9uIE9DU1BfYWRkMV9iYXNpY19ub25jZSgpCiAgICAgdGhpcyBpcyB0byBhbGxvdyByZXNwb25kZXJzIHRvIGluY2x1ZGUgYSBub25jZSBpbiBhIHJlc3BvbnNlIGV2ZW4gaWYKICAgICB0aGUgcmVxdWVzdCBpcyBub25jZS1sZXNzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERpc2FibGUgc3RkaW4gYnVmZmVyaW5nIGluIGxvYWRfY2VydCAoYXBwcy9hcHBzLmMpIHNvIHRoYXQgbm8gY2VydHMgYXJlCiAgICAgc2tpcHBlZCB3aGVuIHVzaW5nIG9wZW5zc2wgeDUwOSBtdWx0aXBsZSB0aW1lcyBvbiBhIHNpbmdsZSBpbnB1dCBmaWxlLAogICAgIGUuZy4gIihvcGVuc3NsIHg1MDkgLW91dCBjZXJ0MTsgb3BlbnNzbCB4NTA5IC1vdXQgY2VydDIpIDxjZXJ0cyIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBBU04xX1VUQ1RJTUVfc2V0X3N0cmluZygpIGFuZCBBU04xX0dFTkVSQUxJWkVEVElNRV9zZXRfc3RyaW5nKCkKICAgICBzZXQgc3RyaW5nIHR5cGU6IHRvIGhhbmRsZSBzZXR0aW5nIEFTTjFfVElNRSBzdHJ1Y3R1cmVzLiBGaXggY2EKICAgICB1dGlsaXR5IHRvIGNvcnJlY3RseSBpbml0aWFsaXplIHJldm9jYXRpb24gZGF0ZSBvZiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSBhbGxvd3MgdGhlIHNlcnZlciB0byBvdmVycmlkZQogICAgIHRoZSBjbGllbnRzIHByZWZlcnJlZCBjaXBoZXJzdWl0ZXMgYW5kIHJhdGhlciB1c2UgaXRzIG93biBwcmVmZXJlbmNlcy4KICAgICBTaG91bGQgaGVscCB0byB3b3JrIGFyb3VuZCBNJCBTR0MgKFNlcnZlciBHYXRlZCBDcnlwdG9ncmFwaHkpIGJ1ZyBpbgogICAgIEludGVybmV0IEV4cGxvcmVyIGJ5IGVuc3VyaW5nIHVuY2hhbmdlZCBoYXNoIG1ldGhvZCBkdXJpbmcgc3RlcHVwLgogICAgIChBbHNvIHJlcGxhY2VzIHRoZSBicm9rZW4vZGVhY3RpdmF0ZWQgU1NMX09QX05PTl9FWFBPUlRfRklSU1Qgb3B0aW9uLikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFrZSBta2RlZi5wbCByZWNvZ25pc2UgYWxsIERFQ0xBUkVfQVNOMSBtYWNyb3MsIGNoYW5nZSByaWpuZGFlbAogICAgIHRvIGFlcyBhbmQgYWRkIGEgbmV3ICdleGlzdCcgb3B0aW9uIHRvIHByaW50IG91dCBzeW1ib2xzIHRoYXQgZG9uJ3QKICAgICBhcHBlYXIgdG8gZXhpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkaXRpb25hbCBvcHRpb25zIHRvIG9jc3AgdXRpbGl0eSB0byBhbGxvdyBmbGFncyB0byBiZSBzZXQgYW5kCiAgICAgYWRkaXRpb25hbCBjZXJ0aWZpY2F0ZXMgc3VwcGxpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBvcHRpb24gLVZBZmlsZSB0byAnb3BlbnNzbCBvY3NwJywgc28gdGhlIHVzZXIgY2FuIGdpdmUgdGhlCiAgICAgT0NTUCBjbGllbnQgYSBudW1iZXIgb2YgY2VydGlmaWNhdGUgdG8gb25seSB2ZXJpZnkgdGhlIHJlc3BvbnNlCiAgICAgc2lnbmF0dXJlIGFnYWluc3QuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVXBkYXRlIFJpam5kYWVsIGNvZGUgdG8gdmVyc2lvbiAzLjAgYW5kIGNoYW5nZSBFVlAgQUVTIGNpcGhlcnMgdG8KICAgICBoYW5kbGUgdGhlIG5ldyBBUEkuIEN1cnJlbnRseSBvbmx5IEVDQiwgQ0JDIG1vZGVzIHN1cHBvcnRlZC4gQWRkIG5ldwogICAgIEFFUyBPSURzLgoKICAgICBBZGQgVExTIEFFUyBjaXBoZXJzdWl0ZXMgYXMgZGVzY3JpYmVkIGluIFJGQzMyNjgsICJBZHZhbmNlZAogICAgIEVuY3J5cHRpb24gU3RhbmRhcmQgKEFFUykgQ2lwaGVyc3VpdGVzIGZvciBUcmFuc3BvcnQgTGF5ZXIKICAgICBTZWN1cml0eSAoVExTKSIuICAoSW4gYmV0YSB2ZXJzaW9ucyBvZiBPcGVuU1NMIDAuOS43LCB0aGVzZSB3ZXJlCiAgICAgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgd2VyZSBub3QgcGFydCBvZiB0aGUgIkFMTCIgY2lwaGVyc3VpdGUKICAgICBhbGlhcyBiZWNhdXNlIHRoZXkgd2VyZSBub3QgeWV0IG9mZmljaWFsOyB0aGV5IGNvdWxkIGJlCiAgICAgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgc3BlY2lmeWluZyB0aGUgIkFFU2RyYWZ0IiBjaXBoZXJzdWl0ZQogICAgIGdyb3VwIGFsaWFzLiAgSW4gdGhlIGZpbmFsIHJlbGVhc2Ugb2YgT3BlblNTTCAwLjkuNywgdGhlIGdyb3VwCiAgICAgYWxpYXMgaXMgY2FsbGVkICJBRVMiIGFuZCBpcyBwYXJ0IG9mICJBTEwiLikKICAgICBbQmVuIExhdXJpZSwgU3RldmUgIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gT0NTUF9jb3B5X25vbmNlKCkgdG8gY29weSBub25jZSB2YWx1ZSAoaWYgcHJlc2VudCkgZnJvbQogICAgIHJlcXVlc3QgdG8gcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb25zIGZvciBPQ1NQIHJlc3BvbmRlcnMuIE9DU1BfcmVxdWVzdF9vbmVyZXFfY291bnQoKSwKICAgICBPQ1NQX3JlcXVlc3Rfb25lcmVxX2dldDAoKSwgT0NTUF9vbmVyZXFfZ2V0MF9pZCgpIGFuZCBPQ1NQX2lkX2dldDBfaW5mbygpCiAgICAgZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdC4gT0NTUF9yZXNwb25zZV9jcmVhdGUoKQogICAgIGNyZWF0ZXMgYSByZXNwb25zZSBhbmQgb3B0aW9uYWxseSBhZGRzIGEgYmFzaWMgcmVzcG9uc2Ugc3RydWN0dXJlLgogICAgIE9DU1BfYmFzaWNfYWRkMV9zdGF0dXMoKSBhZGRzIGEgY29tcGxldGUgc2luZ2xlIHJlc3BvbnNlIHRvIGEgYmFzaWMKICAgICByZXNwb25zZSBhbmQgcmV0dXJucyB0aGUgT0NTUF9TSU5HTEVSRVNQIHN0cnVjdHVyZSBqdXN0IGFkZGVkICh0byBhbGxvdwogICAgIGV4dGVuc2lvbnMgdG8gYmUgaW5jbHVkZWQgZm9yIGV4YW1wbGUpLiBPQ1NQX2Jhc2ljX2FkZDFfY2VydCgpIGFkZHMgYQogICAgIGNlcnRpZmljYXRlIHRvIGEgYmFzaWMgcmVzcG9uc2UgYW5kIE9DU1BfYmFzaWNfc2lnbigpIHNpZ25zIGEgYmFzaWMKICAgICByZXNwb25zZSB3aXRoIHZhcmlvdXMgZmxhZ3MuIE5ldyBoZWxwZXIgZnVuY3Rpb25zIEFTTjFfVElNRV9jaGVjaygpCiAgICAgKGNoZWNrcyB2YWxpZGl0eSBvZiBBU04xX1RJTUUgc3RydWN0dXJlKSBhbmQgQVNOMV9USU1FX3RvX2dlbmVyYWxpemVkdGltZSgpCiAgICAgKGNvbnZlcnRzIEFTTjFfVElNRSB0byBHZW5lcmFsaXplZFRpbWUpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgbmV3IGZ1bmN0aW9ucy4gRVZQX0RpZ2VzdCgpIGNvbWJpbmVzIEVWUF9EaWdlc3R7SW5pdCxVcGRhdGUsRmluYWx9KCkKICAgICBpbiBhIHNpbmdsZSBvcGVyYXRpb24uIFg1MDlfZ2V0MF9wdWJrZXlfYml0c3RyKCkgZXh0cmFjdHMgdGhlIHB1YmxpY19rZXkKICAgICBzdHJ1Y3R1cmUgZnJvbSBhIGNlcnRpZmljYXRlLiBYNTA5X3B1YmtleV9kaWdlc3QoKSBkaWdlc3RzIHRoZSBwdWJsaWNfa2V5CiAgICAgY29udGVudHM6IHRoaXMgaXMgdXNlZCBpbiB2YXJpb3VzIGtleSBpZGVudGlmaWVycy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBza19zb3J0KCkgdG9sZXJhdGUgYSBOVUxMIGFyZ3VtZW50LgogICAgIFtTdGV2ZSBIZW5zb24gcmVwb3J0ZWQgYnkgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyBPQ1NQIHZlcmlmeSBmbGFnIE9DU1BfVFJVU1RPVEhFUi4gV2hlbiBzZXQgdGhlICJvdGhlciIgY2VydGlmaWNhdGVzCiAgICAgcGFzc2VkIGJ5IHRoZSBmdW5jdGlvbiBhcmUgdHJ1c3RlZCBpbXBsaWNpdGx5LiBJZiBhbnkgb2YgdGhlbSBzaWduZWQgdGhlCiAgICAgcmVzcG9uc2UgdGhlbiBpdCBpcyBhc3N1bWVkIHRvIGJlIHZhbGlkIGFuZCBpcyBub3QgdmVyaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gUEtDUzdfc2V0X3R5cGUoKSBpbml0aWFsaXNlIGNvbnRlbnRfdHlwZSBpbiBQS0NTN19FTkNfQ09OVEVOVAogICAgIHRvIGRhdGEuIFRoaXMgd2FzIHByZXZpb3VzbHkgcGFydCBvZiB0aGUgUEtDUzcgQVNOMSBjb2RlLiBUaGlzCiAgICAgd2FzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCBPcGVuU1NMIGNyZWF0ZWQgUEtDUyMxMiBhbmQgUEtDUyM3IHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgS2VubmV0aCBSLiBSb2JpbmV0dGUKCQkJCTxzdXBwb3J0QHNlY3VyZW5ldHRlcm0uY29tPl0KCiAgKikgQWRkIENSWVBUT19wdXNoX2luZm8oKSBhbmQgQ1JZUFRPX3BvcF9pbmZvKCkgY2FsbHMgdG8gbmV3IEFTTjEKICAgICByb3V0aW5lczogd2l0aG91dCB0aGVzZSB0cmFjaW5nIG1lbW9yeSBsZWFrcyBpcyB2ZXJ5IHBhaW5mdWwuCiAgICAgRml4IGxlYWtzIGluIFBLQ1MxMiBhbmQgUEtDUzcgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBYNTA5X3RpbWVfYWRqKCkgY29wZSB3aXRoIHRoZSBuZXcgYmVoYXZpb3VyIG9mIEFTTjFfVElNRV9uZXcoKS4KICAgICBQcmV2aW91c2x5IGl0IGluaXRpYWxpc2VkIHRoZSAndHlwZScgYXJndW1lbnQgdG8gVl9BU04xX1VUQ1RJTUUgd2hpY2gKICAgICBlZmZlY3RpdmVseSBtZWFudCBHZW5lcmFsaXplZFRpbWUgd291bGQgbmV2ZXIgYmUgdXNlZC4gTm93IGl0CiAgICAgaXMgaW5pdGlhbGlzZWQgdG8gLTEgYnV0IFg1MDlfdGltZV9hZGooKSBub3cgaGFzIHRvIGNoZWNrIHRoZSB2YWx1ZQogICAgIGFuZCB1c2UgQVNOMV9USU1FX3NldCgpIGlmIHRoZSB2YWx1ZSBpcyBub3QgVl9BU04xX1VUQ1RJTUUgb3IKICAgICBWX0FTTjFfR0VORVJBTElaRURUSU1FLCB3aXRob3V0IHRoaXMgaXQgYWx3YXlzIHVzZXMgR2VuZXJhbGl6ZWRUaW1lLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEtlbm5ldGggUi4gUm9iaW5ldHRlCgkJCQk8c3VwcG9ydEBzZWN1cmVuZXR0ZXJtLmNvbT5dCgogICopIEZpeGVzIHRvIEJOX3RvX0FTTjFfSU5URUdFUiB3aGVuIGJuIGlzIHplcm8uIFRoaXMgd291bGQgcHJldmlvdXNseQogICAgIHJlc3VsdCBpbiBhIHplcm8gbGVuZ3RoIGluIHRoZSBBU04xX0lOVEVHRVIgc3RydWN0dXJlIHdoaWNoIHdhcwogICAgIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIHN0cnVjdHVyZSB3aGVuIGQyaV9BU04xX0lOVEVHRVIoKSB3YXMgdXNlZAogICAgIGFuZCB3b3VsZCBjYXVzZSBBU04xX0lOVEVHRVJfY21wKCkgdG8gZmFpbC4gRW5oYW5jZSBzMmlfQVNOMV9JTlRFR0VSKCkKICAgICB0byBjb3BlIHdpdGggaGV4IGFuZCBuZWdhdGl2ZSBpbnRlZ2Vycy4gRml4IGJ1ZyBpbiBpMmFfQVNOMV9JTlRFR0VSKCkKICAgICB3aGVyZSBpdCBkaWQgbm90IHByaW50IG91dCBhIG1pbnVzIGZvciBuZWdhdGl2ZSBBU04xX0lOVEVHRVIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1bW1hcnkgcHJpbnRvdXQgdG8gb2NzcCB1dGlsaXR5LiBUaGUgdmFyaW91cyBmdW5jdGlvbnMgd2hpY2gKICAgICBjb252ZXJ0IHN0YXR1cyB2YWx1ZXMgdG8gc3RyaW5ncyBoYXZlIGJlZW4gcmVuYW1lZCB0bzoKICAgICBPQ1NQX3Jlc3BvbnNlX3N0YXR1c19zdHIoKSwgT0NTUF9jZXJ0X3N0YXR1c19zdHIoKSBhbmQKICAgICBPQ1NQX2NybF9yZWFzb25fc3RyKCkgYW5kIGFyZSBubyBsb25nZXIgc3RhdGljLiBOZXcgb3B0aW9ucwogICAgIHRvIHZlcmlmeSBub25jZSB2YWx1ZXMgYW5kIHRvIGRpc2FibGUgdmVyaWZpY2F0aW9uLiBPQ1NQIHJlc3BvbnNlCiAgICAgcHJpbnRvdXQgZm9ybWF0IGNsZWFuZWQgdXAuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFkZGl0aW9uYWwgT0NTUCBjZXJ0aWZpY2F0ZSBjaGVja3MuIFRoZXNlIGFyZSB0aG9zZSBzcGVjaWZpZWQKICAgICBpbiBSRkMyNTYwLiBUaGlzIGNvbnNpc3RzIG9mIHR3byBzZXBhcmF0ZSBjaGVja3M6IHRoZSBDQSBvZiB0aGUKICAgICBjZXJ0aWZpY2F0ZSBiZWluZyBjaGVja2VkIG11c3QgZWl0aGVyIGJlIHRoZSBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZQogICAgIG9yIHRoZSBpc3N1ZXIgb2YgdGhlIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCiAgICAgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUgbXVzdCBjb250YWluIHRoZSBPQ1NQIHNpZ25pbmcgZXh0ZW5kZWQga2V5CiAgICAgdXNhZ2UuIFRoaXMgY2hlY2sgaXMgcGVyZm9ybWVkIGJ5IGF0dGVtcHRpbmcgdG8gbWF0Y2ggdGhlIE9DU1AKICAgICBzaWduZXIgb3IgdGhlIE9DU1Agc2lnbmVyIENBIHRvIHRoZSBpc3N1ZXJOYW1lSGFzaCBhbmQgaXNzdWVyS2V5SGFzaAogICAgIGluIHRoZSBPQ1NQX0NFUlRJRCBzdHJ1Y3R1cmVzIG9mIHRoZSByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIE9DU1AgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFkZGVkIHRvIE9DU1BfYmFzaWNfdmVyaWZ5KCkKICAgICBhbmQgcmVsYXRlZCByb3V0aW5lcy4gVGhpcyB1c2VzIHRoZSBzdGFuZGFyZCBPcGVuU1NMIGNlcnRpZmljYXRlCiAgICAgdmVyaWZ5IHJvdXRpbmVzIHRvIHBlcmZvcm0gaW5pdGlhbCBjaGVja3MgKGp1c3QgQ0EgdmFsaWRpdHkpIGFuZAogICAgIHRvIG9idGFpbiB0aGUgY2VydGlmaWNhdGUgY2hhaW4uIFRoZW4gYWRkaXRpb25hbCBjaGVja3Mgd2lsbCBiZQogICAgIHBlcmZvcm1lZCBvbiB0aGUgY2hhaW4uIEN1cnJlbnRseSB0aGUgcm9vdCBDQSBpcyBjaGVja2VkIHRvIHNlZQogICAgIGlmIGl0IGlzIGV4cGxpY2l0bHkgdHJ1c3RlZCBmb3IgT0NTUCBzaWduaW5nLiBUaGlzIGlzIHVzZWQgdG8gc2V0CiAgICAgYSByb290IENBIGFzIGEgZ2xvYmFsIHNpZ25pbmcgcm9vdDogdGhhdCBpcyBhbnkgY2VydGlmaWNhdGUgdGhhdAogICAgIGNoYWlucyB0byB0aGF0IENBIGlzIGFuIGFjY2VwdGFibGUgT0NTUCBzaWduaW5nIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAnLWV4dGZpbGUgLi4uJyBvcHRpb24gdG8gJ29wZW5zc2wgY2EnIGZvciByZWFkaW5nIFguNTA5djMKICAgICBleHRlbnNpb25zIGZyb20gYSBzZXBhcmF0ZSBjb25maWd1cmF0aW9uIGZpbGUuCiAgICAgQXMgd2hlbiByZWFkaW5nIGV4dGVuc2lvbnMgZnJvbSB0aGUgbWFpbiBjb25maWd1cmF0aW9uIGZpbGUsCiAgICAgdGhlICctZXh0ZW5zaW9ucyAuLi4nIG9wdGlvbiBtYXkgYmUgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUKICAgICBzZWN0aW9uIHRvIHVzZS4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyBPQ1NQIHV0aWxpdHkuIEFsbG93cyBPQ1NQIHJlcXVlc3RzIHRvIGJlIGdlbmVyYXRlZCBvcgogICAgIHJlYWQuIFRoZSByZXF1ZXN0IGNhbiBiZSBzZW50IHRvIGEgcmVzcG9uZGVyIGFuZCB0aGUgb3V0cHV0CiAgICAgcGFyc2VkLCBvdXRwdXRlZCBvciBwcmludGVkIGluIHRleHQgZm9ybS4gTm90IGNvbXBsZXRlIHlldDoKICAgICBzdGlsbCBuZWVkcyB0byBjaGVjayB0aGUgT0NTUCByZXNwb25zZSB2YWxpZGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgc3ViY29tbWFuZHMgZm9yICdvcGVuc3NsIGNhJzoKICAgICAnb3BlbnNzbCBjYSAtc3RhdHVzIDxzZXJpYWw+JyBwcmludHMgdGhlIHN0YXR1cyBvZiB0aGUgY2VydCB3aXRoCiAgICAgdGhlIGdpdmVuIHNlcmlhbCBudW1iZXIgKGFjY29yZGluZyB0byB0aGUgaW5kZXggZmlsZSkuCiAgICAgJ29wZW5zc2wgY2EgLXVwZGF0ZWRiJyB1cGRhdGVzIHRoZSBleHBpcnkgc3RhdHVzIG9mIGNlcnRpZmljYXRlcwogICAgIGluIHRoZSBpbmRleCBmaWxlLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pl0KCiAgKikgTmV3ICctbmV3cmVxLW5vZGVzJyBjb21tYW5kIG9wdGlvbiB0byBDQS5wbC4gIFRoaXMgaXMgbGlrZQogICAgICctbmV3cmVxJywgYnV0IGNhbGxzICdvcGVuc3NsIHJlcScgd2l0aCB0aGUgJy1ub2Rlcycgb3B0aW9uCiAgICAgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGtleSBpcyBub3QgZW5jcnlwdGVkLgogICAgIFtEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+XQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiBmb3IgdGhlIEdOVSBIdXJkLgogICAgIFtKb25hdGhhbiBCYXJ0bGV0dCA8am9obm55YkB3b2xmcmFtLmNvbT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW5pdGlhbCBjb2RlIHRvIGltcGxlbWVudCBPQ1NQIGJhc2ljIHJlc3BvbnNlIHZlcmlmeS4gVGhpcwogICAgIGlzIGN1cnJlbnRseSBpbmNvbXBsZXRlLiBDdXJyZW50bHkganVzdCBmaW5kcyB0aGUgc2lnbmVyJ3MKICAgICBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBvbiB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFNTTGVheV92ZXJzaW9uIGNvZGUgU1NMRUFZX0RJUiB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVkLWluCiAgICAgdmFsdWUgb2YgT1BFTlNTTERJUi4gIFRoaXMgaXMgYXZhaWxhYmxlIHZpYSB0aGUgbmV3ICctZCcgb3B0aW9uCiAgICAgdG8gJ29wZW5zc2wgdmVyc2lvbicsIGFuZCBpcyBhbHNvIGluY2x1ZGVkIGluICdvcGVuc3NsIHZlcnNpb24gLWEnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFsbG93aW5nIGRlZmluaW5nIG1lbW9yeSBhbGxvY2F0aW9uIGNhbGxiYWNrcyB0aGF0IHdpbGwgYmUgZ2l2ZW4KICAgICBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGluIGFkZGl0aW9uYWwgYXJndW1lbnRzCiAgICAgKGEgY29uc3QgY2hhciogYW5kIGFuIGludCkuICBUaGUgYmFzaWMgZnVuY3Rpb25hbGl0eSByZW1haW5zLCBhcwogICAgIHdlbGwgYXMgdGhlIG9yaWdpbmFsIHBvc3NpYmlsaXR5IHRvIGp1c3QgcmVwbGFjZSBtYWxsb2MoKSwKICAgICByZWFsbG9jKCkgYW5kIGZyZWUoKSBieSBmdW5jdGlvbnMgdGhhdCBkbyBub3Qga25vdyBhYm91dCB0aGVzZQogICAgIGFkZGl0aW9uYWwgYXJndW1lbnRzLiAgVG8gcmVnaXN0ZXIgYW5kIGZpbmQgb3V0IHRoZSBjdXJyZW50CiAgICAgc2V0dGluZ3MgZm9yIGV4dGVuZGVkIGFsbG9jYXRpb24gZnVuY3Rpb25zLCB0aGUgZm9sbG93aW5nCiAgICAgZnVuY3Rpb25zIGFyZSBwcm92aWRlZDoKCglDUllQVE9fc2V0X21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19zZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19nZXRfbWVtX2V4X2Z1bmN0aW9ucwoJQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucwoKICAgICBUaGVzZSB3b3JrIHRoZSBzYW1lIHdheSBhcyBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgYW5kIGZyaWVuZHMuCiAgICAgQ1JZUFRPX2dldF9bbG9ja2VkX11tZW1fZnVuY3Rpb25zIG5vdyB3cml0ZXMgMCB3aGVyZSBzdWNoIGFuCiAgICAgZXh0ZW5kZWQgYWxsb2NhdGlvbiBmdW5jdGlvbiBpcyBlbmFibGVkLgogICAgIFNpbWlsYXJseSwgQ1JZUFRPX2dldF9bbG9ja2VkX11tZW1fZXhfZnVuY3Rpb25zIHdyaXRlcyAwIHdoZXJlCiAgICAgYSBjb252ZW50aW9uYWwgYWxsb2NhdGlvbiBmdW5jdGlvbiBpcyBlbmFibGVkLgogICAgIFtSaWNoYXJkIExldml0dGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgRmluaXNoIG9mZiByZW1vdmluZyB0aGUgcmVtYWluaW5nIExIQVNIIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdHMuCiAgICAgVGhlcmUgc2hvdWxkIG5vIGxvbmdlciBiZSBhbnkgcHJvdG90eXBlLWNhc3RpbmcgcmVxdWlyZWQgd2hlbiB1c2luZwogICAgIHRoZSBMSEFTSCBhYnN0cmFjdGlvbiwgYW5kIGFueSBjYXN0cyB0aGF0IHJlbWFpbiBhcmUgImJ1Z3MiLiBTZWUKICAgICB0aGUgY2FsbGJhY2sgdHlwZXMgYW5kIG1hY3JvcyBhdCB0aGUgaGVhZCBvZiBsaGFzaC5oIGZvciBkZXRhaWxzCiAgICAgKGFuZCAiT0JKX2NsZWFudXAiIGluIGNyeXB0by9vYmplY3RzL29ial9kYXQuYyBhcyBhbiBleGFtcGxlKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYXV0b21hdGljIHF1ZXJ5IG9mIEVHRCBzb2NrZXRzIGluIFJBTkRfcG9sbCgpIGZvciB0aGUgdW5peCB2YXJpYW50LgogICAgIElmIC9kZXYvW3VdcmFuZG9tIGRldmljZXMgYXJlIG5vdCBhdmFpbGFibGUgb3IgZG8gbm90IHJldHVybiBlbm91Z2gKICAgICBlbnRyb3B5LCBFR0Qgc3R5bGUgc29ja2V0cyAoc2VydmVkIGJ5IEVHRCBvciBQUk5HRCkgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgYmUgcXVlcmllZC4KICAgICBUaGUgbG9jYXRpb25zIC92YXIvcnVuL2VnZC1wb29sLCAvZGV2L2VnZC1wb29sLCAvZXRjL2VnZC1wb29sLCBhbmQKICAgICAvZXRjL2VudHJvcHkgd2lsbCBiZSBxdWVyaWVkIG9uY2UgZWFjaCBpbiB0aGlzIHNlcXVlbmNlLCBxdWVyaW5nIHN0b3BzCiAgICAgd2hlbiBlbm91Z2ggZW50cm9weSB3YXMgY29sbGVjdGVkIHdpdGhvdXQgcXVlcnlpbmcgbW9yZSBzb2NrZXRzLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBDaGFuZ2UgdGhlIFVuaXggUkFORF9wb2xsKCkgdmFyaWFudCB0byBiZSBhYmxlIHRvIHBvbGwgc2V2ZXJhbAogICAgIHJhbmRvbSBkZXZpY2VzLCBhcyBzcGVjaWZpZWQgYnkgREVWUkFORE9NLCB1bnRpbCBhIHN1ZmZpY2llbnQgYW1vdW50CiAgICAgb2YgZGF0YSBoYXMgYmVlbiBjb2xsZWN0ZWQuICAgV2Ugc3BlbmQgYXQgbW9zdCAxMCBtcyBvbiBlYWNoIGZpbGUKICAgICAoc2VsZWN0IHRpbWVvdXQpIGFuZCByZWFkIGluIG5vbi1ibG9ja2luZyBtb2RlLiAgREVWUkFORE9NIG5vdwogICAgIGRlZmF1bHRzIHRvIHRoZSBsaXN0ICIvZGV2L3VyYW5kb20iLCAiL2Rldi9yYW5kb20iLCAiL2Rldi9zcmFuZG9tIgogICAgIChwcmV2aW91c2x5IGl0IHdhcyBqdXN0IHRoZSBzdHJpbmcgIi9kZXYvdXJhbmRvbSIpLCBzbyBvbiB0eXBpY2FsCiAgICAgcGxhdGZvcm1zIHRoZSAxMCBtcyBkZWxheSB3aWxsIG5ldmVyIG9jY3VyLgogICAgIEFsc28gc2VwYXJhdGUgb3V0IHRoZSBVbml4IHZhcmlhbnQgdG8gaXRzIG93biBmaWxlLCByYW5kX3VuaXguYy4KICAgICBGb3IgVk1TLCB0aGVyZSdzIGEgY3VycmVudGx5LWVtcHR5IHJhbmRfdm1zLmMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTW92ZSBPQ1NQIGNsaWVudCByZWxhdGVkIHJvdXRpbmVzIHRvIG9jc3BfY2wuYy4gVGhlc2UKICAgICBwcm92aWRlIHV0aWxpdHkgZnVuY3Rpb25zIHdoaWNoIGFuIGFwcGxpY2F0aW9uIG5lZWRpbmcKICAgICB0byBpc3N1ZSBhIHJlcXVlc3QgdG8gYW4gT0NTUCByZXNwb25kZXIgYW5kIGFuYWx5c2UgdGhlCiAgICAgcmVzcG9uc2Ugd2lsbCB0eXBpY2FsbHkgbmVlZDogYXMgb3Bwb3NlZCB0byB0aG9zZSB3aGljaCBhbgogICAgIE9DU1AgcmVzcG9uZGVyIGl0c2VsZiB3b3VsZCBuZWVkIHdoaWNoIHdpbGwgYmUgYWRkZWQgbGF0ZXIuCgogICAgIE9DU1BfcmVxdWVzdF9zaWduKCkgc2lnbnMgYW4gT0NTUCByZXF1ZXN0IHdpdGggYW4gQVBJIHNpbWlsYXIKICAgICB0byBQS0NTN19zaWduKCkuIE9DU1BfcmVzcG9uc2Vfc3RhdHVzKCkgcmV0dXJucyBzdGF0dXMgb2YgT0NTUAogICAgIHJlc3BvbnNlLiBPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMoKSBleHRyYWN0cyBiYXNpYyByZXNwb25zZQogICAgIGZyb20gcmVzcG9uc2UuIE9DU1BfcmVzcF9maW5kX3N0YXR1cygpOiBmaW5kcyBhbmQgZXh0cmFjdHMgc3RhdHVzCiAgICAgaW5mb3JtYXRpb24gZnJvbSBhbiBPQ1NQX0NFUlRJRCBzdHJ1Y3R1cmUgKHdoaWNoIHdpbGwgYmUgY3JlYXRlZAogICAgIHdoZW4gdGhlIHJlcXVlc3Qgc3RydWN0dXJlIGlzIGJ1aWx0KS4gVGhlc2UgYXJlIGJ1aWx0IGZyb20gbG93ZXIKICAgICBsZXZlbCBmdW5jdGlvbnMgd2hpY2ggd29yayBvbiBPQ1NQX1NJTkdMRVJFU1Agc3RydWN0dXJlcyBidXQKICAgICB3b250IG5vcm1hbGx5IGJlIHVzZWQgdW5sZXNzIHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgdG8gZXhhbWluZQogICAgIGV4dGVuc2lvbnMgaW4gdGhlIE9DU1AgcmVzcG9uc2UgZm9yIGV4YW1wbGUuCgogICAgIFJlcGxhY2Ugbm9uY2Ugcm91dGluZXMgd2l0aCBhIHBhaXIgb2YgZnVuY3Rpb25zLgogICAgIE9DU1BfcmVxdWVzdF9hZGQxX25vbmNlKCkgYWRkcyBhIG5vbmNlIHZhbHVlIGFuZCBvcHRpb25hbGx5CiAgICAgZ2VuZXJhdGVzIGEgcmFuZG9tIHZhbHVlLiBPQ1NQX2NoZWNrX25vbmNlKCkgY2hlY2tzIHRoZQogICAgIHZhbGlkaXR5IG9mIHRoZSBub25jZSBpbiBhbiBPQ1NQIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBmdW5jdGlvbiBPQ1NQX3JlcXVlc3RfYWRkKCkgdG8gT0NTUF9yZXF1ZXN0X2FkZDBfaWQoKS4KICAgICBUaGlzIGRvZXNuJ3QgY29weSB0aGUgc3VwcGxpZWQgT0NTUF9DRVJUSUQgYW5kIGF2b2lkcyB0aGUKICAgICBuZWVkIHRvIGZyZWUgdXAgdGhlIG5ld2x5IGNyZWF0ZWQgaWQuIENoYW5nZSByZXR1cm4gdHlwZQogICAgIHRvIE9DU1BfT05FUkVRIHRvIHJldHVybiB0aGUgaW50ZXJuYWwgT0NTUF9PTkVSRVEgc3RydWN0dXJlLgogICAgIFRoaXMgY2FuIHRoZW4gYmUgdXNlZCB0byBhZGQgZXh0ZW5zaW9ucyB0byB0aGUgcmVxdWVzdC4KICAgICBEZWxldGVkIE9DU1BfcmVxdWVzdF9uZXcoKSwgc2luY2UgbW9zdCBvZiBpdHMgZnVuY3Rpb25hbGl0eQogICAgIGlzIG5vdyBpbiBPQ1NQX1JFUVVFU1RfbmV3KCkgKGFuZCB0aGUgY2FzZSBpbnNlbnNpdGl2ZSBuYW1lCiAgICAgY2xhc2gpIGFwYXJ0IGZyb20gdGhlIGFiaWxpdHkgdG8gc2V0IHRoZSByZXF1ZXN0IG5hbWUgd2hpY2gKICAgICB3aWxsIGJlIGFkZGVkIGVsc2V3aGVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgT0NTUCBBUEkuIFJlbW92ZSBvYnNvbGV0ZSBleHRlbnNpb25zIGFyZ3VtZW50IGZyb20KICAgICB2YXJpb3VzIGZ1bmN0aW9ucy4gRXh0ZW5zaW9ucyBhcmUgbm93IGhhbmRsZWQgdXNpbmcgdGhlIG5ldwogICAgIE9DU1AgZXh0ZW5zaW9uIGNvZGUuIE5ldyBzaW1wbGUgT0NTUCBIVFRQIGZ1bmN0aW9uIHdoaWNoIAogICAgIGNhbiBiZSB1c2VkIHRvIHNlbmQgcmVxdWVzdHMgYW5kIHBhcnNlIHRoZSByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIFBLQ1MjNyAoUy9NSU1FKSBjb2RlIHRvIHdvcmsgd2l0aCBuZXcgQVNOMS4gVHdvIG5ldwogICAgIEFTTjFfSVRFTSBzdHJ1Y3R1cmVzIGhlbHAgd2l0aCBzaWduIGFuZCB2ZXJpZnkuIFBLQ1M3X0FUVFJfU0lHTgogICAgIHVzZXMgdGhlIHNwZWNpYWwgcmVvcmRlciB2ZXJzaW9uIG9mIFNFVCBPRiB0byBzb3J0IHRoZSBhdHRyaWJ1dGVzCiAgICAgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaCB0aGUgZW5jb2RlZCBvcmRlci4gVGhpcyByZXNvbHZlcyBhIGxvbmcKICAgICBzdGFuZGluZyBwcm9ibGVtOiBhIHZlcmlmeSBvbiBhIFBLQ1M3IHN0cnVjdHVyZSBqdXN0IGFmdGVyIHNpZ25pbmcKICAgICBpdCB1c2VkIHRvIGZhaWwgYmVjYXVzZSB0aGUgYXR0cmlidXRlIG9yZGVyIGRpZCBub3QgbWF0Y2ggdGhlCiAgICAgZW5jb2RlZCBvcmRlci4gUEtDUzdfQVRUUl9WRVJJRlkgZG9lcyBub3QgcmVvcmRlciB0aGUgYXR0cmlidXRlczoKICAgICBpdCB1c2VzIHRoZSByZWNlaXZlZCBvcmRlci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gdG9sZXJhdGUgc29tZSBicm9rZW4KICAgICBzb2Z0d2FyZSB0aGF0IGRvZXMgbm90IG9yZGVyIFNFVCBPRi4gVGhpcyBpcyBoYW5kbGVkIGJ5IGVuY29kaW5nCiAgICAgYXMgYSBTRVFVRU5DRSBPRiBidXQgdXNpbmcgaW1wbGljaXQgdGFnZ2luZyAod2l0aCBVTklWRVJTQUwgY2xhc3MpCiAgICAgdG8gcHJvZHVjZSB0aGUgcmVxdWlyZWQgU0VUIE9GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhhdmUgbWsxbWYucGwgZ2VuZXJhdGUgdGhlIG1hY3JvcyBPUEVOU1NMX0JVSUxEX1NITElCQ1JZUFRPIGFuZAogICAgIE9QRU5TU0xfQlVJTERfU0hMSUJTU0wgYW5kIHVzZSB0aGVtIGFwcHJvcHJpYXRlbHkgaW4gdGhlIGhlYWRlcgogICAgIGZpbGVzIHRvIGdldCBjb3JyZWN0IGRlY2xhcmF0aW9ucyBvZiB0aGUgQVNOLjEgaXRlbSB2YXJpYWJsZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3cml0ZSBvZiBQS0NTIzEyIGNvZGUgdG8gdXNlIG5ldyBBU04xIGZ1bmN0aW9uYWxpdHkuIFJlcGxhY2UgbWFueQogICAgIFBLQ1MjMTIgbWFjcm9zIHdpdGggcmVhbCBmdW5jdGlvbnMuIEZpeCB0d28gdW5yZWxhdGVkIEFTTjEgYnVnczoKICAgICBhc24xX2NoZWNrX3RsZW4oKSB3b3VsZCBzb21ldGltZXMgYXR0ZW1wdCB0byB1c2UgJ2N0eCcgd2hlbiBpdCB3YXMKICAgICBOVUxMIGFuZCBBU04xX1RZUEUgd2FzIG5vdCBkZXJlZmVyZW5jZWQgcHJvcGVybHkgaW4gYXNuMV9leF9jMmkoKS4KICAgICBOZXcgQVNOMSBtYWNybzogREVDTEFSRV9BU04xX0lURU0oKSB3aGljaCBqdXN0IGRlY2xhcmVzIHRoZSByZWxldmFudAogICAgIEFTTjFfSVRFTSBhbmQgbm8gd3JhcHBlciBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBvciBBU04xX2l0ZW1fZDJpX2ZwKCkgYW5kIEFTTjFfaXRlbV9kMmlfYmlvKCkuIFRoZXNlCiAgICAgcmVwbGFjZSB0aGUgb2xkIGZ1bmN0aW9uIHBvaW50ZXIgYmFzZWQgSS9PIHJvdXRpbmVzLiBDaGFuZ2UgbW9zdCBvZgogICAgIHRoZSAqX2QyaV9iaW8oKSBhbmQgKl9kMmlfZnAoKSBmdW5jdGlvbnMgdG8gdXNlIHRoZXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgbWtkZWYucGwgdG8gYmUgbW9yZSBhY2NlcHRpbmcgYWJvdXQgc3BhY2luZyBpbiBDIHByZXByb2Nlc3NvcgogICAgIGxpbmVzLCByZWNvZ25pY2UgbW9yZSAiYWxnb3JpdGhtcyIgdGhhdCBjYW4gYmUgZGVzZWxlY3RlZCwgYW5kIG1ha2UKICAgICBpdCBjb21wbGFpbiBhYm91dCBhbGdvcml0aG0gZGVzZWxlY3Rpb24gdGhhdCBpc24ndCByZWNvZ25pc2VkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBBU04xIGZ1bmN0aW9ucyB0byBoYW5kbGUgZHVwLCBzaWduLCB2ZXJpZnksIGRpZ2VzdCwgcGFjayBhbmQKICAgICB1bnBhY2sgb3BlcmF0aW9ucyBpbiB0ZXJtcyBvZiBBU04xX0lURU0uIE1vZGlmeSBleGlzdGluZyB3cmFwcGVycwogICAgIHRvIHVzZSBuZXcgZnVuY3Rpb25zLiBBZGQgTk9fQVNOMV9PTEQgd2hpY2ggY2FuIGJlIHNldCB0byByZW1vdmUKICAgICBzb21lIG9sZCBzdHlsZSBBU04xIGZ1bmN0aW9uczogdGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgb2xkCiAgICAgY29kZSB3aWxsIHN0aWxsIHdvcmsgd2hlbiB0aGVzZSBldmVudHVhbGx5IGdvIGF3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGV4dGVuc2lvbiBmdW5jdGlvbnMgZm9yIE9DU1Agc3RydWN0dXJlcywgdGhlc2UgZm9sbG93IHRoZQogICAgIHNhbWUgY29udmVudGlvbnMgYXMgY2VydGlmaWNhdGVzIGFuZCBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5VjNfYWRkMV9pMmQoKS4gVGhpcyBhdXRvbWF0aWNhbGx5IGVuY29kZXMgYW5kCiAgICAgYWRkcyBhbiBleHRlbnNpb24uIEl0cyBiZWhhdmlvdXIgY2FuIGJlIGN1c3RvbWlzZWQgd2l0aCB2YXJpb3VzCiAgICAgZmxhZ3MgdG8gYXBwZW5kLCByZXBsYWNlIG9yIGRlbGV0ZS4gVmFyaW91cyB3cmFwcGVycyBhZGRlZCBmb3IKICAgICBjZXJ0aWZjYXRlcyBhbmQgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdG8gYXZvaWQgY2FsbGluZyB0aGUgdW5kZXJseWluZyBBU04xIHByaW50IHJvdXRpbmUgd2hlbgogICAgIGFuIGV4dGVuc2lvbiBjYW5ub3QgYmUgcGFyc2VkLiBDb3JyZWN0IGEgdHlwbyBpbiB0aGUKICAgICBPQ1NQX1NFUlZJQ0VMT0MgZXh0ZW5zaW9uLiBUaWR5IHVwIHByaW50IE9DU1AgZm9ybWF0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgbWtkZWYucGwgcGFyc2Ugc29tZSBvZiB0aGUgQVNOMSBtYWNyb3MgYW5kIGFkZCBhcHJvcHJpYXRlCiAgICAgZW50cmllcyBmb3IgdmFyaWFibGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbmFsaXR5IHRvIGFwcHMvb3BlbnNzbC5jIGZvciBkZXRlY3RpbmcgbG9ja2luZwogICAgIHByb2JsZW1zOiBBcyB0aGUgcHJvZ3JhbSBpcyBzaW5nbGUtdGhyZWFkZWQsIGFsbCB3ZSBoYXZlCiAgICAgdG8gZG8gaXMgcmVnaXN0ZXIgYSBsb2NraW5nIGNhbGxiYWNrIHVzaW5nIGFuIGFycmF5IGZvcgogICAgIHN0b3Jpbmcgd2hpY2ggbG9ja3MgYXJlIGN1cnJlbnRseSBoZWxkIGJ5IHRoZSBwcm9ncmFtLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBhIGxvY2sgYXJvdW5kIHRoZSBjYWxsIHRvIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KCkgaW4KICAgICBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9pZHgoKSwgd2hpY2ggaXMgdXNlZCBpbgogICAgIHNzbF92ZXJpZnlfY2VydF9jaGFpbigpIGFuZCB0aHVzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUKICAgICBkdXJpbmcgVExTL1NTTCBoYW5kc2hha2VzIHNvIHRoYXQgdGhyZWFkLXNhZmV0eSBpcyBlc3NlbnRpYWwuCiAgICAgVW5mb3J0dW5hdGVseSwgdGhlIGV4X2RhdGEgZGVzaWduIGlzIG5vdCBhdCBhbGwgc3VpdGVkCiAgICAgZm9yIG11bHRpLXRocmVhZGVkIHVzZSwgc28gaXQgcHJvYmFibHkgc2hvdWxkIGJlIGFib2xpc2hlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRlZCBCcm9hZGNvbSAidWJzZWMiIEVOR0lORSB0byBPcGVuU1NMLgogICAgIFtCcm9hZGNvbSwgdHdlYWtlZCBhbmQgaW50ZWdyYXRlZCBieSBHZW9mZiBUaG9ycGVdCgogICopIE1vdmUgY29tbW9uIGV4dGVuc2lvbiBwcmludGluZyBjb2RlIHRvIG5ldyBmdW5jdGlvbgogICAgIFg1MDlWM19wcmludF9leHRlbnNpb25zKCkuIFJlb3JnYW5pc2UgT0NTUCBwcmludCByb3V0aW5lcyBhbmQKICAgICBpbXBsZW1lbnQgc29tZSBuZWVkZWQgT0NTUCBBU04xIGZ1bmN0aW9ucy4gQWRkIE9DU1AgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9zaWduYXR1cmVfcHJpbnQoKSB0byByZW1vdmUgZHVwbGljYXRpb24gaW4gc29tZQogICAgIHByaW50IHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHNwZWNpYWwgbWVhbmluZyB3aGVuIFNFVCBPRiBhbmQgU0VRVUVOQ0UgT0YgZmxhZ3MgYXJlIGJvdGgKICAgICBzZXQgKHRoaXMgd2FzIHRyZWF0ZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBTRVQgT0YgcHJldmlvdXNseSkuIFRoaXMKICAgICBpcyB1c2VkIHRvIHJlb3JkZXIgdGhlIFNUQUNLIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIHRvIG1hdGNoIHRoZQogICAgIGVuY29kaW5nLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBnZXQgcm91bmQgYSBwcm9ibGVtIHdoZXJlIGEgUEtDUzcKICAgICBzdHJ1Y3R1cmUgd2hpY2ggd2FzIHNpZ25lZCBjb3VsZCBub3QgYmUgdmVyaWZpZWQgYmVjYXVzZSB0aGUgU1RBQ0sKICAgICBvcmRlciBkaWQgbm90IHJlZmxlY3QgdGhlIGVuY29kZWQgb3JkZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVpbXBsZW1lbnQgdGhlIE9DU1AgQVNOMSBtb2R1bGUgdXNpbmcgdGhlIG5ldyBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSB0aGUgWDUwOVYzIGNvZGUgdG8gcGVybWl0IHRoZSB1c2Ugb2YgYW4gQVNOMV9JVEVNIHN0cnVjdHVyZQogICAgIGZvciBpdHMgQVNOMSBvcGVyYXRpb25zLiBUaGUgb2xkIHN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIHN0aWxsIGV4aXN0CiAgICAgZm9yIG5vdyBidXQgdGhleSB3aWxsIGV2ZW50dWFsbHkgZ28gYXdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZSBpbiByZXBsYWNlbWVudCBBU04xIGNvZGUgZnJvbSB0aGUgQVNOMSBicmFuY2guIFRoaXMgYWxtb3N0CiAgICAgY29tcGxldGVseSByZXBsYWNlcyB0aGUgb2xkIEFTTjEgZnVuY3Rpb25hbGl0eSB3aXRoIGEgdGFibGUgZHJpdmVuCiAgICAgZW5jb2RlciBhbmQgZGVjb2RlciB3aGljaCBpbnRlcnByZXRzIGFuIEFTTjFfSVRFTSBzdHJ1Y3R1cmUgZGVzY3JpYmluZwogICAgIHRoZSBBU04xIG1vZHVsZS4gQ29tcGF0aWJpbGl0eSB3aXRoIHRoZSBleGlzdGluZyBBU04xIEFQSSAoaTJkLGQyaSkgaXMKICAgICBsYXJnZWx5IG1haW50YWluZWQuIEFsbW9zdCBhbGwgb2YgdGhlIG9sZCBhc24xX21hYy5oIG1hY3JvIGJhc2VkIEFTTjEKICAgICBoYXMgYWxzbyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIEJOX21vZF9leHBfcmVjcCBzbyB0aGF0IG5lZ2F0aXZlIG1vZHVsaSBhcmUgdG9sZXJhdGVkCiAgICAgKHRoZSBzaWduIGlzIGlnbm9yZWQpLiAgU2ltaWxhcmx5LCBpZ25vcmUgdGhlIHNpZ24gaW4gQk5fTU9OVF9DVFhfc2V0CiAgICAgc28gdGhhdCBCTl9tb2RfZXhwX21vbnQgYW5kIEJOX21vZF9leHBfbW9udF93b3JkIHdvcmsKICAgICBmb3IgbmVnYXRpdmUgbW9kdWxpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl91YWRkIGFuZCBCTl91c3ViOiBBbHdheXMgcmV0dXJuIG5vbi1uZWdhdGl2ZSByZXN1bHRzIGluc3RlYWQKICAgICBvZiBub3QgdG91Y2hpbmcgdGhlIHJlc3VsdCdzIHNpZ24gYml0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJOX2RpdiBidWdmaXg6IElmIHRoZSByZXN1bHQgaXMgMCwgdGhlIHNpZ24gKHJlcy0+bmVnKSBtdXN0IG5vdCBiZQogICAgIHNldC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2VkIHRoZSBMSEFTSCBjb2RlIHRvIHVzZSBwcm90b3R5cGVzIGZvciBjYWxsYmFja3MsIGFuZCBjcmVhdGVkCiAgICAgbWFjcm9zIHRvIGRlY2xhcmUgYW5kIGltcGxlbWVudCB0aGluIChvcHRpb25hbGx5IHN0YXRpYykgZnVuY3Rpb25zCiAgICAgdGhhdCBwcm92aWRlIHR5cGUtc2FmZXR5IGFuZCBhdm9pZCBmdW5jdGlvbiBwb2ludGVyIGNhc3RpbmcgZm9yIHRoZQogICAgIHR5cGUtc3BlY2lmaWMgY2FsbGJhY2tzLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZGVkIEtlcmJlcm9zIENpcGhlciBTdWl0ZXMgdG8gYmUgdXNlZCB3aXRoIFRMUywgYXMgd3JpdHRlbiBpbgogICAgIFJGQyAyNzEyLgogICAgIFtWZWVycyBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiwKICAgICAgSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1PiwgdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVmb3JtYXQgdGhlIEZBUSBzbyB0aGUgZGlmZmVyZW50IHF1ZXN0aW9ucyBhbmQgYW5zd2VycyBjYW4gYmUgZGl2aWRlZAogICAgIGluIHNlY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgc3ViamVjdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBIYXZlIHRoZSB6bGliIGNvbXByZXNzaW9uIGNvZGUgbG9hZCBaTElCLkRMTCBkeW5hbWljYWxseSB1bmRlcgogICAgIFdpbmRvd3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX21vZF9zcXJ0IGZvciBjb21wdXRpbmcgc3F1YXJlIHJvb3RzIG1vZHVsbyBhIHByaW1lCiAgICAgKHVzaW5nIHRoZSBwcm9iYWJpbGlzdGljIFRvbmVsbGktU2hhbmtzIGFsZ29yaXRobSB1bmxlc3MKICAgICBwID09IDMgKG1vZCA0KSAgb3IgIHAgPT0gNSAobW9kIDgpLCAgd2hpY2ggYXJlIGNhc2VzIHRoYXQgY2FuCiAgICAgYmUgaGFuZGxlZCBkZXRlcm1pbmlzdGljYWxseSkuCiAgICAgW0xlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+LCBCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgQk5fbW9kX2ludmVyc2UgZmFzdGVyIGJ5IGV4cGxpY2l0bHkgaGFuZGxpbmcgc21hbGwgcXVvdGllbnRzCiAgICAgaW4gdGhlIEV1Y2xpZCBsb29wLiAoU3BlZWQgZ2FpbiBhYm91dCAyMCUgZm9yIHNtYWxsIG1vZHVsaSBbMjU2IG9yCiAgICAgNTEyIGJpdHNdLCBhYm91dCAzMCUgZm9yIGxhcmdlciBvbmVzIFsxMDI0IG9yIDIwNDggYml0c10uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9rcm9uZWNrZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX2djZCBzbyB0aGF0IGl0IHdvcmtzIG9uIG5lZ2F0aXZlIGlucHV0czsgdGhlIHJlc3VsdCBpcwogICAgIHBvc2l0aXZlIHVubGVzcyBib3RoIHBhcmFtZXRlcnMgYXJlIHplcm8uCiAgICAgUHJldmlvdXNseSBzb21ldGhpbmcgcmVhc29uYWJseSBjbG9zZSB0byBhbiBpbmZpbml0ZSBsb29wIHdhcwogICAgIHBvc3NpYmxlIGJlY2F1c2UgbnVtYmVycyBjb3VsZCBiZSBncm93aW5nIGluc3RlYWQgb2Ygc2hyaW5raW5nCiAgICAgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIEV1Y2xpZCdzIGFsZ29yaXRobS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5faXNfd29yZCgpIGFuZCBCTl9pc19vbmUoKSBtYWNyb3MgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlCiAgICAgc2lnbiBvZiB0aGUgbnVtYmVyIGluIHF1ZXN0aW9uLgoKICAgICBGaXggQk5faXNfd29yZChhLHcpIHRvIHdvcmsgY29ycmVjdGx5IGZvciB3ID09IDAuCgogICAgIFRoZSBvbGQgQk5faXNfd29yZChhLHcpIG1hY3JvIGlzIG5vdyBjYWxsZWQgQk5fYWJzX2lzX3dvcmQoYSx3KQogICAgIGJlY2F1c2UgaXRzIHRlc3QgaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mICdhJyBlcXVhbHMgJ3cnLgogICAgIE5vdGUgdGhhdCBCTl9hYnNfaXNfd29yZCBkb2VzICpub3QqIGhhbmRsZSB3ID09IDAgcmVsaWFibHk7CiAgICAgaXQgZXhpc3RzIG1vc3RseSBmb3IgdXNlIGluIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgQk5faXNfemVybygpLAogICAgIEJOX2lzX29uZSgpLCBhbmQgQk5faXNfd29yZCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9zd2FwLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBCTl9ubm1vZCBpbnN0ZWFkIG9mIEJOX21vZCBpbiBjcnlwdG8vYm4vYm5fZXhwLmMgc28gdGhhdAogICAgIHRoZSBleHBvbmVudGlhdGlvbiBmdW5jdGlvbnMgYXJlIG1vcmUgbGlrZWx5IHRvIHByb2R1Y2UgcmVhc29uYWJsZQogICAgIHJlc3VsdHMgb24gbmVnYXRpdmUgaW5wdXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBCTl9tb2RfbXVsIHNvIHRoYXQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbm9uLW5lZ2F0aXZlLgogICAgIFByZXZpb3VzbHksIGl0IGNvdWxkIGJlIG5lZ2F0aXZlIGlmIG9uZSBvZiB0aGUgZmFjdG9ycyB3YXMgbmVnYXRpdmU7CiAgICAgSSBkb24ndCB0aGluayBhbnlvbmUgcmVhbGx5IHdhbnRlZCB0aGF0IGJlaGF2aW91ci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb3ZlIEJOX21vZF8uLi4gZnVuY3Rpb25zIGludG8gbmV3IGZpbGUgY3J5cHRvL2JuL2JuX21vZC5jCiAgICAgKGV4Y2VwdCBmb3IgZXhwb25lbnRpYXRpb24sIHdoaWNoIHN0YXlzIGluIGNyeXB0by9ibi9ibl9leHAuYywKICAgICBhbmQgQk5fbW9kX211bF9yZWNpcHJvY2FsLCB3aGljaCBzdGF5cyBpbiBjcnlwdG8vYm4vYm5fcmVjcC5jKQogICAgIGFuZCBhZGQgbmV3IGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9ubm1vZAogICAgICAgICAgQk5fbW9kX3NxcgogICAgICAgICAgQk5fbW9kX2FkZAogICAgICAgICAgQk5fbW9kX2FkZF9xdWljawogICAgICAgICAgQk5fbW9kX3N1YgogICAgICAgICAgQk5fbW9kX3N1Yl9xdWljawogICAgICAgICAgQk5fbW9kX2xzaGlmdDEKICAgICAgICAgIEJOX21vZF9sc2hpZnQxX3F1aWNrCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0CiAgICAgICAgICBCTl9tb2RfbHNoaWZ0X3F1aWNrCgogICAgIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgZ2VuZXJhdGUgbm9uLW5lZ2F0aXZlIHJlc3VsdHMuCgogICAgIEJOX25ubW9kIG90aGVyd2lzZSBpcyBsaWtlIEJOX21vZCAoaWYgQk5fbW9kIGNvbXB1dGVzIGEgcmVtYWluZGVyICByCiAgICAgc3VjaCB0aGF0ICB8bXwgPCByIDwgMCwgIEJOX25ubW9kIHdpbGwgb3V0cHV0ICByZW0gKyB8bXwgIGluc3RlYWQpLgoKICAgICBCTl9tb2RfWFhYX3F1aWNrKHIsIGEsIFtiLF0gbSkgZ2VuZXJhdGVzIHRoZSBzYW1lIHJlc3VsdCBhcwogICAgIEJOX21vZF9YWFgociwgYSwgW2IsXSBtLCBjdHgpLCBidXQgcmVxdWlyZXMgdGhhdCAgYSAgW2FuZCAgYl0KICAgICBiZSByZWR1Y2VkIG1vZHVsbyAgbS4KICAgICBbTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT4sIEJvZG8gTW9lbGxlcl0KCiNpZiAwCiAgICAgVGhlIGZvbGxvd2luZyBlbnRyeSBhY2NpZGVudGlseSBhcHBlYXJlZCBpbiB0aGUgQ0hBTkdFUyBmaWxlCiAgICAgZGlzdHJpYnV0ZWQgd2l0aCBPcGVuU1NMIDAuOS43LiAgVGhlIG1vZGlmaWNhdGlvbnMgZGVzY3JpYmVkIGluCiAgICAgaXQgZG8gKm5vdCogYXBwbHkgdG8gT3BlblNTTCAwLjkuNy4KCiAgKikgUmVtb3ZlIGEgZmV3IGNhbGxzIHRvIGJuX3dleHBhbmQoKSBpbiBCTl9zcXIoKSAodGhlIG9uZSBpbiB0aGVyZQogICAgIHdhcyBhY3R1YWxseSBuZXZlciBuZWVkZWQpIGFuZCBpbiBCTl9tdWwoKS4gIFRoZSByZW1vdmFsIGluIEJOX211bCgpCiAgICAgcmVxdWlyZWQgYSBzbWFsbCBjaGFuZ2UgaW4gYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCkgYW5kIHRoZSBhZGRpdGlvbgogICAgIG9mIHRoZSBmdW5jdGlvbnMgYm5fY21wX3BhcnRfd29yZHMoKSwgYm5fc3ViX3BhcnRfd29yZHMoKSBhbmQKICAgICBibl9hZGRfcGFydF93b3JkcygpLCB3aGljaCBkbyB0aGUgc2FtZSB0aGluZyBhcyBibl9jbXBfd29yZHMoKSwKICAgICBibl9zdWJfd29yZHMoKSBhbmQgYm5fYWRkX3dvcmRzKCkgZXhjZXB0IHRoZXkgdGFrZSBhcnJheXMgd2l0aAogICAgIGRpZmZlcmluZyBzaXplcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQojZW5kaWYKCiAgKikgSW4gJ29wZW5zc2wgcGFzc3dkJywgdmVyaWZ5IHBhc3N3b3JkcyByZWFkIGZyb20gdGhlIHRlcm1pbmFsCiAgICAgdW5sZXNzIHRoZSAnLXNhbHQnIG9wdGlvbiBpcyB1c2VkICh3aGljaCB1c3VhbGx5IG1lYW5zIHRoYXQKICAgICB2ZXJpZmljYXRpb24gd291bGQganVzdCB3YXN0ZSB1c2VyJ3MgdGltZSBzaW5jZSB0aGUgcmVzdWx0aW5nCiAgICAgaGFzaCBpcyBnb2luZyB0byBiZSBjb21wYXJlZCB3aXRoIHNvbWUgZ2l2ZW4gcGFzc3dvcmQgaGFzaCkKICAgICBvciB0aGUgbmV3ICctbm92ZXJpZnknIG9wdGlvbiBpcyB1c2VkLgoKICAgICBUaGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBpdCBkb2VzIG5vdCBhZmZlY3QKICAgICBub24taW50ZXJhY3RpdmUgdXNlIG9mICdvcGVuc3NsIHBhc3N3ZCcgKHBhc3N3b3JkcyBvbiB0aGUgY29tbWFuZAogICAgIGxpbmUsICctc3RkaW4nIG9wdGlvbiwgJy1pbiAuLi4nIG9wdGlvbikgYW5kIHRodXMgc2hvdWxkIG5vdAogICAgIGNhdXNlIGFueSBwcm9ibGVtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gUlNBcmVmLCBzaW5jZSB0aGVyZSdzIG5vIG1vcmUgbmVlZCBmb3IgaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBEU08gbG9hZCBhbG9uZyBhIHBhdGggZ2l2ZW4gdGhyb3VnaCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgIChTSExJQl9QQVRIKSB3aXRoIHNobF9sb2FkKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uc3RpZnkgdGhlIEVOR0lORSBjb2RlIGFzIGEgcmVzdWx0IG9mIEJJR05VTSBjb25zdGlmaWNhdGlvbi4KICAgICBBbHNvIGNvbnN0aWZ5IHRoZSBSU0EgY29kZSBhbmQgbW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpdC4gIEluIGEKICAgICBmZXcgcGxhY2VzLCBtb3N0IG5vdGFibGUgaW4gdGhlIGRlcHRoIG9mIHRoZSBBU04uMSBjb2RlLCB1Z2x5CiAgICAgY2FzdHMgYmFjayB0byBub24tY29uc3Qgd2VyZSByZXF1aXJlZCAodG8gYmUgc29sdmVkIGF0IGEgbGF0ZXIKICAgICB0aW1lKQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgc28gdGhlIG9wZW5zc2wgYXBwbGljYXRpb24gaGFzIGFsbCBlbmdpbmVzIGxvYWRlZCBieSBkZWZhdWx0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBCSUdOVU0gcm91dGluZXMgYSBsaXR0bGUgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgoJRU5HSU5FX2xvYWRfY3N3aWZ0KCkKCUVOR0lORV9sb2FkX2NoaWwoKQoJRU5HSU5FX2xvYWRfYXRhbGxhKCkKCUVOR0lORV9sb2FkX251cm9uKCkKCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpCgogICAgIFRoYXQgd2F5LCBhbiBhcHBsaWNhdGlvbiBjYW4gaXRzZWxmIGNob29zZSBpZiBleHRlcm5hbCBlbmdpbmVzIHRoYXQKICAgICBhcmUgYnVpbHQtaW4gaW4gT3BlblNTTCBzaGFsbCBldmVyIGJlIHVzZWQgb3Igbm90LiAgVGhlIGJlbmVmaXQgaXMKICAgICB0aGF0IGFwcGxpY2F0aW9ucyB3b24ndCBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGxpYmRsIG9yIG90aGVyIGRzbwogICAgIGxpYnJhcmllcyB1bmxlc3MgaXQncyByZWFsbHkgbmVlZGVkLgoKICAgICBDaGFuZ2VkICdvcGVuc3NsIGVuZ2luZScgdG8gbG9hZCBhbGwgZW5naW5lcyBvbiBkZW1hbmQuCiAgICAgQ2hhbmdlZCB0aGUgZW5naW5lIGhlYWRlciBmaWxlcyB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24gb2Ygc29tZQogICAgIGRlY2xhcmF0aW9ucyAodGhleSBkaWZmZXJlZCEpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopICdvcGVuc3NsIGVuZ2luZScgY2FuIG5vdyBsaXN0IGNhcGFiaWxpdGllcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluICdvcGVuc3NsIGVuZ2luZScuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV2ZXIgY2FsbCBsb2FkX2RoX3BhcmFtKE5VTEwpIGluIHNfc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBlbmdpbmUgYXBwbGljYXRpb24uICBJdCBjYW4gY3VycmVudGx5IGxpc3QgZW5naW5lcyBieSBuYW1lIGFuZAogICAgIGlkZW50aXR5LCBhbmQgdGVzdCBpZiB0aGV5IGFyZSBhY3R1YWxseSBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW1wcm92ZSBSUE0gc3BlY2lmaWNhdGlvbiBmaWxlIGJ5IGZvcmNpbmcgc3ltYm9saWMgbGlua2luZyBhbmQgbWFraW5nCiAgICAgc3VyZSB0aGUgaW5zdGFsbGVkIGRvY3VtZW50YXRpb24gaXMgYWxzbyBvd25lZCBieSByb290LnJvb3QuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIEdpdmUgdGhlIE9wZW5TU0wgYXBwbGljYXRpb25zIG1vcmUgcG9zc2liaWxpdGllcyB0byBtYWtlIHVzZSBvZgogICAgIGtleXMgKHB1YmxpYyBhcyB3ZWxsIGFzIHByaXZhdGUpIGhhbmRsZWQgYnkgZW5naW5lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgT0NTUCBjb2RlIHRoYXQgY29tZXMgZnJvbSBDZXJ0Q28uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIFZNUyBzdXBwb3J0IGZvciB0aGUgUmlqbmRhZWwgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCB1bnRlc3RlZCBzdXBwb3J0IGZvciBOdXJvbiBjcnlwdG8gYWNjZWxlcmF0b3IuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBleHRlcm5hbCBjcnlwdG9ncmFwaGljIGRldmljZXMuICBUaGlzIGNvZGUgd2FzCiAgICAgcHJldmlvdXNseSBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGFzIHRoZSAiZW5naW5lIiBicmFuY2guCiAgICAgW0dlb2ZmIFRob3JwZSwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdvcmsgdGhlIGZpbGVuYW1lLXRyYW5zbGF0aW9uIGluIHRoZSBEU08gY29kZS4gSXQgaXMgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSBmYXIgZ3JlYXRlciBjb250cm9sIG92ZXIgaG93IGEgIm5hbWUiIGlzIHR1cm5lZCBpbnRvIGEgZmlsZW5hbWUKICAgICBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBhbmQgYW55IG9kZGl0aWVzIGFib3V0IHRoZQogICAgIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyeSBmaWxlbmFtZXMgb24gZWFjaCBzeXN0ZW0uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCB0aHJlYWRzIG9uIEZyZWVCU0QtZWxmIGluIENvbmZpZ3VyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIFNIQTEgYXNzZW1ibHkgcHJvYmxlbSB3aXRoIE1BU006IGl0IHByb2R1Y2VzCiAgICAgd2FybmluZ3MgYWJvdXQgY29ycnVwdCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGVuIGFzc2VtYmxpbmcKICAgICB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyBpcyBjYXVzZWQgYnkgdGhlIG92ZXJsYXBwaW5nCiAgICAgb2YgdHdvIHNlY3Rpb25zLgogICAgIFtCZXJuZCBNYXR0aGVzIDxtYWluYnVnQGNlbG9jb20uZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIE5DT05GIGNoYW5nZXMuCiAgICAgTkNPTkZfZ2V0X251bWJlcigpIGhhcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwuICBBcyBhIHJlcGxhY2VtZW50LAogICAgIE5DT05GX2dldF9udW1iZXJfZSgpIGlzIGRlZmluZWQgKF9lIGZvciAiZXJyb3IgY2hlY2tpbmciKSBhbmQgaXMKICAgICBwcm9tb3RlZCBzdHJvbmdseS4gIFRoZSBvbGQgTkNPTkZfZ2V0X251bWJlciBpcyBrZXB0IGFyb3VuZCBmb3IKICAgICBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICBNYWtlIGl0IHBvc3NpYmxlIGZvciBtZXRob2RzIHRvIGxvYWQgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIEJJTywKICAgICBieSBwcm92aWRpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgaXMgZ2l2ZW4gYSBuYW1lIGluc3RlYWQgb2YgYSBCSU8uCiAgICAgRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGFuCiAgICAgTERBUCBzZXJ2ZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBub24gYmxvY2tpbmcgYWNjZXB0IEJJT3MuIEFkZGVkIG5ldyBJL08gc3BlY2lhbCByZWFzb24KICAgICBCSU9fUlJfQUNDRVBUIHRvIGNvdmVyIHRoaXMgY2FzZS4gUHJldmlvdXNseSB1c2Ugb2YgYWNjZXB0IEJJT3MKICAgICB3aXRoIG5vbiBibG9ja2luZyBJL08gd2FzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIG5vIHJldHJ5IGNvZGUgd2FzCiAgICAgaW1wbGVtZW50ZWQuIEFsc28gYWRkZWQgbmV3IFNTTCBjb2RlIFNTTF9XQU5UX0FDQ0VQVCB0byBjb3ZlcgogICAgIHRoaXMgY2FzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgYmVnaW5uaW5ncyBvZiBSaWpuZGFlbCBzdXBwb3J0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBEaXJlY3RvcnlTdHJpbmcgbWFzayBzZXR0aW5nLiBBZGQgc3VwcG9ydCBmb3IKICAgICBYNTA5X05BTUVfcHJpbnRfZXgoKSBpbiAncmVxJyBhbmQgWDUwOV9wcmludF9leCgpIGZ1bmN0aW9uCiAgICAgdG8gYWxsb3cgY2VydGlmaWNhdGUgcHJpbnRpbmcgdG8gbW9yZSBjb250cm9sbGFibGUsIGFkZGl0aW9uYWwKICAgICAnY2VydG9wdCcgb3B0aW9uIHRvICd4NTA5JyB0byBhbGxvdyBuZXcgcHJpbnRpbmcgb3B0aW9ucyB0byBiZQogICAgIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiBvbGQgRUFZIE1ENSBoYWNrIGZyb20gZV9vcy5oLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42bCBhbmQgMC45LjZtICBbMTcgTWFyIDIwMDRdCgogICopIEZpeCBudWxsLXBvaW50ZXIgYXNzaWdubWVudCBpbiBkb19jaGFuZ2VfY2lwaGVyX3NwZWMoKSByZXZlYWxlZAogICAgIGJ5IHVzaW5nIHRoZSBDb2Rlbm9taWNvbiBUTFMgVGVzdCBUb29sIChDVkUtMjAwNC0wMDc5KQogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZrIGFuZCAwLjkuNmwgIFswNCBOb3YgMjAwM10KCiAgKikgRml4IGFkZGl0aW9uYWwgYnVnIHJldmVhbGVkIGJ5IHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIGJ1ZyB0cmlnZ2VyaW5nIGxhcmdlIHJlY3Vyc2lvbiB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgY2VydGFpbiBBU04uMSB0YWdzIChDVkUtMjAwMy0wODUxKQogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aiBhbmQgMC45LjZrICBbMzAgU2VwIDIwMDNdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmV2ZWFsZWQgYnkgcnVubmluZyB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBvdXQgb2YgYm91bmRzIHJlYWRzIGluIHRoZSBBU04xIGNvZGUgd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGludmFsaWQgdGFncyAoQ1ZFLTIwMDMtMDU0MyBhbmQgQ1ZFLTIwMDMtMDU0NCkuCiAgICAgCiAgICAgSWYgdmVyaWZ5IGNhbGxiYWNrIGlnbm9yZXMgaW52YWxpZCBwdWJsaWMga2V5IGVycm9ycyBkb24ndCB0cnkgdG8gY2hlY2sKICAgICBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgd2l0aCB0aGUgTlVMTCBwdWJsaWMga2V5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2FjY2VwdCgpIChzc2wvczNfc3J2ci5jKSBvbmx5IGFjY2VwdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZQogICAgIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdGVkIG9uZTogYXMgc3RhdGVkIGluIFRMUyAxLjAgYW5kIFNTTCAzLjAKICAgICBzcGVjaWZpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKSAoc3NsL3MzX3NydnIuYyksIHRvbGVyYXRlIGFkZGl0aW9uYWwKICAgICBleHRyYSBkYXRhIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIG5vdCBvbmx5IGZvciBUTFMgMS4wCiAgICAgYnV0IGFsc28gZm9yIFNTTCAzLjAgKGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE1hdHRoaWFzIExvZXBmZV0KCiAgKikgQ2hhbmdlIFg1MDlfY2VydGlmaWNhdGVfdHlwZSgpIHRvIG1hcmsgdGhlIGtleSBhcyBleHBvcnRlZC9leHBvcnRhYmxlCiAgICAgd2hlbiBpdCdzIDUxMiAqYml0cyogbG9uZywgbm90IDUxMiBieXRlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmkgYW5kIDAuOS42aiAgWzEwIEFwciAyMDAzXQoKICAqKSBDb3VudGVybWVhc3VyZSBhZ2FpbnN0IHRoZSBLbGltYS1Qb2tvcm55LVJvc2EgZXh0ZW5zaW9uIG9mCiAgICAgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBwYWRkaW5nOiB0cmVhdAogICAgIGEgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgbWlzbWF0Y2ggbGlrZSBhIGRlY3J5cHRpb24gZXJyb3IKICAgICBpbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlIChzc2wvczNfc3J2ci5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUdXJuIG9uIFJTQSBibGluZGluZyBieSBkZWZhdWx0IGluIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCiAgICAgdG8gYXZvaWQgYSB0aW1pbmcgYXR0YWNrLiBBcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IGl0IGNhbiBjYWxsCiAgICAgUlNBX2JsaW5kaW5nX29mZigpIG9yIHVzZSB0aGUgbmV3IGZsYWcgUlNBX0ZMQUdfTk9fQkxJTkRJTkcuCiAgICAgVGhleSB3b3VsZCBiZSBpbGwtYWR2aXNlZCB0byBkbyBzbyBpbiBtb3N0IGNhc2VzLgogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSBIZW5zb24sIEdlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUlNBIGJsaW5kaW5nIGNvZGUgc28gdGhhdCBpdCB3b3JrcyB3aGVuIHRoZSBQUk5HIGlzIG5vdAogICAgIHNlZWRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgc2VjcmV0IFJTQSBleHBvbmVudCBpcyBhYnVzZWQgYXMKICAgICBhbiB1bnByZWRpY3RhYmxlIHNlZWQgLS0gaWYgaXQgaXMgbm90IHVucHJlZGljdGFibGUsIHRoZXJlCiAgICAgaXMgbm8gcG9pbnQgaW4gYmxpbmRpbmcgYW55d2F5KS4gIE1ha2UgUlNBIGJsaW5kaW5nIHRocmVhZC1zYWZlCiAgICAgYnkgcmVtZW1iZXJpbmcgdGhlIGNyZWF0b3IncyB0aHJlYWQgSUQgaW4gcnNhLT5ibGluZGluZyBhbmQKICAgICBoYXZpbmcgYWxsIG90aGVyIHRocmVhZHMgdXNlIGxvY2FsIG9uZS10aW1lIGJsaW5kaW5nIGZhY3RvcnMKICAgICAodGhpcyByZXF1aXJlcyBtb3JlIGNvbXB1dGF0aW9uIHRoYW4gc2hhcmluZyByc2EtPmJsaW5kaW5nLCBidXQKICAgICBhdm9pZHMgZXhjZXNzaXZlIGxvY2tpbmc7IGFuZCBpZiBhbiBSU0Egb2JqZWN0IGlzIG5vdCBzaGFyZWQKICAgICBiZXR3ZWVuIHRocmVhZHMsIGJsaW5kaW5nIHdpbGwgc3RpbGwgYmUgdmVyeSBmYXN0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmggYW5kIDAuOS42aSAgWzE5IEZlYiAyMDAzXQoKICAqKSBJbiBzc2wzX2dldF9yZWNvcmQgKHNzbC9zM19wa3QuYyksIG1pbmltaXplIGluZm9ybWF0aW9uIGxlYWtlZAogICAgIHZpYSB0aW1pbmcgYnkgcGVyZm9ybWluZyBhIE1BQyBjb21wdXRhdGlvbiBldmVuIGlmIGluY29ycnJlY3QKICAgICBibG9jayBjaXBoZXIgcGFkZGluZyBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgaXMgYSBjb3VudGVybWVhc3VyZQogICAgIGFnYWluc3QgYWN0aXZlIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIGhhcyB0byBkaXN0aW5ndWlzaAogICAgIGJldHdlZW4gYmFkIHBhZGRpbmcgYW5kIGEgTUFDIHZlcmlmaWNhdGlvbiBlcnJvci4gKENWRS0yMDAzLTAwNzgpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQnJpY2UgQ2FudmVsIChFUEZMKSwKICAgICBBbGFpbiBIaWx0Z2VuIChVQlMpLCBTZXJnZSBWYXVkZW5heSAoRVBGTCksIGFuZAogICAgIE1hcnRpbiBWdWFnbm91eCAoRVBGTCwgSWxpb24pXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmcgYW5kIDAuOS42aCAgWzUgRGVjIDIwMDJdCgogICopIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2NsZWFuc2UoKSwgd2hpY2ggaXMgdXNlZCB0byBjbGVhbnNlIGEgc2VjdGlvbiBvZgogICAgIG1lbW9yeSBmcm9tIGl0J3MgY29udGVudHMuICBUaGlzIGlzIGRvbmUgd2l0aCBhIGNvdW50ZXIgdGhhdCB3aWxsCiAgICAgcGxhY2UgYWx0ZXJuYXRpbmcgdmFsdWVzIGluIGVhY2ggYnl0ZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc29sdmUKICAgICB0d28gaXNzdWVzOiAxKSB0aGUgcmVtb3ZhbCBvZiBjYWxscyB0byBtZW1zZXQoKSBieSBoaWdobHkgb3B0aW1pemluZwogICAgIGNvbXBpbGVycywgYW5kIDIpIGNsZWFuc2luZyB3aXRoIG90aGVyIHZhbHVlcyB0aGFuIDAsIHNpbmNlIHRob3NlIGNhbgogICAgIGJlIHJlYWQgdGhyb3VnaCBvbiBjZXJ0YWluIG1lZGlhLCBmb3IgZXhhbXBsZSBhIHN3YXAgc3BhY2Ugb24gZGlzay4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBCdWdmaXg6IGNsaWVudCBzaWRlIHNlc3Npb24gY2FjaGluZyBkaWQgbm90IHdvcmsgd2l0aCBleHRlcm5hbCBjYWNoaW5nLAogICAgIGJlY2F1c2UgdGhlIHNlc3Npb24tPmNpcGhlciBzZXR0aW5nIHdhcyBub3QgcmVzdG9yZWQgd2hlbiByZWxvYWRpbmcKICAgICBmcm9tIHRoZSBleHRlcm5hbCBjYWNoZS4gVGhpcyBwcm9ibGVtIHdhcyBtYXNrZWQsIHdoZW4KICAgICBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcgKHBhcnQgb2YgU1NMX09QX0FMTCkgd2FzIHNldC4KICAgICAoRm91bmQgYnkgU3RldmUgSGFzbGFtIDxzdGV2ZUBhcmFxbmlkLmRkdHMubmV0Pi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBjbGllbnRfY2VydGlmaWNhdGUgKHNzbC9zMl9jbG50LmMpOiBUaGUgcGVybWlzc2libGUgdG90YWwKICAgICBsZW5ndGggb2YgdGhlIFJFUVVFU1QtQ0VSVElGSUNBVEUgbWVzc2FnZSBpcyAxOCAuLiAzNCwgbm90IDE3IC4uIDMzLgogICAgIFtaZWV2IExpZWJlciA8emVldi1sQHlhaG9vLmNvbT5dCgogICopIFVuZG8gYW4gdW5kb2N1bWVudGVkIGNoYW5nZSBpbnRyb2R1Y2VkIGluIDAuOS42ZSB3aGljaCBjYXVzZWQKICAgICByZXBlYXRlZCBjYWxscyB0byBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycygpIGFuZCAKICAgICBPcGVuU1NMX2FkZF9hbGxfZGlnZXN0cygpIHRvIGJlIGlnbm9yZWQsIGV2ZW4gYWZ0ZXIgY2FsbGluZwogICAgIEVWUF9jbGVhbnVwKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcmVhZGVyIHRvIGRlYWwgd2l0aCBsYXN0IGxpbmUgbm90CiAgICAgYmVpbmcgcHJvcGVybHkgdGVybWluYXRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgWDUwOV9OQU1FX2NtcCgpIHNvIGl0IGFwcGxpZXMgdGhlIHNwZWNpYWwgcnVsZXMgb24gaGFuZGxpbmcKICAgICBETiB2YWx1ZXMgdGhhdCBhcmUgb2YgdHlwZSBQcmludGFibGVTdHJpbmcsIGFzIHdlbGwgYXMgUkROcyBvZiB0eXBlCiAgICAgZW1haWxBZGRyZXNzIHdoZXJlIHRoZSB2YWx1ZSBoYXMgdGhlIHR5cGUgaWE1U3RyaW5nLgogICAgIFtzdGVmYW5rQHZhbGljZXJ0LmNvbSB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgYSBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRSBmbGFnIHRvIHRha2Ugb3ZlciBoYWxmCiAgICAgdGhlIGpvYiBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVAgd2FzIGluY29uc2lzdGVudGx5CiAgICAgZG9pbmcsIGRlZmluZSBhIG5ldyBmbGFnIChTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTCkgdG8gYmUKICAgICB0aGUgYml0d2lzZS1PUiBvZiB0aGUgdHdvIGZvciB1c2UgYnkgdGhlIG1ham9yaXR5IG9mIGFwcGxpY2F0aW9ucwogICAgIHdhbnRpbmcgdGhpcyBiZWhhdmlvdXIsIGFuZCB1cGRhdGUgdGhlIGRvY3MuIFRoZSBkb2N1bWVudGVkCiAgICAgYmVoYXZpb3VyIGFuZCBhY3R1YWwgYmVoYXZpb3VyIHdlcmUgaW5jb25zaXN0ZW50IGFuZCBoYWQgYmVlbgogICAgIGNoYW5naW5nIGFueXdheSwgc28gdGhpcyBpcyBtb3JlIGEgYnVnLWZpeCB0aGFuIGEgYmVoYXZpb3VyYWwKICAgICBjaGFuZ2UuCiAgICAgW0dlb2ZmIFRob3JwZSwgZGlhZ25vc2VkIGJ5IE5hZGF2IEhhcidFbF0KCiAgKikgRG9uJ3QgaW1wb3NlIGEgMTYtYnl0ZSBsZW5ndGggbWluaW11bSBvbiBzZXNzaW9uIElEcyBpbiBzc2wvczNfY2xudC5jCiAgICAgKHRoZSBTU0wgMy4wIGFuZCBUTFMgMS4wIHNwZWNpZmljYXRpb25zIGFsbG93IGFueSBsZW5ndGggdXAgdG8gMzIgYnl0ZXMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBpbml0aWFsaXphdGlvbiBjb2RlIHJhY2UgY29uZGl0aW9ucyBpbgogICAgICAgIFNTTHYyM19tZXRob2QoKSwgIFNTTHYyM19jbGllbnRfbWV0aG9kKCksICAgU1NMdjIzX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBTU0x2Ml9tZXRob2QoKSwgICBTU0x2Ml9jbGllbnRfbWV0aG9kKCksICAgIFNTTHYyX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBTU0x2M19tZXRob2QoKSwgICBTU0x2M19jbGllbnRfbWV0aG9kKCksICAgIFNTTHYzX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBUTFN2MV9tZXRob2QoKSwgICBUTFN2MV9jbGllbnRfbWV0aG9kKCksICAgIFRMU3YxX3NlcnZlcl9tZXRob2QoKSwKICAgICAgICBzc2wyX2dldF9jaXBoZXJfYnlfY2hhcigpLAogICAgICAgIHNzbDNfZ2V0X2NpcGhlcl9ieV9jaGFyKCkuCiAgICAgW1BhdHJpY2sgTWNDb3JtaWNrIDxwYXRyaWNrQHRlbGxtZS5jb20+LCBCb2RvIE1vZWxsZXJdCgogICopIFJlb3JkZXIgY2xlYW51cCBzZXF1ZW5jZSBpbiBTU0xfQ1RYX2ZyZWUoKTogb25seSByZW1vdmUgdGhlIGV4X2RhdGEgYWZ0ZXIKICAgICB0aGUgY2FjaGVkIHNlc3Npb25zIGFyZSBmbHVzaGVkLCBhcyB0aGUgcmVtb3ZlX2NiKCkgbWlnaHQgdXNlIGV4X2RhdGEKICAgICBjb250ZW50cy4gQnVnIGZvdW5kIGJ5IFNhbSBWYXJzaGF2Y2hpayA8bXJzYW1AY291cmllci1tdGEuY29tPgogICAgIChzZWUgW29wZW5zc2wub3JnICMyMTJdKS4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggdHlwbyBpbiBPQkpfdHh0Mm9iaiB3aGljaCBpbmNvcnJlY3RseSBwYXNzZWQgdGhlIGNvbnRlbnQKICAgICBsZW5ndGgsIGluc3RlYWQgb2YgdGhlIGVuY29kaW5nIGxlbmd0aCB0byBkMmlfQVNOMV9PQkpFQ1QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZmIGFuZCAwLjkuNmcgIFs5IEF1ZyAyMDAyXQoKICAqKSBbSW4gMC45LjZnLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggY3J5cHRvL2VuZ2luZS92ZW5kb3JfZGVmbnMvY3N3aWZ0LmggZm9yIFdJTjMyICh1c2UgJ19zdGRjYWxsJykuCiAgICAgW0x5bm4gR2F6aXMgPGxnYXppc0ByYWluYm93LmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZSBhbmQgMC45LjZmICBbOCBBdWcgMjAwMl0KCiAgKikgRml4IEFTTjEgY2hlY2tzLiBDaGVjayBmb3Igb3ZlcmZsb3cgYnkgY29tcGFyaW5nIHdpdGggTE9OR19NQVgKICAgICBhbmQgZ2V0IGZpeCB0aGUgaGVhZGVyIGxlbmd0aCBjYWxjdWxhdGlvbi4KICAgICBbRmxvcmlhbiBXZWltZXIgPFdlaW1lckBDRVJULlVuaS1TdHV0dGdhcnQuREU+LAoJQWxvbiBLYW50b3IgPGFsb25rQGNoZWNrcG9pbnQuY29tPiAoYW5kIG90aGVycyksCglTdGV2ZSBIZW5zb25dCgogICopIFVzZSBwcm9wZXIgZXJyb3IgaGFuZGxpbmcgaW5zdGVhZCBvZiAnYXNzZXJ0aW9ucycgaW4gYnVmZmVyCiAgICAgb3ZlcmZsb3cgY2hlY2tzIGFkZGVkIGluIDAuOS42ZS4gIFRoaXMgcHJldmVudHMgRG9TICh0aGUKICAgICBhc3NlcnRpb25zIGNvdWxkIGNhbGwgYWJvcnQoKSkuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT4sIEJvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZkIGFuZCAwLjkuNmUgIFszMCBKdWwgMjAwMl0KCiAgKikgQWRkIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0byBhc24xX2dldF9sZW5ndGgoKSB0byByZWplY3QKICAgICB0aGUgQVNOMSBsZW5ndGggYnl0ZXMgaWYgdGhleSBleGNlZWQgc2l6ZW9mKGxvbmcpLCB3aWxsIGFwcGVhcgogICAgIG5lZ2F0aXZlIG9yIHRoZSBjb250ZW50IGxlbmd0aCBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlCiAgICAgc3VwcGxpZWQgYnVmZmVyLgogICAgIFtTdGV2ZSBIZW5zb24sIEFkaSBTdGF2IDxzdGF2QG1lcmN1cnkuY28uaWw+LCBKYW1lcyBZb25hbiA8amltQG50bHAuY29tPl0KCiAgKikgRml4IGNpcGhlciBzZWxlY3Rpb24gcm91dGluZXM6IGNpcGhlcnMgd2l0aG91dCBlbmNyeXB0aW9uIGhhZCBubyBmbGFncwogICAgIGZvciB0aGUgY2lwaGVyIHN0cmVuZ3RoIHNldCBhbmQgd2hlcmUgdGhlcmVmb3JlIG5vdCBoYW5kbGVkIGNvcnJlY3RseQogICAgIGJ5IHRoZSBzZWxlY3Rpb24gcm91dGluZXMgKFBSICMxMzApLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggRVZQX2RzYV9zaGEgbWFjcm8uCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBOZXcgb3B0aW9uCiAgICAgICAgICBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTCiAgICAgZm9yIGRpc2FibGluZyB0aGUgU1NMIDMuMC9UTFMgMS4wIENCQyB2dWxuZXJhYmlsaXR5IGNvdW50ZXJtZWFzdXJlCiAgICAgdGhhdCB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuNmQuCgogICAgIEFzIHRoZSBjb3VudGVybWVhc3VyZSB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZSB3aXRoIHNvbWUKICAgICBicm9rZW4gU1NMIGltcGxlbWVudGF0aW9ucywgdGhlIG5ldyBvcHRpb24gaXMgcGFydCBvZiBTU0xfT1BfQUxMLgogICAgIFNTTF9PUF9BTEwgaXMgdXN1YWxseSBlbXBsb3llZCB3aGVuIGNvbXBhdGliaWxpdHkgd2l0aCB3ZWlyZCBTU0wKICAgICBpbXBsZW1lbnRhdGlvbnMgaXMgZGVzaXJlZCAoZS5nLiAnLWJ1Z3MnIG9wdGlvbiB0byAnc19jbGllbnQnIGFuZAogICAgICdzX3NlcnZlcicpLCBzbyB0aGUgbmV3IG9wdGlvbiBpcyBhdXRvbWF0aWNhbGx5IHNldCBpbiBtYW55CiAgICAgYXBwbGljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZXMgaW4gc2VjdXJpdHkgcGF0Y2g6CgogICAgIENoYW5nZXMgbWFya2VkICIoQ0hBVFMpIiB3ZXJlIHNwb25zb3JlZCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZAogICAgIFJlc2VhcmNoIFByb2plY3RzIEFnZW5jeSAoREFSUEEpIGFuZCBBaXIgRm9yY2UgUmVzZWFyY2ggTGFib3JhdG9yeSwKICAgICBBaXIgRm9yY2UgTWF0ZXJpZWwgQ29tbWFuZCwgVVNBRiwgdW5kZXIgYWdyZWVtZW50IG51bWJlcgogICAgIEYzMDYwMi0wMS0yLTA1MzcuCgogICopIEFkZCB2YXJpb3VzIHNhbml0eSBjaGVja3MgdG8gYXNuMV9nZXRfbGVuZ3RoKCkgdG8gcmVqZWN0CiAgICAgdGhlIEFTTjEgbGVuZ3RoIGJ5dGVzIGlmIHRoZXkgZXhjZWVkIHNpemVvZihsb25nKSwgd2lsbCBhcHBlYXIKICAgICBuZWdhdGl2ZSBvciB0aGUgY29udGVudCBsZW5ndGggZXhjZWVkcyB0aGUgbGVuZ3RoIG9mIHRoZQogICAgIHN1cHBsaWVkIGJ1ZmZlci4gKENWRS0yMDAyLTA2NTkpCiAgICAgW1N0ZXZlIEhlbnNvbiwgQWRpIFN0YXYgPHN0YXZAbWVyY3VyeS5jby5pbD4sIEphbWVzIFlvbmFuIDxqaW1AbnRscC5jb20+XQoKICAqKSBBc3NlcnRpb25zIGZvciB2YXJpb3VzIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3dzLCBub3Qga25vd24gdG8KICAgICBoYXBwZW4gaW4gcHJhY3RpY2UuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgVmFyaW91cyB0ZW1wb3JhcnkgYnVmZmVycyB0byBob2xkIEFTQ0lJIHZlcnNpb25zIG9mIGludGVnZXJzIHdlcmUKICAgICB0b28gc21hbGwgZm9yIDY0IGJpdCBwbGF0Zm9ybXMuIChDVkUtMjAwMi0wNjU1KQogICAgIFtNYXR0aGV3IEJ5bmctTWFkZGljayA8bWJtQGFsZGlnaXRhbC5jby51az4gYW5kIEJlbiBMYXVyaWUgKENIQVRTKT4KCiAgKikgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wzIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIHNlc3Npb24gSUQgdG8gYSBjbGllbnQuIChDVkUtMjAwMi0wNjU2KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMiBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBjbGllbnQgbWFzdGVyIGtleS4gKENWRS0yMDAyLTA2NTYpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZjIGFuZCAwLjkuNmQgIFs5IE1heSAyMDAyXQoKICAqKSBGaXggY3J5cHRvL2FzbjEvYV9zaWduLmMgc28gdGhhdCAncGFyYW1ldGVycycgaXMgb21pdHRlZCAobm90CiAgICAgZW5jb2RlZCBhcyBOVUxMKSB3aXRoIGlkLWRzYS13aXRoLXNoYTEuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+OyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hlY2sgdmFyaW91cyBYNTA5Xy4uLigpIHJldHVybiB2YWx1ZXMgaW4gYXBwcy9yZXEuYy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEZpeCBCQVNFNjQgZGVjb2RlIChFVlBfRGVjb2RlVXBkYXRlKSBmb3IgZGF0YSB3aXRoIENSL0xGIGVuZGVkIGxpbmVzOgogICAgIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbiB3b3VsZCBlcnJvbm91c2x5IGJlIGZsYWdnZWQsIHdoZW4gdGhlIENSTEYKICAgICB3YXMganVzdCBhdCB0aGUgZW5kIG9mIGEgcHJvY2Vzc2VkIGJsb2NrLiBUaGUgYnVnIHdhcyBkaXNjb3ZlcmVkIHdoZW4KICAgICBwcm9jZXNzaW5nIGRhdGEgdGhyb3VnaCBhIGJ1ZmZlcmluZyBtZW1vcnkgQklPIGhhbmRpbmcgdGhlIGRhdGEgdG8gYQogICAgIEJBU0U2NC1kZWNvZGluZyBCSU8uIEJ1ZyBmdW5kIGFuZCBwYXRjaCBzdWJtaXR0ZWQgYnkgUGF2ZWwgVHNla292CiAgICAgPHB0c2Vrb3ZAc3ludHJleC5jb20+IGFuZCBOZWRlbGNobyBTdGFuZXYuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEltcGxlbWVudCBhIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgYSB2dWxuZXJhYmlsaXR5IHJlY2VudGx5IGZvdW5kCiAgICAgaW4gQ0JDIGNpcGhlcnN1aXRlcyBpbiBTU0wgMy4wL1RMUyAxLjA6IFNlbmQgYW4gZW1wdHkgZnJhZ21lbnQKICAgICBiZWZvcmUgYXBwbGljYXRpb24gZGF0YSBjaHVua3MgdG8gYXZvaWQgdGhlIHVzZSBvZiBrbm93biBJVnMKICAgICB3aXRoIGRhdGEgcG90ZW50aWFsbHkgY2hvc2VuIGJ5IHRoZSBhdHRhY2tlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggbGVuZ3RoIGNoZWNrcyBpbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUTFMvU1NMIGxpYnJhcnkgYnVnZml4OiB1c2Ugcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgZGlmZmVyZW50bHkKICAgICB0byBwcmV2ZW50IHNzbDNfcmVhZF9pbnRlcm5hbCgpIGZyb20gaW5jb3JyZWN0bHkgYXNzdW1pbmcgdGhhdAogICAgIHNzbDNfcmVhZF9ieXRlcygpIGZvdW5kIGFwcGxpY2F0aW9uIGRhdGEgd2hpbGUgaGFuZHNoYWtlCiAgICAgcHJvY2Vzc2luZyB3YXMgZW5hYmxlZCB3aGVuIGluIGZhY3Qgcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgd2FzCiAgICAgbWVyZWx5IGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBkdXJpbmcgdGhlIGluaXRpYWwgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRml4IG9iamVjdCBkZWZpbml0aW9ucyBmb3IgUHJpdmF0ZSBhbmQgRW50ZXJwcmlzZTogdGhleSB3ZXJlIG5vdAogICAgIHJlY29nbml6ZWQgaW4gdGhlaXIgc2hvcnRuYW1lICg9bG93ZXJjYXNlKSByZXByZXNlbnRhdGlvbi4gRXh0ZW5kCiAgICAgb2JqX2RhdC5wbCB0byBpc3N1ZSBhbiBlcnJvciB3aGVuIHVzaW5nIHVuZGVmaW5lZCBrZXl3b3JkcyBpbnN0ZWFkCiAgICAgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIHByb2JsZW0gKFN2ZW5uaW5nIFNvcmVuc2VuCiAgICAgPHNzc0Bzc3MuZG5zYWxpYXMubmV0PikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzKCkgc28gdGhhdCBpdCB3b3JrcyBmb3IgJ25vbi1zdGFuZGFyZCcKICAgICBnZW5lcmF0b3JzLCBpLmUuIGdlbmVyYXRvcnMgb3RoZXIgdGhhbiAyIGFuZCA1LiAgKFByZXZpb3VzbHksIHRoZQogICAgIGNvZGUgZGlkIG5vdCBwcm9wZXJseSBpbml0aWFsaXNlIHRoZSAnYWRkJyBhbmQgJ3JlbScgdmFsdWVzIHRvCiAgICAgQk5fZ2VuZXJhdGVfcHJpbWUoKS4pCgogICAgIEluIHRoZSBuZXcgZ2VuZXJhbCBjYXNlLCB3ZSBkbyBub3QgaW5zaXN0IHRoYXQgJ2dlbmVyYXRvcicgaXMKICAgICBhY3R1YWxseSBhIHByaW1pdGl2ZSByb290OiBUaGlzIHJlcXVpcmVtZW50IGlzIHJhdGhlciBwb2ludGxlc3M7CiAgICAgYSBnZW5lcmF0b3Igb2YgdGhlIG9yZGVyLXEgc3ViZ3JvdXAgaXMganVzdCBhcyBnb29kLCBpZiBub3QKICAgICBiZXR0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KIAogICopIE1hcCBuZXcgWDUwOSB2ZXJpZmljYXRpb24gZXJyb3JzIHRvIGFsZXJ0cy4gRGlzY292ZXJlZCBhbmQgc3VibWl0dGVkIGJ5CiAgICAgVG9tIFd1IDx0b21AYXJjb3QuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHNzbDNfcGVuZGluZygpIChzc2wvczNfbGliLmMpIHRvIHByZXZlbnQgU1NMX3BlbmRpbmcoKSBmcm9tCiAgICAgcmV0dXJuaW5nIG5vbi16ZXJvIGJlZm9yZSB0aGUgZGF0YSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY2VpdmVkCiAgICAgd2hlbiB1c2luZyBub24tYmxvY2tpbmcgSS9PLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgSm9obiBIdWdoZXNdCgogICopIFNvbWUgb2YgdGhlIGNpcGhlcnMgbWlzc2VkIHRoZSBzdHJlbmd0aCBlbnRyeSAoU1NMX0xPVyBldGMpLgogICAgIFtCZW4gTGF1cmllLCBMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggYnVnIGluIFNTTF9jbGVhcigpOiBiYWQgc2Vzc2lvbnMgd2VyZSBub3QgcmVtb3ZlZCAoZm91bmQgYnkKICAgICBZb3JhbSBaYWhhdmkgPFlvcmFtWkBnaWxpYW4uY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBDeWdXaW4gMS4zIGFuZCBvbiwgYW5kIHByZXNlcnZlIHByb3BlcgogICAgIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2ZXJzaW9ucyBiZWZvcmUgdGhhdC4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSByZW1vdmFsIGZyb20gc2Vzc2lvbiBjYWNoZSAoU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbigpKSBtb3JlIHJvYnVzdDoKICAgICBjaGVjayB3aGV0aGVyIHdlIGRlYWwgd2l0aCBhIGNvcHkgb2YgYSBzZXNzaW9uIGFuZCBkbyBub3QgZGVsZXRlIGZyb20KICAgICB0aGUgY2FjaGUgaW4gdGhpcyBjYXNlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5ICJJemhhciBTaG9zaGFuaSBMZXZpIgogICAgIDxpemhhckBjaGVja3BvaW50LmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIERvIG5vdCBzdG9yZSBzZXNzaW9uIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgc2Vzc2lvbiBjYWNoZSwgaWYgaXQKICAgICBpcyBuZXZlciBpbnRlbmRlZCB0byBiZSBsb29rZWQgdXAgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUAogICAgIGZsYWcgaXMgc2V0KS4gUHJvcG9zZWQgYnkgQXNsYW0gPGFzbGFtQGZ1bmsuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSGF2ZSBBU04xX0JJVF9TVFJJTkdfc2V0X2JpdCgpIHJlYWxseSBjbGVhciBhIGJpdCB3aGVuIHRoZSByZXF1ZXN0ZWQKICAgICB2YWx1ZSBpcyAwLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFtJbiAwLjkuNmQtZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBhIGNyYXNoYnVnIGFuZCBhIGxvZ2ljIGJ1ZyBpbiBod2NyaGtfbG9hZF9wdWJrZXkoKS4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXQgbGludXgtczM5MHguCiAgICAgW05lYWxlIEZlcmd1c29uIDxOZWFsZS5GZXJndXNvbkBTb2Z0d2FyZUFHLVVTQS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFRoZSBlYXJsaWVyIGJ1Z2ZpeCBmb3IgdGhlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0MgY2FzZSBvZgogICAgIHNzbDNfYWNjZXB0IChzc2wvczNfc3J2ci5jKSBpbmNvcnJlY3RseSB1c2VkIGEgbG9jYWwgZmxhZwogICAgIHZhcmlhYmxlIGFzIGFuIGluZGljYXRpb24gdGhhdCBhIENsaWVudEhlbGxvIG1lc3NhZ2UgaGFzIGJlZW4KICAgICByZWNlaXZlZC4gIEFzIHRoZSBmbGFnIHZhbHVlIHdpbGwgYmUgbG9zdCBiZXR3ZWVuIG11bHRpcGxlCiAgICAgaW52b2NhdGlvbnMgb2Ygc3NsM19hY2NlcHQgd2hlbiB1c2luZyBub24tYmxvY2tpbmcgSS9PLCB0aGUKICAgICBmdW5jdGlvbiBtYXkgbm90IGJlIGF3YXJlIHRoYXQgYSBoYW5kc2hha2UgaGFzIGFjdHVhbGx5IHRha2VuCiAgICAgcGxhY2UsIHRodXMgcHJldmVudGluZyBhIG5ldyBzZXNzaW9uIGZyb20gYmVpbmcgYWRkZWQgdG8gdGhlCiAgICAgc2Vzc2lvbiBjYWNoZS4KCiAgICAgVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBub3cgc2V0IHMtPm5ld19zZXNzaW9uIHRvIDIgaW5zdGVhZCBvZgogICAgIHVzaW5nIGEgbG9jYWwgdmFyaWFibGUuCiAgICAgW0x1dHogSmFlbmlja2UsIEJvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4OiBSZXR1cm4gLTEgZnJvbSBzc2wzX2dldF9zZXJ2ZXJfZG9uZSAoc3NsMy9zM19jbG50LmMpCiAgICAgaWYgdGhlIFNTTF9SX0xFTkdUSF9NSVNNQVRDSCBlcnJvciBpcyBkZXRlY3RlZC4KICAgICBbR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIE5ldyAnc2hhcmVkX2xkZmxhZycgY29sdW1uIGluIENvbmZpZ3VyZSBwbGF0Zm9ybSB0YWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggRVZQX0NJUEhFUl9tb2RlIG1hY3JvLgogICAgIFsiRGFuIFMuIENhbXBlciIgPGRhbkBidGkubmV0Pl0KCiAgKikgRml4IHNzbDNfcmVhZF9ieXRlcyAoc3NsL3MzX3BrdC5jKTogVG8gaWdub3JlIG1lc3NhZ2VzIG9mIHVua25vd24KICAgICB0eXBlLCB3ZSBtdXN0IHRocm93IHRoZW0gYXdheSBieSBzZXR0aW5nIHJyLT5sZW5ndGggdG8gMC4KICAgICBbRCBQIENoYW5nIDxkcGNAcXVhbHlzLmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YiBhbmQgMC45LjZjICBbMjEgZGVjIDIwMDFdCgogICopIEZpeCBCTl9yYW5kX3JhbmdlIGJ1ZyBwb2ludGVkIG91dCBieSBEb21pbmlrdXMgU2NoZXJrbAogICAgIDxEb21pbmlrdXMuU2NoZXJrbEBiaW9kYXRhLmNvbT4uICAoVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uCiAgICAgd29ya2VkIGluY29ycmVjdGx5IGZvciB0aG9zZSBjYXNlcyB3aGVyZSAgcmFuZ2UgPSAxMC4uLl8yICBhbmQKICAgICAzKnJhbmdlICBpcyB0d28gYml0cyBsb25nZXIgdGhhbiAgcmFuZ2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE9ubHkgYWRkIHNpZ25pbmcgdGltZSB0byBQS0NTNyBzdHJ1Y3R1cmVzIGlmIGl0IGlzIG5vdCBhbHJlYWR5CiAgICAgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggY3J5cHRvL29iamVjdHMvb2JqZWN0cy5oOiAibGQtY2UiIHNob3VsZCBiZSAiaWQtY2UiLAogICAgIE9CSl9sZF9jZSBzaG91bGQgYmUgT0JKX2lkX2NlLgogICAgIEFsc28gc29tZSBpcC1wZGEgT0lEcyBpbiBjcnlwdG8vb2JqZWN0cy9vYmplY3RzLnR4dCB3ZXJlCiAgICAgaW5jb3JyZWN0IChjZi4gUkZDIDMwMzkpLgogICAgIFtNYXR0IENvb3BlciwgRnJlZGVyaWMgR2l1ZGljZWxsaSwgQm9kbyBNb2VsbGVyXQoKICAqKSBSZWxlYXNlIENSWVBUT19MT0NLX0RZTkxPQ0sgd2hlbiBDUllQVE9fZGVzdHJveV9keW5sb2NraWQoKQogICAgIHJldHVybnMgZWFybHkgYmVjYXVzZSBpdCBoYXMgbm90aGluZyB0byBkby4KICAgICBbQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggbXV0ZXggY2FsbGJhY2sgcmV0dXJuIHZhbHVlcyBpbiBjcnlwdG8vZW5naW5lL2h3X25jaXBoZXIuYy4KICAgICBbQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgQ3J5cHRvZ3JhcGhpYyBBcHBsaWFuY2UncyBrZXlzZXJ2ZXIgdGVjaG5vbG9neS4KICAgICAoVXNlIGVuZ2luZSAna2V5Y2xpZW50JykKICAgICBbQ3J5cHRvZ3JhcGhpYyBBcHBsaWFuY2VzIGFuZCBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIE9TLzM5MCBVbml4LiAgVGhlIEMgY29tcGlsZXIgJ2M4OScKICAgICBpcyBjYWxsZWQgdmlhIHRvb2xzL2M4OS5zaCBiZWNhdXNlIGFyZ3VtZW50cyBoYXZlIHRvIGJlCiAgICAgcmVhcnJhbmdlZCAoYWxsICctTCcgb3B0aW9ucyBtdXN0IGFwcGVhciBiZWZvcmUgdGhlIGZpcnN0IG9iamVjdAogICAgIG1vZHVsZXMpLgogICAgIFtSaWNoYXJkIFNoYXBpcm8gPHJzaGFwaXJvQGFiaW5pdGlvLmNvbT5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBCcm9hZGNvbSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMsIGJhY2twb3J0ZWQKICAgICBmcm9tIDAuOS43LgogICAgIFtCcm9hZGNvbSwgTmFsaW4gRGFoeWFiaGFpIDxuYWxpbkByZWRoYXQuY29tPiwgTWFyayBDb3hdCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBTdXJlV2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSAKICAgICBCYWx0aW1vcmUgVGVjaG5vbG9naWVzLiAgKFVzZSBlbmdpbmUgJ3N1cmV3YXJlJykKICAgICBbQmFsdGltb3JlIFRlY2hub2xvZ2llcyBhbmQgTWFyayBDb3hdCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBBY2NlbGVyYXRlZAogICAgIEVuY3J5cHRpb24gUHJvY2Vzc2luZywgd3d3LmFlcC5pZS4gIChVc2UgZW5naW5lICdhZXAnKQogICAgIFtBRVAgSW5jLiBhbmQgTWFyayBDb3hdCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIGdjYyBvbiBVbml4V2FyZS4KICAgICBbR2FyeSBCZW5zb24gPGdiZW5zb25AcmVkaGF0LmNvbT5dCgogICopIENoYW5nZSBzc2wvczJfY2xudC5jIGFuZCBzc2wvczJfc3J2ci5jIHNvIHRoYXQgcmVjZWl2ZWQgaGFuZHNoYWtlCiAgICAgbWVzc2FnZXMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBwaWVjZSAoZml4ZWQtbGVuZ3RoIHBhcnQgYW5kCiAgICAgdmFyaWFibGUtbGVuZ3RoIHBhcnQgY29tYmluZWQpIGFuZCBmaXggdmFyaW91cyBidWdzIGZvdW5kIG9uIHRoZSB3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSBjYWNoaW5nIGluIEJJT19nZXRob3N0YnluYW1lKCksIGRpcmVjdGx5IHVzZSBnZXRob3N0YnluYW1lKCkKICAgICBpbnN0ZWFkLiAgQklPX2dldGhvc3RieW5hbWUoKSBkb2VzIG5vdCBrbm93IHdoYXQgdGltZW91dHMgYXJlCiAgICAgYXBwcm9wcmlhdGUsIHNvIGVudHJpZXMgd291bGQgc3RheSBpbiBjYWNoZSBldmVuIHdoZW4gdGhleSBoYXZlCiAgICAgYmVjb21lIGludmFsaWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBSaWNoIFNhbHogPHJzYWx6QHpvbGVyYS5jb20+CgogICopIENoYW5nZSBzc2wyM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczIzX3NydnIuYykgYmVoYXZpb3VyIHdoZW4KICAgICBmYWNlZCB3aXRoIGEgcGF0aG9sb2dpY2FsbHkgc21hbGwgQ2xpZW50SGVsbG8gZnJhZ21lbnQgdGhhdCBkb2VzCiAgICAgbm90IGNvbnRhaW4gY2xpZW50X3ZlcnNpb246IEluc3RlYWQgb2YgYWJvcnRpbmcgd2l0aCBhbiBlcnJvciwKICAgICBzaW1wbHkgY2hvb3NlIHRoZSBoaWdoZXN0IGF2YWlsYWJsZSBwcm90b2NvbCB2ZXJzaW9uIChpLmUuLAogICAgIFRMUyAxLjAgdW5sZXNzIGl0IGlzIGRpc2FibGVkKS4gIEluIHByYWN0aWNlLCBDbGllbnRIZWxsbwogICAgIG1lc3NhZ2VzIGFyZSBuZXZlciBzZW50IGxpa2UgdGhpcywgYnV0IHRoaXMgY2hhbmdlIGdpdmVzIHVzCiAgICAgc3RyaWN0bHkgY29ycmVjdCBiZWhhdmlvdXIgYXQgbGVhc3QgZm9yIFRMUy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggU1NMIGhhbmRzaGFrZSBmdW5jdGlvbnMgYW5kIFNTTF9jbGVhcigpIHN1Y2ggdGhhdCBTU0xfY2xlYXIoKQogICAgIG5ldmVyIHJlc2V0cyBzLT5tZXRob2QgdG8gcy0+Y3R4LT5tZXRob2Qgd2hlbiBjYWxsZWQgZnJvbSB3aXRoaW4KICAgICBvbmUgb2YgdGhlIFNTTCBoYW5kc2hha2UgZnVuY3Rpb25zLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTmlrbyBCYXJpY10KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczNfc3J2ci5jKSwgZ2VuZXJhdGUgYSBmYXRhbCBhbGVydAogICAgIChzZW50IHVzaW5nIHRoZSBjbGllbnQncyB2ZXJzaW9uIG51bWJlcikgaWYgY2xpZW50X3ZlcnNpb24gaXMKICAgICBzbWFsbGVyIHRoYW4gdGhlIHByb3RvY29sIHZlcnNpb24gaW4gdXNlLiAgQWxzbyBjaGFuZ2UKICAgICBzc2wyM19nZXRfY2xpZW50X2hlbGxvIChzc2wvczIzX3NydnIuYykgdG8gc2VsZWN0IFRMUyAxLjAgaWYKICAgICB0aGUgY2xpZW50IGRlbWFuZGVkIFNTTCAzLjAgYnV0IG9ubHkgVExTIDEuMCBpcyBlbmFibGVkOyB0aGVuCiAgICAgdGhlIGNsaWVudCB3aWxsIGF0IGxlYXN0IHNlZSB0aGF0IGFsZXJ0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSB0byBoYW5kbGUgbWVzc2FnZSBmcmFnbWVudGF0aW9uCiAgICAgY29ycmVjdGx5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGluZmluaXRlIGxvb3AgaW4gc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgaWYgYQogICAgIGNsaWVudCByZWNlaXZlcyBIZWxsb1JlcXVlc3Qgd2hpbGUgaW4gYSBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgYnVnIG5vdGljZWQgYnkgQW5keSBTY2huZWlkZXIgPGFuZHkuc2NobmVpZGVyQGJqc3MuY28udWs+XQoKICAqKSBCdWdmaXggaW4gc3NsM19hY2NlcHQgKHNzbC9zM19zcnZyLmMpOiBDYXNlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0MKICAgICBzaG91bGQgZW5kIGluICdicmVhaycsIG5vdCAnZ290byBlbmQnIHdoaWNoIGNpcmN1bWVudHMgdmFyaW91cwogICAgIGNsZWFudXBzIGRvbmUgaW4gc3RhdGUgU1NMX1NUX09LLiAgIEJ1dCBzZXNzaW9uIHJlbGF0ZWQgc3R1ZmYKICAgICBtdXN0IGJlIGRpc2FibGVkIGZvciBTU0xfU1RfT0sgaW4gdGhlIGNhc2UgdGhhdCB3ZSBqdXN0IHNlbnQgYQogICAgIEhlbGxvUmVxdWVzdC4KCiAgICAgQWxzbyBhdm9pZCBzb21lIG92ZXJoZWFkIGJ5IG5vdCBjYWxsaW5nIHNzbF9pbml0X3diaW9fYnVmZmVyKCkKICAgICBiZWZvcmUganVzdCBzZW5kaW5nIGEgSGVsbG9SZXF1ZXN0LgogICAgIFtCb2RvIE1vZWxsZXIsIEVyaWMgUmVzY29ybGEgPGVrckBydGZtLmNvbT5dCgogICopIEZpeCBzc2wvczNfZW5jLmMsIHNzbC90MV9lbmMuYyBhbmQgc3NsL3MzX3BrdC5jIHNvIHRoYXQgd2UgZG9uJ3QKICAgICByZXZlYWwgd2hldGhlciBpbGxlZ2FsIGJsb2NrIGNpcGhlciBwYWRkaW5nIHdhcyBmb3VuZCBvciBhIE1BQwogICAgIHZlcmlmaWNhdGlvbiBlcnJvciBvY2N1cmVkLiAgKE5laXRoZXIgU1NMZXJyKCkgY29kZXMgbm9yIGFsZXJ0cwogICAgIGFyZSBkaXJlY3RseSB2aXNpYmxlIHRvIHBvdGVudGlhbCBhdHRhY2tlcnMsIGJ1dCB0aGUgaW5mb3JtYXRpb24KICAgICBtYXkgbGVhayB2aWEgbG9nZmlsZXMuKQoKICAgICBTaW1pbGFyIGNoYW5nZXMgYXJlIG5vdCByZXF1aXJlZCBmb3IgdGhlIFNTTCAyLjAgaW1wbGVtZW50YXRpb24KICAgICBiZWNhdXNlIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpcyBzZW50IGluIGNsZWFyIGZvciBTU0wgMi4wLAogICAgIGFuZCB0aGUgZXh0cmEgYnl0ZXMgYXJlIGp1c3QgaWdub3JlZC4gIEhvd2V2ZXIgc3NsL3MyX3BrdC5jCiAgICAgZmFpbGVkIHRvIHZlcmlmeSB0aGF0IHRoZSBwdXJwb3J0ZWQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgaXMgaW4KICAgICB0aGUgbGVnYWwgcmFuZ2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIE9wZW5VTklYLTggc3VwcG9ydCBpbmNsdWRpbmcgc2hhcmVkIGxpYnJhcmllcwogICAgIChCb3lkIEx5bm4gR2VyYmVyIDxnZXJiZXJiQHplbmV6LmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbXByb3ZlIFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX09BRVAoKSBjaGVjayBhZ2FpbiB0byBhdm9pZAogICAgICd3cmlzdHdhdGNoIGF0dGFjaycgdXNpbmcgaHVnZSBlbmNvZGluZyBwYXJhbWV0ZXJzIChjZi4KICAgICBKYW1lcyBILiBNYW5nZXIncyBDUllQVE8gMjAwMSBwYXBlcikuICBOb3RlIHRoYXQgdGhlCiAgICAgUlNBX1BLQ1MxX09BRVBfUEFERElORyBjYXNlIG9mIFJTQV9wcml2YXRlX2RlY3J5cHQoKSBkb2VzIG5vdCB1c2UKICAgICBlbmNvZGluZyBwYXJhbWV0ZXJzIGFuZCBoZW5jZSB3YXMgbm90IHZ1bG5lcmFibGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQk5fc3FyKCkgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlciwgcmVwb3J0ZWQgYnkgSmltIEVsbGlzIDxqaW0uZWxsaXNAY2F2aXVtLmNvbT5dCgogICopIFJhYmluLU1pbGxlciB0ZXN0IGFuYWx5c2VzIGFzc3VtZSB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgd2l0bmVzc2VzLAogICAgIHNvIHVzZSBCTl9wc2V1ZG9fcmFuZF9yYW5nZSgpIGluc3RlYWQgb2YgdXNpbmcgQk5fcHNldWRvX3JhbmQoKQogICAgIGZvbGxvd2VkIGJ5IG1vZHVsYXIgcmVkdWN0aW9uLgogICAgIFtCb2RvIE1vZWxsZXI7IHBvaW50ZWQgb3V0IGJ5IEFkYW0gWW91bmcgPEFZb3VuZzFATkNTVVMuSk5KLkNPTT5dCgogICopIEFkZCBCTl9wc2V1ZG9fcmFuZF9yYW5nZSgpIHdpdGggb2J2aW91cyBmdW5jdGlvbmFsaXR5OiBCTl9yYW5kX3JhbmdlKCkKICAgICBlcXVpdmFsZW50IGJhc2VkIG9uIEJOX3BzZXVkb19yYW5kKCkgaW5zdGVhZCBvZiBCTl9yYW5kKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgczNfc3J2ci5jOiBhbGxvdyBzZW5kaW5nIG9mIGxhcmdlIGNsaWVudCBjZXJ0aWZpY2F0ZSBsaXN0cyAoPiAxNiBrQikuCiAgICAgVGhpcyBmdW5jdGlvbiB3YXMgYnJva2VuLCBhcyB0aGUgY2hlY2sgZm9yIGEgbmV3IGNsaWVudCBoZWxsbyBtZXNzYWdlCiAgICAgdG8gaGFuZGxlIFNHQyBkaWQgbm90IGFsbG93IHRoZXNlIGxhcmdlIG1lc3NhZ2VzLgogICAgIChUcmFja2VkIGRvd24gYnkgIkRvdWdsYXMgRS4gRW5nZXJ0IiA8ZGVlbmdlcnRAYW5sLmdvdj4uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYWxlcnQgZGVzY3JpcHRpb25zIGZvciBUTFN2MSB0byBTU0xfYWxlcnRfZGVzY19zdHJpbmdbX2xvbmddKCkuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBidWdneSBiZWhhdmlvdXIgb2YgQklPX2dldF9udW1fcmVuZWdvdGlhdGVzKCkgYW5kIEJJT19jdHJsKCkKICAgICBmb3IgQklPX0NfR0VUX1dSSVRFX0JVRl9TSVpFICgiU3RlcGhlbiBIaW50b24iIDxzaGludG9uQG5ldG9waWEuY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIFJld29yayB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgVHJ1NjQgVW5peC4KICAgICBUaGUgY29uZmlndXJhdGlvbiBwYXJ0IG1ha2VzIHVzZSBvZiBtb2Rlcm4gY29tcGlsZXIgZmVhdHVyZXMgYW5kCiAgICAgc3RpbGwgcmV0YWlucyBvbGQgY29tcGlsZXIgYmVoYXZpb3IgZm9yIHRob3NlIHRoYXQgcnVuIG9sZGVyIHZlcnNpb25zCiAgICAgb2YgdGhlIE9TLiAgVGhlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcGFydCBpbmNsdWRlcyBhIHZhcmlhbnQgdGhhdAogICAgIHVzZXMgdGhlIFJQQVRIIGZlYXR1cmUsIGFuZCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc3BlY2lhbAogICAgIGNvbmZpZ3VyYXRpb24gdGFyZ2V0ICJhbHBoYS1jYy1ycGF0aCIsIHdoaWNoIHdpbGwgbmV2ZXIgYmUgc2VsZWN0ZWQKICAgICBhdXRvbWF0aWNhbGx5LgogICAgIFtUaW0gTW9vbmV5IDxtb29uZXlAZG9nYmVydC5jYy5uZHN1Lk5vRGFrLmVkdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gc3NsM19nZXRfa2V5X2V4Y2hhbmdlIChzc2wvczNfY2xudC5jKSwgY2FsbCBzc2wzX2dldF9tZXNzYWdlKCkKICAgICB3aXRoIHRoZSBzYW1lIG1lc3NhZ2Ugc2l6ZSBhcyBpbiBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KCkuCiAgICAgT3RoZXJ3aXNlLCBpZiBubyBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlIG9jY3VycywgQ2VydGlmaWNhdGVSZXF1ZXN0CiAgICAgbWVzc2FnZXMgbWlnaHQgaW5hZHZlcnRlbnRseSBiZSByZWplY3QgYXMgdG9vIGxvbmcuCiAgICAgW1BldHIgTGFtcGEgPGxhbXBhQGZlZS52dXRici5jej5dCgogICopIEVuaGFuY2VkIHN1cHBvcnQgZm9yIElBLTY0IFVuaXggcGxhdGZvcm1zICh3ZWxsLCBMaW51eCBhbmQgSFAtVVgpLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBNb2RpZmllZCBTU0wgbGlicmFyeSBzdWNoIHRoYXQgdGhlIHZlcmlmeV9jYWxsYmFjayB0aGF0IGhhcyBiZWVuIHNldAogICAgIHNwZWNpZmljbHkgZm9yIGFuIFNTTCBvYmplY3Qgd2l0aCBTU0xfc2V0X3ZlcmlmeSgpIGlzIGFjdHVhbGx5IGJlaW5nCiAgICAgdXNlZC4gQmVmb3JlIHRoZSBjaGFuZ2UsIGEgdmVyaWZ5X2NhbGxiYWNrIHNldCB3aXRoIHRoaXMgZnVuY3Rpb24gd2FzCiAgICAgaWdub3JlZCBhbmQgdGhlIHZlcmlmeV9jYWxsYmFjaygpIHNldCBpbiB0aGUgU1NMX0NUWCBhdCB0aGUgdGltZSBvZgogICAgIHRoZSBjYWxsIHdhcyB1c2VkLiBOZXcgZnVuY3Rpb24gWDUwOV9TVE9SRV9DVFhfc2V0X3ZlcmlmeV9jYigpIGludHJvZHVjZWQKICAgICB0byBhbGxvdyB0aGUgbmVjZXNzYXJ5IHNldHRpbmdzLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBpbiBjcnlwdG8vZHNhL2RzYV9saWIuYyBhbmQgY3J5cHRvL2RoL2RoX2xpYi5jCiAgICAgZXhwbGljaXRseSB0byBOVUxMLCBhcyBhdCBsZWFzdCBvbiBTb2xhcmlzIDggdGhpcyBzZWVtcyBub3QgYWx3YXlzIHRvIGJlCiAgICAgZG9uZSBhdXRvbWF0aWNhbGx5IChpbiBjb250cmFkaWN0aW9uIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIEMKICAgICBzdGFuZGFyZCkuIFRoaXMgbWFkZSBwcm9ibGVtcyB3aGVuIHVzZWQgZnJvbSBPcGVuU1NILgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbiBPcGVuU1NMIDAuOS42YSBhbmQgMC45LjZiLCBjcnlwdG8vZGgvZGhfa2V5LmMgaWdub3JlZAogICAgIGRoLT5sZW5ndGggYW5kIGFsd2F5cyB1c2VkCgogICAgICAgICAgQk5fcmFuZF9yYW5nZShwcml2X2tleSwgZGgtPnApLgoKICAgICBCTl9yYW5kX3JhbmdlKCkgaXMgbm90IG5lY2Vzc2FyeSBmb3IgRGlmZmllLUhlbGxtYW4sIGFuZCB0aGlzCiAgICAgc3BlY2lmaWMgcmFuZ2UgbWFrZXMgRGlmZmllLUhlbGxtYW4gdW5uZWNlc3NhcmlseSBpbmVmZmljaWVudCBpZgogICAgIGRoLT5sZW5ndGggKHJlY29tbWVuZGVkIGV4cG9uZW50IGxlbmd0aCkgaXMgbXVjaCBzbWFsbGVyIHRoYW4gdGhlCiAgICAgbGVuZ3RoIG9mIGRoLT5wLiAgV2UgY291bGQgdXNlIEJOX3JhbmRfcmFuZ2UoKSBpZiB0aGUgb3JkZXIgb2YKICAgICB0aGUgc3ViZ3JvdXAgd2FzIHN0b3JlZCBpbiB0aGUgREggc3RydWN0dXJlLCBidXQgd2Ugb25seSBoYXZlCiAgICAgZGgtPmxlbmd0aC4KCiAgICAgU28gc3dpdGNoIGJhY2sgdG8KCiAgICAgICAgICBCTl9yYW5kKHByaXZfa2V5LCBsLCAuLi4pCgogICAgIHdoZXJlICdsJyBpcyBkaC0+bGVuZ3RoIGlmIHRoaXMgaXMgZGVmaW5lZCwgb3IgQk5fbnVtX2JpdHMoZGgtPnApLTEKICAgICBvdGhlcndpc2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4KCiAgICAgICAgICBSU0FfZWF5X3B1YmxpY19lbmNyeXB0CiAgICAgICAgICBSU0FfZWF5X3ByaXZhdGVfZGVjcnlwdAogICAgICAgICAgUlNBX2VheV9wcml2YXRlX2VuY3J5cHQgKHNpZ25pbmcpCiAgICAgICAgICBSU0FfZWF5X3B1YmxpY19kZWNyeXB0IChzaWduYXR1cmUgdmVyaWZpY2F0aW9uKQoKICAgICAoZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIFJTQV9wdWJsaWNfZW5jcnlwdCwKICAgICBSU0FfcHJpdmF0ZV9kZWNyeXB0LCBSU0FfcHJpdmF0ZV9lbmNyeXB0LCBSU0FfcHVibGljX2RlY3J5cHQpLAogICAgIGFsd2F5cyByZWplY3QgbnVtYmVycyA+PSBuLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgdXNlIGEgbmV3IHNob3J0LXRpbWUgbG9jayBDUllQVE9fTE9DS19SQU5EMgogICAgIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byAnbG9ja2luZ190aHJlYWQnLiAgVGhpcyBpcyBuZWNlc3Nhcnkgb24KICAgICBzeXN0ZW1zIHdoZXJlIGFjY2VzcyB0byAnbG9ja2luZ190aHJlYWQnIChhbiAndW5zaWduZWQgbG9uZycKICAgICB2YXJpYWJsZSkgaXMgbm90IGF0b21pYy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHNldCAnbG9ja2luZ190aHJlYWQnIHRvIGN1cnJlbnQgdGhyZWFkJ3MgSUQKICAgICAqYmVmb3JlKiBzZXR0aW5nIHRoZSAnY3J5cHRvX2xvY2tfcmFuZCcgZmxhZy4gIFRoZSBwcmV2aW91cyBjb2RlIGhhZAogICAgIGEgcmFjZSBjb25kaXRpb24gaWYgMCBpcyBhIHZhbGlkIHRocmVhZCBJRC4KICAgICBbVHJhdmlzIFZpdGVrIDx2aXRla0Byb2d1ZXdhdmUuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgdW5kZXIgSXJpeC4KICAgICBbQWxiZXJ0IENoaW4tQS1Zb3VuZyA8Y2hpbmFAdGhld3JpdHRlbndvcmQuY29tPl0KCiAgKikgQWRkIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGJ1aWxkIG9uIExpbnV4IG9uIGJvdGggYmlnLWVuZGlhbiBhbmQKICAgICBsaXR0bGUtZW5kaWFuIE1JUFMuCiAgICAgW1JhbGYgQmFlY2hsZSA8cmFsZkB1bmkta29ibGVuei5kZT5dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gY3JlYXRlIHNoYXJlZCBsaWJyYXJpZXMgb24gSFAtVVguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZhIGFuZCAwLjkuNmIgIFs5IEp1bCAyMDAxXQoKICAqKSBDaGFuZ2Ugc3NsZWF5X3JhbmRfYnl0ZXMgKGNyeXB0by9yYW5kL21kX3JhbmQuYykKICAgICB0byBhdm9pZCBhIFNTTGVheS9PcGVuU1NMIFBSTkcgd2Vha25lc3MgcG9pbnRlZCBvdXQgYnkKICAgICBNYXJra3UtSnVoYW5pIE8uIFNhYXJpbmVuIDxtYXJra3UtanVoYW5pLnNhYXJpbmVuQG5va2lhLmNvbT46CiAgICAgUFJORyBzdGF0ZSByZWNvdmVyeSB3YXMgcG9zc2libGUgYmFzZWQgb24gdGhlIG91dHB1dCBvZgogICAgIG9uZSBQUk5HIHJlcXVlc3QgYXBwcm9wcmlhdGVseSBzaXplZCB0byBnYWluIGtub3dsZWRnZSBvbgogICAgICdtZCcgZm9sbG93ZWQgYnkgZW5vdWdoIGNvbnNlY3V0aXZlIDEtYnl0ZSBQUk5HIHJlcXVlc3RzCiAgICAgdG8gdHJhdmVyc2UgYWxsIG9mICdzdGF0ZScuCgogICAgIDEuIFdoZW4gdXBkYXRpbmcgJ21kX2xvY2FsJyAodGhlIGN1cnJlbnQgdGhyZWFkJ3MgY29weSBvZiAnbWQnKQogICAgICAgIGR1cmluZyBQUk5HIG91dHB1dCBnZW5lcmF0aW9uLCBoYXNoIGFsbCBvZiB0aGUgcHJldmlvdXMKICAgICAgICAnbWRfbG9jYWwnIHZhbHVlLCBub3QganVzdCB0aGUgaGFsZiB1c2VkIGZvciBQUk5HIG91dHB1dC4KCiAgICAgMi4gTWFrZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gJ3N0YXRlJyBpbmNsdWRlZCBpbnRvIHRoZSBoYXNoCiAgICAgICAgaW5kZXBlbmRlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIFBSTkcgYnl0ZXMgcmVxdWVzdGVkLgoKICAgICBUaGUgZmlyc3QgbWVhc3VyZSBhbG9uZSB3b3VsZCBiZSBzdWZmaWNpZW50IHRvIGF2b2lkCiAgICAgTWFya2t1LUp1aGFuaSdzIGF0dGFjay4gIChBY3R1YWxseSBpdCBoYWQgbmV2ZXIgb2NjdXJyZWQKICAgICB0byBtZSB0aGF0IHRoZSBoYWxmIG9mICdtZF9sb2NhbCcgdXNlZCBmb3IgY2hhaW5pbmcgd2FzIHRoZQogICAgIGhhbGYgZnJvbSB3aGljaCBQUk5HIG91dHB1dCBieXRlcyB3ZXJlIHRha2VuIC0tIEkgaGFkIGFsd2F5cwogICAgIGFzc3VtZWQgdGhhdCB0aGUgc2VjcmV0IGhhbGYgd291bGQgYmUgdXNlZC4pICBUaGUgc2Vjb25kCiAgICAgbWVhc3VyZSBtYWtlcyBzdXJlIHRoYXQgYWRkaXRpb25hbCBkYXRhIGZyb20gJ3N0YXRlJyBpcyBuZXZlcgogICAgIG1peGVkIGludG8gJ21kX2xvY2FsJyBpbiBzbWFsbCBwb3J0aW9uczsgdGhpcyBoZXVyaXN0aWNhbGx5CiAgICAgZnVydGhlciBzdHJlbmd0aGVucyB0aGUgUFJORy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggY3J5cHRvL2JuL2FzbS9taXBzMy5zLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBXaGVuIG9ubHkgdGhlIGtleSBpcyBnaXZlbiB0byAiZW5jIiwgdGhlIElWIGlzIHVuZGVmaW5lZC4gUHJpbnQgb3V0CiAgICAgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlbiBYNTA5X05BTUUgaXMgZW1wdHkgaW4gWDUwOSBwcmludGluZyByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBkc2FfZG9fdmVyaWZ5IChjcnlwdG8vZHNhL2RzYV9vc3NsLmMpLCB2ZXJpZnkgdGhhdCByIGFuZCBzIGFyZQogICAgIHBvc2l0aXZlIGFuZCBsZXNzIHRoYW4gcS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBjaGFuZ2UgKnBvaW50ZXIgaW4gQ1JZUFRPX2FkZF9sb2NrKCkgaXMgYWRkX2xvY2tfY2FsbGJhY2sgaXMKICAgICB1c2VkOiBpdCBpc24ndCB0aHJlYWQgc2FmZSBhbmQgdGhlIGFkZF9sb2NrX2NhbGxiYWNrIHNob3VsZCBoYW5kbGUKICAgICB0aGF0IGl0c2VsZi4KICAgICBbUGF1bCBSb3NlIDxQYXVsLlJvc2VAYnJpZGdlLmNvbT5dCgogICopIFZlcmlmeSB0aGF0IGluY29taW5nIGRhdGEgb2JleXMgdGhlIGJsb2NrIHNpemUgaW4KICAgICBzc2wzX2VuYyAoc3NsL3MzX2VuYy5jKSBhbmQgdGxzMV9lbmMgKHNzbC90MV9lbmMuYykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IE9BRVAgY2hlY2suCiAgICAgW1VsZiBN9mxsZXIsIEJvZG8gTfZsbGVyXQoKICAqKSBUaGUgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41CiAgICAgUlNBIGVuY3J5cHRpb24gd2FzIGFjY2lkZW50YWxseSByZW1vdmVkIGluIHMzX3NydnIuYyBpbiBPcGVuU1NMIDAuOS41CiAgICAgd2hlbiBmaXhpbmcgdGhlIHNlcnZlciBiZWhhdmlvdXIgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmxlICdjbGllbnQKICAgICBoZWxsbycgbWVzc2FnZXMuICAoTm90ZSB0aGF0IHRoZSBhdHRhY2sgaXMgaW1wcmFjdGljYWwgYWdhaW5zdAogICAgIFNTTCAzLjAgYW5kIFRMUyAxLjAgYW55d2F5IGJlY2F1c2UgbGVuZ3RoIGFuZCB2ZXJzaW9uIGNoZWNraW5nCiAgICAgbWVhbnMgdGhhdCB0aGUgcHJvYmFiaWxpdHkgb2YgZ3Vlc3NpbmcgYSB2YWxpZCBjaXBoZXJ0ZXh0IGlzCiAgICAgYXJvdW5kIDJeLTQwOyBzZWUgc2VjdGlvbiA1IGluIEJsZWljaGVuYmFjaGVyJ3MgQ1JZUFRPICc5OAogICAgIHBhcGVyLikKCiAgICAgQmVmb3JlIDAuOS41LCB0aGUgY291bnRlcm1lYXN1cmUgKGhpZGUgdGhlIGVycm9yIGJ5IGdlbmVyYXRpbmcgYQogICAgIHJhbmRvbSAnZGVjcnlwdGlvbiByZXN1bHQnKSBkaWQgbm90IHdvcmsgcHJvcGVybHkgYmVjYXVzZQogICAgIEVSUl9jbGVhcl9lcnJvcigpIHdhcyBtaXNzaW5nLCBtZWFuaW5nIHRoYXQgU1NMX2dldF9lcnJvcigpIHdvdWxkCiAgICAgZGV0ZWN0IHRoZSBzdXBwb3NlZGx5IGlnbm9yZWQgZXJyb3IuCgogICAgIEJvdGggcHJvYmxlbXMgYXJlIG5vdyBmaXhlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vYmlvL2JmX2J1ZmYuYywgaW5jcmVhc2UgREVGQVVMVF9CVUZGRVJfU0laRSB0byA0MDk2CiAgICAgKHByZXZpb3VzbHkgaXQgd2FzIDEwMjQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgY29tcGF0aWJpbGl0eSBtb2RlIHRydXN0IHNldHRpbmdzOiBpZ25vcmUgdHJ1c3Qgc2V0dGluZ3MKICAgICB1bmxlc3Mgc29tZSB2YWxpZCB0cnVzdCBvciByZWplY3Qgc2V0dGluZ3MgYXJlIHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZvciBibG93ZmlzaCBFVlA6IGl0cyBhIHZhcmlhYmxlIGxlbmd0aCBjaXBoZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHZhcmlvdXMgYnVncyByZWxhdGVkIHRvIERTQSBTL01JTUUgdmVyaWZpY2F0aW9uLiBIYW5kbGUgbWlzc2luZwogICAgIHBhcmFtZXRlcnMgaW4gRFNBIHB1YmxpYyBrZXkgc3RydWN0dXJlcyBhbmQgcmV0dXJuIGFuIGVycm9yIGluIHRoZQogICAgIERTQSByb3V0aW5lcyBpZiBwYXJhbWV0ZXJzIGFyZSBhYnNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gdmVyc2lvbnMgdXAgdG8gMC45LjYsIFJBTkRfZmlsZV9uYW1lKCkgcmVzb3J0ZWQgdG8gZmlsZSAiLnJuZCIKICAgICBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgaWYgbmVpdGhlciAkUkFOREZJTEUgbm9yICRIT01FIHdhcyBzZXQuCiAgICAgUkFORF9maWxlX25hbWUoKSBpbiAwLjkuNmEgcmV0dXJuZWQgTlVMTCBpbiB0aGlzIGNhc2UuICBUaGlzIGhhcwogICAgIGNhdXNlZCBzb21lIGNvbmZ1c2lvbiB0byBXaW5kb3dzIHVzZXJzIHdobyBoYXZlbid0IGRlZmluZWQgJEhPTUUuCiAgICAgVGh1cyBSQU5EX2ZpbGVfbmFtZSgpIGlzIGNoYW5nZWQgYWdhaW46IGVfb3MuaCBjYW4gZGVmaW5lIGEKICAgICBERUZBVUxUX0hPTUUsIHdoaWNoIHdpbGwgYmUgdXNlZCBpZiAkSE9NRSBpcyBub3Qgc2V0LgogICAgIEZvciBXaW5kb3dzLCB3ZSB1c2UgIkM6Ijsgb24gb3RoZXIgcGxhdGZvcm1zLCB3ZSBzdGlsbCByZXF1aXJlCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKICAqKSBNb3ZlICdpZiAoIWluaXRpYWxpemVkKSBSQU5EX3BvbGwoKScgaW50byByZWdpb25zIHByb3RlY3RlZCBieQogICAgIENSWVBUT19MT0NLX1JBTkQuICBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBhdm9pZHMKICAgICBoYXZpbmcgbXVsdGlwbGUgdGhyZWFkcyBjYWxsIFJBTkRfcG9sbCgpIGNvbmN1cnJlbnRseS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMsIHJlcGxhY2UgJ2FkZF9kb19ub3RfbG9jaycgZmxhZyBieSBhCiAgICAgY29tYmluYXRpb24gb2YgYSBmbGFnIGFuZCBhIHRocmVhZCBJRCB2YXJpYWJsZS4KICAgICBPdGhlcndpc2Ugd2hpbGUgb25lIHRocmVhZCBpcyBpbiBzc2xlYXlfcmFuZF9ieXRlcyAod2hpY2ggc2V0cyB0aGUKICAgICBmbGFnKSwgKm90aGVyKiB0aHJlYWRzIGNhbiBlbnRlciBzc2xlYXlfYWRkX2J5dGVzIHdpdGhvdXQgb2JleWluZwogICAgIHRoZSBDUllQVE9fTE9DS19SQU5EIGxvY2sgKGFuZCBtYXkgZXZlbiBpbGxlZ2FsbHkgcmVsZWFzZSB0aGUgbG9jawogICAgIHRoYXQgdGhleSBkbyBub3QgaG9sZCBhZnRlciB0aGUgZmlyc3QgdGhyZWFkIHVuc2V0cyBhZGRfZG9fbm90X2xvY2spLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBiY3Rlc3QgYWdhaW46ICcteCcgZXhwcmVzc2lvbnMgYXJlIG5vdCBhdmFpbGFibGUgaW4gYWxsCiAgICAgdmVyc2lvbnMgb2YgJ3Rlc3QnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42IGFuZCAwLjkuNmEgIFs1IEFwciAyMDAxXQoKICAqKSBGaXggYSBjb3VwbGUgb2YgbWVtb3J5IGxlYWtzIGluIFBLQ1M3X2RhdGFEZWNvZGUoKQogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEhleXVuIFpoZW5nIDxoemhlbmdAYXRkc3ByaW50LmNvbT5dCgogICopIENoYW5nZSBDb25maWd1cmUgYW5kIE1ha2VmaWxlcyB0byBwcm92aWRlIEVYRV9FWFQsIHdoaWNoIHdpbGwgY29udGFpbgogICAgIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS4gIEFsc28sIG1ha2UgdGhlIHBlcmwKICAgICBzY3JpcHRzIHRoYXQgdXNlIHN5bWxpbmsoKSB0byB0ZXN0IGlmIGl0IHJlYWxseSBleGlzdHMgYW5kIHVzZSAiY3AiCiAgICAgaWYgaXQgZG9lc24ndC4gIEFsbCB0aGlzIG1hZGUgT3BlblNTTCBjb21waWxhYmxlIGFuZCBpbnN0YWxsYWJsZSBpbgogICAgIEN5Z1dpbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIGFzbjFfR2V0U2VxdWVuY2UoKSBmb3IgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZGF0YS4KICAgICBJZiBTRVFVRU5DRSBpcyBsZW5ndGggaXMgaW5kZWZpbml0ZSBqdXN0IHNldCBjLT5zbGVuIHRvIHRoZSB0b3RhbAogICAgIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBzaGlnZUBGcmVlQlNELm9yZ10KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBDaGFuZ2UgYmN0ZXN0IHRvIGF2b2lkIGhlcmUtZG9jdW1lbnRzIGluc2lkZSBjb21tYW5kIHN1YnN0aXR1dGlvbgogICAgICh3b3JrYXJvdW5kIGZvciBGcmVlQlNEIC9iaW4vc2ggYnVnKS4KICAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFVsdHJpeCwgYXZvaWQgc2hlbGwgZnVuY3Rpb25zIChpbnRyb2R1Y2VkCiAgICAgaW4gdGhlIGJjdGVzdCB2ZXJzaW9uIHRoYXQgc2VhcmNoZXMgYWxvbmcgJFBBVEgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbmFtZSAnZGVzX2VuY3J5cHQnIHRvICdkZXNfZW5jcnlwdDEnLiAgVGhpcyBhdm9pZHMgdGhlIGNsYXNoZXMKICAgICB3aXRoIGRlc19lbmNyeXB0KCkgZGVmaW5lZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBsaWtlIFNvbGFyaXMKICAgICBhbmQgVW5peFdhcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hlY2sgdGhlIHJlc3VsdCBvZiBSU0EtQ1JUIChzZWUgRC4gQm9uZWgsIFIuIERlTWlsbG8sIFIuIExpcHRvbjoKICAgICBPbiB0aGUgSW1wb3J0YW5jZSBvZiBFbGltaW5hdGluZyBFcnJvcnMgaW4gQ3J5cHRvZ3JhcGhpYwogICAgIENvbXB1dGF0aW9ucywgSi4gQ3J5cHRvbG9neSAxNCAoMjAwMSkgMiwgMTAxLTExOSwKICAgICBodHRwOi8vdGhlb3J5LnN0YW5mb3JkLmVkdS9+ZGFiby9wYXBlcnMvZmF1bHRzLnBzLmd6KS4KICAgICBbVWxmIE1vZWxsZXJdCiAgCiAgKikgTUlQUyBhc3NlbWJsZXIgQklHTlVNIGRpdmlzaW9uIGJ1ZyBmaXguIAogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBEaXNhYmxlZCBpbmNvcnJlY3QgQWxwaGEgYXNzZW1ibGVyIGNvZGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IFBLQ1MjNyBkZWNvZGUgcm91dGluZXMgc28gdGhleSBjb3JyZWN0bHkgdXBkYXRlIHRoZSBsZW5ndGgKICAgICBhZnRlciByZWFkaW5nIGFuIEVPQyBmb3IgdGhlIEVYUExJQ0lUIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIEZpeCBidWcgaW4gUEtDUyMxMiBrZXkgZ2VuZXJhdGlvbiByb3V0aW5lcy4gVGhpcyB3YXMgdHJpZ2dlcmVkCiAgICAgaWYgYSAzREVTIGtleSB3YXMgZ2VuZXJhdGVkIHdpdGggYSAwIGluaXRpYWwgYnl0ZS4gSW5jbHVkZQogICAgIFBLQ1MxMl9CUk9LRU5fS0VZR0VOIGNvbXBpbGF0aW9uIG9wdGlvbiB0byByZXRhaW4gdGhlIG9sZAogICAgIChidXQgYnJva2VuKSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBiY3Rlc3QgdG8gc2VhcmNoIGZvciBhIHdvcmtpbmcgYmMgYWxvbmcgJFBBVEggYW5kIHByaW50CiAgICAgaXQgd2hlbiBmb3VuZC4KICAgICBbVGltIFJpY2UgPHRpbUBtdWx0aXRhbGVudHMubmV0PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIGVyci5jOiBmcmVlIGVycl9kYXRhIHN0cmluZyBpZiBuZWNlc3Nhcnk7CiAgICAgZG9uJ3Qgd3JpdGUgdG8gdGhlIHdyb25nIGluZGV4IGluIEVSUl9zZXRfZXJyb3JfZGF0YS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbXBsZW1lbnQgc3NsMjNfcGVlayAoYW5hbG9nb3VzIHRvIHNzbDIzX3JlYWQpLCB3aGljaCBwcmV2aW91c2x5CiAgICAgZGlkIG5vdCBleGlzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXBsYWNlIHJkdHNjIHdpdGggX2VtaXQgc3RhdGVtZW50cyBmb3IgVkMrKyB2ZXJzaW9uIDUuCiAgICAgW0plcmVteSBDb29wZXIgPGplcmVteUBiYXltb28ub3JnPl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byByZXVzZSBTU0x2MiBzZXNzaW9ucy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBjb3B5X2VtYWlsKCkgY2hlY2sgZm9yID49IDAgYXMgYSByZXR1cm4gdmFsdWUgZm9yCiAgICAgWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQoKSBzaW5jZSAwIGlzIGEgdmFsaWQgaW5kZXguCiAgICAgW1N0ZXZlIEhlbnNvbiByZXBvcnRlZCBieSBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBvcGVuc2NhLm9yZz5dCgogICopIEF2b2lkIGNvcmVkdW1wIHdpdGggdW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBwdWJsaWMga2V5cyBieSBjaGVja2luZyBpZgogICAgIFg1MDlfZ2V0X3B1YmtleSgpIGZhaWxzIGluIFBLQ1M3X3ZlcmlmeSgpLiBGaXggbWVtb3J5IGxlYWsgd2hlbgogICAgIFBLQ1M3X3ZlcmlmeSgpIGZhaWxzIHdpdGggbm9uIGRldGFjaGVkIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRG9uJ3QgdXNlIGdldGVudiBpbiBsaWJyYXJ5IGZ1bmN0aW9ucyB3aGVuIHJ1biBhcyBzZXR1aWQvc2V0Z2lkLgogICAgIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2lzc2V0dWdpZCgpLgogICAgIFtVbGYgTW9lbGxlcl0KCiAgKikgQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGluIG1lbW9yeSBsZWFrIGRldGVjdGlvbiBjb2RlIChjcnlwdG8vbWVtX2RiZy5jKQogICAgIGR1ZSB0byBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgbXVsdGktdGhyZWFkaW5nOgoKICAgICAxLiBGaXggdGltaW5nIGdsaXRjaCBpbiB0aGUgTWVtQ2hlY2tfb2ZmKCkgcG9ydGlvbiBvZiBDUllQVE9fbWVtX2N0cmwoKS4KCiAgICAgMi4gRml4IGxvZ2ljYWwgZ2xpdGNoIGluIGlzX01lbUNoZWNrX29uKCkgYWthIENSWVBUT19pc19tZW1fY2hlY2tfb24oKS4KCiAgICAgMy4gQ291bnQgaG93IG1hbnkgdGltZXMgTWVtQ2hlY2tfb2ZmKCkgaGFzIGJlZW4gY2FsbGVkIHNvIHRoYXQKICAgICAgICBuZXN0ZWQgdXNlIGNhbiBiZSB0cmVhdGVkIGNvcnJlY3RseS4gIFRoaXMgYWxzbyBhdm9pZHMgCiAgICAgICAgaW5iYW5kLXNpZ25hbGxpbmcgaW4gdGhlIHByZXZpb3VzIGNvZGUgKHdoaWNoIHJlbGllZCBvbiB0aGUKICAgICAgICBhc3N1bXB0aW9uIHRoYXQgdGhyZWFkIElEIDAgaXMgaW1wb3NzaWJsZSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkICItcmFuZCIgb3B0aW9uIGFsc28gdG8gc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggQ1BVIGRldGVjdGlvbiBvbiBJcml4IDYueC4KICAgICBbS3VydCBIb2NrZW5idXJ5IDxraG9ja2VuYkBzdGV2ZW5zLXRlY2guZWR1PiBhbmQKICAgICAgIkJydWNlIFcuIEZvcnNiZXJnIiA8YnJ1Y2UuZm9yc2JlcmdAYmFlc3lzdGVtcy5jb20+XQoKICAqKSBGaXggWDUwOV9OQU1FIGJ1ZyB3aGljaCBwcm9kdWNlZCBpbmNvcnJlY3QgZW5jb2RpbmcgaWYgWDUwOV9OQU1FCiAgICAgd2FzIGVtcHR5LgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgVXNlIHRoZSBjYWNoZWQgZW5jb2Rpbmcgb2YgYW4gWDUwOV9OQU1FIHN0cnVjdHVyZSByYXRoZXIgdGhhbgogICAgIGNvcHlpbmcgaXQuIFRoaXMgaXMgYXBwYXJlbnRseSB0aGUgcmVhc29uIGZvciB0aGUgbGlic2FmZSAiZXJyb3JzIgogICAgIGJ1dCB0aGUgY29kZSBpcyBhY3R1YWxseSBjb3JyZWN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24gQk5fcmFuZF9yYW5nZSgpLCBhbmQgZml4IERTQV9zaWduX3NldHVwKCkgdG8gcHJldmVudAogICAgIEJsZWljaGVuYmFjaGVyJ3MgRFNBIGF0dGFjay4KICAgICBFeHRlbmQgQk5fW3BzZXVkb19dcmFuZDogQXMgYmVmb3JlLCB0b3A9MSBmb3JjZXMgdGhlIGhpZ2hlc3QgdHdvIGJpdHMKICAgICB0byBiZSBzZXQgYW5kIHRvcD0wIGZvcmNlcyB0aGUgaGlnaGVzdCBiaXQgdG8gYmUgc2V0OyB0b3A9LTEgaXMgbmV3CiAgICAgYW5kIGxlYXZlcyB0aGUgaGlnaGVzdCBiaXQgcmFuZG9tLgogICAgIFtVbGYgTW9lbGxlciwgQm9kbyBNb2VsbGVyXQoKICAqKSBJbiB0aGUgTkNPTkZfLi4uLWJhc2VkIGltcGxlbWVudGF0aW9ucyBmb3IgQ09ORl8uLi4gcXVlcmllcwogICAgIChjcnlwdG8vY29uZi9jb25mX2xpYi5jKSwgaWYgdGhlIGlucHV0IExIQVNIIGlzIE5VTEwsIGF2b2lkIHVzaW5nCiAgICAgYSB0ZW1wb3JhcnkgQ09ORiBzdHJ1Y3R1cmUgd2l0aCB0aGUgZGF0YSBjb21wb25lbnQgc2V0IHRvIE5VTEwKICAgICAod2hpY2ggZ2l2ZXMgc2VnbWVudGF0aW9uIGZhdWx0cyBpbiBsaF9yZXRyaWV2ZSkuCiAgICAgSW5zdGVhZCwgdXNlIE5VTEwgZm9yIHRoZSBDT05GIHBvaW50ZXIgaW4gQ09ORl9nZXRfc3RyaW5nIGFuZAogICAgIENPTkZfZ2V0X251bWJlciAod2hpY2ggbWF5IHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMpIGFuZCBkaXJlY3RseQogICAgIHJldHVybiBOVUxMIGZyb20gQ09ORl9nZXRfc2VjdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVuIGZvciBFQkNESUMuCiAgICAgW1VsZiBNb2VsbGVyXQoKICAqKSBUb2xlcmF0ZSBub25SZXB1ZGlhdGlvbiBhcyBiZWluZyB2YWxpZCBmb3IgUy9NSU1FIHNpZ25pbmcgYW5kIGNlcnRTaWduCiAgICAga2V5VXNhZ2UgaWYgYmFzaWNDb25zdHJhaW50cyBhYnNlbnQgZm9yIGEgQ0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBTTUlNRV93cml0ZV9QS0NTNygpIHdyaXRlIG1haWwgaGVhZGVyIHZhbHVlcyB3aXRoIGEgZm9ybWF0IHRoYXQKICAgICBpcyBtb3JlIGdlbmVyYWxseSBhY2NlcHRlZCAobm8gc3BhY2VzIGJlZm9yZSB0aGUgc2VtaWNvbG9uKSwgc2luY2UKICAgICBzb21lIHByb2dyYW1zIGNhbid0IHBhcnNlIHRob3NlIHZhbHVlcyBwcm9wZXJseSBvdGhlcndpc2UuICBBbHNvIG1ha2UKICAgICBzdXJlIEJJTydzIHRoYXQgYnJlYWsgbGluZXMgYWZ0ZXIgZWFjaCB3cml0ZSBkbyBub3QgY3JlYXRlIGludmFsaWQKICAgICBoZWFkZXJzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgdGhlIENSTCBlbmNvZGluZyByb3V0aW5lcyB3b3JrIHdpdGggZW1wdHkgU0VRVUVOQ0UgT0YuIFRoZQogICAgIG1hY3JvcyBwcmV2aW91c2x5IHVzZWQgd291bGQgbm90IGVuY29kZSBhbiBlbXB0eSBTRVFVRU5DRSBPRgogICAgIGFuZCBicmVhayB0aGUgc2lnbmF0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgWmVybyB0aGUgcHJlbWFzdGVyIHNlY3JldCBhZnRlciBkZXJpdmluZyB0aGUgbWFzdGVyIHNlY3JldCBpbgogICAgIERIIGNpcGhlcnN1aXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc29tZSBFVlBfYWRkX2RpZ2VzdF9hbGlhcyByZWdpc3RyYXRpb25zIChhcyBmb3VuZCBpbgogICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCkpIHRvIFNTTF9saWJyYXJ5X2luaXQoKQogICAgIGFrYSBPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpLiAgVGhpcyBwcm92aWRlcyBpbXByb3ZlZAogICAgIGNvbXBhdGliaWxpdHkgd2l0aCBwZWVycyB1c2luZyBYLjUwOSBjZXJ0aWZpY2F0ZXMKICAgICB3aXRoIHVuY29udmVudGlvbmFsIEFsZ29yaXRobUlkZW50aWZpZXIgT0lEcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIElyaXggd2l0aCBOT19BU00uCiAgICAgWyJCcnVjZSBXLiBGb3JzYmVyZyIgPGJydWNlLmZvcnNiZXJnQGJhZXN5c3RlbXMuY29tPl0KCiAgKikgLi9jb25maWcgc2NyaXB0IGZpeGVzLgogICAgIFtVbGYgTW9lbGxlciwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggJ29wZW5zc2wgcGFzc3dkIC0xJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgUEtDUzEyX2tleV9nZW5fYXNjKCkgc28gaXQgY2FuIGNvcGUgd2l0aCBub24gbnVsbAogICAgIHRlcm1pbmF0ZWQgc3RyaW5ncyB3aG9zZSBsZW5ndGggaXMgcGFzc2VkIGluIHRoZSBwYXNzbGVuCiAgICAgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZSBmcm9tIFBFTSBjYWxsYmFja3MuIFRoaXMgd2FzIGRvbmUKICAgICBieSBhZGRpbmcgYW4gZXh0cmEgbGVuZ3RoIHBhcmFtZXRlciB0byBhc2MydW5pKCkuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgPG9kZGlzc2V5QHNhbXN1bmcuY28ua3I+XQoKICAqKSBGaXggQyBjb2RlIGdlbmVyYXRlZCBieSAnb3BlbnNzbCBkc2FwYXJhbSAtQyc6IElmIGEgQk5fYmluMmJuCiAgICAgY2FsbCBmYWlsZWQsIGZyZWUgdGhlIERTQSBzdHJ1Y3R1cmUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHRvIHVuaTJhc2MoKSB0byBjb3BlIHdpdGggemVybyBsZW5ndGggVW5pY29kZSBzdHJpbmdzLgogICAgIFRoZXNlIGFyZSBwcmVzZW50IGluIHNvbWUgUEtDUyMxMiBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbmNyZWFzZSBzMi0+d2J1ZiBhbGxvY2F0aW9uIGJ5IG9uZSBieXRlIGluIHNzbDJfbmV3IChzc2wvczJfbGliLmMpLgogICAgIE90aGVyd2lzZSBkb19zc2xfd3JpdGUgKHNzbC9zMl9wa3QuYykgd2lsbCB3cml0ZSBiZXlvbmQgYnVmZmVyIGxpbWl0cwogICAgIHdoZW4gd3JpdGluZyBhIDMyNzY3IGJ5dGUgcmVjb3JkLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcmVwb3J0ZWQgYnkgRXJpYyBEYXkgPGVkYXlAY29uY2VudHJpYy5uZXQ+XQoKICAqKSBJbiBSU0FfZWF5X3B1YmxpY197ZW4sZWR9Y3J5cHQgYW5kIFJTQV9lYXlfbW9kX2V4cCAocnNhX2VheS5jKSwKICAgICBvYnRhaW4gbG9jayBDUllQVE9fTE9DS19SU0EgYmVmb3JlIHNldHRpbmcgcnNhLT5fbWV0aG9kX21vZF97bixwLHF9LgoKICAgICAoUlNBIG9iamVjdHMgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBhY2Nlc3MgdG8gd2hpY2ggaXMgcHJvdGVjdGVkCiAgICAgYnkgQ1JZUFRPX0xPQ0tfUlNBIFtzZWUgcnNhX2xpYi5jLCBzM19zcnZyLmMsIHNzbF9jZXJ0LmMsIHNzbF9yc2EuY10sCiAgICAgc28gdGhleSBhcmUgbWVhbnQgdG8gYmUgc2hhcmVkIGJldHdlZW4gdGhyZWFkcy4pCiAgICAgW0JvZG8gTW9lbGxlciwgR2VvZmYgVGhvcnBlOyBvcmlnaW5hbCBwYXRjaCBzdWJtaXR0ZWQgYnkKICAgICAiUmVkZGllLCBTdGV2ZW4iIDxTdGV2ZW4uUmVkZGllQGNhLmNvbT5dCgogICopIEZpeCBhIGRlYWRsb2NrIGluIENSWVBUT19tZW1fbGVha3MoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgYmV0dGVyIHRlc3QgcGF0dGVybnMgaW4gYm50ZXN0LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSByYW5kX3dpbi5jIGZpeCBmb3IgQm9ybGFuZCBDLgogICAgIFtVbGYgTfZsbGVyXQogCiAgKikgQk5fcnNoaWZ0IGJ1Z2ZpeCBmb3IgbiA9PSAwLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhICdiY3Rlc3QnIHNjcmlwdCB0aGF0IGNoZWNrcyBmb3Igc29tZSBrbm93biAnYmMnIGJ1Z3MKICAgICBzbyB0aGF0ICdtYWtlIHRlc3QnIGRvZXMgbm90IGFib3J0IGp1c3QgYmVjYXVzZSAnYmMnIGlzIGJyb2tlbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdG9yZSB2ZXJpZnlfcmVzdWx0IHdpdGhpbiBTU0xfU0VTU0lPTiBhbHNvIGZvciBjbGllbnQgc2lkZSB0bwogICAgIGF2b2lkIHBvdGVudGlhbCBzZWN1cml0eSBob2xlLiAoUmUtdXNlZCBzZXNzaW9ucyBvbiB0aGUgY2xpZW50IHNpZGUKICAgICBhbHdheXMgcmVzdWx0ZWQgaW4gdmVyaWZ5X3Jlc3VsdD09WDUwOV9WX09LLCBub3QgdXNpbmcgdGhlIG9yaWdpbmFsCiAgICAgcmVzdWx0IG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHNzbDNfcGVuZGluZzogSWYgdGhlIHJlY29yZCBpbiBzLT5zMy0+cnJlYyBpcyBub3Qgb2YgdHlwZQogICAgIFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSwgcmV0dXJuIDAuCiAgICAgU2ltaWxhcmx5LCBjaGFuZ2Ugc3NsMl9wZW5kaW5nIHRvIHJldHVybiAwIGlmIFNTTF9pbl9pbml0KHMpIGlzIHRydWUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFNTTF9wZWVrOgogICAgIEJvdGggc3NsMl9wZWVrIGFuZCBzc2wzX3BlZWssIHdoaWNoIHdlcmUgdG90YWxseSBicm9rZW4gaW4gZWFybGllcgogICAgIHJlbGVhc2VzLCBoYXZlIGJlZW4gcmUtaW1wbGVtZW50ZWQgYnkgcmVuYW1pbmcgdGhlIHByZXZpb3VzCiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHNzbDJfcmVhZCBhbmQgc3NsM19yZWFkIHRvIHNzbDJfcmVhZF9pbnRlcm5hbAogICAgIGFuZCBzc2wzX3JlYWRfaW50ZXJuYWwsIHJlc3BlY3RpdmVseSwgYW5kIGFkZGluZyAncGVlaycgcGFyYW1ldGVycwogICAgIHRvIHRoZW0uICBUaGUgbmV3IHNzbFsyM11fe3JlYWQscGVla30gZnVuY3Rpb25zIGFyZSBjYWxscyB0bwogICAgIHNzbFsyM11fcmVhZF9pbnRlcm5hbCB3aXRoIHRoZSAncGVlaycgZmxhZyBzZXQgYXBwcm9wcmlhdGVseS4KICAgICBBICdwZWVrJyBwYXJhbWV0ZXIgaGFzIGFsc28gYmVlbiBhZGRlZCB0byBzc2wzX3JlYWRfYnl0ZXMsIHdoaWNoCiAgICAgZG9lcyB0aGUgYWN0dWFsIHdvcmsgZm9yIHNzbDNfcmVhZF9pbnRlcm5hbC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsaXNlICJleF9kYXRhIiBtZW1iZXIgb2YgUlNBL0RTQS9ESCBzdHJ1Y3R1cmVzIHByaW9yIHRvIGNhbGxpbmcKICAgICB0aGUgbWV0aG9kLXNwZWNpZmljICJpbml0KCkiIGhhbmRsZXIuIEFsc28gY2xlYW4gdXAgZXhfZGF0YSBhZnRlcgogICAgIGNhbGxpbmcgdGhlIG1ldGhvZC1zcGVjaWZpYyAiZmluaXNoKCkiIGhhbmRsZXIuIFByZXZpb3VzbHksIHRoaXMgd2FzCiAgICAgaGFwcGVuaW5nIHRoZSBvdGhlciB3YXkgcm91bmQuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgSW5jcmVhc2UgQk5fQ1RYX05VTSAodGhlIG51bWJlciBvZiBCSUdOVU1zIGluIGEgQk5fQ1RYKSB0byAxNi4KICAgICBUaGUgcHJldmlvdXMgdmFsdWUsIDEyLCB3YXMgbm90IGFsd2F5cyBzdWZmaWNpZW50IGZvciBCTl9tb2RfZXhwKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBzdXJlIHRoYXQgc2hhcmVkIGxpYnJhcmllcyBnZXQgdGhlIGludGVybmFsIG5hbWUgZW5naW5lIHdpdGgKICAgICB0aGUgZnVsbCB2ZXJzaW9uIG51bWJlciBhbmQgbm90IGp1c3QgMC4gIFRoaXMgc2hvdWxkIG1hcmsgdGhlCiAgICAgc2hhcmVkIGxpYnJhcmllcyBhcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZS4gIE9mIGNvdXJzZSwgdGhpcyBzaG91bGQKICAgICBiZSBjaGFuZ2VkIGFnYWluIHdoZW4gd2UgY2FuIGd1YXJhbnRlZSBiYWNrd2FyZCBiaW5hcnkgY29tcGF0aWJpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggdHlwbyBpbiBnZXRfY2VydF9ieV9zdWJqZWN0KCkgaW4gYnlfZGlyLmMKICAgICBbSmVhbi1NYXJjIERlc3BlcnJpZXIgPGplYW4tbWFyYy5kZXNwZXJyaWVyQGNlcnRwbHVzLmNvbT5dCgogICopIFJld29yayB0aGUgc3lzdGVtIHRvIGdlbmVyYXRlIHNoYXJlZCBsaWJyYXJpZXM6CgogICAgIC0gTWFrZSBub3RlIG9mIHRoZSBleHBlY3RlZCBleHRlbnNpb24gZm9yIHRoZSBzaGFyZWQgbGlicmFyaWVzIGFuZAogICAgICAgaWYgdGhlcmUgaXMgYSBuZWVkIGZvciBzeW1ib2xpYyBsaW5rcyBmcm9tIGZvciBleGFtcGxlIGxpYmNyeXB0by5zby4wCiAgICAgICB0byBsaWJjcnlwdG8uc28uMC45LjcuICBUaGVyZSBpcyBleHRlbmRlZCBpbmZvIGluIENvbmZpZ3VyZSBmb3IKICAgICAgIHRoYXQuCgogICAgIC0gTWFrZSBhcyBmZXcgcmVidWlsZHMgb2YgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYXMgcG9zc2libGUuCgogICAgIC0gU3RpbGwgYXZvaWQgbGlua2luZyB0aGUgT3BlblNTTCBwcm9ncmFtcyB3aXRoIHRoZSBzaGFyZWQgbGlicmFyaWVzLgoKICAgICAtIFdoZW4gaW5zdGFsbGluZywgaW5zdGFsbCB0aGUgc2hhcmVkIGxpYnJhcmllcyBzZXBhcmF0ZWx5IGZyb20gdGhlCiAgICAgICBzdGF0aWMgb25lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggU1NMX0NUWF9zZXRfcmVhZF9haGVhZCBtYWNybyB0byBhY3R1YWxseSB1c2UgaXRzIGFyZ3VtZW50LgoKICAgICBDb3B5IFNTTF9DVFgncyByZWFkX2FoZWFkIGZsYWcgdG8gU1NMIG9iamVjdCBkaXJlY3RseSBpbiBTU0xfbmV3CiAgICAgYW5kIG5vdCBpbiBTU0xfY2xlYXIgYmVjYXVzZSB0aGUgbGF0dGVyIGlzIGFsc28gdXNlZCBieSB0aGUKICAgICBhY2NlcHQvY29ubmVjdCBmdW5jdGlvbnM7IHByZXZpb3VzbHksIHRoZSBzZXR0aW5ncyBtYWRlIGJ5CiAgICAgU1NMX3NldF9yZWFkX2FoZWFkIHdvdWxkIGJlIGxvc3QgZHVyaW5nIHRoZSBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgQW5kZXJzIEdlcnR6IDxnZXJ0ekBlcGFjdC5zZT5dICAgICAKCiAgKikgQ29ycmVjdCB1dGlsL21rZGVmLnBsIHRvIGJlIHNlbGVjdGl2ZSBhYm91dCBkaXNhYmxlZCBhbGdvcml0aG1zLgogICAgIFByZXZpb3VzbHksIGl0IHdvdWxkIGNyZWF0ZSBlbnRyaWVzIGZvciBkaXNhYmxlZWQgYWxnb3JpdGhtcyBubwogICAgIG1hdHRlciB3aGF0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZGVkIHNldmVyYWwgbmV3IG1hbnVhbCBwYWdlcyBmb3IgU1NMXyogZnVuY3Rpb24uCiAgICAgW0x1dHogSmFlbmlja2VdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS41YSBhbmQgMC45LjYgIFsyNCBTZXAgMjAwMF0KCiAgKikgSW4gc3NsMjNfZ2V0X2NsaWVudF9oZWxsbywgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIGZhY2VkCiAgICAgd2l0aCBhbiBpbml0aWFsIFNTTCAzLjAvVExTIHJlY29yZCB0aGF0IGlzIHRvbyBzbWFsbCB0byBjb250YWluIHRoZQogICAgIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgQ2xpZW50SGVsbG8gbWVzc2FnZSwgaS5lLiBjbGllbnRfdmVyc2lvbi4KICAgICAoTm90ZSB0aGF0IHRoaXMgaXMgYSBwYXRob2xvZ2ljIGNhc2UgdGhhdCBwcm9iYWJseSBoYXMgbmV2ZXIgaGFwcGVuZWQKICAgICBpbiByZWFsIGxpZmUuKSAgVGhlIHByZXZpb3VzIGFwcHJvYWNoIHdhcyB0byB1c2UgdGhlIHZlcnNpb24gbnVtYmVyCiAgICAgZnJvbSB0aGUgcmVjb3JkIGhlYWRlciBhcyBhIHN1YnN0aXR1dGU7IGJ1dCBvdXIgcHJvdG9jb2wgY2hvaWNlCiAgICAgc2hvdWxkIG5vdCBkZXBlbmQgb24gdGhhdCBvbmUgYmVjYXVzZSBpdCBpcyBub3QgYXV0aGVudGljYXRlZAogICAgIGJ5IHRoZSBGaW5pc2hlZCBtZXNzYWdlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb3JlIHJvYnVzdCByYW5kb21uZXNzIGdhdGhlcmluZyBmdW5jdGlvbnMgZm9yIFdpbmRvd3MuCiAgICAgW0plZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT5dCgogICopIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgaWYgdGhlIGZsYWcgWDUwOV9WX0ZMQUdfSVNTVUVSX0NIRUNLIGlzCiAgICAgbm90IHNldCB0aGVuIHdlIGRvbid0IHNldHVwIHRoZSBlcnJvciBjb2RlIGZvciBpc3N1ZXIgY2hlY2sgZXJyb3JzCiAgICAgdG8gYXZvaWQgcG9zc2libHkgb3ZlcndyaXRpbmcgb3RoZXIgZXJyb3JzIHdoaWNoIHRoZSBjYWxsYmFjayBkb2VzCiAgICAgaGFuZGxlLiBJZiBhbiBhcHBsaWNhdGlvbiBkb2VzIHNldCB0aGUgZmxhZyB0aGVuIHdlIGFzc3VtZSBpdCBrbm93cwogICAgIHdoYXQgaXQgaXMgZG9pbmcgYW5kIGNhbiBoYW5kbGUgdGhlIG5ldyBpbmZvcm1hdGlvbmFsIGNvZGVzCiAgICAgYXBwcm9wcmlhdGVseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIGEgbmFzdHkgYnVnIGluIEFTTjFfVFlQRSBoYW5kbGluZy4gQVNOMV9UWVBFIGlzIHVzZWQgZm9yCiAgICAgYSBnZW5lcmFsICJBTlkiIHR5cGUsIGFzIHN1Y2ggaXQgc2hvdWxkIGJlIGFibGUgdG8gZGVjb2RlIGFueXRoaW5nCiAgICAgaW5jbHVkaW5nIHRhZ2dlZCB0eXBlcy4gSG93ZXZlciBpdCBkaWRuJ3QgY2hlY2sgdGhlIGNsYXNzIHNvIGl0IHdvdWxkCiAgICAgd3JvbmdseSBpbnRlcnByZXQgdGFnZ2VkIHR5cGVzIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpciB1bml2ZXJzYWwKICAgICBjb3VudGVycGFydCBhbmQgdW5rbm93biB0eXBlcyB3ZXJlIGp1c3QgcmVqZWN0ZWQuIENoYW5nZWQgc28gdGhhdCB0aGUKICAgICB0YWdnZWQgYW5kIHVua25vd24gdHlwZXMgYXJlIGhhbmRsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGEgU0VRVUVOQ0U6CiAgICAgdGhhdCBpcyB0aGUgZW5jb2RpbmcgaXMgc3RvcmVkIGludGFjdC4gVGhlcmUgaXMgYWxzbyBhIG5ldyB0eXBlCiAgICAgIlZfQVNOMV9PVEhFUiIgd2hpY2ggaXMgdXNlZCB3aGVuIHRoZSBjbGFzcyBpcyBub3QgdW5pdmVyc2FsLCBpbiB0aGlzCiAgICAgY2FzZSB3ZSBoYXZlIG5vIGlkZWEgd2hhdCB0aGUgYWN0dWFsIHR5cGUgaXMgc28gd2UganVzdCBsdW1wIHRoZW0gYWxsCiAgICAgdG9nZXRoZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgT24gVk1TLCBzdGRvdXQgbWF5IHZlcnkgd2VsbCBsZWFkIHRvIGEgZmlsZSB0aGF0IGlzIHdyaXR0ZW4gdG8KICAgICBpbiBhIHJlY29yZC1vcmllbnRlZCBmYXNoaW9uLiAgVGhhdCBtZWFucyB0aGF0IGV2ZXJ5IHdyaXRlKCkgd2lsbAogICAgIHdyaXRlIGEgc2VwYXJhdGUgcmVjb3JkLCB3aGljaCB3aWxsIGJlIHJlYWQgc2VwYXJhdGVseSBieSB0aGUKICAgICBwcm9ncmFtcyB0cnlpbmcgdG8gcmVhZCBmcm9tIGl0LiAgVGhpcyBjYW4gYmUgdmVyeSBjb25mdXNpbmcuCgogICAgIFRoZSBzb2x1dGlvbiBpcyB0byBwdXQgYSBCSU8gZmlsdGVyIGluIHRoZSB3YXkgdGhhdCB3aWxsIGJ1ZmZlcgogICAgIHRleHQgdW50aWwgYSBsaW5lZmVlZCBpcyByZWFjaGVkLCBhbmQgdGhlbiB3cml0ZSBldmVyeXRoaW5nIGEKICAgICBsaW5lIGF0IGEgdGltZSwgc28gZXZlcnkgcmVjb3JkIHdyaXR0ZW4gd2lsbCBiZSBhbiBhY3R1YWwgbGluZSwKICAgICBub3QgY2h1bmtzIG9mIGxpbmVzIGFuZCBub3QgKHVzdWFsbHkgZG9lc24ndCBoYXBwZW4sIGJ1dCBJJ3ZlCiAgICAgc2VlbiBpdCBvbmNlKSBzZXZlcmFsIGxpbmVzIGluIG9uZSByZWNvcmQuICBCSU9fZl9saW5lYnVmZmVyKCkgaXMKICAgICB0aGUgYW5zd2VyLgoKICAgICBDdXJyZW50bHksIGl0J3MgYSBWTVMtb25seSBtZXRob2QsIGJlY2F1c2UgdGhhdCdzIHdoZXJlIGl0IGhhcwogICAgIGJlZW4gdGVzdGVkIHdlbGwgZW5vdWdoLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJlbW92ZSAnb3B0aW1pemVkJyBzcXVhcmluZyB2YXJpYW50IGluIEJOX21vZF9tdWxfbW9udGdvbWVyeSwKICAgICBpdCBjYW4gcmV0dXJuIGluY29ycmVjdCByZXN1bHRzLgogICAgIChOb3RlOiBUaGUgYnVnZ3kgdmFyaWFudCB3YXMgbm90IGVuYWJsZWQgaW4gT3BlblNTTCAwLjkuNWEsCiAgICAgYnV0IGl0IHdhcyBpbiAwLjkuNi1iZXRhWzEyXS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRGlzYWJsZSB0aGUgY2hlY2sgZm9yIGNvbnRlbnQgYmVpbmcgcHJlc2VudCB3aGVuIHZlcmlmeWluZyBkZXRhY2hlZAogICAgIHNpZ25hdHVyZXMgaW4gcGs3X3NtaW1lLmMuIFNvbWUgdmVyc2lvbnMgb2YgTmV0c2NhcGUgKHdyb25nbHkpCiAgICAgaW5jbHVkZSB6ZXJvIGxlbmd0aCBjb250ZW50IHdoZW4gc2lnbmluZyBtZXNzYWdlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQklPX3NodXRkb3duX3dyIG1hY3JvLCB3aGljaCBpbnZva2VzIHRoZSBCSU9fQ19TSFVURE9XTl9XUgogICAgIEJJT19jdHJsIChmb3IgQklPIHBhaXJzKS4KICAgICBbQm9kbyBN9mxsZXJdCgogICopIEFkZCBEU08gbWV0aG9kIGZvciBWTVMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQnVnIGZpeDogTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBjb3VsZCBwcm9kdWNlIHJlc3VsdHMgd2l0aCB0aGUKICAgICB3cm9uZyBzaWduLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgUlBNIHNwZWNpZmljYXRpb24gb3BlbnNzbC5zcGVjIGFuZCBtb2RpZnkgaXQgdG8gYnVpbGQgdGhyZWUKICAgICBwYWNrYWdlcy4gIFRoZSBkZWZhdWx0IHBhY2thZ2UgY29udGFpbnMgYXBwbGljYXRpb25zLCBhcHBsaWNhdGlvbgogICAgIGRvY3VtZW50YXRpb24gYW5kIHJ1bi10aW1lIGxpYnJhcmllcy4gIFRoZSBkZXZlbCBwYWNrYWdlIGNvbnRhaW5zCiAgICAgaW5jbHVkZSBmaWxlcywgc3RhdGljIGxpYnJhcmllcyBhbmQgZnVuY3Rpb24gZG9jdW1lbnRhdGlvbi4gIFRoZQogICAgIGRvYyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBjb250ZW50cyBvZiB0aGUgZG9jIGRpcmVjdG9yeS4gIFRoZSBvcmlnaW5hbAogICAgIG9wZW5zc2wuc3BlYyB3YXMgcHJvdmlkZWQgYnkgRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQogICAgIAogICopIEFkZCBhIGxhcmdlIG51bWJlciBvZiBkb2N1bWVudGF0aW9uIGZpbGVzIGZvciBtYW55IFNTTCByb3V0aW5lcy4KICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT5dCgogICopIEFkZCBhIGNvbmZpZ3VyYXRpb24gZW50cnkgZm9yIFNvbnkgTmV3cyA0LgogICAgIFtOQUtBSkkgSGlyb3l1a2kgPG5ha2FqaUB0dXRycC50dXQuYWMuanA+XQoKICAqKSBEb24ndCBzZXQgdGhlIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMgdG8gb25lIHdoZW4gZ2VuZXJhdGluZyBhCiAgICAgcmFuZG9tIG51bWJlciA8IHEgaW4gdGhlIERTQSBsaWJyYXJ5LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBOZXcgU1NMIEFQSSBtb2RlICdTU0xfTU9ERV9BVVRPX1JFVFJZJy4gIFRoaXMgZGlzYWJsZXMgdGhlIGRlZmF1bHQKICAgICBiZWhhdmlvdXIgdGhhdCBTU0xfcmVhZCBtYXkgcmVzdWx0IGluIFNTTF9FUlJPUl9XQU5UX1JFQUQgKGV2ZW4gaWYKICAgICB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaXMgYmxvY2tpbmcpIGlmIGEgaGFuZHNoYWtlIHRvb2sgcGxhY2UuCiAgICAgKFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBuZWVkZWQgYnkgYXBwbGljYXRpb25zIHN1Y2ggYXMgc19jbGllbnQKICAgICBhbmQgc19zZXJ2ZXIgdGhhdCB1c2Ugc2VsZWN0KCkgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gdXNlIFNTTF9yZWFkOwogICAgIGJ1dCBmb3IgYXBwbGljYXRpb25zIHRoYXQga25vdyBpbiBhZHZhbmNlIHdoZW4gdG8gZXhwZWN0IGRhdGEsIGl0CiAgICAganVzdCBtYWtlcyB0aGluZ3MgbW9yZSBjb21wbGljYXRlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIFJBTkRfZWdkX2J5dGVzKCksIHdoaWNoIGdpdmVzIGNvbnRyb2wgb3ZlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKICAgICBmcm9tIEVHRC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgZmV3IG1vcmUgRUJDRElDIGNvbmRpdGlvbmFscyB0aGF0IG1ha2UgYHJlcScgYW5kIGB4NTA5JwogICAgIHdvcmsgYmV0dGVyIG9uIHN1Y2ggc3lzdGVtcy4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaFAuU2llbWVucy5EZT5dCgogICopIEFkZCB0d28gZGVtbyBwcm9ncmFtcyBmb3IgUEtDUzEyX3BhcnNlKCkgYW5kIFBLQ1MxMl9jcmVhdGUoKS4KICAgICBVcGRhdGUgUEtDUzEyX3BhcnNlKCkgc28gaXQgY29waWVzIHRoZSBmcmllbmRseU5hbWUgYW5kIHRoZQogICAgIGtleWlkIHRvIHRoZSBjZXJ0aWZpY2F0ZXMgYXV4IGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBQS0NTN192ZXJpZnkoKSB3aGljaCBjYXVzZWQgYW4gaW5maW5pdGUgbG9vcAogICAgIGlmIHRoZXJlIHdhcyBtb3JlIHRoYW4gb25lIHNpZ25hdHVyZS4KICAgICBbU3ZlbiBVc3pwZWxrYXQgPHN1QGNlbG9jb20uZGU+XQoKICAqKSBNYWpvciBjaGFuZ2UgaW4gdXRpbC9ta2RlZi5wbCB0byBpbmNsdWRlIGV4dHJhIGluZm9ybWF0aW9uCiAgICAgYWJvdXQgZWFjaCBzeW1ib2wsIGFzIHdlbGwgYXMgcHJlc2VudGlnIHZhcmlhYmxlcyBhcyB3ZWxsCiAgICAgYXMgZnVuY3Rpb25zLiAgVGhpcyBjaGFuZ2UgbWVhbnMgdGhhdCB0aGVyZSdzIG4gbW9yZSBuZWVkCiAgICAgdG8gcmVidWlsZCB0aGUgLm51bSBmaWxlcyB3aGVuIHNvbWUgYWxnb3JpdGhtcyBhcmUgZXhjbHVkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWxsb3cgdGhlIHZlcmlmeSB0aW1lIHRvIGJlIHNldCBieSBhbiBhcHBsaWNhdGlvbiwKICAgICByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgdGhlIGN1cnJlbnQgdGltZS4KICAgICBbU3RldmUgSGVuc29uXQogIAogICopIFBoYXNlIDIgdmVyaWZ5IGNvZGUgcmVvcmdhbmlzYXRpb24uIFRoZSBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmeSBjb2RlIG5vdyBsb29rcyB1cCBhbiBpc3N1ZXIgY2VydGlmaWNhdGUgYnkgYQogICAgIG51bWJlciBvZiBjcml0ZXJpYTogc3ViamVjdCBuYW1lLCBhdXRob3JpdHkga2V5IGlkCiAgICAgYW5kIGtleSB1c2FnZS4gSXQgYWxzbyB2ZXJpZmllcyBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZXMKICAgICBieSB0aGUgc2FtZSBjcml0ZXJpYS4gVGhlIG1haW4gY29tcGFyaXNvbiBmdW5jdGlvbiBpcwogICAgIFg1MDlfY2hlY2tfaXNzdWVkKCkgd2hpY2ggcGVyZm9ybXMgdGhlc2UgY2hlY2tzLgogCiAgICAgTG90IG9mIGNoYW5nZXMgd2VyZSBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzCiAgICAgd2l0aG91dCBjb21wbGV0ZWx5IHJld3JpdGluZyB0aGUgbG9va3VwIGNvZGUuCiAKICAgICBBdXRob3JpdHkgYW5kIHN1YmplY3Qga2V5IGlkZW50aWZpZXIgYXJlIG5vdyBjYWNoZWQuCiAKICAgICBUaGUgTEhBU0ggJ2NlcnRzJyBpcyBYNTA5X1NUT1JFIGhhcyBub3cgYmVlbiByZXBsYWNlZAogICAgIGJ5IGEgU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpLiBUaGlzIGlzIG1haW5seSBiZWNhdXNlIGFuCiAgICAgTEhBU0ggY2FuJ3Qgc3RvcmUgb3IgcmV0cmlldmUgbXVsdGlwbGUgb2JqZWN0cyB3aXRoCiAgICAgdGhlIHNhbWUgaGFzaCB2YWx1ZS4KCiAgICAgQXMgYSByZXN1bHQgdmFyaW91cyBmdW5jdGlvbnMgKHdoaWNoIHdlcmUgYWxsIGludGVybmFsCiAgICAgdXNlIG9ubHkpIGhhdmUgY2hhbmdlZCB0byBoYW5kbGUgdGhlIG5ldyBYNTA5X1NUT1JFCiAgICAgc3RydWN0dXJlLiBUaGlzIHdpbGwgYnJlYWsgYW55dGhpbmcgdGhhdCBtZXNzZWQgcm91bmQKICAgICB3aXRoIFg1MDlfU1RPUkUgaW50ZXJuYWxseS4KIAogICAgIFRoZSBmdW5jdGlvbnMgWDUwOV9TVE9SRV9hZGRfY2VydCgpIG5vdyBjaGVja3MgZm9yIGFuCiAgICAgZXhhY3QgbWF0Y2gsIHJhdGhlciB0aGFuIGp1c3Qgc3ViamVjdCBuYW1lLgogCiAgICAgVGhlIFg1MDlfU1RPUkUgQVBJIGRvZXNuJ3QgZGlyZWN0bHkgc3VwcG9ydCB0aGUgcmV0cmlldmFsCiAgICAgb2YgbXVsdGlwbGUgY2VydGlmaWNhdGVzIG1hdGNoaW5nIGEgZ2l2ZW4gY3JpdGVyaWEsIGhvd2V2ZXIKICAgICB0aGlzIGNhbiBiZSB3b3JrZWQgcm91bmQgYnkgcGVyZm9ybWluZyBhIGxvb2t1cCBmaXJzdAogICAgICh3aGljaCB3aWxsIGZpbGwgdGhlIGNhY2hlIHdpdGggY2FuZGlkYXRlIGNlcnRpZmljYXRlcykKICAgICBhbmQgdGhlbiBleGFtaW5pbmcgdGhlIGNhY2hlIGZvciBtYXRjaGVzLiBUaGlzIGlzIHByb2JhYmx5CiAgICAgdGhlIGJlc3Qgd2UgY2FuIGRvIHdpdGhvdXQgdGhyb3dpbmcgb3V0IFg1MDlfTE9PS1VQCiAgICAgZW50aXJlbHkgKG1heWJlIGxhdGVyLi4uKS4KIAogICAgIFRoZSBYNTA5X1ZFUklGWV9DVFggc3RydWN0dXJlIGhhcyBiZWVuIGVuaGFuY2VkIGNvbnNpZGVyYWJseS4KIAogICAgIEFsbCBjZXJ0aWZpY2F0ZSBsb29rdXAgb3BlcmF0aW9ucyBub3cgZ28gdmlhIGEgZ2V0X2lzc3VlcigpCiAgICAgY2FsbGJhY2suIEFsdGhvdWdoIHRoaXMgY3VycmVudGx5IHVzZXMgYW4gWDUwOV9TVE9SRSBpdAogICAgIGNhbiBiZSByZXBsYWNlZCBieSBjdXN0b20gbG9va3Vwcy4gVGhpcyBpcyBhIHNpbXBsZSB3YXkKICAgICB0byBieXBhc3MgdGhlIFg1MDlfU1RPUkUgaGFja2VyeSBuZWNlc3NhcnkgdG8gbWFrZSB0aGlzCiAgICAgd29yayBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIG1vcmUgZWZmaWNpZW50IHRlY2huaXF1ZXMKICAgICBpbiBmdXR1cmUuIEEgdmVyeSBzaW1wbGUgdmVyc2lvbiB3aGljaCB1c2VzIGEgc2ltcGxlCiAgICAgU1RBQ0sgZm9yIGl0cyB0cnVzdGVkIGNlcnRpZmljYXRlIHN0b3JlIGlzIGFsc28gcHJvdmlkZWQKICAgICB1c2luZyBYNTA5X1NUT1JFX0NUWF90cnVzdGVkX3N0YWNrKCkuCiAKICAgICBUaGUgdmVyaWZ5X2NiKCkgYW5kIHZlcmlmeSgpIGNhbGxiYWNrcyBub3cgaGF2ZSBlcXVpdmFsZW50cwogICAgIGluIHRoZSBYNTA5X1NUT1JFX0NUWCBzdHJ1Y3R1cmUuCiAKICAgICBYNTA5X1NUT1JFX0NUWCBhbHNvIGhhcyBhICdmbGFncycgZmllbGQgd2hpY2ggY2FuIGJlIHVzZWQKICAgICB0byBjdXN0b21pc2UgdGhlIHZlcmlmeSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KIAogICopIEFkZCBuZXcgUEtDUyM3IHNpZ25pbmcgb3B0aW9uIFBLQ1M3X05PU01JTUVDQVAgd2hpY2ggCiAgICAgZXhjbHVkZXMgUy9NSU1FIGNhcGFiaWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaGVuIGEgY2VydGlmaWNhdGUgcmVxdWVzdCBpcyByZWFkIGluIGtlZXAgYSBjb3B5IG9mIHRoZQogICAgIG9yaWdpbmFsIGVuY29kaW5nIG9mIHRoZSBzaWduZWQgZGF0YSBhbmQgdXNlIGl0IHdoZW4gb3V0cHV0aW5nCiAgICAgYWdhaW4uIFNpZ25hdHVyZXMgdGhlbiB1c2UgdGhlIG9yaWdpbmFsIGVuY29kaW5nIHJhdGhlciB0aGFuCiAgICAgYSBkZWNvZGVkLCBlbmNvZGVkIHZlcnNpb24gd2hpY2ggbWF5IGNhdXNlIHByb2JsZW1zIGlmIHRoZQogICAgIHJlcXVlc3QgaXMgaW1wcm9wZXJseSBlbmNvZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIEJJT19wdXRzIGltcGxlbWVudGF0aW9ucywgY2FsbAogICAgIGJ1ZmZlcl93cml0ZShiLCAuLi4pIGRpcmVjdGx5IGluIGJ1ZmZlcl9wdXRzIGluc3RlYWQgb2YgY2FsbGluZwogICAgIEJJT193cml0ZShiLCAuLi4pLgoKICAgICBJbiBCSU9fcHV0cywgaW5jcmVtZW50IGItPm51bV93cml0ZSBhcyBpbiBCSU9fd3JpdGUuCiAgICAgW1BldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyXQoKICAqKSBGaXggQk5fbXVsX3dvcmQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB3b3JkIGlzIDAuIChXZSBoYXZlIHRvIHVzZQogICAgIEJOX3plcm8sIHdlIG1heSBub3QgcmV0dXJuIGEgQklHTlVNIHdpdGggYW4gYXJyYXkgY29uc2lzdGluZyBvZgogICAgIHdvcmRzIHNldCB0byB6ZXJvLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBjYWxsaW5nIGFib3J0KCkgZnJvbSB3aXRoaW4gdGhlIGxpYnJhcnkgd2hlbiBwcm9ibGVtcyBhcmUKICAgICBkZXRlY3RlZCwgZXhjZXB0IGlmIHByZXByb2Nlc3NvciBzeW1ib2xzIGhhdmUgYmVlbiBkZWZpbmVkCiAgICAgKHN1Y2ggYXMgUkVGX0NIRUNLLCBCTl9ERUJVRyBldGMuKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgb3BlbnNzbCBhcHBsaWNhdGlvbiAncnNhdXRsJy4gVGhpcyB1dGlsaXR5IGNhbiBiZQogICAgIHVzZWQgZm9yIGxvdyBsZXZlbCBSU0Egb3BlcmF0aW9ucy4gREVSIHB1YmxpYyBrZXkKICAgICBCSU8vZnAgcm91dGluZXMgYWxzbyBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIGVudHJ5IGFuZCBwYXRjaGVzIGZvciBjb21waWxpbmcgb24gUU5YIDQuCiAgICAgW0FuZHJlYXMgU2NobmVpZGVyIDxhbmRyZWFzQGRzMy5ldGVjaC5maC1oYW1idXJnLmRlPl0KCiAgKikgQSBkZW1vIHN0YXRlLW1hY2hpbmUgaW1wbGVtZW50YXRpb24gd2FzIHNwb25zb3JlZCBieQogICAgIE51cm9uIChodHRwOi8vd3d3Lm51cm9uLmNvbS8pIGFuZCBpcyBub3cgYXZhaWxhYmxlIGluCiAgICAgZGVtb3Mvc3RhdGVfbWFjaGluZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IG9wdGlvbnMgYWRkZWQgdG8gdGhlICdkZ3N0JyB1dGlsaXR5IGZvciBzaWduYXR1cmUKICAgICBnZW5lcmF0aW9uIGFuZCB2ZXJpZmljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVW5yZWNvZ25pemVkIFBLQ1MjNyBjb250ZW50IHR5cGVzIGFyZSBub3cgaGFuZGxlZCB2aWEgYQogICAgIGNhdGNoIGFsbCBBU04xX1RZUEUgc3RydWN0dXJlLiBUaGlzIGFsbG93cyB1bnN1cHBvcnRlZAogICAgIHR5cGVzIHRvIGJlIHN0b3JlZCBhcyBhICJibG9iIiBhbmQgYW4gYXBwbGljYXRpb24gY2FuCiAgICAgZW5jb2RlIGFuZCBkZWNvZGUgaXQgbWFudWFsbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHZhcmlvdXMgc2lnbmVkL3Vuc2lnbmVkIGlzc3VlcyB0byBtYWtlIGFfc3RyZXguYwogICAgIGNvbXBpbGUgdW5kZXIgVkMrKy4KICAgICBbT3NjYXIgSmFjb2Jzc29uIDxvc2Nhci5qYWNvYnNzb25AY2Vsb2NvbS5jb20+XQoKICAqKSBBU04xIGZpeGVzLiBpMmRfQVNOMV9PQkpFQ1Qgd2FzIG5vdCByZXR1cm5pbmcgdGhlIGNvcnJlY3QKICAgICBsZW5ndGggaWYgcGFzc2VkIGEgYnVmZmVyLiBBU04xX0lOVEVHRVJfdG9fQk4gZmFpbGVkCiAgICAgaWYgcGFzc2VkIGEgTlVMTCBCTiBhbmQgaXRzIGFyZ3VtZW50IHdhcyBuZWdhdGl2ZS4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBTdmVuIEhlaWJlcmcgPHN2ZW5AdGFydHUuY3liZXIuZWU+XQoKICAqKSBNb2RpZmljYXRpb24gdG8gUEtDUyM3IGVuY29kaW5nIHJvdXRpbmVzIHRvIG91dHB1dCBkZWZpbml0ZQogICAgIGxlbmd0aCBlbmNvZGluZy4gU2luY2UgY3VycmVudGx5IHRoZSB3aG9sZSBzdHJ1Y3R1cmVzIGFyZSBpbgogICAgIG1lbW9yeSB0aGVyZSdzIG5vdCByZWFsIHBvaW50IGluIHVzaW5nIGluZGVmaW5pdGUgbGVuZ3RoIAogICAgIGNvbnN0cnVjdGVkIGVuY29kaW5nLiBIb3dldmVyIGlmIE9wZW5TU0wgaXMgY29tcGlsZWQgd2l0aAogICAgIHRoZSBmbGFnIFBLQ1M3X0lOREVGSU5JVEVfRU5DT0RJTkcgdGhlIG9sZCBmb3JtIGlzIHVzZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgQklPX3ZwcmludGYoKSBhbmQgQklPX3ZzbnByaW50ZigpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZGVkIG1vcmUgcHJlZml4ZXMgdG8gcGFyc2UgZm9yIGluIHRoZSB0aGUgc3RyaW5ncyB3cml0dGVuCiAgICAgdGhyb3VnaCBhIGxvZ2dpbmcgYmlvLCB0byBjb3ZlciBhbGwgdGhlIGxldmVscyB0aGF0IGFyZSBhdmFpbGFibGUKICAgICB0aHJvdWdoIHN5c2xvZy4gIFRoZSBwcmVmaXhlcyBhcmUgbm93OgoKCVBBTklDLCBFTUVSRywgRU1SCT0+CUxPR19FTUVSRwoJQUxFUlQsIEFMUgkJPT4JTE9HX0FMRVJUCglDUklULCBDUkkJCT0+CUxPR19DUklUCglFUlJPUiwgRVJSCQk9PglMT0dfRVJSCglXQVJOSU5HLCBXQVJOLCBXQVIJPT4JTE9HX1dBUk5JTkcKCU5PVElDRSwgTk9URSwgTk9UCT0+CUxPR19OT1RJQ0UKCUlORk8sIElORgkJPT4JTE9HX0lORk8KCURFQlVHLCBEQkcJCT0+CUxPR19ERUJVRwoKICAgICBhbmQgYXMgYmVmb3JlLCBpZiBub25lIG9mIHRob3NlIHByZWZpeGVzIGFyZSBwcmVzZW50IGF0IHRoZQogICAgIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCBMT0dfRVJSIGlzIGNob3Nlbi4KCiAgICAgT24gV2luMzIsIHRoZSBMT0dfKiBsZXZlbHMgYXJlIG1hcHBlZCBhY2NvcmRpbmcgdG8gdGhpczoKCglMT0dfRU1FUkcsIExPR19BTEVSVCwgTE9HX0NSSVQsIExPR19FUlIJPT4gRVZFTlRMT0dfRVJST1JfVFlQRQoJTE9HX1dBUk5JTkcJCQkJPT4gRVZFTlRMT0dfV0FSTklOR19UWVBFCglMT0dfTk9USUNFLCBMT0dfSU5GTywgTE9HX0RFQlVHCQk9PiBFVkVOVExPR19JTkZPUk1BVElPTl9UWVBFCgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1hZGUgaXQgcG9zc2libGUgdG8gcmVjb25maWd1cmUgd2l0aCBqdXN0IHRoZSBjb25maWd1cmF0aW9uCiAgICAgYXJndW1lbnQgInJlY29uZiIgb3IgInJlY29uZmlndXJlIi4gIFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgYXJlIHN0b3JlZCBpbiBNYWtlZmlsZS5zc2wgaW4gdGhlIHZhcmlhYmxlIENPTkZJR1VSRV9BUkdTLAogICAgIGFuZCBhcmUgcmV0cmlldmVkIGZyb20gdGhlcmUgd2hlbiByZWNvbmZpZ3VyaW5nLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ENCBpbXBsZW1lbnRlZC4KICAgICBbQXNzYXIgV2VzdGVybHVuZCA8YXNzYXJAc2ljcy5zZT4sIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBhcmd1bWVudHMgLUNBZmlsZSBhbmQgLUNBcGF0aCB0byB0aGUgcGtjczEyIHV0aWxpdHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIG9ial9kYXQucGwgc2NyaXB0IHdhcyBtZXNzaW5nIHVwIHRoZSBzb3J0aW5nIG9mIG9iamVjdAogICAgIG5hbWVzLiBUaGUgcmVhc29uIHdhcyB0aGF0IGl0IGNvbXBhcmVkIHRoZSBxdW90ZWQgdmVyc2lvbgogICAgIG9mIHN0cmluZ3MgYXMgYSByZXN1bHQgIk9DU1AiID4gIk9DU1AgU2lnbmluZyIgYmVjYXVzZQogICAgICIgPiBTUEFDRS4gQ2hhbmdlZCBzY3JpcHQgdG8gc3RvcmUgdW5xdW90ZWQgdmVyc2lvbnMgb2YKICAgICBuYW1lcyBhbmQgYWRkIHF1b3RlcyBvbiBvdXRwdXQuIEl0IHdhcyBhbHNvIG9taXR0aW5nIHNvbWUKICAgICBuYW1lcyBmcm9tIHRoZSBsb29rdXAgdGFibGUgaWYgdGhleSB3ZXJlIGdpdmVuIGEgZGVmYXVsdAogICAgIHZhbHVlICh0aGF0IGlzIGlmIFNOIGlzIG1pc3NpbmcgaXQgaXMgZ2l2ZW4gdGhlIHNhbWUKICAgICB2YWx1ZSBhcyBMTiBhbmQgdmljZSB2ZXJzYSksIHRoZXNlIGFyZSBub3cgYWRkZWQgb24gdGhlCiAgICAgZ3JvdW5kcyB0aGF0IGlmIGFuIG9iamVjdCBoYXMgYSBuYW1lIHdlIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgbG9vayBpdCB1cC4gRmluYWxseSBhZGRlZCB3YXJuaW5nIG91dHB1dCB3aGVuIGR1cGxpY2F0ZQogICAgIHNob3J0IG9yIGxvbmcgbmFtZXMgYXJlIGZvdW5kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgbmVlZGVkIGZvciBUYW5kZW0gTlNLLgogICAgIFtTY290dCBVcm9mZiA8c2NvdHRAeHlwcm8uY29tPl0KCiAgKikgRml4IFNTTCAyLjAgcm9sbGJhY2sgY2hlY2tpbmc6IER1ZSB0byBhbiBvZmYtYnktb25lIGVycm9yIGluCiAgICAgUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzKCksIHNwZWNpYWwgcGFkZGluZyB3YXMgbmV2ZXIgZGV0ZWN0ZWQKICAgICBhbmQgdGh1cyB0aGUgU1NMIDMuMC9UTFMgMS4wIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgcHJvdG9jb2wKICAgICB2ZXJzaW9uIHJvbGxiYWNrIGF0dGFja3Mgd2FzIG5vdCBlZmZlY3RpdmUuCgogICAgIEluIHMyM19jbG50LmMsIGRvbid0IHVzZSBzcGVjaWFsIHJvbGxiYWNrLWF0dGFjayBkZXRlY3Rpb24gcGFkZGluZwogICAgIChSU0FfU1NMVjIzX1BBRERJTkcpIGlmIFNTTCAyLjAgaXMgdGhlIG9ubHkgcHJvdG9jb2wgZW5hYmxlZCBpbiB0aGUKICAgICBjbGllbnQ7IHNpbWlsYXJseSwgaW4gczIzX3NydnIuYywgZG9uJ3QgZG8gdGhlIHJvbGxiYWNrIGNoZWNrIGlmCiAgICAgU1NMIDIuMCBpcyB0aGUgb25seSBwcm90b2NvbCBlbmFibGVkIGluIHRoZSBzZXJ2ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBnZXQgaGV4ZHVtcHMgb2YgdW5wcmludGFibGUgZGF0YSB3aXRoICdvcGVuc3NsCiAgICAgYXNuMXBhcnNlJy4gIEJ5IGltcGxpY2F0aW9uLCB0aGUgZnVuY3Rpb25zIEFTTjFfcGFyc2VfZHVtcCgpIGFuZAogICAgIEJJT19kdW1wX2luZGVudCgpIGFyZSBhZGRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb25zIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgYW5kIFg1MDlfTkFNRV9wcmludF9leCgpCiAgICAgdGhlc2UgcHJpbnQgb3V0IHN0cmluZ3MgYW5kIG5hbWUgc3RydWN0dXJlcyBiYXNlZCBvbiB2YXJpb3VzCiAgICAgZmxhZ3MgaW5jbHVkaW5nIFJGQzIyNTMgc3VwcG9ydCBhbmQgcHJvcGVyIGhhbmRsaW5nIG9mCiAgICAgbXVsdGlieXRlIGNoYXJhY3RlcnMuIEFkZGVkIG9wdGlvbnMgdG8gdGhlICd4NTA5JyB1dGlsaXR5IAogICAgIHRvIGFsbG93IHRoZSB2YXJpb3VzIGZsYWdzIHRvIGJlIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHVzZSBBU04xX1RJTUUgaW5zdGVhZCBvZiBBU04xX1VUQ1RJTUUuCiAgICAgQWxzbyBjaGFuZ2UgdGhlIGZ1bmN0aW9ucyBYNTA5X2NtcF9jdXJyZW50X3RpbWUoKSBhbmQKICAgICBYNTA5X2dtdGltZV9hZGooKSB3b3JrIHdpdGggYW4gQVNOMV9USU1FIHN0cnVjdHVyZSwKICAgICB0aGlzIHdpbGwgZW5hYmxlIGNlcnRpZmljYXRlcyB1c2luZyBHZW5lcmFsaXplZFRpbWUgaW4gdmFsaWRpdHkKICAgICBkYXRlcyB0byBiZSBjaGVja2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIE5FR19QVUJLRVlfQlVHIGNvZGUgKHdoaWNoIHRvbGVyYXRlcyBpbnZhbGlkCiAgICAgbmVnYXRpdmUgcHVibGljIGtleSBlbmNvZGluZ3MpIG9uIGJ5IGRlZmF1bHQsCiAgICAgTk9fTkVHX1BVQktFWV9CVUcgY2FuIGJlIHNldCB0byBkaXNhYmxlIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBjMmlfQVNOMV9PQkpFQ1QoKSB3aGljaCBhY3RzIG9uIEFTTjFfT0JKRUNUCiAgICAgY29udGVudCBvY3RldHMuIEFuIGkyY19BU04xX09CSkVDVCBpcyB1bm5lY2Vzc2FyeSBiZWNhdXNlCiAgICAgdGhlIGVuY29kaW5nIGNhbiBiZSB0cml2aWFsbHkgb2J0YWluZWQgZnJvbSB0aGUgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGNyeXB0by9lcnIuYyBsb2NraW5nIGJ1Z2ZpeDogVXNlIHdyaXRlIGxvY2tzIChDUllQVE9fd19bdW5dbG9jayksCiAgICAgbm90IHJlYWQgbG9ja3MgKENSWVBUT19yX1t1bl1sb2NrKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBIGZpcnN0IGF0dGVtcHQgYXQgY3JlYXRpbmcgb2ZmaWNpYWwgc3VwcG9ydCBmb3Igc2hhcmVkCiAgICAgbGlicmFyaWVzIHRocm91Z2ggY29uZmlndXJhdGlvbi4gIEkndmUga2VwdCBpdCBzbyB0aGUKICAgICBkZWZhdWx0IGlzIHN0YXRpYyBsaWJyYXJpZXMgb25seSwgYW5kIHRoZSBPcGVuU1NMIHByb2dyYW1zCiAgICAgYXJlIGFsd2F5cyBzdGF0aWNhbGx5IGxpbmtlZCBmb3Igbm93LCBidXQgdGhlcmUgYXJlCiAgICAgcHJlcGFyYXRpb25zIGZvciBkeW5hbWljIGxpbmtpbmcgaW4gcGxhY2UuCiAgICAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgb24gTGludXggYW5kIFRydTY0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJhbmRvbW5lc3MgcG9sbGluZyBmdW5jdGlvbiBmb3IgV2luOXgsIGFzIGRlc2NyaWJlZCBpbjoKICAgICBQZXRlciBHdXRtYW5uLCBTb2Z0d2FyZSBHZW5lcmF0aW9uIG9mIFByYWN0aWNhbGx5IFN0cm9uZwogICAgIFJhbmRvbSBOdW1iZXJzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggc28gUFJORyBpcyBzZWVkZWQgaW4gcmVxIGlmIHVzaW5nIGFuIGFscmVhZHkgZXhpc3RpbmcKICAgICBEU0Ega2V5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIHRvIHNtaW1lIGFwcGxpY2F0aW9uLiAtaW5mb3JtIGFuZCAtb3V0Zm9ybQogICAgIGFsbG93IGFsdGVybmF0aXZlIGZvcm1hdHMgZm9yIHRoZSBTL01JTUUgbWVzc2FnZSBpbmNsdWRpbmcKICAgICBQRU0gYW5kIERFUi4gVGhlIC1jb250ZW50IG9wdGlvbiBhbGxvd3MgdGhlIGNvbnRlbnQgdG8gYmUKICAgICBzcGVjaWZpZWQgc2VwYXJhdGVseS4gVGhpcyBzaG91bGQgYWxsb3cgdGhpbmdzIGxpa2UgTmV0c2NhcGUKICAgICBmb3JtIHNpZ25pbmcgb3V0cHV0IGVhc2llciB0byB2ZXJpZnkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBBU04xIGVuY29kaW5nIG9mIHRhZ3MgdXNpbmcgdGhlICdsb25nIGZvcm0nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBBU04xIGZ1bmN0aW9ucywgaTJjXyogYW5kIGMyaV8qIGZvciBJTlRFR0VSIGFuZCBCSVQKICAgICBTVFJJTkcgdHlwZXMuIFRoZXNlIGNvbnZlcnQgY29udGVudCBvY3RldHMgdG8gYW5kIGZyb20gdGhlCiAgICAgdW5kZXJseWluZyB0eXBlLiBUaGUgYWN0dWFsIHRhZyBhbmQgbGVuZ3RoIG9jdGV0cyBhcmUKICAgICBhbHJlYWR5IGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHJlYWQgaW4gYW5kIGNoZWNrZWQuIFRoZXNlCiAgICAgYXJlIG5lZWRlZCBiZWNhdXNlIGFsbCBvdGhlciBzdHJpbmcgdHlwZXMgaGF2ZSB2aXJ0dWFsbHkKICAgICBpZGVudGljYWwgaGFuZGxpbmcgYXBhcnQgZnJvbSB0aGUgdGFnLiBCeSBoYXZpbmcgdmVyc2lvbnMKICAgICBvZiB0aGUgQVNOMSBmdW5jdGlvbnMgdGhhdCBqdXN0IG9wZXJhdGUgb24gY29udGVudCBvY3RldHMKICAgICBJTVBMSUNJVCB0YWdnaW5nIGNhbiBiZSBoYW5kbGVkIHByb3Blcmx5LiBJdCBhbHNvIGFsbG93cwogICAgIHRoZSBBU04xX0VOVU1FUkFURUQgY29kZSB0byBiZSBjdXQgZG93biBiZWNhdXNlIEFTTjFfRU5VTUVSQVRFRAogICAgIGFuZCBBU04xX0lOVEVHRVIgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0YWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBoYW5kbGluZyBvZiBPSUQgb2JqZWN0cyBhcyBmb2xsb3dzOgoKICAgICAtIE5ldyBvYmplY3QgaWRlbnRpZmllcnMgYXJlIGluc2VydGVkIGluIG9iamVjdHMudHh0LCBmb2xsb3dpbmcKICAgICAgIHRoZSBzeW50YXggZ2l2ZW4gaW4gb2JqZWN0cy5SRUFETUUuCiAgICAgLSBvYmplY3RzLnBsIGlzIHVzZWQgdG8gcHJvY2VzcyBvYmpfbWFjLm51bSBhbmQgY3JlYXRlIGEgbmV3CiAgICAgICBvYmpfbWFjLmguCiAgICAgLSBvYmpfZGF0LnBsIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9ial9kYXQuaCwgdXNpbmcgdGhlIGRhdGEgaW4KICAgICAgIG9ial9tYWMuaC4KCiAgICAgVGhpcyBpcyBjdXJyZW50bHkga2luZCBvZiBhIGhhY2ssIGFuZCB0aGUgcGVybCBjb2RlIGluIG9iamVjdHMucGwKICAgICBpc24ndCB2ZXJ5IGVsZWdhbnQsIGJ1dCBpdCB3b3JrcyBhcyBJIGludGVuZGVkLiAgVGhlIHNpbXBsZXN0IHdheQogICAgIHRvIGNoZWNrIHRoYXQgaXQgd29ya2VkIGNvcnJlY3RseSBpcyB0byBsb29rIGluIG9ial9kYXQuaCBhbmQKICAgICBjaGVjayB0aGUgYXJyYXkgbmlkX29ianMgYW5kIG1ha2Ugc3VyZSB0aGUgb2JqZWN0cyBoYXZlbid0IG1vdmVkCiAgICAgYXJvdW5kICh0aGlzIGlzIGltcG9ydGFudCEpLiAgQWRkaXRpb25zIGFyZSBPSywgYXMgd2VsbCBhcwogICAgIGNvbnNpc3RlbnQgbmFtZSBjaGFuZ2VzLiAKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgQlNELXN0eWxlIE1ENS1iYXNlZCBwYXNzd29yZHMgdG8gJ29wZW5zc2wgcGFzc3dkJyAob3B0aW9uICctMScpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGl0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyICctcmFuZCBmaWxlJyB0byAnb3BlbnNzbCByZXEnLgogICAgIFRoZSBnaXZlbiBmaWxlIGFkZHMgdG8gd2hhdGV2ZXIgaGFzIGFscmVhZHkgYmVlbiBzZWVkZWQgaW50byB0aGUKICAgICByYW5kb20gcG9vbCB0aHJvdWdoIHRoZSBSQU5ERklMRSBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIG9yCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIHRoZSBkZWZhdWx0IHJhbmRvbSBzdGF0ZSBmaWxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIG1rc3RhY2sucGwgbm93IHNvcnRzIGVhY2ggbWFjcm8gZ3JvdXAgaW50byBsZXhpY2FsIG9yZGVyLgogICAgIFByZXZpb3VzbHkgdGhlIG91dHB1dCBvcmRlciBkZXBlbmRlZCBvbiB0aGUgb3JkZXIgdGhlIGZpbGVzCiAgICAgYXBwZWFyZWQgaW4gdGhlIGRpcmVjdG9yeSwgcmVzdWx0aW5nIGluIG5lZWRsZXNzIHJld3JpdGluZwogICAgIG9mIHNhZmVzdGFjay5oIC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQYXRjaGVzIHRvIG1ha2UgT3BlblNTTCBjb21waWxlIHVuZGVyIFdpbjMyIGFnYWluLiBNb3N0bHkKICAgICB3b3JrIGFyb3VuZHMgZm9yIHRoZSBWQysrIHByb2JsZW0gdGhhdCBpdCB0cmVhdHMgZnVuYygpIGFzCiAgICAgZnVuYyh2b2lkKS4gQWxzbyBzdHJpcHBlZCBvdXQgdGhlIHBhcnRzIG9mIG1rZGVmLnBsIHRoYXQKICAgICBhZGRlZCBleHRyYSB0eXBlc2FmZSBmdW5jdGlvbnM6IHRoZXNlIG5vIGxvbmdlciBleGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXNhdGlvbiBvZiB0aGUgc3RhY2sgY29kZS4gVGhlIG1hY3JvcyBhcmUgbm93IGFsbCAKICAgICBjb2xsZWN0ZWQgaW4gc2FmZXN0YWNrLmggLiBFYWNoIG1hY3JvIGlzIGRlZmluZWQgaW4gdGVybXMgb2YKICAgICBhICJzdGFjayBtYWNybyIgb2YgdGhlIGZvcm0gU0tNXzxuYW1lPih0eXBlLCBhLCBiKS4gVGhlIAogICAgIERFQlVHX1NBRkVTVEFDSyBpcyBub3cgaGFuZGxlZCBpbiB0ZXJtcyBvZiBmdW5jdGlvbiBjYXN0cywKICAgICB0aGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIHJldGFpbmluZyB0eXBlIHNhZmV0eSB3aXRob3V0IHRoZQogICAgIHVzZSBvZiBhZGRpdGlvbmFsIGZ1bmN0aW9ucy4gSWYgREVCVUdfU0FGRVNUQUNLIGlzIG5vdCBkZWZpbmVkCiAgICAgdGhlbiB0aGUgbm9uIHR5cGVzYWZlIG1hY3JvcyBhcmUgdXNlZCBpbnN0ZWFkLiBBbHNvIG1vZGlmaWVkIHRoZQogICAgIG1rc3RhY2sucGwgc2NyaXB0IHRvIGhhbmRsZSB0aGUgbmV3IGZvcm0uIE5lZWRzIHRlc3RpbmcgdG8gc2VlCiAgICAgaWYgd2hpY2ggKGlmIGFueSkgY29tcGlsZXJzIGl0IGNob2tlcyBhbmQgbWF5YmUgbWFrZSBERUJVR19TQUZFU1RBQ0sKICAgICB0aGUgZGVmYXVsdCBpZiBubyBtYWpvciBwcm9ibGVtcy4gU2ltaWxhciBiZWhhdmlvdXIgZm9yIEFTTjFfU0VUX09GCiAgICAgYW5kIFBLQ1MxMl9TVEFDS19PRi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaGVuIHNvbWUgdmVyc2lvbnMgb2YgSUlTIHVzZSB0aGUgJ05FVCcgZm9ybSBvZiBwcml2YXRlIGtleSB0aGUKICAgICBrZXkgZGVyaXZhdGlvbiBhbGdvcml0aG0gaXMgZGlmZmVyZW50LiBOb3JtYWxseSBNRDUocGFzc3dvcmQpIGlzCiAgICAgdXNlZCBhcyBhIDEyOCBiaXQgUkM0IGtleS4gSW4gdGhlIG1vZGlmaWVkIGNhc2UKICAgICBNRDUoTUQ1KHBhc3N3b3JkKSArICJTR0NLRVlTQUxUIikgIGlzIHVzZWQgaW5zdGVkLiBBZGRlZCBzb21lCiAgICAgbmV3IGZ1bmN0aW9ucyBpMmRfUlNBX05FVCgpLCBkMmlfUlNBX05FVCgpIGV0YyB3aGljaCBhcmUgdGhlIHNhbWUKICAgICBhcyB0aGUgb2xkIE5ldHNjYXBlX1JTQSBmdW5jdGlvbnMgZXhjZXB0IHRoZXkgaGF2ZSBhbiBhZGRpdGlvbmFsCiAgICAgJ3NnY2tleScgcGFyYW1ldGVyIHdoaWNoIHVzZXMgdGhlIG1vZGlmaWVkIGFsZ29yaXRobS4gQWxzbyBhZGRlZAogICAgIGFuIC1zZ2NrZXkgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0aGUgcnNhIHV0aWxpdHkuIFRoYW5rcyB0byAKICAgICBBZHJpYW4gUGVjayA8YmVydGllQG5jaXBoZXIuY29tPiBmb3IgcG9zdGluZyBkZXRhaWxzIG9mIHRoZSBtb2RpZmllZAogICAgIGFsZ29yaXRobSB0byBvcGVuc3NsLWRldi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZXZwX2xvY2FsLmggbWFjcm9zIHdlcmUgdXNpbmcgJ2MuIyNrbmFtZScgd2hpY2ggcmVzdWx0ZWQgaW4KICAgICBpbnZhbGlkIGV4cGFuc2lvbiBvbiBzb21lIHN5c3RlbXMgKFNDTyA1LjAuNSBmb3IgZXhhbXBsZSkuCiAgICAgQ29ycmVjdGVkIHRvICdjLmtuYW1lJy4KICAgICBbUGhpbGxpcCBQb3JjaCA8cm9vdEB0aGVwb3JjaC5jb20+XQoKICAqKSBOZXcgWDUwOV9nZXQxX2VtYWlsKCkgYW5kIFg1MDlfUkVRX2dldDFfZW1haWwoKSBmdW5jdGlvbnMgdGhhdCByZXR1cm4KICAgICBhIFNUQUNLIG9mIGVtYWlsIGFkZHJlc3NlcyBmcm9tIGEgY2VydGlmaWNhdGUgb3IgcmVxdWVzdCwgdGhlc2UgbG9vawogICAgIGluIHRoZSBzdWJqZWN0IG5hbWUgYW5kIHRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUgZXh0ZW5zaW9ucyBhbmQgCiAgICAgb21pdCBhbnkgZHVwbGljYXRlIGFkZHJlc3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZS1pbXBsZW1lbnQgQk5fbW9kX2V4cDJfbW9udCB1c2luZyBpbmRlcGVuZGVudCAoYW5kIGxhcmdlcikgd2luZG93cy4KICAgICBUaGlzIG1ha2VzIERTQSB2ZXJpZmljYXRpb24gYWJvdXQgMiAlIGZhc3Rlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNyZWFzZSBtYXhpbXVtIHdpbmRvdyBzaXplIGluIEJOX21vZF9leHBfLi4uIHRvIDYgYml0cyBpbnN0ZWFkIG9mIDUKICAgICAobWVhbmluZyB0aGF0IG5vdyAyXjUgdmFsdWVzIHdpbGwgYmUgcHJlY29tcHV0ZWQsIHdoaWNoIGlzIG9ubHkgNCBLQgogICAgIHBsdXMgb3ZlcmhlYWQgZm9yIDEwMjQgYml0IG1vZHVsaSkuCiAgICAgVGhpcyBtYWtlcyBleHBvbmVudGlhdGlvbnMgYWJvdXQgMC41ICUgZmFzdGVyIGZvciAxMDI0IGJpdAogICAgIGV4cG9uZW50cyAoYXMgbWVhc3VyZWQgYnkgIm9wZW5zc2wgc3BlZWQgcnNhMjA0OCIpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbmFtZSBtZW1vcnkgaGFuZGxpbmcgbWFjcm9zIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyCiAgICAgc29mdHdhcmU6CiAgICAgICAgICBNYWxsb2MgICAgICAgICA9PiAgT1BFTlNTTF9tYWxsb2MKICAgICAgICAgIE1hbGxvY19sb2NrZWQgID0+ICBPUEVOU1NMX21hbGxvY19sb2NrZWQKICAgICAgICAgIFJlYWxsb2MgICAgICAgID0+ICBPUEVOU1NMX3JlYWxsb2MKICAgICAgICAgIEZyZWUgICAgICAgICAgID0+ICBPUEVOU1NMX2ZyZWUKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fbW9kX2V4cF9tb250X3dvcmQgZm9yIHNtYWxsIGJhc2VzIChyb3VnaGx5IDE1JQogICAgIGZhc3RlciB0aGFuIEJOX21vZF9leHBfbW9udCwgaS5lLiA3JSBmb3IgYSBmdWxsIERIIGV4Y2hhbmdlKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDeWdXaW4zMiBzdXBwb3J0LgogICAgIFtKb2huIEphcnZpZSA8amphcnZpZUBuZXdzZ3V5LmNvbT5dCgogICopIFRoZSB0eXBlLXNhZmUgc3RhY2sgY29kZSBoYXMgYmVlbiByZWppZ2dlZC4gSXQgaXMgbm93IG9ubHkgY29tcGlsZWQKICAgICBpbiB3aGVuIE9wZW5TU0wgaXMgY29uZmlndXJlZCB3aXRoIHRoZSBERUJVR19TQUZFU1RBQ0sgb3B0aW9uIGFuZAogICAgIGJ5IGRlZmF1bHQgYWxsIHR5cGUtc3BlY2lmaWMgc3RhY2sgZnVuY3Rpb25zIGFyZSAiI2RlZmluZSJkIGJhY2sgdG8KICAgICBzdGFuZGFyZCBzdGFjayBmdW5jdGlvbnMuIFRoaXMgcmVzdWx0cyBpbiBtb3JlIHN0cmVhbWxpbmVkIG91dHB1dAogICAgIGJ1dCByZXRhaW5zIHRoZSB0eXBlLXNhZmV0eSBjaGVja2luZyBwb3NzaWJpbGl0aWVzIG9mIHRoZSBvcmlnaW5hbAogICAgIGFwcHJvYWNoLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRoZSBTVEFDSyBjb2RlIGhhcyBiZWVuIGNsZWFuZWQgdXAsIGFuZCBjZXJ0YWluIHR5cGUgZGVjbGFyYXRpb25zCiAgICAgdGhhdCBkaWRuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSBoYXZlIGJlZW4gYnJvdWdodCBpbiBsaW5lLiBUaGlzIGhhcwogICAgIGFsc28gaW52b2x2ZWQgYSBjbGVhbnVwIG9mIHNvcnRzIGluIHNhZmVzdGFjay5oIHRvIG1vcmUgY29ycmVjdGx5CiAgICAgbWFwIHR5cGUtc2FmZSBzdGFjayBmdW5jdGlvbnMgb250byB0aGVpciBwbGFpbiBzdGFjayBjb3VudGVycGFydHMuCiAgICAgVGhpcyB3b3JrIGhhcyBhbHNvIHJlc3VsdGVkIGluIGEgdmFyaWV0eSBvZiAiY29uc3QiaWZpY2F0aW9ucyBvZgogICAgIGxvdHMgb2YgdGhlIGNvZGUsIGVzcGVjaWFsbHkgIl9jbXAiIG9wZXJhdGlvbnMgd2hpY2ggc2hvdWxkIG5vcm1hbGx5CiAgICAgYmUgcHJvdG90eXBlZCB3aXRoICJjb25zdCIgcGFyYW1ldGVycyBhbnl3YXkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgV2hlbiBnZW5lcmF0aW5nIGJ5dGVzIGZvciB0aGUgZmlyc3QgdGltZSBpbiBtZF9yYW5kLmMsICdzdGlyIHRoZSBwb29sJwogICAgIGJ5IHNlZWRpbmcgd2l0aCBTVEFURV9TSVpFIGR1bW15IGJ5dGVzICh3aXRoIHplcm8gZW50cm9weSBjb3VudCkuCiAgICAgKFRoZSBQUk5HIHN0YXRlIGNvbnNpc3RzIG9mIHR3byBwYXJ0cywgdGhlIGxhcmdlIHBvb2wgJ3N0YXRlJyBhbmQgJ21kJywKICAgICB3aGVyZSBhbGwgb2YgJ21kJyBpcyB1c2VkIGVhY2ggdGltZSB0aGUgUFJORyBpcyB1c2VkLCBidXQgJ3N0YXRlJwogICAgIGlzIHVzZWQgb25seSBpbmRleGVkIGJ5IGEgY3ljbGljIGNvdW50ZXIuIEFzIGVudHJvcHkgbWF5IG5vdCBiZQogICAgIHdlbGwgZGlzdHJpYnV0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nLCAnbWQnIGlzIGltcG9ydGFudCBhcyBhCiAgICAgY2hhaW5pbmcgdmFyaWFibGUuIEhvd2V2ZXIsIHRoZSBvdXRwdXQgZnVuY3Rpb24gY2hhaW5zIG9ubHkgaGFsZgogICAgIG9mICdtZCcsIGkuZS4gODAgYml0cy4gIHNzbGVheV9yYW5kX2FkZCwgb24gdGhlIG90aGVyIGhhbmQsIGNoYWlucwogICAgIGFsbCBvZiAnbWQnLCBhbmQgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgd2lsbCByZXN1bHQKICAgICBpbiBhbGwgb2YgJ3N0YXRlJyBiZWluZyByZXdyaXR0ZW4sIHdpdGggdGhlIG5ldyB2YWx1ZXMgZGVwZW5kaW5nCiAgICAgb24gdmlydHVhbGx5IGFsbCBvZiAnbWQnLiAgVGhpcyBvdmVyY29tZXMgdGhlIDgwIGJpdCBsaW1pdGF0aW9uLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBzc2wvczJfY2xudC5jIGFuZCBzc2wvczNfY2xudC5jLCBjYWxsIEVSUl9jbGVhcl9lcnJvcigpIHdoZW4KICAgICB0aGUgaGFuZHNoYWtlIGlzIGNvbnRpbnVlZCBhZnRlciBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oKTsKICAgICBvdGhlcndpc2UsIGlmIFNTTF9WRVJJRllfTk9ORSBpcyBzZXQsIHJlbWFpbmluZyBlcnJvciBjb2RlcwogICAgIGNhbiBsZWFkIHRvICd1bmV4cGxhaW5hYmxlJyBjb25uZWN0aW9uIGFib3J0cyBsYXRlci4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHRyYWNrZWQgZG93biBieSBMdXR6IEphZW5pY2tlXQoKICAqKSBNYWpvciBFVlAgQVBJIGNpcGhlciByZXZpc2lvbi4KICAgICBBZGQgaG9va3MgZm9yIGV4dHJhIEVWUCBmZWF0dXJlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyBjaXBoZXIKICAgICBwYXJhbWV0ZXJzIHRvIGJlIHNldCBpbiB0aGUgRVZQIGludGVyZmFjZS4gU3VwcG9ydCBhZGRlZCBmb3IgdmFyaWFibGUKICAgICBrZXkgbGVuZ3RoIGNpcGhlcnMgdmlhIHRoZSBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCgpIGZ1bmN0aW9uIGFuZAogICAgIHNldHRpbmcgb2YgUkMyIGFuZCBSQzUgcGFyYW1ldGVycy4KCiAgICAgTW9kaWZ5IEVWUF9PcGVuSW5pdCgpIGFuZCBFVlBfU2VhbEluaXQoKSB0byBjb3BlIHdpdGggdmFyaWFibGUga2V5IGxlbmd0aAogICAgIGNpcGhlcnMuCgogICAgIFJlbW92ZSBsb3RzIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIHRoZSBFVlAgbGlicmFyeS4gRm9yIGV4YW1wbGUgKmV2ZXJ5KgogICAgIGNpcGhlciBpbml0KCkgZnVuY3Rpb24gaGFuZGxlcyB0aGUgJ2l2JyBpbiB0aGUgc2FtZSB3YXkgYWNjb3JkaW5nIHRvIHRoZQogICAgIGNpcGhlciBtb2RlLiBUaGV5IGFsc28gYWxsIGRvIG5vdGhpbmcgaWYgdGhlICdrZXknIHBhcmFtZXRlciBpcyBOVUxMIGFuZAogICAgIGZvciBDRkIgYW5kIE9GQiBtb2RlcyB0aGV5IHplcm8gY3R4LT5udW0uCgogICAgIE5ldyBmdW5jdGlvbmFsaXR5IGFsbG93cyByZW1vdmFsIG9mIFMvTUlNRSBjb2RlIFJDMiBoYWNrLgoKICAgICBNb3N0IG9mIHRoZSByb3V0aW5lcyBoYXZlIHRoZSBzYW1lIGZvcm0gYW5kIHNvIGNhbiBiZSBkZWNsYXJlZCBpbiB0ZXJtcwogICAgIG9mIG1hY3Jvcy4KCiAgICAgQnkgc2hpZnRpbmcgdGhpcyB0byB0aGUgdG9wIGxldmVsIEVWUF9DaXBoZXJJbml0KCkgaXQgY2FuIGJlIHJlbW92ZWQgZnJvbQogICAgIGFsbCBpbmRpdmlkdWFsIGNpcGhlcnMuIElmIHRoZSBjaXBoZXIgd2FudHMgdG8gaGFuZGxlIElWcyBvciBrZXlzCiAgICAgZGlmZmVyZW50bHkgaXQgY2FuIHNldCB0aGUgRVZQX0NJUEhfQ1VTVE9NX0lWIG9yIEVWUF9DSVBIX0FMV0FZU19DQUxMX0lOSVQKICAgICBmbGFncy4KCiAgICAgQ2hhbmdlIGxvdHMgb2YgZnVuY3Rpb25zIGxpa2UgRVZQX0VuY3J5cHRVcGRhdGUoKSB0byBub3cgcmV0dXJuIGEKICAgICB2YWx1ZTogYWx0aG91Z2ggc29mdHdhcmUgdmVyc2lvbnMgb2YgdGhlIGFsZ29yaXRobXMgY2Fubm90IGZhaWwKICAgICBhbnkgaW5zdGFsbGVkIGhhcmR3YXJlIHZlcnNpb25zIGNhbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgU1NMX09QX1RMU19ST0xMQkFDS19CVUc6IEluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UsIGlmCiAgICAgdGhpcyBvcHRpb24gaXMgc2V0LCB0b2xlcmF0ZSBicm9rZW4gY2xpZW50cyB0aGF0IHNlbmQgdGhlIG5lZ290aWF0ZWQKICAgICBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbnN0ZWFkIG9mIHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgdmVyc2lvbgogICAgIG51bWJlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDYWxsIGRoX3RtcF9jYiAoc2V0IGJ5IC4uLl9UTVBfREhfQ0IpIHdpdGggY29ycmVjdCAnaXNfZXhwb3J0JyBmbGFnOwogICAgIGkuZS4gbm9uLXplcm8gZm9yIGV4cG9ydCBjaXBoZXJzdWl0ZXMsIHplcm8gb3RoZXJ3aXNlLgogICAgIFByZXZpb3VzIHZlcnNpb25zIGhhZCB0aGlzIGZsYWcgaW52ZXJ0ZWQsIGluY29uc2lzdGVudCB3aXRoCiAgICAgcnNhX3RtcF9jYiAoLi4uX1RNUF9SU0FfQ0IpLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcmVwb3J0ZWQgYnkgQW1pdCBDaG9wcmFdCgogICopIEFkZCBtaXNzaW5nIERTQSBsaWJyYXJ5IHRleHQgc3RyaW5nLiBXb3JrIGFyb3VuZCBmb3Igc29tZSBJSVMKICAgICBrZXkgZmlsZXMgd2l0aCBpbnZhbGlkIFNFUVVFTkNFIGVuY29kaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRvY3VtZW50IChkb2Mvc3RhbmRhcmRzLnR4dCkgdGhhdCBsaXN0IGFsbCBraW5kcyBvZiBzdGFuZGFyZHMKICAgICBhbmQgc28gb24gdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gT3BlblNTTC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFbmhhbmNlIGNfcmVoYXNoIHNjcmlwdC4gT2xkIHZlcnNpb24gd291bGQgbWlzaGFuZGxlIGNlcnRpZmljYXRlcwogICAgIHdpdGggdGhlIHNhbWUgc3ViamVjdCBuYW1lIGhhc2ggYW5kIHdvdWxkbid0IGhhbmRsZSBDUkxzIGF0IGFsbC4KICAgICBBZGRlZCAtZmluZ2VycHJpbnQgb3B0aW9uIHRvIGNybCB1dGlsaXR5LCB0byBzdXBwb3J0IG5ldyBjX3JlaGFzaAogICAgIGZlYXR1cmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVsaW1pbmF0ZSBub24tQU5TSSBkZWNsYXJhdGlvbnMgaW4gY3J5cHRvLmggYW5kIHN0YWNrLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBmb3IgU1NMIHNlcnZlciBwdXJwb3NlIGNoZWNraW5nLiBTZXJ2ZXIgY2hlY2tpbmcgd2FzCiAgICAgcmVqZWN0aW5nIGNlcnRpZmljYXRlcyB3aGljaCBoYWQgZXh0ZW5kZWQga2V5IHVzYWdlIHByZXNlbnQKICAgICBidXQgbm8gc3NsIGNsaWVudCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFJlbmUgR3Jvc3NlciA8Z3Jvc3NlckBoaXNvbHV0aW9ucy5jb20+XQoKICAqKSBNYWtlIFBLQ1MjMTIgY29kZSB3b3JrIHdpdGggbm8gcGFzc3dvcmQuIFRoZSBQS0NTIzEyIHNwZWMKICAgICBpcyBhIGxpdHRsZSB1bmNsZWFyIGFib3V0IGhvdyBhIGJsYW5rIHBhc3N3b3JkIGlzIGhhbmRsZWQuCiAgICAgU2luY2UgdGhlIHBhc3N3b3JkIGluIGVuY29kZWQgYXMgYSBCTVBTdHJpbmcgd2l0aCB0ZXJtaW5hdGluZwogICAgIGRvdWJsZSBOVUxMIGEgemVybyBsZW5ndGggcGFzc3dvcmQgd291bGQgZW5kIHVwIGFzIGp1c3QgdGhlCiAgICAgZG91YmxlIE5VTEwuIEhvd2V2ZXIgbm8gcGFzc3dvcmQgYXQgYWxsIGlzIGRpZmZlcmVudCBhbmQgaXMKICAgICBoYW5kbGVkIGRpZmZlcmVudGx5IGluIHRoZSBQS0NTIzEyIGtleSBnZW5lcmF0aW9uIGNvZGUuIE5TCiAgICAgdHJlYXRzIGEgYmxhbmsgcGFzc3dvcmQgYXMgemVybyBsZW5ndGguIE1TSUUgdHJlYXRzIGl0IGFzIG5vCiAgICAgcGFzc3dvcmQgb24gZXhwb3J0OiBidXQgaXQgd2lsbCB0cnkgYm90aCBvbiBpbXBvcnQuIFdlIG5vdyBkbwogICAgIHRoZSBzYW1lOiBQS0NTMTJfcGFyc2UoKSB0cmllcyB6ZXJvIGxlbmd0aCBhbmQgbm8gcGFzc3dvcmQgaWYKICAgICB0aGUgcGFzc3dvcmQgaXMgc2V0IHRvICIiIG9yIE5VTEwgKE5VTEwgaXMgbm93IGEgdmFsaWQgcGFzc3dvcmQ6CiAgICAgaXQgd2Fzbid0IGJlZm9yZSkgYXMgZG9lcyB0aGUgcGtjczEyIGFwcGxpY2F0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1Z2ZpeGVzIGluIGFwcHMveDUwOS5jOiBBdm9pZCBhIG1lbW9yeSBsZWFrOyBhbmQgZG9uJ3QgdXNlCiAgICAgcGVycm9yIHdoZW4gUEVNX3JlYWRfYmlvX1g1MDlfUkVRIGZhaWxzLCB0aGUgZXJyb3IgbWVzc2FnZSBtdXN0CiAgICAgYmUgb2J0YWluZWQgZnJvbSB0aGUgZXJyb3IgcXVldWUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgJ3RocmVhZF9oYXNoJyBtZW1vcnkgbGVhayBpbiBjcnlwdG8vZXJyL2Vyci5jIGJ5IGZyZWVpbmcKICAgICBpdCBpbiBFUlJfcmVtb3ZlX3N0YXRlIGlmIGFwcHJvcHJpYXRlLCBhbmQgY2hhbmdlIEVSUl9nZXRfc3RhdGUKICAgICBhY2NvcmRpbmdseSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgKHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aHJlYWRfaGFzaCBpcyBubyBsb25nZXIgY29uc3RhbnQgb25jZSBzZXQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeCBmb3IgbGludXgtZWxmIG1ha2VmaWxlLm9uZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHdpbGwgbm93IGNhdXNlIGEgZGVmYXVsdAogICAgIFJTQV9NRVRIT0QgdG8gYmUgY2hvc2VuIGlmIG9uZSBkb2Vzbid0IGV4aXN0IGFscmVhZHkuCiAgICAgUHJldmlvdXNseSB0aGlzIHdhcyBvbmx5IHNldCBkdXJpbmcgYSBjYWxsIHRvIFJTQV9uZXcoKQogICAgIG9yIFJTQV9uZXdfbWV0aG9kKE5VTEwpIG1lYW5pbmcgaXQgd2FzIHBvc3NpYmxlIGZvcgogICAgIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSB0byByZXR1cm4gTlVMTC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGRlZCBuYXRpdmUgbmFtZSB0cmFuc2xhdGlvbiB0byB0aGUgZXhpc3RpbmcgRFNPIGNvZGUKICAgICB0aGF0IHdpbGwgY29udmVydCAoaWYgdGhlIGZsYWcgdG8gZG8gc28gaXMgc2V0KSBmaWxlbmFtZXMKICAgICB0aGF0IGFyZSBzdWZmaWNpZW50bHkgc21hbGwgYW5kIGhhdmUgbm8gcGF0aCBpbmZvcm1hdGlvbgogICAgIGludG8gYSBjYW5vbmljYWwgbmF0aXZlIGZvcm0uIEVnLiAiYmxhaCIgY29udmVydGVkIHRvCiAgICAgImxpYmJsYWguc28iIG9yICJibGFoLmRsbCIgZXRjLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBmdW5jdGlvbiBFUlJfZXJyb3Jfc3RyaW5nX24oZSwgYnVmLCBsZW4pIHdoaWNoIGlzIGxpa2UKICAgICBFUlJfZXJyb3Jfc3RyaW5nKGUsIGJ1ZiksIGJ1dCB3cml0ZXMgYXQgbW9zdCAnbGVuJyBieXRlcwogICAgIGluY2x1ZGluZyB0aGUgMCB0ZXJtaW5hdG9yLiAgRm9yIEVSUl9lcnJvcl9zdHJpbmdfbiwgJ2J1ZicKICAgICBtYXkgbm90IGJlIE5VTEwuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz4sIEJvZG8gTW9lbGxlcl0KCiAgKikgQ09ORiBsaWJyYXJ5IHJld29ya2VkIHRvIGJlY29tZSBtb3JlIGdlbmVyYWwuICBBIG5ldyBDT05GCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIHJlYWRlciAiY2xhc3MiIGlzIGltcGxlbWVudGVkIGFzIHdlbGwgYXMgYQogICAgIG5ldyBmdW5jdGlvbnMgKE5DT05GXyosIGZvciAiTmV3IENPTkYiKSB0byBoYW5kbGUgaXQuICBUaGUgbm93CiAgICAgb2xkIENPTkZfKiBmdW5jdGlvbnMgYXJlIHN0aWxsIHRoZXJlLCBidXQgYXJlIHJlaW1wbGVtZW50ZWQgdG8KICAgICB3b3JrIGluIHRlcm1zIG9mIHRoZSBuZXcgZnVuY3Rpb25zLiAgQWxzbywgYSBzZXQgb2YgZnVuY3Rpb25zCiAgICAgdG8gaGFuZGxlIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG9mIHRoZSBjb25maWd1cmF0aW9uIGRhdGEgaXMKICAgICBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byB3cml0ZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCiAgICAgcmVhZGVyICJjbGFzc2VzIiAoSSBjYW4gZGVmaW5pdGVseSBzZWUgc29tZXRoaW5nIHJlYWRpbmcgYQogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBYTUwgZm9ybWF0LCBmb3IgZXhhbXBsZSksIGNhbGxlZCBfQ09ORl8qLAogICAgIG9yICJ0aGUgY29uZmlndXJhdGlvbiBzdG9yYWdlIEFQSSIuLi4KCiAgICAgVGhlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGluZyBmdW5jdGlvbnMgYXJlOgoKICAgICAgICBOQ09ORl9uZXcsIE5DT05GX2ZyZWUsIE5DT05GX2xvYWQsIE5DT05GX2xvYWRfZnAsIE5DT05GX2xvYWRfYmlvLAogICAgICAgIE5DT05GX2dldF9zZWN0aW9uLCBOQ09ORl9nZXRfc3RyaW5nLCBOQ09ORl9nZXRfbnVtYnJlCgogICAgICAgIE5DT05GX2RlZmF1bHQsIE5DT05GX1dJTjMyCgogICAgICAgIE5DT05GX2R1bXBfZnAsIE5DT05GX2R1bXBfYmlvCgogICAgIE5DT05GX2RlZmF1bHQgYW5kIE5DT05GX1dJTjMyIGFyZSBtZXRob2QgKG9yICJjbGFzcyIpIGNob29zZXJzLAogICAgIE5DT05GX25ldyBjcmVhdGVzIGEgbmV3IENPTkYgb2JqZWN0LiAgVGhpcyB3b3JrcyBpbiB0aGUgc2FtZSB3YXkKICAgICBhcyBvdGhlciBpbnRlcmZhY2VzIGluIE9wZW5TU0wsIGxpa2UgdGhlIEJJTyBpbnRlcmZhY2UuCiAgICAgTkNPTkZfZHVtcF8qIGR1bXAgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKICAgICB3aGljaCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZy4gIEFsbCBvdGhlciBmdW5jdGlvbnMgdGFrZSB0aGUgc2FtZQogICAgIGFyZ3VtZW50cyBhcyB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMgd3RoIHRoZSBleGNlcHRpb24gb2YgdGhlCiAgICAgZmlyc3QgdGhhdCBtdXN0IGJlIGEgYENPTkYgKicgaW5zdGVhZCBvZiBhIGBMSEFTSCAqJy4KCiAgICAgVG8gbWFrZSBpdCBlYXNlciB0byB1c2UgdGhlIG5ldyBjbGFzc2VzIHdpdGggdGhlIG9sZCBDT05GXyogZnVuY3Rpb25zLAogICAgIHRoZSBmdW5jdGlvbiBDT05GX3NldF9kZWZhdWx0X21ldGhvZCBpcyBwcm92aWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgJy10bHMxJyBvcHRpb24gdG8gJ29wZW5zc2wgY2lwaGVycycsIHdoaWNoIHdhcyBhbHJlYWR5CiAgICAgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1dCBoYWQgbm90IGJlZW4gaW1wbGVtZW50ZWQuCiAgICAgKFRoaXMgb3B0aW9uIGlzIG5vdCB5ZXQgcmVhbGx5IHVzZWZ1bCBiZWNhdXNlIGV2ZW4gdGhlIGFkZGl0aW9uYWwKICAgICBleHBlcmltZW50YWwgVExTIDEuMCBjaXBoZXJzIGFyZSBjdXJyZW50bHkgdHJlYXRlZCBhcyBTU0wgMy4wIGNpcGhlcnMuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWwgRFNPIGNvZGUgYWRkZWQgaW50byBsaWJjcnlwdG8gZm9yIGxldHRpbmcgT3BlblNTTCAoYW5kCiAgICAgT3BlblNTTC1iYXNlZCBhcHBsaWNhdGlvbnMpIGxvYWQgc2hhcmVkIGxpYnJhcmllcyBhbmQgYmluZCB0bwogICAgIHRoZW0gaW4gYSBwb3J0YWJsZSB3YXkuCiAgICAgW0dlb2ZmIFRob3JwZSwgd2l0aCBjb250cmlidXRpb25zIGZyb20gUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNSBhbmQgMC45LjVhICBbMSBBcHIgMjAwMF0KCiAgKikgTWFrZSBzdXJlIF9scm90bCBhbmQgX2xyb3RyIGFyZSBvbmx5IHVzZWQgd2l0aCBNU1ZDLgoKICAqKSBVc2UgbG9jayBDUllQVE9fTE9DS19SQU5EIGNvcnJlY3RseSBpbiBzc2xlYXlfcmFuZF9zdGF0dXMKICAgICAodGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgUkFORF9zdGF0dXMpLgoKICAqKSBSZW5hbWUgb3BlbnNzbCB4NTA5IG9wdGlvbiAnLWNybGV4dCcsIHdoaWNoIHdhcyBhZGRlZCBpbiAwLjkuNSwKICAgICB0byAnLWNscmV4dCcgKD0gY2xlYXIgZXh0ZW5zaW9ucyksIGFzIGludGVuZGVkIGFuZCBkb2N1bWVudGVkLgogICAgIFtCb2RvIE1vZWxsZXI7IGluY29uc2lzdGVuY3kgcG9pbnRlZCBvdXQgYnkgTWljaGFlbCBBdHRpbGkKICAgICA8YXR0aWxpQGFtYXhvLmNvbT5dCgogICopIEZpeCBmb3IgSE1BQy4gSXQgd2Fzbid0IHplcm9pbmcgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrIGlmIHRoZSBrZXkgbGVuZ3RoCiAgICAgd2FzIGxhcmdlciB0aGFuIHRoZSBNRCBibG9jayBzaXplLiAgICAgIAogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFlvc3QgV2lsbGlhbSA8WW9zdFdAdGNlLmNvbT5dCgogICopIE1vZGVybmlzZSBQS0NTMTJfcGFyc2UoKSBzbyBpdCB1c2VzIFNUQUNLX09GKFg1MDkpIGZvciBpdHMgY2EgYXJndW1lbnQKICAgICBmaXggYSBsZWFrIHdoZW4gdGhlIGNhIGFyZ3VtZW50IHdhcyBwYXNzZWQgYXMgTlVMTC4gU3RvcCBYNTA5X1BVQktFWV9zZXQoKQogICAgIHVzaW5nIHRoZSBwYXNzZWQga2V5OiBpZiB0aGUgcGFzc2VkIGtleSB3YXMgYSBwcml2YXRlIGtleSB0aGUgcmVzdWx0CiAgICAgb2YgWDUwOV9wcmludCgpLCBmb3IgZXhhbXBsZSwgd291bGQgYmUgdG8gcHJpbnQgb3V0IGFsbCB0aGUgcHJpdmF0ZSBrZXkKICAgICBjb21wb25lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGRlc19xdWFkX2Nrc3VtKCkgYnl0ZSBvcmRlciBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyLCB1c2luZyB0aGUgcHJvYmxlbSBkZXNjcmlwdGlvbiBpbiBrcmI0LTAuOS43LCB3aGVyZQogICAgICB0aGUgc29sdXRpb24gaXMgYXR0cmlidXRlZCB0byBEZXJyaWNrIEogQnJhc2hlYXIgPHNoYWRvd0BERU1FTlRJQS5PUkc+XQoKICAqKSBGaXggc28gVl9BU04xX0FQUF9DSE9PU0Ugd29ya3MgYWdhaW46IGhvd2V2ZXIgaXRzIHVzZSBpcyBzdHJvbmdseQogICAgIGRpc2NvdXJhZ2VkLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IEJyaWFuIEtvcnZlciA8YnJpYW5rQGNzLnN0YW5mb3JkLmVkdT5dCgogICopIEZvciBlYXNpbHkgdGVzdGluZyBpbiBzaGVsbCBzY3JpcHRzIHdoZXRoZXIgc29tZSBjb21tYW5kCiAgICAgJ29wZW5zc2wgWFhYJyBleGlzdHMsIHRoZSBuZXcgcHNldWRvLWNvbW1hbmQgJ29wZW5zc2wgbm8tWFhYJwogICAgIHJldHVybnMgd2l0aCBleGl0IGNvZGUgMCBpZmYgbm8gY29tbWFuZCBvZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhdmFpbGFibGUuCiAgICAgJ25vLVhYWCcgaXMgcHJpbnRlZCBpbiB0aGlzIGNhc2UsICdYWFgnIG90aGVyd2lzZS4gIEluIGJvdGggY2FzZXMsCiAgICAgdGhlIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBhbmQgbm90aGluZyBpcyBwcmludGVkIHRvIHN0ZGVyci4KICAgICBBZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgYWx3YXlzIGlnbm9yZWQuCgogICAgIFNpbmNlIGZvciBlYWNoIGNpcGhlciB0aGVyZSBpcyBhIGNvbW1hbmQgb2YgdGhlIHNhbWUgbmFtZSwKICAgICB0aGUgJ25vLWNpcGhlcicgY29tcGlsYXRpb24gc3dpdGNoZXMgY2FuIGJlIHRlc3RlZCB0aGlzIHdheS4KCiAgICAgKCdvcGVuc3NsIG5vLVhYWCcgaXMgbm90IGFibGUgdG8gZGV0ZWN0IHBzZXVkby1jb21tYW5kcyBzdWNoCiAgICAgYXMgJ3F1aXQnLCAnbGlzdC1YWFgtY29tbWFuZHMnLCBvciAnbm8tWFhYJyBpdHNlbGYuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVwZGF0ZSB0ZXN0IHN1aXRlIHNvIHRoYXQgJ21ha2UgdGVzdCcgc3VjY2VlZHMgaW4gJ25vLXJzYScgY29uZmlndXJhdGlvbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGb3IgU1NMX1tDVFhfXXNldF90bXBfZGgsIGRvbid0IGNyZWF0ZSBhIERIIGtleSBpZiBTU0xfT1BfU0lOR0xFX0RIX1VTRQogICAgIGlzIHNldDsgaXQgd2lsbCBiZSB0aHJvd24gYXdheSBhbnl3YXkgYmVjYXVzZSBlYWNoIGhhbmRzaGFrZSBjcmVhdGVzCiAgICAgaXRzIG93biBrZXkuCiAgICAgc3NsX2NlcnRfZHVwLCB3aGljaCBpcyB1c2VkIGJ5IFNTTF9uZXcsIG5vdyBjb3BpZXMgREgga2V5cyBpbiBhZGRpdGlvbgogICAgIHRvIHBhcmFtZXRlcnMgLS0gaW4gcHJldmlvdXMgdmVyc2lvbnMgKHNpbmNlIE9wZW5TU0wgMC45LjMpIHRoZQogICAgICdkZWZhdWx0IGtleScgZnJvbSBTU0xfQ1RYX3NldF90bXBfZGggd291bGQgYWx3YXlzIGJlIGxvc3QsIG1lYW5pbmluZwogICAgIHlvdSBlZmZlY3Rpdmx5IGdvdCBTU0xfT1BfU0lOR0xFX0RIX1VTRSB3aGVuIHVzaW5nIHRoaXMgbWFjcm8uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IHNfY2xpZW50IG9wdGlvbiAtaWduX2VvZjogRU9GIGF0IHN0ZGluIGlzIGlnbm9yZWQsIGFuZAogICAgICdRJyBhbmQgJ1InIGxvc2UgdGhlaXIgc3BlY2lhbCBtZWFuaW5ncyAocXVpdC9yZW5lZ290aWF0ZSkuCiAgICAgVGhpcyBpcyBwYXJ0IG9mIHdoYXQgLXF1aWV0IGRvZXM7IHVubGlrZSAtcXVpZXQsIC1pZ25fZW9mCiAgICAgZG9lcyBub3Qgc3VwcHJlc3MgYW55IG91dHB1dC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgY29tcGF0aWJpbGl0eSBvcHRpb25zIHRvIHRoZSBwdXJwb3NlIGFuZCB0cnVzdCBjb2RlLiBUaGUKICAgICBwdXJwb3NlIFg1MDlfUFVSUE9TRV9BTlkgaXMgImFueSBwdXJwb3NlIiB3aGljaCBhdXRvbWF0aWNhbGx5CiAgICAgYWNjZXB0cyBhIGNlcnRpZmljYXRlIG9yIENBLCB0aGlzIHdhcyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLAogICAgIHdpdGggYWxsIHRoZSBhc3NvY2lhdGVkIHNlY3VyaXR5IGlzc3Vlcy4KCiAgICAgWDUwOV9UUlVTVF9DT01QQVQgaXMgdGhlIG9sZCB0cnVzdCBiZWhhdmlvdXI6IG9ubHkgYW5kCiAgICAgYXV0b21hdGljYWxseSB0cnVzdCBzZWxmIHNpZ25lZCByb290cyBpbiBjZXJ0aWZpY2F0ZSBzdG9yZS4gQQogICAgIG5ldyB0cnVzdCBzZXR0aW5nIFg1MDlfVFJVU1RfREVGQVVMVCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhhdAogICAgIGEgcHVycG9zZSBoYXMgbm8gYXNzb2NpYXRlZCB0cnVzdCBzZXR0aW5nIGFuZCBpdCBzaG91bGQgaW5zdGVhZAogICAgIHVzZSB0aGUgdmFsdWUgaW4gdGhlIGRlZmF1bHQgcHVycG9zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIFBLQ1MjOCBEU0EgcHJpdmF0ZSBrZXkgY29kZSBzbyBpdCBkZWNvZGVzIGtleXMgYWdhaW4KICAgICBhbmQgZml4IGEgbWVtb3J5IGxlYWsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gdXRpbC9ta2Vyci5wbCAod2hpY2ggaW1wbGVtZW50cyAnbWFrZSBlcnJvcnMnKSwgcHJlc2VydmUKICAgICByZWFzb24gc3RyaW5ncyBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSAuYyBmaWxlLCBhcwogICAgIHRoZSBkZWZhdWx0IHRvIGhhdmUgb25seSBkb3duY2FzZSBsZXR0ZXJzIChhbmQgZGlnaXRzKSBpbgogICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHJlYXNvbnMgY29kZXMgaXMgbm90IGFsd2F5cyBhcHByb3ByaWF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBFUlJfbG9hZF9FUlJfc3RyaW5ncygpLCBidWlsZCBhbiBFUlJfTElCX1NZUyBlcnJvciByZWFzb24gdGFibGUKICAgICB1c2luZyBzdHJlcnJvci4gIFByZXZpb3VzbHksIEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKCkgcmV0dXJuZWQKICAgICBsaWJyYXJ5IG5hbWVzIGFzIHJlYXNvbiBzdHJpbmdzIGZvciBTWVNlcnI7IGJ1dCBTWVNlcnIgaXMgYSBzcGVjaWFsCiAgICAgY2FzZSB3aGVyZSBzbWFsbCBudW1iZXJzIGFyZSBlcnJubyB2YWx1ZXMsIG5vdCBsaWJyYXJ5IG51bWJlcnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkICctZHNhcGFyYW0nIG9wdGlvbiB0byAnb3BlbnNzbCBkaHBhcmFtJyBhcHBsaWNhdGlvbi4gIFRoaXMKICAgICBjb252ZXJ0cyBEU0EgcGFyYW1ldGVycyBpbnRvIERIIHBhcmFtZXRlcnMuIChXaGVuIGNyZWF0aW5nIHBhcmFtZXRlcnMsCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgaXMgdXNlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSAnbGVuZ3RoJyAocmVjb21tZW5kZWQgZXhwb25lbnQgbGVuZ3RoKSBpbiBDIGNvZGUgZ2VuZXJhdGVkCiAgICAgYnkgJ29wZW5zc2wgZGhwYXJhbSAtQycuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIHNlY29uZCBhcmd1bWVudCB0byBzZXRfbGFiZWwgaW4gcGVybGFzbSB3YXMgYWxyZWFkeSBiZWluZyB1c2VkCiAgICAgc28gY291bGRuJ3QgYmUgdXNlZCBhcyBhICJmaWxlIHNjb3BlIiBmbGFnLiBNb3ZlZCB0byB0aGlyZCBhcmd1bWVudAogICAgIHdoaWNoIHdhcyBmcmVlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBFTV9BU04xX3dyaXRlX2JpbyBhbmQgc29tZSBvdGhlciBmdW5jdGlvbnMsIHVzZSBSQU5EX3BzZXVkb19ieXRlcwogICAgIGluc3RlYWQgb2YgUkFORF9ieXRlcyBmb3IgZW5jcnlwdGlvbiBJVnMgYW5kIHNhbHRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY2x1ZGUgUkFORF9zdGF0dXMoKSBpbnRvIFJBTkRfTUVUSE9EIGluc3RlYWQgb2YgaW1wbGVtZW50aW5nCiAgICAgaXQgb25seSBmb3IgbWRfcmFuZC5jICBPdGhlcndpc2UgcmVwbGFjaW5nIHRoZSBQUk5HIGJ5IGNhbGxpbmcKICAgICBSQU5EX3NldF9yYW5kX21ldGhvZCB3b3VsZCBiZSBpbXBvc3NpYmxlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IGxldCBEU0FfZ2VuZXJhdGVfa2V5KCkgZW50ZXIgYW4gaW5maW5pdGUgbG9vcCBpZiB0aGUgcmFuZG9tCiAgICAgbnVtYmVyIGdlbmVyYXRpb24gZmFpbHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICdyYW5kJyBhcHBsaWNhdGlvbiBmb3IgY3JlYXRpbmcgcHNldWRvLXJhbmRvbSBvdXRwdXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkZWQgY29uZmlndXJhdGlvbiBzdXBwb3J0IGZvciBMaW51eC9JQTY0CiAgICAgW1JvbGYgSGFiZXJyZWNrZXIgPHJvbGZAc3VzZS5kZT5dCgogICopIEFzc2VtYmxlciBtb2R1bGUgc3VwcG9ydCBmb3IgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgSFBVWCAoaW4gc2hsaWIvKS4KICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT4gYW5kIEFub255bW91c10KCiAgKikgU2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBmb3IgU29sYXJpcyBnY2MuCiAgICAgW0x1dHogQmVobmtlIDxiZWhua2VAdHJ1c3RjZW50ZXIuZGU+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNCBhbmQgMC45LjUgIFsyOCBGZWIgMjAwMF0KCiAgKikgUEtDUzdfZW5jcnlwdCgpIHdhcyBhZGRpbmcgdGV4dCBNSU1FIGhlYWRlcnMgdHdpY2UgYmVjYXVzZSB0aGV5CiAgICAgd2VyZSBhZGRlZCBtYW51YWxseSBhbmQgYnkgU01JTUVfY3JsZl9jb3B5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gYm50ZXN0LmMgZG9uJ3QgY2FsbCBCTl9yYW5kIHdpdGggemVybyBiaXRzIGFyZ3VtZW50LgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IEFuZHJldyBXLiBHcmF5IDxhZ3JheUBpY29uc2luYy5jb20+XQoKICAqKSBCTl9tdWwgYnVnZml4OiBJbiBibl9tdWxfcGFydF9yZWN1cnNpb24oKSBvbmx5IHRoZSBhPmFbbl0gJiYgYj5iW25dCiAgICAgY2FzZSB3YXMgaW1wbGVtZW50ZWQuIFRoaXMgY2F1c2VkIEJOX2Rpdl9yZWNwKCkgdG8gZmFpbCBvY2Nhc2lvbmFsbHkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIHNldF9sYWJlbCgpIGluIHRoZSBwZXJsCiAgICAgYXNzZW1ibHkgbGFuZ3VhZ2UgYnVpbGRlci4gSWYgdGhpcyBhcmd1bWVudCBleGlzdHMgYW5kIGlzIHNldAogICAgIHRvIDEgaXQgc2lnbmFscyB0aGF0IHRoZSBhc3NlbWJsZXIgc2hvdWxkIHVzZSBhIHN5bWJvbCB3aG9zZSAKICAgICBzY29wZSBpcyB0aGUgZW50aXJlIGZpbGUsIG5vdCBqdXN0IHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGlzCiAgICAgaXMgbmVlZGVkIHdpdGggTUFTTSB3aGljaCB1c2VzIHRoZSBmb3JtYXQgbGFiZWw6OiBmb3IgdGhpcyBzY29wZS4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBQZXRlciBSdW5lc3RpZyA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBBU04xIHR5cGVzIHNvIHRoZXkgYXJlIHR5cGVkZWZzIGJ5IGRlZmF1bHQuIEJlZm9yZQogICAgIGFsbW9zdCBhbGwgdHlwZXMgd2VyZSAjZGVmaW5lJ2QgdG8gQVNOMV9TVFJJTkcgd2hpY2ggd2FzIGNhdXNpbmcKICAgICBTVEFDS19PRigpIHByb2JsZW1zOiB5b3UgY291bGRuJ3QgZGVjbGFyZSBTVEFDS19PRihBU04xX1VURjhTVFJJTkcpCiAgICAgZm9yIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIG5hbWVzIG9mIG5ldyBmdW5jdGlvbnMgdG8gdGhlIG5ldyBnZXQxL2dldDAgbmFtaW5nCiAgICAgY29udmVudGlvbjogQWZ0ZXIgJ2dldDEnLCB0aGUgY2FsbGVyIG93bnMgYSByZWZlcmVuY2UgY291bnQKICAgICBhbmQgaGFzIHRvIGNhbGwgLi4uX2ZyZWU7ICdnZXQwJyByZXR1cm5zIGEgcG9pbnRlciB0byBzb21lCiAgICAgZGF0YSBzdHJ1Y3R1cmUgd2l0aG91dCBpbmNyZW1lbnRpbmcgcmVmZXJlbmNlIGNvdW50ZXJzLgogICAgIChTb21lIG9mIHRoZSBleGlzdGluZyAnZ2V0JyBmdW5jdGlvbnMgaW5jcmVtZW50IGEgcmVmZXJlbmNlCiAgICAgY291bnRlciwgc29tZSBkb24ndC4pCiAgICAgU2ltaWxhcmx5LCAnc2V0MScgYW5kICdhZGQxJyBmdW5jdGlvbnMgaW5jcmVhc2UgcmVmZXJlbmNlCiAgICAgY291bnRlcnMgb3IgZHVwbGljYXRlIG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSBvZiB0ZW1wIFJTQSBrZXkgZ2VuZXJhdGlvbiBmYWlsdXJlOgogICAgIHRoZSBjb2RlIHVzZWQgdG8gYXNzdW1lIGl0IGFsd2F5cyB3b3JrZWQgYW5kIGNyYXNoZWQgb24gZmFpbHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcG90ZW50aWFsIGJ1ZmZlciBvdmVycnVuIHByb2JsZW0gaW4gQklPX3ByaW50ZigpLgogICAgIFtVbGYgTfZsbGVyLCB1c2luZyBwdWJsaWMgZG9tYWluIGNvZGUgYnkgUGF0cmljayBQb3dlbGw7IHByb2JsZW0KICAgICAgcG9pbnRlZCBvdXQgYnkgRGF2aWQgU2FjZXJkb3RlIDxkYXMzM0Bjb3JuZWxsLmVkdT5dCgogICopIFN1cHBvcnQgRUdEIDxodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vPi4gIE5ldyBmdW5jdGlvbnMKICAgICBSQU5EX2VnZCgpIGFuZCBSQU5EX3N0YXR1cygpLiAgSW4gdGhlIGNvbW1hbmQgbGluZSBhcHBsaWNhdGlvbiwKICAgICB0aGUgRUdEIHNvY2tldCBjYW4gYmUgc3BlY2lmaWVkIGxpa2UgYSBzZWVkIGZpbGUgdXNpbmcgUkFOREZJTEUKICAgICBvciAtcmFuZC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWxsb3cgdGhlIHN0cmluZyBDRVJUSUZJQ0FURSB0byBiZSB0b2xlcmF0ZWQgaW4gUEtDUyM3IHN0cnVjdHVyZXMuCiAgICAgU29tZSBDQXMgKGUuZy4gVmVyaXNpZ24pIGRpc3RyaWJ1dGUgY2VydGlmaWNhdGVzIGluIHRoaXMgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgdGhlIFNTTF9BTExPV19BREggY29tcGlsZSBvcHRpb24gYW5kIHNldCB0aGUgZGVmYXVsdCBjaXBoZXIKICAgICBsaXN0IHRvIGV4Y2x1ZGUgdGhlbS4gVGhpcyBtZWFucyB0aGF0IG5vIHNwZWNpYWwgY29tcGlsYXRpb24gb3B0aW9uCiAgICAgaXMgbmVlZGVkIHRvIHVzZSBhbm9ueW1vdXMgREg6IGl0IGp1c3QgbmVlZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCiAgICAgY2lwaGVyIGxpc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBFVlBfTURfQ1RYX3R5cGUgbWFjcm8gc28gaXRzIG1lYW5pbmcgY29uc2lzdGVudCB3aXRoCiAgICAgRVZQX01EX3R5cGUuIFRoZSBvbGQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gYSBuZXcgbWFjcm8gY2FsbGVkCiAgICAgRVZQX01EX21kKCkuIENoYW5nZSBjb2RlIHRoYXQgdXNlcyBpdCBhbmQgdXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgLi4uX2N0cmwgZnVuY3Rpb25zIG5vdyBoYXZlIGNvcnJlc3BvbmRpbmcgLi4uX2NhbGxiYWNrX2N0cmwgZnVuY3Rpb25zCiAgICAgd2hlcmUgdGhlICd2b2lkIConIGFyZ3VtZW50IGlzIHJlcGxhY2VkIGJ5IGEgZnVuY3Rpb24gcG9pbnRlciBhcmd1bWVudC4KICAgICBQcmV2aW91c2x5ICd2b2lkIConIHdhcyBhYnVzZWQgdG8gcG9pbnQgdG8gZnVuY3Rpb25zLCB3aGljaCB3b3JrcyBvbgogICAgIG1hbnkgcGxhdGZvcm1zLCBidXQgaXMgbm90IGNvcnJlY3QuICBBcyB0aGVzZSBmdW5jdGlvbnMgYXJlIHVzdWFsbHkKICAgICBjYWxsZWQgYnkgbWFjcm9zIGRlZmluZWQgaW4gT3BlblNTTCBoZWFkZXIgZmlsZXMsIG1vc3Qgc291cmNlIGNvZGUKICAgICBzaG91bGQgd29yayB3aXRob3V0IGNoYW5nZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4gKHdoaWNoIGlzIGNyZWF0ZWQgYnkgQ29uZmlndXJlKSBub3cgY29udGFpbnMKICAgICBzZWN0aW9ucyB3aXRoIGluZm9ybWF0aW9uIG9uIC1ELi4uIGNvbXBpbGVyIHN3aXRjaGVzIHVzZWQgZm9yCiAgICAgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IHNvIHRoYXQgYXBwbGljYXRpb25zIGNhbiBzZWUgdGhlbS4gIFRvIGVuYWJsZQogICAgIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgYSBwcmUtcHJvY2Vzc29yIHN5bWJvbCBPUEVOU1NMXy4uLl9ERUZJTkVTCiAgICAgbXVzdCBiZSBkZWZpbmVkLiAgRS5nLiwKICAgICAgICAjZGVmaW5lIE9QRU5TU0xfQUxHT1JJVEhNX0RFRklORVMKICAgICAgICAjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgogICAgIGRlZmluZXMgYWxsIHBlcnRpbmVudCBOT188YWxnbz4gc3ltYm9scywgc3VjaCBhcyBOT19JREVBLCBOT19SU0EsIGV0Yy4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBVbGYgYW5kIEJvZG8gTfZsbGVyXQoKICAqKSBCdWdmaXg6IFRvbGVyYXRlIGZyYWdtZW50YXRpb24gYW5kIGludGVybGVhdmluZyBpbiB0aGUgU1NMIDMvVExTCiAgICAgcmVjb3JkIGxheWVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgJ290aGVyJyB0eXBlIGluIGNlcnRpZmljYXRlIGF1eCBpbmZvIHRvIGEgU1RBQ0tfT0YKICAgICBYNTA5X0FMR09SLiBBbHRob3VnaCBub3QgYW4gQWxnb3JpdGhtSWRlbnRpZmllciBhcyBzdWNoIGl0IGhhcwogICAgIHRoZSByZXF1aXJlZCBBU04xIGZvcm1hdDogYXJiaXRyYXJ5IHR5cGVzIGRldGVybWluZWQgYnkgYW4gT0lELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIFBFTV93cml0ZV9YNTA5X1JFUV9ORVcoKSBmdW5jdGlvbnMgYW5kIGEgY29tbWFuZCBsaW5lCiAgICAgYXJndW1lbnQgdG8gJ3JlcScuIFRoaXMgaXMgbm90IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzIG5ld2VyIG9yCiAgICAgYmV0dGVyIHRoYW4gb3RoZXJzIGl0IGp1c3QgdXNlcyB0aGUgd29yayAnTkVXJyBpbiB0aGUgY2VydGlmaWNhdGUKICAgICByZXF1ZXN0IGhlYWRlciBsaW5lcy4gU29tZSBzb2Z0d2FyZSBuZWVkcyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2UgcGFzc3dvcmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50czogbm93IHBhc3N3b3JkcyBjYW4gYmUKICAgICBvYnRhaW5lZCBmcm9tIHZhcmlvdXMgc291cmNlcy4gRGVsZXRlIHRoZSBQRU1fY2IgZnVuY3Rpb24gYW5kIG1ha2UKICAgICBpdCB0aGUgZGVmYXVsdCBiZWhhdmlvdXI6IGkuZS4gaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwgYW5kIHRoZQogICAgIHVzcmRhdGEgYXJndW1lbnQgaXMgbm90IE5VTEwgaW50ZXJwcmV0IGl0IGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHBhc3MKICAgICBwaHJhc2UuIElmIHVzcmRhdGEgYW5kIHRoZSBjYWxsYmFjayBhcmUgTlVMTCB0aGVuIHRoZSBwYXNzIHBocmFzZQogICAgIGlzIHByb21wdGVkIGZvciBhcyB1c3VhbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIENvbXBhcSBBdGFsbGEgY3J5cHRvIGFjY2VsZXJhdG9yLiBJZiBpdCBpcyBpbnN0YWxsZWQsCiAgICAgdGhlIHN1cHBvcnQgaXMgYXV0b21hdGljYWxseSBlbmFibGVkLiBUaGUgcmVzdWx0aW5nIGJpbmFyaWVzIHdpbGwKICAgICBhdXRvZGV0ZWN0IHRoZSBjYXJkIGFuZCB1c2UgaXQgaWYgcHJlc2VudC4KICAgICBbQmVuIExhdXJpZSBhbmQgQ29tcGFxIEluYy5dCgogICopIFdvcmsgYXJvdW5kIGZvciBOZXRzY2FwZSBoYW5nIGJ1Zy4gVGhpcyBzZW5kcyBjZXJ0aWZpY2F0ZSByZXF1ZXN0CiAgICAgYW5kIHNlcnZlciBkb25lIGluIG9uZSByZWNvcmQuIFNpbmNlIHRoaXMgaXMgcGVyZmVjdGx5IGxlZ2FsIGluIHRoZQogICAgIFNTTC9UTFMgcHJvdG9jb2wgaXQgaXNuJ3QgYSAiYnVnIiBvcHRpb24gYW5kIGlzIG9uIGJ5IGRlZmF1bHQuIFNlZQogICAgIHRoZSBidWdzL1NTTHYzIGVudHJ5IGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSFAtVVggdHVuZS11cDogbmV3IHVuaWZpZWQgY29uZmlncywgSFAgQyBjb21waWxlciBidWcgd29ya2Fyb3VuZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIC1yYW5kIGFyZ3VtZW50IHRvIHNtaW1lIGFuZCBwa2NzMTIgYXBwbGljYXRpb25zIGFuZCByZWFkL3dyaXRlCiAgICAgb2Ygc2VlZCBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAncGFzc3dkJyB0b29sIGZvciBjcnlwdCgzKSBhbmQgYXByMSBwYXNzd29yZCBoYXNoZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGNvbW1hbmQgbGluZSBwYXNzd29yZCBvcHRpb25zIHRvIHRoZSByZW1haW5pbmcgYXBwbGljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1ZyBmaXggZm9yIEJOX2Rpdl9yZWNwKCkgZm9yIG51bWVyYXRvcnMgd2l0aCBhbiBldmVuIG51bWJlciBvZgogICAgIGJpdHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE1vcmUgdGVzdHMgaW4gYm50ZXN0LmMsIGFuZCBjaGFuZ2VkIHRlc3RfYm4gb3V0cHV0LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSAuL2NvbmZpZyByZWNvZ25pemVzIE1hY09TIFggbm93LgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBCdWcgZml4IGZvciBCTl9kaXYoKSB3aGVuIHRoZSBmaXJzdCB3b3JkcyBvZiBudW0gYW5kIGRpdnNvciBhcmUKICAgICBlcXVhbCAoaXQgZ2F2ZSB3cm9uZyByZXN1bHRzIGlmIChyZW09KG4xLXEqZDApJkJOX01BU0syKSA8IGQwKS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgYnJva2VuIFBLQ1MjOCBmb3JtYXRzLCBhbmQgY29tbWFuZCBsaW5lCiAgICAgb3B0aW9ucyB0byBwcm9kdWNlIHRoZW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBCTl9DVFhfc3RhcnQoKSwgQk5fQ1RYX2dldCgpIGFuZCBCVF9DVFhfZW5kKCkgdG8KICAgICBnZXQgdGVtcG9yYXJ5IEJJR05VTXMgZnJvbSBhIEJOX0NUWC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ29ycmVjdCByZXR1cm4gdmFsdWVzIGluIEJOX21vZF9leHBfbW9udCgpIGFuZCBCTl9tb2RfZXhwMl9tb250KCkKICAgICBmb3IgcCA9PSAwLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIFNTTGVheV9hZGRfYWxsXyooKSBmdW5jdGlvbnMgdG8gT3BlblNTTF9hZGRfYWxsXyooKSBhbmQKICAgICBpbmNsdWRlIGEgI2RlZmluZSBmcm9tIHRoZSBvbGQgbmFtZSB0byB0aGUgbmV3LiBUaGUgb3JpZ2luYWwgaW50ZW50CiAgICAgd2FzIHRoYXQgc3RhdGljYWxseSBsaW5rZWQgYmluYXJpZXMgY291bGQgZm9yIGV4YW1wbGUganVzdCBjYWxsCiAgICAgU1NMZWF5X2FkZF9hbGxfY2lwaGVycygpIHRvIGp1c3QgYWRkIGNpcGhlcnMgdG8gdGhlIHRhYmxlIGFuZCBub3QKICAgICBsaW5rIHdpdGggZGlnZXN0cy4gVGhpcyBuZXZlciB3b3JrZWQgYmVjYXlzZSBTU0xlYXlfYWRkX2FsbF9kaWdlc3RzKCkKICAgICBhbmQgU1NMZWF5X2FkZF9hbGxfY2lwaGVycygpIHdlcmUgaW4gdGhlIHNhbWUgc291cmNlIGZpbGUgc28gY2FsbGluZwogICAgIG9uZSB3b3VsZCBsaW5rIHdpdGggdGhlIG90aGVyLiBUaGV5IGFyZSBub3cgaW4gc2VwYXJhdGUgc291cmNlIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyAtbm90ZXh0IG9wdGlvbiB0byAnY2EnIGFuZCBhIC1wdWJrZXkgb3B0aW9uIHRvICdzcGthYycuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGEgbGVzcyB1bnVzdWFsIGZvcm0gb2YgdGhlIE1pbGxlci1SYWJpbiBwcmltYWxpdHkgdGVzdCAoaXQgdXNlZAogICAgIGEgYmluYXJ5IGFsZ29yaXRobSBmb3IgZXhwb25lbnRpYXRpb24gaW50ZWdyYXRlZCBpbnRvIHRoZSBNaWxsZXItUmFiaW4KICAgICBsb29wLCBvdXIgc3RhbmRhcmQgbW9kZXhwIGFsZ29yaXRobXMgYXJlIGZhc3RlcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3VwcG9ydCBmb3IgdGhlIEVCQ0RJQyBjaGFyYWN0ZXIgc2V0IGNvbXBsZXRlZC4KICAgICBbTWFydGluIEtyYWVtZXIgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+XQoKICAqKSBTb3VyY2UgY29kZSBjbGVhbnVwczogdXNlIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlLCBlbGltaW5hdGUgY2FzdHMsCiAgICAgdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKiBpbiBsaGFzaC4KICAgICBbVWxmIE32bGxlcl0gCgogICopIEJ1Z2ZpeDogc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2Ugd2FzIG5vdCByZXN0YXJ0YWJsZQogICAgICh0aGUgc3RhdGUgd2FzIG5vdCBjaGFuZ2VkIHRvIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQiwgYW5kIGJlY2F1c2Ugb2YKICAgICB0aGlzIHRoZSBzZXJ2ZXIgY291bGQgb3ZlcndyaXRlIGVwaGVtZXJhbCBrZXlzIHRoYXQgdGhlIGNsaWVudAogICAgIGhhcyBhbHJlYWR5IHNlZW4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gRFNBX2lzX3ByaW1lIGludG8gYSBtYWNybyB0aGF0IGNhbGxzIEJOX2lzX3ByaW1lLAogICAgIHVzaW5nIDUwIGl0ZXJhdGlvbnMgb2YgdGhlIFJhYmluLU1pbGxlciB0ZXN0LgoKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBub3cgdXNlcyBCTl9pc19wcmltZV9mYXN0dGVzdCAod2l0aCA1MAogICAgIGl0ZXJhdGlvbnMgb2YgdGhlIFJhYmluLU1pbGxlciB0ZXN0IGFzIHJlcXVpcmVkIGJ5IHRoZSBhcHBlbmRpeAogICAgIHRvIEZJUFMgUFVCIDE4NlstMV0pIGluc3RlYWQgb2YgRFNBX2lzX3ByaW1lLgogICAgIEFzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0IGluY2x1ZGVzIHRyaWFsIGRpdmlzaW9uLCBEU0EgcGFyYW1ldGVyCiAgICAgZ2VuZXJhdGlvbiBiZWNvbWVzIG11Y2ggZmFzdGVyLgoKICAgICBUaGlzIGltcGxpZXMgYSBjaGFuZ2UgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgaW4gRFNBX2lzX3ByaW1lCiAgICAgYW5kIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzOiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UKICAgICBmb3IgZWFjaCBwb3NpdGl2ZSB3aXRuZXNzIGluIHRoZSBSYWJpbi1NaWxsZXIgdGVzdCwgbm90IGp1c3QKICAgICBvY2Nhc2lvbmFsbHkgaW4gdGhlIGlubmVyIGxvb3A7IGFuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUKICAgICBjYWxsYmFjayBmdW5jdGlvbiBub3cgcHJvdmlkZSBhbiBpdGVyYXRpb24gY291bnQgZm9yIHRoZSBvdXRlcgogICAgIGxvb3AgcmF0aGVyIHRoYW4gZm9yIHRoZSBjdXJyZW50IGludm9jYXRpb24gb2YgdGhlIGlubmVyIGxvb3AuCiAgICAgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnMgYWRkaXRpb25hbGx5IGNhbiBjYWxsIHRoZSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHdpdGggYW4gJ2l0ZXJhdGlvbiBjb3VudCcgb2YgLTEsIG1lYW5pbmcgdGhhdCBhCiAgICAgY2FuZGlkYXRlIGhhcyBwYXNzZWQgdGhlIHRyaWFsIGRpdmlzaW9uIHRlc3QgKHdoZW4gcSBpcyBnZW5lcmF0ZWQgCiAgICAgZnJvbSBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBzZWVkLCB0cmlhbCBkaXZpc2lvbiBpcyBza2lwcGVkKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5faXNfcHJpbWVfZmFzdHRlc3QgdGhhdCBvcHRpb25hbGx5IGRvZXMgdHJpYWwKICAgICBkaXZpc2lvbiBiZWZvcmUgc3RhcnRpbmcgdGhlIFJhYmluLU1pbGxlciB0ZXN0IGFuZCBoYXMKICAgICBhbiBhZGRpdGlvbmFsIEJOX0NUWCAqIGFyZ3VtZW50ICh3aGVyZWFzIEJOX2lzX3ByaW1lIGFsd2F5cwogICAgIGhhcyB0byBhbGxvY2F0ZSBhdCBsZWFzdCBvbmUgQk5fQ1RYKS4KICAgICAnY2FsbGJhY2soMSwgLTEsIGNiX2FyZyknIGlzIGNhbGxlZCB3aGVuIGEgbnVtYmVyIGhhcyBwYXNzZWQgdGhlCiAgICAgdHJpYWwgZGl2aXNpb24gc3RhZ2UuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBidWcgaW4gQ1JMIGVuY29kaW5nLiBUaGUgdmFsaWRpdHkgZGF0ZXMgd2VyZW4ndCBiZWluZyBoYW5kbGVkCiAgICAgYXMgQVNOMV9USU1FLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtcGtjczEyIG9wdGlvbiB0byBDQS5wbCBzY3JpcHQgdG8gd3JpdGUgb3V0IGEgUEtDUyMxMiBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBCTl9wc2V1ZG9fcmFuZCgpLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBCTl9tb2RfbXVsX21vbnRnb21lcnkoKTogcmVwbGFjZSB0aGUgYnJva2VuIChhbmQgdW5yZWFkYWJsZSkKICAgICBiaWdudW0gdmVyc2lvbiBvZiBCTl9mcm9tX21vbnRnb21lcnkoKSB3aXRoIHRoZSB3b3JraW5nIGNvZGUgZnJvbQogICAgIFNTTGVheSAwLjkuMCAodGhlIHdvcmQgYmFzZWQgdmVyc2lvbiBpcyBmYXN0ZXIgYW55d2F5KSwgYW5kIGNsZWFuIHVwCiAgICAgdGhlIGNvbW1lbnRzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBdm9pZCBhIHJhY2UgY29uZGl0aW9uIGluIHMyX2NsbnQuYyAoZnVuY3Rpb24gZ2V0X3NlcnZlcl9oZWxsbykgdGhhdAogICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIHNhbWUgU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUgaW4KICAgICBTU0wyIGNsaWVudHMgaW4gbXVsdGlwbGUgdGhyZWFkcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgcmV0dXJuIHZhbHVlIG9mIFJBTkRfbG9hZF9maWxlKCkgbm8gbG9uZ2VyIGNvdW50cyBieXRlcyBvYnRhaW5lZAogICAgIGJ5IHN0YXQoKS4gIFJBTkRfbG9hZF9maWxlKC4uLiwgLTEpIGlzIG5ldyBhbmQgdXNlcyB0aGUgY29tcGxldGUgZmlsZQogICAgIHRvIHNlZWQgdGhlIFBSTkcgKHByZXZpb3VzbHkgYW4gZXhwbGljaXQgYnl0ZSBjb3VudCB3YXMgcmVxdWlyZWQpLgogICAgIFtVbGYgTfZsbGVyLCBCb2RvIE32bGxlcl0KCiAgKikgQ2xlYW4gdXAgQ1JZUFRPX0VYX0RBVEEgZnVuY3Rpb25zLCBzb21lIG9mIHRoZXNlIGRpZG4ndCBoYXZlIHByb3RvdHlwZXMKICAgICB1c2VkIChjaGFyICopIGluc3RlYWQgb2YgKHZvaWQgKikgYW5kIGhhZCBjYXN0cyBhbGwgb3ZlciB0aGUgcGxhY2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBCTl9nZW5lcmF0ZV9wcmltZSgpIHJldHVybiBOVUxMIG9uIGVycm9yIGlmIHJldCE9TlVMTC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUmV0YWluIHNvdXJjZSBjb2RlIGNvbXBhdGliaWxpdHkgZm9yIEJOX3ByaW1lX2NoZWNrcyBtYWNybzoKICAgICBCTl9pc19wcmltZSguLi4sIEJOX3ByaW1lX2NoZWNrcywgLi4uKSBub3cgdXNlcwogICAgIEJOX3ByaW1lX2NoZWNrc19mb3Jfc2l6ZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZgogICAgIFJhYmluLU1pbGxlciBpdGVyYXRpb25zLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEaWZmaWUtSGVsbG1hbiB1c2VzICJzYWZlIiBwcmltZXM6IERIX2NoZWNrKCkgcmV0dXJuIGNvZGUgcmVuYW1lZCB0bwogICAgIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUuCiAgICAgKENoZWNrIGlmIHRoaXMgaXMgdHJ1ZT8gT3BlblBHUCBjYWxscyB0aGVtICJzdHJvbmciLikKICAgICBbVWxmIE32bGxlcl0KCiAgKikgTWVyZ2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgImRoIiBhbmQgImdlbmRoIiBwcm9ncmFtcyBpbnRvIGEgbmV3IHByb2dyYW0KICAgICAiZGhwYXJhbSIuIFRoZSBvbGQgcHJvZ3JhbXMgYXJlIHJldGFpbmVkIGZvciBub3cgYnV0IHdpbGwgaGFuZGxlIERIIGtleXMKICAgICAoaW5zdGVhZCBvZiBwYXJhbWV0ZXJzKSBpbiBmdXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgY2lwaGVycywgc19zZXJ2ZXIgYW5kIHNfY2xpZW50IHByb2dyYW1zIGNoZWNrIHRoZSByZXR1cm4gdmFsdWVzCiAgICAgd2hlbiBhIG5ldyBjaXBoZXIgbGlzdCBpcyBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgU1NML1RMUyBjaXBoZXIgbWVjaGFuaXNtIHRvIGNvcnJlY3RseSBoYW5kbGUgdGhlIFRMUyA1NmJpdAogICAgIGNpcGhlcnMuIEJlZm9yZSB3aGVuIHRoZSA1NmJpdCBjaXBoZXJzIHdlcmUgZW5hYmxlZCB0aGUgc29ydGluZyB3YXMKICAgICB3cm9uZy4KCiAgICAgVGhlIHN5bnRheCBmb3IgdGhlIGNpcGhlciBzb3J0aW5nIGhhcyBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgc29ydGluZyBieQogICAgIGNpcGhlci1zdHJlbmd0aCAodXNpbmcgdGhlIHN0cmVuZ3RoX2JpdHMgaGFyZCBjb2RlZCBpbiB0aGUgdGFibGVzKS4KICAgICBUaGUgbmV3IGNvbW1hbmQgaXMgIkBTVFJFTkdUSCIgKHNlZSBhbHNvIGRvYy9hcHBzL2NpcGhlcnMucG9kKS4KCiAgICAgRml4IGEgYnVnIGluIHRoZSBjaXBoZXItY29tbWFuZCBwYXJzZXI6IHdoZW4gc3VwcGx5aW5nIGEgY2lwaGVyIGNvbW1hbmQKICAgICBzdHJpbmcgd2l0aCBhbiAidW5kZWZpbmVkIiBzeW1ib2wgKG5laXRoZXIgY29tbWFuZCBub3IgYWxwaGFudW1lcmljCiAgICAgW0EtWmEtejAtOV0sIHNzbF9zZXRfY2lwaGVyX2xpc3QgdXNlZCB0byBoYW5nIGluIGFuIGVuZGxlc3MgbG9vcC4gTm93CiAgICAgYW4gZXJyb3IgaXMgZmxhZ2dlZC4KCiAgICAgRHVlIHRvIHRoZSBzdHJlbmd0aC1zb3J0aW5nIGV4dGVuc2lvbiwgdGhlIGNvZGUgb2YgdGhlCiAgICAgc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpIGZ1bmN0aW9uIHdhcyBjb21wbGV0ZWx5IHJlYXJyYW5nZWQuIEkgaG9wZSB0aGF0CiAgICAgdGhlIHJlYWRhYmlsaXR5IHdhcyBhbHNvIGluY3JlYXNlZCA6LSkKICAgICBbTHV0eiBKYWVuaWNrZSA8THV0ei5KYWVuaWNrZUBhZXQuVFUtQ290dGJ1cy5ERT5dCgogICopIE1pbm9yIGNoYW5nZSB0byAneDUwOScgdXRpbGl0eS4gVGhlIC1DQWNyZWF0ZXNlcmlhbCBvcHRpb24gbm93IHVzZXMgMQogICAgIGZvciB0aGUgZmlyc3Qgc2VyaWFsIG51bWJlciBhbmQgcGxhY2VzIDIgaW4gdGhlIHNlcmlhbCBudW1iZXIgZmlsZS4gVGhpcwogICAgIGF2b2lkcyBwcm9ibGVtcyB3aGVuIHRoZSByb290IENBIGlzIGNyZWF0ZWQgd2l0aCBzZXJpYWwgbnVtYmVyIHplcm8gYW5kCiAgICAgdGhlIGZpcnN0IHVzZXIgY2VydGlmaWNhdGUgaGFzIHRoZSBzYW1lIGlzc3VlciBuYW1lIGFuZCBzZXJpYWwgbnVtYmVyCiAgICAgYXMgdGhlIHJvb3QgQ0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gWDUwOV9BVFRSSUJVVEUgdXRpbGl0aWVzLCBjaGFuZ2UgdGhlICdyZXEnIHByb2dyYW0gc28gaXQgdXNlcwogICAgIHRoZSBuZXcgY29kZS4gQWRkIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgc3R1ZmYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMuIFRoZXNlIGhhdmUgYmVlbiByZW5hbWVkIGZyb20KICAgICBYNTA5XyooKSB0byBYNTA5YXRfKigpIG9uIHRoZSBncm91bmRzIHRoYXQgdGhleSBkb24ndCBoYW5kbGUgWDUwOQogICAgIHN0cnVjdHVyZXMgYW5kIGJlaGF2ZSBpbiBhbiBhbmFsYWdvdXMgd2F5IHRvIHRoZSBYNTA5djMgZnVuY3Rpb25zOgogICAgIHRoZXkgc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBidXQgd3JhcHBlciBmdW5jdGlvbnMgc2hvdWxkIGJlIHVzZWQKICAgICBpbnN0ZWFkLgoKICAgICBTbyB3ZSBhbHNvIG5vdyBoYXZlIHNvbWUgd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBjYWxsIHRoZSBYNTA5YXQgZnVuY3Rpb25zCiAgICAgd2hlbiBwYXNzZWQgY2VydGlmaWNhdGUgcmVxdWVzdHMuIChUTyBETzogc2ltaWxhciB0aGluZ3MgY2FuIGJlIGRvbmUgd2l0aAogICAgIFBLQ1MjNyBzaWduZWQgYW5kIHVuc2lnbmVkIGF0dHJpYnV0ZXMsIFBLQ1MjMTIgYXR0cmlidXRlcyBhbmQgYSBmZXcgb3RoZXIKICAgICB0aGluZ3MuIFNvbWUgb2YgdGhlc2UgbmVlZCBzb21lIGQyaSBvciBpMmQgYW5kIHByaW50IGZ1bmN0aW9uYWxpdHkKICAgICBiZWNhdXNlIHRoZXkgaGFuZGxlIG1vcmUgY29tcGxleCBzdHJ1Y3R1cmVzLikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbWlzc2luZyAjaWZuZGVmcyB0aGF0IGNhdXNlZCBtaXNzaW5nIHN5bWJvbHMgd2hlbiBidWlsZGluZyBsaWJzc2wKICAgICBhcyBhIHNoYXJlZCBsaWJyYXJ5IHdpdGhvdXQgUlNBLiAgVXNlICNpZm5kZWYgTk9fU1NMMiBpbnN0ZWFkIG9mCiAgICAgTk9fUlNBIGluIHNzbC9zMiouYy4gCiAgICAgW0tyaXMgS2VubmF3YXkgPGtyaXNAaHViLmZyZWVic2Qub3JnPiwgbW9kaWZpZWQgYnkgVWxmIE32bGxlcl0KCiAgKikgUHJlY2F1dGlvbnMgYWdhaW5zdCB1c2luZyB0aGUgUFJORyB1bmluaXRpYWxpemVkOiBSQU5EX2J5dGVzKCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHdoaWNoIGluZGljYXRlcyB0aGUgcXVhbGl0eSBvZiB0aGUgcmFuZG9tIGRhdGEKICAgICAoMSA9IG9rLCAwID0gbm90IHNlZWRlZCkuICBBbHNvIGFuIGVycm9yIGlzIHJlY29yZGVkIG9uIHRoZSB0aHJlYWQncwogICAgIGVycm9yIHF1ZXVlLiBOZXcgZnVuY3Rpb24gUkFORF9wc2V1ZG9fYnl0ZXMoKSBnZW5lcmF0ZXMgb3V0cHV0IHRoYXQgaXMKICAgICBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBidXQgbm90IHVucHJlZGljdGFibGUuIFJBTkRfYWRkIGlzIGxpa2UKICAgICBSQU5EX3NlZWQsIGJ1dCB0YWtlcyBhbiBleHRyYSBhcmd1bWVudCBmb3IgYW4gZW50cm9weSBlc3RpbWF0ZQogICAgIChSQU5EX3NlZWQgYWx3YXlzIGFzc3VtZXMgZnVsbCBlbnRyb3B5KS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRG8gbW9yZSBpdGVyYXRpb25zIG9mIFJhYmluLU1pbGxlciBwcm9iYWJsZSBwcmltZSB0ZXN0IChzcGVjaWZpY2FsbHksCiAgICAgMyBmb3IgMTAyNC1iaXQgcHJpbWVzLCA2IGZvciA1MTItYml0IHByaW1lcywgMTIgZm9yIDI1Ni1iaXQgcHJpbWVzCiAgICAgaW5zdGVhZCBvZiBvbmx5IDIgZm9yIGFsbCBsZW5ndGhzOyBzZWUgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIGRlZmluaXRpb24KICAgICBpbiBjcnlwdG8vYm4vYm5fcHJpbWUuYyBmb3IgdGhlIGNvbXBsZXRlIHRhYmxlKS4gIFRoaXMgZ3VhcmFudGVlcyBhCiAgICAgZmFsc2UtcG9zaXRpdmUgcmF0ZSBvZiBhdCBtb3N0IDJeLTgwIGZvciByYW5kb20gaW5wdXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSBzc2wzX3JlYWRfbiAoc3NsL3MzX3BrdC5jKSBhdm9pZGluZyBhIGNvdXBsZSBvZiBidWdzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X0NUWF9yZ2V0X2NoYWluKCkgKHJlbmFtZWQgdG8gWDUwOV9DVFhfZ2V0MV9jaGFpbgogICAgIGluIHRoZSAwLjkuNSByZWxlYXNlKSwgdGhpcyByZXR1cm5zIHRoZSBjaGFpbgogICAgIGZyb20gYW4gWDUwOV9DVFggc3RydWN0dXJlIHdpdGggYSBkdXAgb2YgdGhlIHN0YWNrIGFuZCBhbGwKICAgICB0aGUgWDUwOSByZWZlcmVuY2UgY291bnRzIHVwcGVkOiBzbyB0aGUgc3RhY2sgd2lsbCBleGlzdAogICAgIGFmdGVyIFg1MDlfQ1RYX2NsZWFudXAoKSBoYXMgYmVlbiBjYWxsZWQuIE1vZGlmeSBwa2NzMTIuYwogICAgIHRvIHVzZSB0aGlzLgoKICAgICBBbHNvIG1ha2UgU1NMX1NFU1NJT05fcHJpbnQoKSBwcmludCBvdXQgdGhlIHZlcmlmeSByZXR1cm4KICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtYW5wYWdlIGZvciB0aGUgcGtjczEyIGNvbW1hbmQuIEFsc28gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgYmVoYXZpb3VyIHNvIE1BQyBpdGVyYXRpb24gY291bnRzIGFyZSB1c2VkIHVubGVzcyB0aGUgbmV3CiAgICAgLW5vbWFjaXRlciBvcHRpb24gaXMgdXNlZC4gVGhpcyBpbXByb3ZlcyBmaWxlIHNlY3VyaXR5IGFuZAogICAgIG9ubHkgb2xkZXIgdmVyc2lvbnMgb2YgTVNJRSAoNC4wIGZvciBleGFtcGxlKSBuZWVkIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhvbm9yIHRoZSBuby14eHggQ29uZmlndXJlIG9wdGlvbnMgd2hlbiBjcmVhdGluZyAuREVGIGZpbGVzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgUEtDUyMxMCBhdHRyaWJ1dGVzIHRvIGZpZWxkIHRhYmxlOiBjaGFsbGVuZ2VQYXNzd29yZCwgCiAgICAgdW5zdHJ1Y3R1cmVkTmFtZSBhbmQgdW5zdHJ1Y3R1cmVkQWRkcmVzcy4gVGhlc2UgYXJlIHRha2VuIGZyb20KICAgICBkcmFmdCBQS0NTIzkgdjIuMCBidXQgYXJlIGNvbXBhdGlibGUgd2l0aCB2MS4yIHByb3ZpZGVkIG5vIAogICAgIGludGVybmF0aW9uYWwgY2hhcmFjdGVycyBhcmUgdXNlZC4KCiAgICAgTW9yZSBjaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIGNvZGU6IGFsbG93IHRoZSBzZXR0aW5nIG9mIHR5cGVzCiAgICAgYmFzZWQgb24gc3RyaW5ncy4gUmVtb3ZlIHRoZSAnbG9jJyBwYXJhbWV0ZXIgd2hlbiBhZGRpbmcKICAgICBhdHRyaWJ1dGVzIGJlY2F1c2UgdGhlc2Ugd2lsbCBiZSBhIFNFVCBPRiBlbmNvZGluZyB3aGljaCBpcyBzb3J0ZWQKICAgICBpbiBBU04xIG9yZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgY2hhbmdlcyB0byB0aGUgJ3JlcScgdXRpbGl0eSB0byBhbGxvdyByZXF1ZXN0IGdlbmVyYXRpb24KICAgICBhdXRvbWF0aW9uLiBUaGlzIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8ganVzdCBnZW5lcmF0ZSBhIHRlbXBsYXRlCiAgICAgZmlsZSBjb250YWluaW5nIGFsbCB0aGUgZmllbGQgdmFsdWVzIGFuZCBoYXZlIHJlcSBjb25zdHJ1Y3QgdGhlCiAgICAgcmVxdWVzdC4KCiAgICAgSW5pdGlhbCBzdXBwb3J0IGZvciBYNTA5X0FUVFJJQlVURSBoYW5kbGluZy4gU3RhY2tzIG9mIHRoZXNlIGFyZQogICAgIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGluY2x1ZGluZyBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBhbmQgUEtDUyM3CiAgICAgc3RydWN0dXJlcy4gVGhleSBhcmUgY3VycmVudGx5IGhhbmRsZWQgbWFudWFsbHkgd2hlcmUgbmVjZXNzYXJ5IHdpdGgKICAgICBzb21lIHByaW1pdGl2ZSB3cmFwcGVycyBmb3IgUEtDUyM3LiBUaGUgbmV3IGZ1bmN0aW9ucyBiZWhhdmUgaW4gYQogICAgIG1hbm5lciBhbmFsb2dvdXMgdG8gdGhlIFg1MDkgZXh0ZW5zaW9uIGZ1bmN0aW9uczogdGhleSBhbGxvdwogICAgIGF0dHJpYnV0ZXMgdG8gYmUgbG9va2VkIHVwIGJ5IE5JRCBhbmQgYWRkZWQuCgogICAgIExhdGVyIHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoZSBYNTA5VjMgY29kZSB3b3VsZCBiZSBkZXNpcmFibGUgdG8KICAgICBhdXRvbWF0aWNhbGx5IGhhbmRsZSB0aGUgZW5jb2RpbmcsIGRlY29kaW5nIGFuZCBwcmludGluZyBvZiB0aGUKICAgICBtb3JlIGNvbXBsZXggdHlwZXMuIFRoZSBzdHJpbmcgdHlwZXMgbGlrZSBjaGFsbGVuZ2VQYXNzd29yZCBjYW4KICAgICBiZSBoYW5kbGVkIGJ5IHRoZSBzdHJpbmcgdGFibGUgZnVuY3Rpb25zLgoKICAgICBBbHNvIG1vZGlmaWVkIHRoZSBtdWx0aSBieXRlIHN0cmluZyB0YWJsZSBoYW5kbGluZy4gTm93IHRoZXJlIGlzCiAgICAgYSAnZ2xvYmFsIG1hc2snIHdoaWNoIG1hc2tzIG91dCBjZXJ0YWluIHR5cGVzLiBUaGUgdGFibGUgaXRzZWxmCiAgICAgY2FuIHVzZSB0aGUgZmxhZyBTVEFCTEVfTk9fTUFTSyB0byBpZ25vcmUgdGhlIG1hc2sgc2V0dGluZzogdGhpcwogICAgIGlzIHVzZWZ1bCB3aGVuIGZvciBleGFtcGxlIHRoZXJlIGlzIG9ubHkgb25lIHBlcm1pc3NpYmxlIHR5cGUKICAgICAoYXMgaW4gY291bnRyeU5hbWUpIGFuZCB1c2luZyB0aGUgbWFzayBtaWdodCByZXN1bHQgaW4gbm8gdmFsaWQKICAgICB0eXBlcyBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gdXAgJ0ZpbmlzaGVkJyBoYW5kbGluZywgYW5kIGFkZCBmdW5jdGlvbnMgU1NMX2dldF9maW5pc2hlZCBhbmQKICAgICBTU0xfZ2V0X3BlZXJfZmluaXNoZWQgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIG9idGFpbiB0aGUgbGF0ZXN0CiAgICAgRmluaXNoZWQgbWVzc2FnZXMgc2VudCB0byB0aGUgcGVlciBvciBleHBlY3RlZCBmcm9tIHRoZSBwZWVyLAogICAgIHJlc3BlY3RpdmVseS4gIChTU0xfZ2V0X3BlZXJfZmluaXNoZWQgaXMgdXN1YWxseSB0aGUgRmluaXNoZWQgbWVzc2FnZQogICAgIGFjdHVhbGx5IHJlY2VpdmVkIGZyb20gdGhlIHBlZXIsIG90aGVyd2lzZSB0aGUgcHJvdG9jb2wgd2lsbCBiZSBhYm9ydGVkLikKCiAgICAgQXMgdGhlIEZpbmlzaGVkIG1lc3NhZ2UgYXJlIG1lc3NhZ2UgZGlnZXN0cyBvZiB0aGUgY29tcGxldGUgaGFuZHNoYWtlCiAgICAgKHdpdGggYSB0b3RhbCBvZiAxOTIgYml0cyBmb3IgVExTIDEuMCBhbmQgbW9yZSBmb3IgU1NMIDMuMCksIHRoZXkgY2FuCiAgICAgYmUgdXNlZCBmb3IgZXh0ZXJuYWwgYXV0aGVudGljYXRpb24gcHJvY2VkdXJlcyB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbgogICAgIHByb3ZpZGVkIGJ5IFNTTC9UTFMgaXMgbm90IGRlc2lyZWQgb3IgaXMgbm90IGVub3VnaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBFbmhhbmNlZCBzdXBwb3J0IGZvciBBbHBoYSBMaW51eCBpcyBhZGRlZC4gTm93IC4vY29uZmlnIGNoZWNrcyBpZgogICAgIHRoZSBob3N0IHN1cHBvcnRzIEJXWCBleHRlbnNpb24gYW5kIGlmIENvbXBhcSBDIGlzIHByZXNlbnQgb24gdGhlCiAgICAgJFBBVEguIEp1c3QgZXhwbG9pdGluZyBvZiB0aGUgQldYIGV4dGVuc2lvbiByZXN1bHRzIGluIDIwLTMwJQogICAgIHBlcmZvcm1hbmNlIGtpY2sgZm9yIHNvbWUgYWxnb3JpdGhtcywgZS5nLiBERVMgYW5kIFJDNCB0byBtZW50aW9uCiAgICAgYSBjb3VwbGUuIENvbXBhcSBDIGluIHR1cm4gZ2VuZXJhdGVzIH4yMCUgZmFzdGVyIGNvZGUgZm9yIE1ENSBhbmQKICAgICBTSEExLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgTVMgImZhc3QgU0dDIi4gVGhpcyBpcyBhcmd1YWJseSBhIHZpb2xhdGlvbiBvZiB0aGUKICAgICBTU0wzL1RMUyBwcm90b2NvbC4gTmV0c2NhcGUgU0dDIGRvZXMgdHdvIGhhbmRzaGFrZXM6IHRoZSBmaXJzdCB3aXRoCiAgICAgd2VhayBjcnlwdG8gYW5kIGFmdGVyIGNoZWNraW5nIHRoZSBjZXJ0aWZpY2F0ZSBpcyBTR0MgYSBzZWNvbmQgb25lCiAgICAgd2l0aCBzdHJvbmcgY3J5cHRvLiBNUyBTR0Mgc3RvcHMgdGhlIGZpcnN0IGhhbmRzaGFrZSBhZnRlciByZWNlaXZpbmcKICAgICB0aGUgc2VydmVyIGNlcnRpZmljYXRlIG1lc3NhZ2UgYW5kIHNlbmRzIGEgc2Vjb25kIGNsaWVudCBoZWxsby4gU2luY2UKICAgICBhIHNlcnZlciB3aWxsIHR5cGljYWxseSBkbyBhbGwgdGhlIHRpbWUgY29uc3VtaW5nIG9wZXJhdGlvbnMgYmVmb3JlCiAgICAgZXhwZWN0aW5nIGFueSBmdXJ0aGVyIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudCAoc2VydmVyIGtleSBleGNoYW5nZQogICAgIGlzIHRoZSBtb3N0IGV4cGVuc2l2ZSkgdGhlcmUgaXMgbGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvLgoKICAgICBUbyBnZXQgT3BlblNTTCB0byBzdXBwb3J0IE1TIFNHQyB3ZSBoYXZlIHRvIHBlcm1pdCBhIHNlY29uZCBjbGllbnQKICAgICBoZWxsbyBtZXNzYWdlIGFmdGVyIHdlIGhhdmUgc2VudCBzZXJ2ZXIgZG9uZS4gSW4gYWRkaXRpb24gd2UgaGF2ZSB0bwogICAgIHJlc2V0IHRoZSBNQUMgaWYgd2UgZG8gZ2V0IHRoaXMgc2Vjb25kIGNsaWVudCBoZWxsby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmdW5jdGlvbiAnZDJpX0F1dG9Qcml2YXRlS2V5KCknIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGRlY2lkZQogICAgIGlmIGEgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkgaXMgUlNBIG9yIERTQSB0cmFkaXRpb25hbCBmb3JtYXQuIENoYW5nZWQKICAgICBkMmlfUHJpdmF0ZUtleV9iaW8oKSB0byB1c2UgaXQuIFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSAidHJhZGl0aW9uYWwiCiAgICAgZm9ybWF0IERFUiBlbmNvZGVkIHByaXZhdGUga2V5LiBOZXdlciBjb2RlIHNob3VsZCB1c2UgUEtDUyM4IGZvcm1hdCB3aGljaAogICAgIGhhcyB0aGUga2V5IHR5cGUgZW5jb2RlZCBpbiB0aGUgQVNOMSBzdHJ1Y3R1cmUuIEFkZGVkIERFUiBwcml2YXRlIGtleQogICAgIHN1cHBvcnQgdG8gcGtjczggYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU1NMIDMvVExTIDEgc2VydmVycyBub3cgZG9uJ3QgcmVxdWVzdCBjZXJ0aWZpY2F0ZXMgd2hlbiBhbiBhbm9ueW1vdXMKICAgICBjaXBoZXJzdWl0ZXMgaGFzIGJlZW4gc2VsZWN0ZWQgKGFzIHJlcXVpcmVkIGJ5IHRoZSBTU0wgMy9UTFMgMQogICAgIHNwZWNpZmljYXRpb25zKS4gIEV4Y2VwdGlvbjogV2hlbiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUCiAgICAgaXMgc2V0LCB3ZSBpbnRlcnByZXQgdGhpcyBhcyBhIHJlcXVlc3QgdG8gdmlvbGF0ZSB0aGUgc3BlY2lmaWNhdGlvbgogICAgICh0aGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuIGlzIGEgaGFuZHNoYWtlIGZhaWx1cmUsIGFuZCAnY29ycmVjdCcKICAgICBiZWhhdmlvdXIgd291bGQgcmVzdWx0IGluIGEgaGFuZHNoYWtlIGZhaWx1cmUgYW55d2F5KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbiBTU0xfQ1RYX2FkZF9zZXNzaW9uLCB0YWtlIGludG8gYWNjb3VudCB0aGF0IHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlcyB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgKGUuZy4gd2hlbiB0d28gdGhyZWFkcwogICAgIGNvbmN1cnJlbnRseSBvYnRhaW4gdGhlbSBmcm9tIGFuIGV4dGVybmFsIGNhY2hlKS4KICAgICBUaGUgaW50ZXJuYWwgY2FjaGUgY2FuIGhhbmRsZSBvbmx5IG9uZSBTU0xfU0VTU0lPTiB3aXRoIGEgZ2l2ZW4gSUQsCiAgICAgc28gaWYgdGhlcmUncyBhIGNvbmZsaWN0LCB3ZSBub3cgdGhyb3cgb3V0IHRoZSBvbGQgb25lIHRvIGFjaGlldmUKICAgICBjb25zaXN0ZW5jeS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgT0lEcyBmb3IgaWRlYSBhbmQgYmxvd2Zpc2ggaW4gQ0JDIG1vZGUuIFRoaXMgd2lsbCBhbGxvdyBib3RoCiAgICAgdG8gYmUgdXNlZCBpbiBQS0NTIzUgdjIuMCBhbmQgUy9NSU1FLiAgQWxzbyBhZGQgY2hlY2tpbmcgdG8KICAgICBzb21lIHJvdXRpbmVzIHRoYXQgdXNlIGNpcGhlciBPSURzOiBzb21lIGNpcGhlcnMgZG8gbm90IGhhdmUgT0lEcwogICAgIGRlZmluZWQgYW5kIHNvIHRoZXkgY2Fubm90IGJlIHVzZWQgZm9yIFMvTUlNRSBhbmQgUEtDUyM1IHYyLjAgZm9yCiAgICAgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTaW1wbGlmeSB0aGUgdHJ1c3Qgc2V0dGluZyBzdHJ1Y3R1cmUgYW5kIGNvZGUuIE5vdyB3ZSBqdXN0IGhhdmUKICAgICB0d28gc2VxdWVuY2VzIG9mIE9JRHMgZm9yIHRydXN0ZWQgYW5kIHJlamVjdGVkIHNldHRpbmdzLiBUaGVzZSB3aWxsCiAgICAgdHlwaWNhbGx5IGhhdmUgdmFsdWVzIHRoZSBzYW1lIGFzIHRoZSBleHRlbmRlZCBrZXkgdXNhZ2UgZXh0ZW5zaW9uCiAgICAgYW5kIGFueSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwdXJwb3Nlcy4KCiAgICAgVGhlIHRydXN0IGNoZWNraW5nIGNvZGUgbm93IGhhcyBhIGRlZmF1bHQgYmVoYXZpb3VyOiBpdCB3aWxsIGp1c3QKICAgICBjaGVjayBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgTklEIGFzIHRoZSBwYXNzZWQgaWQuIEZ1bmN0aW9ucyBjYW4KICAgICBiZSBwcm92aWRlZCB0byBvdmVycmlkZSBlaXRoZXIgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9yIHRoZSBiZWhhdmlvdXIKICAgICBmb3IgYSBnaXZlbiBpZC4gU1NMIGNsaWVudCwgc2VydmVyIGFuZCBlbWFpbCBhbHJlYWR5IGhhdmUgZnVuY3Rpb25zCiAgICAgaW4gcGxhY2UgZm9yIGNvbXBhdGliaWxpdHk6IHRoZXkgY2hlY2sgdGhlIE5JRCBhbmQgYWxzbyByZXR1cm4gInRydXN0ZWQiCiAgICAgaWYgdGhlIGNlcnRpZmljYXRlIGlzIHNlbGYgc2lnbmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBkMmksaTJkIGJpby9mcCBmdW5jdGlvbnMgZm9yIFByaXZhdGVLZXk6IHRoZXNlIGNvbnZlcnQgdGhlCiAgICAgdHJhZGl0aW9uYWwgZm9ybWF0IGludG8gYW4gRVZQX1BLRVkgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHBhc3N3b3JkIGNhbGxiYWNrIGZ1bmN0aW9uIFBFTV9jYigpIHdoaWNoIGVpdGhlciBwcm9tcHRzIGZvcgogICAgIGEgcGFzc3dvcmQgaWYgdXNyX2RhdGEgaXMgTlVMTCBvciBvdGhlcndpc2UgYXNzdW1lcyBpdCBpcyBhIG51bGwKICAgICB0ZXJtaW5hdGVkIHBhc3N3b3JkLiBBbGxvdyBwYXNzd29yZHMgdG8gYmUgcGFzc2VkIG9uIGNvbW1hbmQgbGluZQogICAgIGVudmlyb25tZW50IG9yIGNvbmZpZyBmaWxlcyBpbiBhIGZldyBtb3JlIHV0aWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBERVIgYW5kIFBFTSBmdW5jdGlvbnMgdG8gaGFuZGxlIFBLQ1MjOCBmb3JtYXQgcHJpdmF0ZQogICAgIGtleXMuIEFkZCBzb21lIHNob3J0IG5hbWVzIGZvciBQS0NTIzggUEJFIGFsZ29yaXRobXMgYW5kIGFsbG93IHRoZW0KICAgICB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBmb3IgdGhlIHBrY3M4IGFuZCBwa2NzMTIgdXRpbGl0aWVzLgogICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIEFTTjEgIk5VTEwiIHR5cGUuIFRoaXMgY291bGQgYmUgaGFuZGxlZCBiZWZvcmUgYnkgdXNpbmcKICAgICBBU04xX1RZUEUgYnV0IHRoZXJlIHdhc24ndCBhbnkgZnVuY3Rpb24gdGhhdCB3b3VsZCB0cnkgdG8gcmVhZCBhIE5VTEwKICAgICBhbmQgcHJvZHVjZSBhbiBlcnJvciBpZiBpdCBjb3VsZG4ndC4gRm9yIGNvbXBhdGliaWxpdHkgd2UgYWxzbyBoYXZlCiAgICAgQVNOMV9OVUxMX25ldygpIGFuZCBBU04xX05VTExfZnJlZSgpIGZ1bmN0aW9ucyBidXQgdGhlc2UgYXJlIGZha2VkIGFuZAogICAgIGRvbid0IGFsbG9jYXRlIGFueXRoaW5nIGJlY2F1c2UgdGhleSBkb24ndCBuZWVkIHRvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgTWFjT1MgaXMgbm93IHByb3ZpZGVkLiBFeGFtaW5lIElOU1RBTEwuTWFjT1MKICAgICBmb3IgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdiwgUm95IFdvb2RzIDxyb3lAY2VudGljc3lzdGVtcy5jYT5dCgogICopIFJlYnVpbGQgb2YgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIHVzZWQgYnkgT3BlblNTTCBjb2RlIGFuZAogICAgIHBvc3NpYmx5IG90aGVycyBhcyB3ZWxsLiAgVGhlIHB1cnBvc2UgaXMgdG8gbWFrZSBhbiBpbnRlcmZhY2UgdGhhdAogICAgIHByb3ZpZGUgaG9va3Mgc28gYW55b25lIGNhbiBidWlsZCBhIHNlcGFyYXRlIHNldCBvZiBhbGxvY2F0aW9uIGFuZAogICAgIGRlYWxsb2NhdGlvbiByb3V0aW5lcyB0byBiZSB1c2VkIGJ5IE9wZW5TU0wsIGZvciBleGFtcGxlIG1lbW9yeQogICAgIHBvb2wgaW1wbGVtZW50YXRpb25zLCBvciBzb21ldGhpbmcgZWxzZSwgd2hpY2ggd2FzIHByZXZpb3VzbHkgaGFyZAogICAgIHNpbmNlIE1hbGxvYygpLCBSZWFsbG9jKCkgYW5kIEZyZWUoKSB3ZXJlIGRlZmluZWQgYXMgbWFjcm9zIGhhdmluZwogICAgIHRoZSB2YWx1ZXMgbWFsbG9jLCByZWFsbG9jIGFuZCBmcmVlLCByZXNwZWN0aXZlbHkgKGV4Y2VwdCBmb3IgV2luMzIKICAgICBjb21waWxhdGlvbnMpLiAgVGhlIHNhbWUgaXMgcHJvdmlkZWQgZm9yIG1lbW9yeSBkZWJ1Z2dpbmcgY29kZS4KICAgICBPcGVuU1NMIGFscmVhZHkgY29tZXMgd2l0aCBmdW5jdGlvbmFsaXR5IHRvIGZpbmQgbWVtb3J5IGxlYWtzLCBidXQKICAgICB0aGlzIGdpdmVzIHBlb3BsZSBhIGNoYW5jZSB0byBkZWJ1ZyBvdGhlciBtZW1vcnkgcHJvYmxlbXMuCgogICAgIFdpdGggdGhlc2UgY2hhbmdlcywgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGhhdmUgYXBwZWFyZWQ6CgogICAgICAgQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkJICAgICAgICBbRl0KICAgICAgIENSWVBUT19nZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZGJnX3NldF9vcHRpb25zKCkJICAgICAgICAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2RiZ19nZXRfb3B0aW9ucygpICAgICAgICAgICAgICAgICBbRl0KICAgICAgIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpICAgICAgICAgICAgICAgW01dCgogICAgIFRoZSBtZW1vcnkgZGVidWcgZnVuY3Rpb25zIGFyZSBOVUxMIGJ5IGRlZmF1bHQsIHVubGVzcyB0aGUgbGlicmFyeQogICAgIGlzIGNvbXBpbGVkIHdpdGggQ1JZUFRPX01ERUJVRyBvciBmcmllbmRzIGlzIGRlZmluZWQuICBJZiBzb21lb25lCiAgICAgd2FudHMgdG8gZGVidWcgbWVtb3J5IGFueXdheSwgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkgKHdoaWNoCiAgICAgZ2l2ZXMgdGhlIHN0YW5kYXJkIGRlYnVnZ2luZyBmdW5jdGlvbnMgdGhhdCBjb21lIHdpdGggT3BlblNTTCkgb3IKICAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKSAodGVsbHMgT3BlblNTTCB0byB1c2UgZnVuY3Rpb25zCiAgICAgcHJvdmlkZWQgYnkgdGhlIGxpYnJhcnkgdXNlcikgbXVzdCBiZSB1c2VkLiAgV2hlbiB0aGUgc3RhbmRhcmQKICAgICBkZWJ1Z2dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkLCBDUllQVE9fZGJnX3NldF9vcHRpb25zIGNhbiBiZSB1c2VkIHRvCiAgICAgcmVxdWVzdCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uOgogICAgIENSWVBUT19kYmdfc2V0X29wdGlvbnMoVl9DWVJQVE9fTURFQlVHX3h4eCkgY29ycmVzcG9uZHMgdG8gc2V0dGluZwogICAgIHRoZSBDUllQVE9fTURFQlVHX3h4eCBtYWNybyB3aGVuIGNvbXBpbGluZyB0aGUgbGlicmFyeS4gICAKCiAgICAgQWxzbywgdGhpbmdzIGxpa2UgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zIHdpbGwgYWx3YXlzIGdpdmUgdGhlCiAgICAgZXhwZWN0ZWQgcmVzdWx0ICh0aGUgbmV3IHNldCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgYWxsb2NhdGlvbgogICAgIGFuZCBkZWFsbG9jYXRpb24pIGF0IGFsbCB0aW1lcywgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybSBhbmQgY29tcGlsZXIKICAgICBvcHRpb25zLgoKICAgICBUbyBmaW5pc2ggaXQgdXAsIHNvbWUgZnVuY3Rpb25zIHRoYXQgd2VyZSBuZXZlciB1c2UgaW4gYW55IG90aGVyCiAgICAgd2F5IHRoYW4gdGhyb3VnaCBtYWNyb3MgaGF2ZSBhIG5ldyBBUEkgYW5kIG5ldyBzZW1hbnRpYzoKCiAgICAgICBDUllQVE9fZGJnX21hbGxvYygpCiAgICAgICBDUllQVE9fZGJnX3JlYWxsb2MoKQogICAgICAgQ1JZUFRPX2RiZ19mcmVlKCkKCiAgICAgQWxsIG1hY3JvcyBvZiB2YWx1ZSBoYXZlIHJldGFpbmVkIHRoZWlyIG9sZCBzeW50YXguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSBhbmQgQm9kbyBNb2VsbGVyXQoKICAqKSBTb21lIFMvTUlNRSBmaXhlcy4gVGhlIE9JRCBmb3IgU01JTUVDYXBhYmlsaXRpZXMgd2FzIHdyb25nLCB0aGUKICAgICBvcmRlcmluZyBvZiBTTUlNRUNhcGFiaWxpdGllcyB3YXNuJ3QgaW4gInN0cmVuZ3RoIG9yZGVyIiBhbmQgdGhlcmUKICAgICB3YXMgYSBtaXNzaW5nIE5VTEwgaW4gdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgZm9yIHRoZSBTSEExIHNpZ25hdHVyZQogICAgIGFsZ29yaXRobS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTb21lIEFTTjEgdHlwZXMgd2l0aCBpbGxlZ2FsIHplcm8gbGVuZ3RoIGVuY29kaW5nIChJTlRFR0VSLAogICAgIEVOVU1FUkFURUQgYW5kIE9CSkVDVCBJREVOVElGSUVSKSBjaG9rZWQgdGhlIEFTTjEgcm91dGluZXMuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT4sIG1vZGlmaWVkIGJ5IFN0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2UgaW4gbXkgUy9NSU1FIGxpYnJhcnkgZm9yIE9wZW5TU0wuIFRoaXMgcHJvdmlkZXMgYSBzaW1wbGUKICAgICBTL01JTUUgQVBJIG9uIHRvcCBvZiB0aGUgUEtDUyM3IGNvZGUsIGEgTUlNRSBwYXJzZXIgKHdpdGggZW5vdWdoCiAgICAgZnVuY3Rpb25hbGl0eSB0byBoYW5kbGUgbXVsdGlwYXJ0L3NpZ25lZCBwcm9wZXJseSkgYW5kIGEgdXRpbGl0eQogICAgIGNhbGxlZCAnc21pbWUnIHRvIGNhbGwgYWxsIHRoaXMgc3R1ZmYuIFRoaXMgaXMgYmFzZWQgb24gY29kZSBJCiAgICAgb3JpZ2luYWxseSB3cm90ZSBmb3IgQ2VsbyB3aG8gaGF2ZSBraW5kbHkgYWxsb3dlZCBpdCB0byBiZQogICAgIGluY2x1ZGVkIGluIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHZhcmlhbnRzIGRlc19zZXRfa2V5X2NoZWNrZWQgYW5kIGRlc19zZXRfa2V5X3VuY2hlY2tlZCBvZgogICAgIGRlc19zZXRfa2V5IChha2EgZGVzX2tleV9zY2hlZCkuICBHbG9iYWwgdmFyaWFibGUgZGVzX2NoZWNrX2tleQogICAgIGRlY2lkZXMgd2hpY2ggb2YgdGhlc2UgaXMgY2FsbGVkIGJ5IGRlc19zZXRfa2V5OyB0aGlzIHdheQogICAgIGRlc19jaGVja19rZXkgYmVoYXZlcyBhcyBpdCBhbHdheXMgZGlkLCBidXQgYXBwbGljYXRpb25zIGFuZAogICAgIHRoZSBsaWJyYXJ5IGl0c2VsZiwgd2hpY2ggd2FzIGJ1Z2d5IGZvciBkZXNfY2hlY2tfa2V5ID09IDEsCiAgICAgaGF2ZSBhIGNsZWFuZXIgd2F5IHRvIHBpY2sgdGhlIHZlcnNpb24gdGhleSBuZWVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBQS0NTMTJfbmV3cGFzcygpIHdoaWNoIGNoYW5nZXMgdGhlIHBhc3N3b3JkIG9mIGEKICAgICBQS0NTMTIgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBYNTA5X1RSVVNUIGFuZCBYNTA5X1BVUlBPU0Ugc28gaXQgYWxzbyB1c2VzIGEgc3RhdGljIGFuZAogICAgIGR5bmFtaWMgbWl4LiBJbiBib3RoIGNhc2VzIHRoZSBpZHMgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byB0aGUKICAgICB0YWJsZS4gQWxzbyBtb2RpZmllZCB0aGUgWDUwOV9UUlVTVF9hZGQoKSBhbmQgWDUwOV9QVVJQT1NFX2FkZCgpCiAgICAgZnVuY3Rpb25zIHNvIHRoZXkgYWNjZXB0IGEgbGlzdCBvZiB0aGUgZmllbGQgdmFsdWVzIGFuZCB0aGUKICAgICBhcHBsaWNhdGlvbiBkb2Vzbid0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZSB0aGUgWDUwOV9UUlVTVAogICAgIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIEFTTjFfU1RSSU5HX1RBQkxFIHN0dWZmIHNvIGl0IGFsc28gdXNlcyBic2VhcmNoIGFuZCBkb2Vzbid0CiAgICAgbmVlZCBpbml0aWFsaXNpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSB3YXkgdGhlIFYzIGV4dGVuc2lvbiBjb2RlIGxvb2tzIHVwIGV4dGVuc2lvbnMuIFRoaXMgbm93CiAgICAgd29ya3MgaW4gYSBzaW1pbGFyIHdheSB0byB0aGUgb2JqZWN0IGNvZGU6IHdlIGhhdmUgc29tZSAic3RhbmRhcmQiCiAgICAgZXh0ZW5zaW9ucyBpbiBhIHN0YXRpYyB0YWJsZSB3aGljaCBpcyBzZWFyY2hlZCB3aXRoIE9CSl9ic2VhcmNoKCkKICAgICBhbmQgdGhlIGFwcGxpY2F0aW9uIGNhbiBhZGQgZHluYW1pYyBvbmVzIGlmIG5lZWRlZC4gVGhlIGZpbGUKICAgICBjcnlwdG8veDUwOXYzL2V4dF9kYXQuaCBub3cgaGFzIHRoZSBpbmZvOiB0aGlzIGZpbGUgbmVlZHMgdG8gYmUKICAgICB1cGRhdGVkIHdoZW5ldmVyIGEgbmV3IGV4dGVuc2lvbiBpcyBhZGRlZCB0byB0aGUgY29yZSBjb2RlIGFuZCBrZXB0CiAgICAgaW4gZXh0X25pZCBvcmRlci4gVGhlcmUgaXMgYSBzaW1wbGUgcHJvZ3JhbSAndGFidGVzdC5jJyB3aGljaCBjaGVja3MKICAgICB0aGlzLiBOZXcgZXh0ZW5zaW9ucyBhcmUgbm90IGFkZGVkIHRvbyBvZnRlbiBzbyB0aGlzIGZpbGUgY2FuIHJlYWRpbHkKICAgICBiZSBtYWludGFpbmVkIG1hbnVhbGx5LgoKICAgICBUaGVyZSBhcmUgdHdvIGJpZyBhZHZhbnRhZ2VzIGluIGRvaW5nIHRoaW5ncyB0aGlzIHdheS4gVGhlIGV4dGVuc2lvbnMKICAgICBjYW4gYmUgbG9va2VkIHVwIGltbWVkaWF0ZWx5IGFuZCBubyBsb25nZXIgbmVlZCB0byBiZSAiYWRkZWQiIHVzaW5nCiAgICAgWDUwOVYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zKCk6IHRoaXMgZnVuY3Rpb24gbm93IGRvZXMgbm90aGluZy4KICAgICBbU2lkZSBub3RlOiBJIGdldCAqbG90cyogb2YgZW1haWwgc2F5aW5nIHRoZSBleHRlbnNpb24gY29kZSBkb2Vzbid0CiAgICAgIHdvcmsgYmVjYXVzZSBwZW9wbGUgZm9yZ2V0IHRvIGNhbGwgdGhpcyBmdW5jdGlvbl0KICAgICBBbHNvIG5vIGR5bmFtaWMgYWxsb2NhdGlvbiBpcyBkb25lIHVubGVzcyBuZXcgZXh0ZW5zaW9ucyBhcmUgYWRkZWQ6CiAgICAgc28gaWYgd2UgZG9uJ3QgYWRkIGN1c3RvbSBleHRlbnNpb25zIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbAogICAgIFg1MDlWM19FWFRfY2xlYW51cCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBlbmMgdXRpbGl0eSdzIHNhbHRpbmcgYXMgZm9sbG93czogbWFrZSBzYWx0aW5nIHRoZSBkZWZhdWx0LiBBZGQgYQogICAgIG1hZ2ljIGhlYWRlciwgc28gdW5zYWx0ZWQgZmlsZXMgZmFpbCBncmFjZWZ1bGx5IGluc3RlYWQgb2YganVzdCBkZWNyeXB0aW5nCiAgICAgdG8gZ2FyYmFnZS4gVGhpcyBpcyBiZWNhdXNlIG5vdCBzYWx0aW5nIGlzIGEgYmlnIHNlY3VyaXR5IGhvbGUsIHNvIHBlb3BsZQogICAgIHNob3VsZCBiZSBkaXNjb3VyYWdlZCBmcm9tIGRvaW5nIGl0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXhlcyBhbmQgZW5oYW5jZW1lbnRzIHRvIHRoZSAneDUwOScgdXRpbGl0eS4gSXQgYWxsb3dlZCBhIG1lc3NhZ2UKICAgICBkaWdlc3QgdG8gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgYnV0IGl0IG9ubHkgdXNlZCB0aGlzCiAgICAgcGFyYW1ldGVyIHdoZW4gc2lnbmluZyBhIGNlcnRpZmljYXRlLiBNb2RpZmllZCBzbyBhbGwgcmVsZXZhbnQKICAgICBvcGVyYXRpb25zIGFyZSBhZmZlY3RlZCBieSB0aGUgZGlnZXN0IHBhcmFtZXRlciBpbmNsdWRpbmcgdGhlCiAgICAgLWZpbmdlcnByaW50IGFuZCAteDUwOXRvcmVxIG9wdGlvbnMuIEFsc28gLXg1MDl0b3JlcSBjaG9rZWQgaWYgYQogICAgIERTQSBrZXkgd2FzIHVzZWQgYmVjYXVzZSBpdCBkaWRuJ3QgZml4IHRoZSBkaWdlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZnkgY29kZS4gQ3VycmVudGx5IHRlc3RzIHRoZSB1bnRydXN0ZWQKICAgICBjZXJ0aWZpY2F0ZXMgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIHZlcmlmeSBwdXJwb3NlICh3aGljaCBpcyBzZXQKICAgICB3aGVuIHRoZSBYNTA5X1NUT1JFX0NUWCBzdHJ1Y3R1cmUgaXMgc2V0IHVwKSBhbmQgY2hlY2tzIHRoZSBwYXRobGVuZ3RoLgoKICAgICBUaGVyZSBpcyBhIE5PX0NIQUlOX1ZFUklGWSBjb21waWxhdGlvbiBvcHRpb24gdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91cjoKICAgICB0aGlzIGlzIGJlY2F1c2UgaXQgd2lsbCByZWplY3QgY2hhaW5zIHdpdGggaW52YWxpZCBleHRlbnNpb25zIHdoZXJlYXMKICAgICBldmVyeSBwcmV2aW91cyB2ZXJzaW9uIG9mIE9wZW5TU0wgYW5kIFNTTGVheSBtYWRlIG5vIGNoZWNrcyBhdCBhbGwuCgogICAgIFRydXN0IGNvZGU6IGNoZWNrcyB0aGUgcm9vdCBDQSBmb3IgdGhlIHJlbGV2YW50IHRydXN0IHNldHRpbmdzLiBUcnVzdAogICAgIHNldHRpbmdzIGhhdmUgYW4gaW5pdGlhbCB2YWx1ZSBjb25zaXN0ZW50IHdpdGggdGhlIHZlcmlmeSBwdXJwb3NlOiBlLmcuCiAgICAgaWYgdGhlIHZlcmlmeSBwdXJwb3NlIGlzIGZvciBTU0wgY2xpZW50IHVzZSBpdCBleHBlY3RzIHRoZSBDQSB0byBiZQogICAgIHRydXN0ZWQgZm9yIFNTTCBjbGllbnQgdXNlLiBIb3dldmVyIHRoZSBkZWZhdWx0IHZhbHVlIGNhbiBiZSBjaGFuZ2VkIHRvCiAgICAgcGVybWl0IGN1c3RvbSB0cnVzdCBzZXR0aW5nczogb25lIGV4YW1wbGUgb2YgdGhpcyB3b3VsZCBiZSB0byBvbmx5IHRydXN0CiAgICAgY2VydGlmaWNhdGVzIGZyb20gYSBzcGVjaWZpYyAic2VjdXJlIiBzZXQgb2YgQ0FzLgoKICAgICBBbHNvIGFkZGVkIFg1MDlfU1RPUkVfQ1RYX25ldygpIGFuZCBYNTA5X1NUT1JFX0NUWF9mcmVlKCkgZnVuY3Rpb25zCiAgICAgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIHZlcnNpb24gcG9ydGFiaWxpdHk6IGVzcGVjaWFsbHkgc2luY2UgdGhlCiAgICAgdmVyaWZ5IHN0cnVjdHVyZSBpcyBsaWtlbHkgdG8gY2hhbmdlIG1vcmUgb2Z0ZW4gbm93LgoKICAgICBTU0wgaW50ZWdyYXRpb24uIEFkZCBwdXJwb3NlIGFuZCB0cnVzdCB0byBTU0xfQ1RYIGFuZCBTU0wgYW5kIGZ1bmN0aW9ucwogICAgIHRvIHNldCB0aGVtLiBJZiBub3Qgc2V0IHRoZW4gYXNzdW1lIFNTTCBjbGllbnRzIHdpbGwgdmVyaWZ5IFNTTCBzZXJ2ZXJzCiAgICAgYW5kIHZpY2UgdmVyc2EuCgogICAgIFR3byBuZXcgb3B0aW9ucyB0byB0aGUgdmVyaWZ5IHByb2dyYW06IC11bnRydXN0ZWQgYWxsb3dzIGEgc2V0IG9mCiAgICAgdW50cnVzdGVkIGNlcnRpZmljYXRlcyB0byBiZSBwYXNzZWQgaW4gYW5kIC1wdXJwb3NlIHdoaWNoIHNldHMgdGhlCiAgICAgaW50ZW5kZWQgcHVycG9zZSBvZiB0aGUgY2VydGlmaWNhdGUuIElmIGEgcHVycG9zZSBpcyBzZXQgdGhlbiB0aGUKICAgICBuZXcgY2hhaW4gdmVyaWZ5IGNvZGUgaXMgdXNlZCB0byBjaGVjayBleHRlbnNpb24gY29uc2lzdGVuY3kuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgdGhlIGF1dGhvcml0eSBpbmZvcm1hdGlvbiBhY2Nlc3MgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBSU0EgYW5kIERTQSBQRU0gcmVhZCByb3V0aW5lcyB0byB0cmFuc3BhcmVudGx5IGhhbmRsZQogICAgIFBLQ1MjOCBmb3JtYXQgcHJpdmF0ZSBrZXlzLiBOZXcgKl9QVUJLRVlfKiBmdW5jdGlvbnMgdGhhdCBoYW5kbGUKICAgICBwdWJsaWMga2V5cyBpbiBhIGZvcm1hdCBjb21wYXRpYmxlIHdpdGggY2VydGlmaWNhdGUKICAgICBTdWJqZWN0UHVibGljS2V5SW5mbyBzdHJ1Y3R1cmVzLiBVbmZvcnR1bmF0ZWx5IHRoZXJlIHdlcmUgYWxyZWFkeQogICAgIGZ1bmN0aW9ucyBjYWxsZWQgKl9QdWJsaWNLZXlfKiB3aGljaCB1c2VkIHZhcmlvdXMgb2RkIGZvcm1hdHMgc28KICAgICB0aGVzZSBhcmUgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHk6IGhvd2V2ZXIgdGhlIERTQSB2YXJpYW50cyB3ZXJlCiAgICAgbmV2ZXIgaW4gYSBwdWJsaWMgcmVsZWFzZSBzbyB0aGV5IGhhdmUgYmVlbiBkZWxldGVkLiBDaGFuZ2VkIGRzYS9yc2EKICAgICB1dGlsaXRpZXMgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybWF0OiBub3RlIG5vIHJlbGVhc2VzIGV2ZXIgaGFuZGxlZCBwdWJsaWMKICAgICBrZXlzIHNvIHdlIHNob3VsZCBiZSBPSy4KCiAgICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgdG8gYXZvaWQgdGhlIHNhbWUgZmlhc2NvCiAgICAgdGhhdCBkb2dzIHByaXZhdGUga2V5czogdGhlcmUgYXJlIHNldmVyYWwgaW5jb21wYXRpYmxlIHByaXZhdGUga2V5CiAgICAgZm9ybWF0cyBzb21lIG9mIHdoaWNoIGFyZSBzdGFuZGFyZCBhbmQgc29tZSBPcGVuU1NMIHNwZWNpZmljIGFuZAogICAgIHJlcXVpcmUgdmFyaW91cyBldmlsIGhhY2tzIHRvIGFsbG93IHBhcnRpYWwgdHJhbnNwYXJlbnQgaGFuZGxpbmcgYW5kCiAgICAgZXZlbiB0aGVuIGl0IGRvZXNuJ3Qgd29yayB3aXRoIERFUiBmb3JtYXRzLiBHaXZlbiB0aGUgb3B0aW9uIGFueXRoaW5nCiAgICAgb3RoZXIgdGhhbiBQS0NTIzggc2hvdWxkIGJlIGR1bXBlZDogYnV0IHRoZSBvdGhlciBmb3JtYXRzIGhhdmUgdG8KICAgICBzdGF5IGluIHRoZSBuYW1lIG9mIGNvbXBhdGliaWxpdHkuCgogICAgIFdpdGggcHVibGljIGtleXMgYW5kIHRoZSBiZW5lZml0IG9mIGhpbmRzaWdodCBvbmUgc3RhbmRhcmQgZm9ybWF0IAogICAgIGlzIHVzZWQgd2hpY2ggd29ya3Mgd2l0aCBFVlBfUEtFWSwgUlNBIG9yIERTQSBzdHJ1Y3R1cmVzOiB0aG91Z2gKICAgICBpdCBjbGVhcmx5IHJldHVybnMgYW4gZXJyb3IgaWYgeW91IHRyeSB0byByZWFkIHRoZSB3cm9uZyBraW5kIG9mIGtleS4KCiAgICAgQWRkZWQgYSAtcHVia2V5IG9wdGlvbiB0byB0aGUgJ3g1MDknIHV0aWxpdHkgdG8gb3V0cHV0IHRoZSBwdWJsaWMga2V5LgogICAgIEFsc28gcmVuYW1lIHRoZSBFVlBfUEtFWV9nZXRfKigpIHRvIEVWUF9QS0VZX3JnZXRfKigpCiAgICAgKHJlbmFtZWQgdG8gRVZQX1BLRVlfZ2V0MV8qKCkgaW4gdGhlIE9wZW5TU0wgMC45LjUgcmVsZWFzZSkgYW5kIGFkZAogICAgIEVWUF9QS0VZX3JzZXRfKigpIGZ1bmN0aW9ucyAocmVuYW1lZCB0byBFVlBfUEtFWV9zZXQxXyooKSkKICAgICB0aGF0IGRvIHRoZSBzYW1lIGFzIHRoZSBFVlBfUEtFWV9hc3NpZ25fKigpIGV4Y2VwdCB0aGV5IHVwIHRoZQogICAgIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgYWRkZWQga2V5ICh0aGV5IGRvbid0ICJzd2FsbG93IiB0aGUKICAgICBzdXBwbGllZCBrZXkpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIGNyeXB0by94NTA5L2J5X2ZpbGUuYyB0aGUgY29kZSB0byByZWFkIGluIGNlcnRpZmljYXRlcyBhbmQKICAgICBDUkxzIHdvdWxkIGZhaWwgaWYgdGhlIGZpbGUgY29udGFpbmVkIG5vIGNlcnRpZmljYXRlcyBvciBubyBDUkxzOgogICAgIGFkZGVkIGEgbmV3IGZ1bmN0aW9uIHRvIHJlYWQgaW4gYm90aCB0eXBlcyBhbmQgcmV0dXJuIHRoZSBudW1iZXIKICAgICByZWFkOiB0aGlzIG1lYW5zIHRoYXQgaWYgbm9uZSBhcmUgcmVhZCBpdCB3aWxsIGJlIGFuIGVycm9yLiBUaGUKICAgICBERVIgdmVyc2lvbnMgb2YgdGhlIGNlcnRpZmljYXRlIGFuZCBDUkwgcmVhZGVyIHdvdWxkIGFsd2F5cyBmYWlsCiAgICAgYmVjYXVzZSBpdCBpc24ndCBwb3NzaWJsZSB0byBtaXggY2VydGlmaWNhdGVzIGFuZCBDUkxzIGluIERFUiBmb3JtYXQKICAgICB3aXRob3V0IGNob2tpbmcgb25lIG9yIHRoZSBvdGhlciByb3V0aW5lLiBDaGFuZ2VkIHRoaXMgdG8ganVzdCByZWFkCiAgICAgYSBjZXJ0aWZpY2F0ZTogdGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8uIEFsc28gbW9kaWZpZWQgdGhlIGNvZGUKICAgICBpbiBhcHBzL3ZlcmlmeS5jIHRvIHRha2Ugbm90aWNlIG9mIHJldHVybiBjb2RlczogaXQgd2FzIHByZXZpb3VzbHkKICAgICBhdHRlbXB0aW5nIHRvIHJlYWQgaW4gY2VydGlmaWNhdGVzIGZyb20gTlVMTCBwb2ludGVycyBhbmQgaWdub3JpbmcKICAgICBhbnkgZXJyb3JzOiB0aGlzIGlzIG9uZSByZWFzb24gd2h5IHRoZSBjZXJ0IGFuZCBDUkwgcmVhZGVyIHNlZW1lZAogICAgIHRvIHdvcmsuIEl0IGRvZXNuJ3QgY2hlY2sgcmV0dXJuIGNvZGVzIGZyb20gdGhlIGRlZmF1bHQgY2VydGlmaWNhdGUKICAgICByb3V0aW5lczogdGhlc2UgbWF5IHdlbGwgZmFpbCBpZiB0aGUgY2VydGlmaWNhdGVzIGFyZW4ndCBpbnN0YWxsZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29kZSB0byBzdXBwb3J0IG90aGVyTmFtZSBvcHRpb24gaW4gR2VuZXJhbE5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRmlyc3QgdXBkYXRlIHRvIHZlcmlmeSBjb2RlLiBDaGFuZ2UgdGhlIHZlcmlmeSB1dGlsaXR5CiAgICAgc28gaXQgd2FybnMgaWYgaXQgaXMgcGFzc2VkIGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGU6CiAgICAgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG5vcm1hbCBiZWhhdmlvdXIuIFg1MDlfdmVyaWZ5CiAgICAgaGFzIGJlZW4gbW9kaWZpZWQgdG8gaXQgd2lsbCBub3cgdmVyaWZ5IGEgc2VsZiBzaWduZWQKICAgICBjZXJ0aWZpY2F0ZSBpZiAqZXhhY3RseSogdGhlIHNhbWUgY2VydGlmaWNhdGUgYXBwZWFycwogICAgIGluIHRoZSBzdG9yZTogaXQgd2FzIHByZXZpb3VzbHkgaW1wb3NzaWJsZSB0byB0cnVzdCBhCiAgICAgc2luZ2xlIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlLiBUaGlzIG1lYW5zIHRoYXQ6CiAgICAgb3BlbnNzbCB2ZXJpZnkgc3MucGVtCiAgICAgbm93IGdpdmVzIGEgd2FybmluZyBhYm91dCBhIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIGJ1dAogICAgIG9wZW5zc2wgdmVyaWZ5IC1DQWZpbGUgc3MucGVtIHNzLnBlbQogICAgIGlzIE9LLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBzZXJ2ZXJzLCBzdG9yZSB2ZXJpZnlfcmVzdWx0IGluIFNTTF9TRVNTSU9OIGRhdGEgc3RydWN0dXJlCiAgICAgKGFuZCBhZGQgaXQgdG8gZXh0ZXJuYWwgc2Vzc2lvbiByZXByZXNlbnRhdGlvbikuCiAgICAgVGhpcyBpcyBuZWVkZWQgd2hlbiBjbGllbnQgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9ucyBmYWlscywKICAgICBidXQgYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgdmVyaWZpY2F0aW9uIGNhbGxiYWNrIChzZXQgYnkKICAgICBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaykgYWxsb3dzIGFjY2VwdGluZyB0aGUgc2Vzc2lvbgogICAgIGFueXdheSAoaS5lLiBsZWF2ZXMgeDUwOV9zdG9yZV9jdHgtPmVycm9yICE9IFg1MDlfVl9PSwogICAgIGJ1dCByZXR1cm5zIDEpOiBXaGVuIHRoZSBzZXNzaW9uIGlzIHJldXNlZCwgd2UgaGF2ZSB0byBzZXQKICAgICBzc2wtPnZlcmlmeV9yZXN1bHQgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgdG8gYXZvaWQKICAgICBzZWN1cml0eSBob2xlcy4KICAgICBbQm9kbyBNb2VsbGVyLCBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEx1dHogSmFlbmlja2VdCgogICopIEZpeCBhIGJ1ZyBpbiB0aGUgbmV3IFBLQ1MjNyBjb2RlOiBpdCBkaWRuJ3QgY29uc2lkZXIgdGhlCiAgICAgY2FzZSBpbiBQS0NTN19kYXRhSW5pdCgpIHdoZXJlIHRoZSBzaWduZWQgUEtDUzcgc3RydWN0dXJlCiAgICAgZGlkbid0IGNvbnRhaW4gYW55IGV4aXN0aW5nIGRhdGEgYmVjYXVzZSBpdCB3YXMgYmVpbmcgY3JlYXRlZC4KICAgICBbUG8tQ2hlbmcgQ2hlbiA8cG9jaGVuZ0Buc3QuY29tLnR3Piwgc2xpZ2h0bHkgbW9kaWZpZWQgYnkgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBzYWx0IHRvIHRoZSBrZXkgZGVyaXZhdGlvbiByb3V0aW5lcyBpbiBlbmMuYy4gVGhpcwogICAgIGZvcm1zIHRoZSBmaXJzdCA4IGJ5dGVzIG9mIHRoZSBlbmNyeXB0ZWQgZmlsZS4gQWxzbyBhZGQgYQogICAgIC1TIG9wdGlvbiB0byBhbGxvdyBhIHNhbHQgdG8gYmUgaW5wdXQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9jbXAoKS4gT2RkbHkgZW5vdWdoIHRoZXJlIHdhc24ndCBhIGZ1bmN0aW9uCiAgICAgdG8gY29tcGFyZSB0d28gY2VydGlmaWNhdGVzLiBXZSBkbyB0aGlzIGJ5IHdvcmtpbmcgb3V0IHRoZSBTSEExCiAgICAgaGFzaCBhbmQgY29tcGFyaW5nIHRoYXQuIFg1MDlfY21wKCkgd2lsbCBiZSBuZWVkZWQgYnkgdGhlIHRydXN0CiAgICAgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0xfZ2V0MV9zZXNzaW9uKCkgaXMgbGlrZSBTU0xfZ2V0X3Nlc3Npb24oKSwgYnV0IGluY3JlbWVudHMKICAgICB0aGUgcmVmZXJlbmNlIGNvdW50IGluIHRoZSBTU0xfU0VTU0lPTiByZXR1cm5lZC4KICAgICBbR2VvZmYgVGhvcnBlIDxnZW9mZkBldS5jMi5uZXQ+XQoKICAqKSBGaXggZm9yICdyZXEnOiBpdCB3YXMgYWRkaW5nIGEgbnVsbCB0byByZXF1ZXN0IGF0dHJpYnV0ZXMuCiAgICAgQWxzbyBjaGFuZ2UgdGhlIFg1MDlfTE9PS1VQIGFuZCBYNTA5X0lORk8gY29kZSB0byBoYW5kbGUKICAgICBjZXJ0aWZpY2F0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIDQwIGFuZCA2NCBiaXQgUkMyIGFuZCBSQzQgYWxnb3JpdGhtczogZG9jdW1lbnQKICAgICB0aGUgJ2VuYycgY29tbWFuZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGFkZCBleHRyYSBpbmZvcm1hdGlvbiB0byB0aGUgbWVtb3J5IGxlYWsKICAgICBkZXRlY3Rpbmcgb3V0cHV0LCB0byBmb3JtIHRyYWNlYmFja3MsIHNob3dpbmcgZnJvbSB3aGVyZSBlYWNoCiAgICAgYWxsb2NhdGlvbiB3YXMgb3JpZ2luYXRlZDogQ1JZUFRPX3B1c2hfaW5mbygiY29uc3RhbnQgc3RyaW5nIikgYWRkcwogICAgIHRoZSBzdHJpbmcgcGx1cyBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgdG8gYSBwZXItdGhyZWFkCiAgICAgc3RhY2ssIENSWVBUT19wb3BfaW5mbygpIGRvZXMgdGhlIG9idmlvdXMsIENSWVBUT19yZW1vdmVfYWxsX2luZm8oKQogICAgIGlzIGxpa2UgY2FsbGluZyBDWVJQVE9fcG9wX2luZm8oKSB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkuCiAgICAgQWxzbyB1cGRhdGVkIG1lbW9yeSBsZWFrIGRldGVjdGlvbiBjb2RlIHRvIGJlIG11bHRpLXRocmVhZC1zYWZlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBvcHRpb25zIC10ZXh0IGFuZCAtbm9vdXQgdG8gcGtjczcgdXRpbGl0eSBhbmQgZGVsZXRlIHRoZQogICAgIGVuY3J5cHRpb24gb3B0aW9ucyB3aGljaCBuZXZlciBkaWQgYW55dGhpbmcuIFVwZGF0ZSBkb2NzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb25zIHRvIHNvbWUgb2YgdGhlIHV0aWxpdGllcyB0byBhbGxvdyB0aGUgcGFzcyBwaHJhc2UKICAgICB0byBiZSBpbmNsdWRlZCBvbiBlaXRoZXIgdGhlIGNvbW1hbmQgbGluZSAobm90IHJlY29tbWVuZGVkIG9uCiAgICAgT1NlcyBsaWtlIFVuaXgpIG9yIHJlYWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuIFVwZGF0ZSB0aGUKICAgICBtYW5wYWdlcyBhbmQgZml4IGEgZmV3IGJ1Z3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZmV3IG1hbnBhZ2VzIGZvciBzb21lIG9mIHRoZSBvcGVuc3NsIGNvbW1hbmRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgLXJldm9rZSBvcHRpb24gaW4gY2EuIEl0IHdhcyBmcmVlaW5nIHVwIG1lbW9yeSB0d2ljZSwKICAgICBsZWFraW5nIGFuZCBub3QgZmluZGluZyBhbHJlYWR5IHJldm9rZWQgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHN1cHBvcnQgY2VydGlmaWNhdGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLgogICAgIFRoaXMgaW52b2x2ZXMgdGhlIHVzZSBvZiBYNTA5X0NFUlRfQVVYIHN0cnVjdHVyZSBhbmQgWDUwOV9BVVgKICAgICBmdW5jdGlvbnMuIEFuIFg1MDlfQVVYIGZ1bmN0aW9uIHN1Y2ggYXMgUEVNX3JlYWRfWDUwOV9BVVgoKQogICAgIGNhbiBzdGlsbCByZWFkIGluIGEgY2VydGlmaWNhdGUgZmlsZSBpbiB0aGUgdXN1YWwgd2F5IGJ1dCBpdAogICAgIHdpbGwgYWxzbyByZWFkIGluIGFueSBhZGRpdGlvbmFsICJhdXhpbGlhcnkgaW5mb3JtYXRpb24iLiBCeQogICAgIGRvaW5nIHRoaW5ncyB0aGlzIHdheSBhIGZhaXIgZGVncmVlIG9mIGNvbXBhdGliaWxpdHkgY2FuIGJlCiAgICAgcmV0YWluZWQ6IGV4aXN0aW5nIGNlcnRpZmljYXRlcyBjYW4gaGF2ZSB0aGlzIGluZm9ybWF0aW9uIGFkZGVkCiAgICAgdXNpbmcgdGhlIG5ldyAneDUwOScgb3B0aW9ucy4gCgogICAgIEN1cnJlbnQgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGluY2x1ZGVzIGFuICJhbGlhcyIgYW5kIHNvbWUgdHJ1c3QKICAgICBzZXR0aW5ncy4gVGhlIHRydXN0IHNldHRpbmdzIHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIGluIGVuaGFuY2VkCiAgICAgY2VydGlmaWNhdGUgY2hhaW4gdmVyaWZpY2F0aW9uIHJvdXRpbmVzOiBjdXJyZW50bHkgYSBjZXJ0aWZpY2F0ZQogICAgIGNhbiBvbmx5IGJlIHRydXN0ZWQgaWYgaXQgaXMgc2VsZiBzaWduZWQgYW5kIHRoZW4gaXQgaXMgdHJ1c3RlZAogICAgIGZvciBhbGwgcHVycG9zZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGFzc2VtYmxlciBmb3IgQWxwaGEgKHRlc3RlZCBvbmx5IG9uIERFQyBPU0Ygbm90IExpbnV4IG9yICpCU0QpLgogICAgIFRoZSBwcm9ibGVtIHdhcyB0aGF0IG9uZSBvZiB0aGUgcmVwbGFjZW1lbnQgcm91dGluZXMgaGFkIG5vdCBiZWVuIHdvcmtpbmcKICAgICBzaW5jZSBTU0xlYXkgcmVsZWFzZXMuICBGb3Igbm93IHRoZSBvZmZlbmRpbmcgcm91dGluZSBoYXMgYmVlbiByZXBsYWNlZAogICAgIHdpdGggbm9uLW9wdGltaXNlZCBhc3NlbWJsZXIuICBFdmVuIHNvLCB0aGlzIG5vdyBnaXZlcyBhcm91bmQgOTUlCiAgICAgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgZm9yIDEwMjQgYml0IFJTQSBzaWducy4KICAgICBbTWFyayBDb3hdCgogICopIEhhY2sgdG8gZml4IFBLQ1MjNyBkZWNyeXB0aW9uIHdoZW4gdXNlZCB3aXRoIHNvbWUgdW5vcnRob2RveCBSQzIgCiAgICAgaGFuZGxpbmcuIE1vc3QgY2xpZW50cyBoYXZlIHRoZSBlZmZlY3RpdmUga2V5IHNpemUgaW4gYml0cyBlcXVhbCB0bwogICAgIHRoZSBrZXkgbGVuZ3RoIGluIGJpdHM6IHNvIGEgNDAgYml0IFJDMiBrZXkgdXNlcyBhIDQwIGJpdCAoNSBieXRlKSBrZXkuCiAgICAgQSBmZXcgaG93ZXZlciBkb24ndCBkbyB0aGlzIGFuZCBpbnN0ZWFkIHVzZSB0aGUgc2l6ZSBvZiB0aGUgZGVjcnlwdGVkIGtleQogICAgIHRvIGRldGVybWluZSB0aGUgUkMyIGtleSBsZW5ndGggYW5kIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIHRvIGRldGVybWluZQogICAgIHRoZSBlZmZlY3RpdmUga2V5IGxlbmd0aC4gSW4gdGhpcyBjYXNlIHRoZSBlZmZlY3RpdmUga2V5IGxlbmd0aCBjYW4gc3RpbGwKICAgICBiZSA0MCBiaXRzIGJ1dCB0aGUga2V5IGxlbmd0aCBjYW4gYmUgMTY4IGJpdHMgZm9yIGV4YW1wbGUuIFRoaXMgaXMgZml4ZWQKICAgICBieSBtYW51YWxseSBmb3JjaW5nIGFuIFJDMiBrZXkgaW50byB0aGUgRVZQX1BLRVkgc3RydWN0dXJlIGJlY2F1c2UgdGhlCiAgICAgRVZQIGNvZGUgY2FuJ3QgY3VycmVudGx5IGhhbmRsZSB1bnVzdWFsIFJDMiBrZXkgc2l6ZXM6IGl0IGFsd2F5cyBhc3N1bWVzCiAgICAgdGhlIGtleSBsZW5ndGggYW5kIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGFyZSBlcXVhbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBidW5jaCBvZiBmdW5jdGlvbnMgdGhhdCBzaG91bGQgc2ltcGxpZnkgdGhlIGNyZWF0aW9uIG9mIAogICAgIFg1MDlfTkFNRSBzdHJ1Y3R1cmVzLiBOb3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIGRvOgogICAgIFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLCAiQ04iLCBNQlNUUklOR19BU0MsICJTdGV2ZSIsIC0xLCAtMSwgMCk7CiAgICAgYW5kIGhhdmUgaXQgYXV0b21hdGljYWxseSB3b3JrIG91dCB0aGUgY29ycmVjdCBmaWVsZCB0eXBlIGFuZCBmaWxsIGluCiAgICAgdGhlIHN0cnVjdHVyZXMuIFRoZSBtb3JlIGFkdmVudHVyb3VzIGNhbiB0cnk6CiAgICAgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQobm0sIGZpZWxkLCBNQlNUUklOR19VVEY4LCBzdHIsIC0xLCAtMSwgMCk7CiAgICAgYW5kIGl0IHdpbGwgKGhvcGVmdWxseSkgd29yayBvdXQgdGhlIGNvcnJlY3QgbXVsdGlieXRlIGVuY29kaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgJ3JlcScgdXRpbGl0eSB0byB1c2UgdGhlIG5ldyBmaWVsZCBoYW5kbGluZyBhbmQgbXVsdGlieXRlCiAgICAgY29weSByb3V0aW5lcy4gQmVmb3JlIHRoZSBETiBmaWVsZCBjcmVhdGlvbiB3YXMgaGFuZGxlZCBpbiBhbiBhZCBob2MKICAgICB3YXkgaW4gcmVxLCBjYSwgYW5kIHg1MDkgd2hpY2ggd2FzIHJhdGhlciBicm9rZW4gYW5kIGRpZG4ndCBzdXBwb3J0CiAgICAgQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncy4gU2luY2Ugc29tZSBzb2Z0d2FyZSBkb2Vzbid0IGltcGxlbWVudAogICAgIEJNUFN0cmluZ3Mgb3IgVVRGOFN0cmluZ3MgeWV0LCB0aGV5IGNhbiBiZSBlbmFibGVkIHVzaW5nIHRoZSBjb25maWcgZmlsZQogICAgIHVzaW5nIHRoZSBkaXJzdHJpbmdfdHlwZSBvcHRpb24uIFNlZSB0aGUgbmV3IGNvbW1lbnQgaW4gdGhlIGRlZmF1bHQKICAgICBvcGVuc3NsLmNuZiBmb3IgbW9yZSBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgY3J5cHRvL3JhbmQvbWRfcmFuZC5jIG1vcmUgcm9idXN0OgogICAgIC0gQXNzdXJlIHVuaXF1ZSByYW5kb20gbnVtYmVycyBhZnRlciBmb3JrKCkuCiAgICAgLSBNYWtlIHN1cmUgdGhhdCBjb25jdXJyZW50IHRocmVhZHMgYWNjZXNzIHRoZSBnbG9iYWwgY291bnRlciBhbmQKICAgICAgIG1kIHNlcmlhbGl6YWJseSBzbyB0aGF0IHdlIG5ldmVyIGxvc2UgZW50cm9weSBpbiB0aGVtCiAgICAgICBvciB1c2UgZXhhY3RseSB0aGUgc2FtZSBzdGF0ZSBpbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgICAgQWNjZXNzIHRvIHRoZSBsYXJnZSBzdGF0ZSBpcyBub3QgYWx3YXlzIHNlcmlhbGl6YWJsZSBiZWNhdXNlCiAgICAgICB0aGUgYWRkaXRpb25hbCBsb2NraW5nIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2Uga2lsbGVyLCBhbmQKICAgICAgIG1kIHNob3VsZCBiZSBsYXJnZSBlbm91Z2ggYW55d2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmaWxlIGFwcHMvYXBwX3JhbmQuYyB3aXRoIGNvbW1vbmx5IG5lZWRlZCBmdW5jdGlvbmFsaXR5CiAgICAgZm9yIGhhbmRsaW5nIHRoZSByYW5kb20gc2VlZCBmaWxlLgoKICAgICBVc2UgdGhlIHJhbmRvbSBzZWVkIGZpbGUgaW4gc29tZSBhcHBsaWNhdGlvbnMgdGhhdCBwcmV2aW91c2x5IGRpZCBub3Q6CiAgICAgICAgICBjYSwKICAgICAgICAgIGRzYXBhcmFtIC1nZW5rZXkgKHdoaWNoIGFsc28gaWdub3JlZCBpdHMgJy1yYW5kJyBvcHRpb24pLCAKICAgICAgICAgIHNfY2xpZW50LAogICAgICAgICAgc19zZXJ2ZXIsCiAgICAgICAgICB4NTA5ICh3aGVuIHNpZ25pbmcpLgogICAgIEV4Y2VwdCBvbiBzeXN0ZW1zIHdpdGggL2Rldi91cmFuZG9tLCBpdCBpcyBjcnVjaWFsIHRvIGhhdmUgYSByYW5kb20KICAgICBzZWVkIGZpbGUgYXQgbGVhc3QgZm9yIGtleSBjcmVhdGlvbiwgRFNBIHNpZ25pbmcsIGFuZCBmb3IgREggZXhjaGFuZ2VzOwogICAgIGZvciBSU0Egc2lnbmF0dXJlcyB3ZSBjb3VsZCBkbyB3aXRob3V0IG9uZS4KCiAgICAgZ2VuZGggYW5kIGdlbmRzYSAodW5saWtlIGdlbnJzYSkgdXNlZCB0byByZWFkIG9ubHkgdGhlIGZpcnN0IGJ5dGUKICAgICBvZiBlYWNoIGZpbGUgbGlzdGVkIGluIHRoZSAnLXJhbmQnIG9wdGlvbi4gIFRoZSBmdW5jdGlvbiBhcyBwcmV2aW91c2x5CiAgICAgZm91bmQgaW4gZ2VucnNhIGlzIG5vdyBpbiBhcHBfcmFuZC5jIGFuZCBpcyB1c2VkIGJ5IGFsbCBwcm9ncmFtcwogICAgIHRoYXQgc3VwcG9ydCAnLXJhbmQnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIFJBTkRfd3JpdGVfZmlsZSwgdXNlIG1vZGUgMDYwMCBmb3IgY3JlYXRpbmcgZmlsZXM7CiAgICAgZG9uJ3QganVzdCBjaG1vZCB3aGVuIGl0IG1heSBiZSB0b28gbGF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXBvcnQgYW4gZXJyb3IgZnJvbSBYNTA5X1NUT1JFX2xvYWRfbG9jYXRpb25zCiAgICAgd2hlbiBYNTA5X0xPT0tVUF9sb2FkX2ZpbGUgb3IgWDUwOV9MT09LVVBfYWRkX2RpciBmYWlsZWQuCiAgICAgW0JpbGwgUGVycnldCgogICopIE5ldyBmdW5jdGlvbiBBU04xX21ic3RyaW5nX2NvcHkoKSB0aGlzIGNvcGllcyBhIHN0cmluZyBpbiBlaXRoZXIKICAgICBBU0NJSSwgVW5pY29kZSwgVW5pdmVyc2FsICg0IGJ5dGVzIHBlciBjaGFyYWN0ZXIpIG9yIFVURjggZm9ybWF0CiAgICAgaW50byBhbiBBU04xX1NUUklORyB0eXBlLiBBIG1hc2sgb2YgcGVybWlzc2libGUgdHlwZXMgaXMgcGFzc2VkCiAgICAgYW5kIGl0IGNob29zZXMgdGhlICJtaW5pbWFsIiB0eXBlIHRvIHVzZSBvciBhbiBlcnJvciBpZiBub3QgdHlwZQogICAgIGlzIHN1aXRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbiBlcXVpdmFsZW50cyB0byB0aGUgdmFyaW91cyBtYWNyb3MgaW4gYXNuMS5oLiBUaGUgb2xkCiAgICAgbWFjcm9zIGFyZSByZXRhaW5lZCB3aXRoIGFuIE1fIHByZWZpeC4gQ29kZSBpbnNpZGUgdGhlIGxpYnJhcnkgY2FuCiAgICAgdXNlIHRoZSBNXyBtYWNyb3MuIEV4dGVybmFsIGNvZGUgKGluY2x1ZGluZyB0aGUgb3BlbnNzbCB1dGlsaXR5KQogICAgIHNob3VsZCAqTk9UKiBpbiBvcmRlciB0byBiZSAic2hhcmVkIGxpYnJhcnkgZnJpZW5kbHkiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IGNhbiBjaGVjayBhIGNlcnRpZmljYXRlJ3MgZXh0ZW5zaW9ucwogICAgIHRvIHNlZSBpZiBpdCB1c2FibGUgZm9yIHZhcmlvdXMgcHVycG9zZXMgc3VjaCBhcyBTU0wgY2xpZW50LAogICAgIHNlcnZlciBvciBTL01JTUUgYW5kIENBcyBvZiB0aGVzZSB0eXBlcy4gVGhpcyBpcyBjdXJyZW50bHkgCiAgICAgVkVSWSBFWFBFUklNRU5UQUwgYnV0IHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIGZvciBjZXJ0aWZpY2F0ZSBjaGFpbgogICAgIHZlcmlmaWNhdGlvbi4gQWxzbyBhZGRlZCBhIC1wdXJwb3NlIGZsYWcgdG8geDUwOSB1dGlsaXR5IHRvCiAgICAgcHJpbnQgb3V0IGFsbCB0aGUgcHVycG9zZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgQ1JZUFRPX0VYX0RBVEEgdG8gWDUwOSBjZXJ0aWZpY2F0ZSBzdHJ1Y3R1cmUgYW5kIGFzc29jaWF0ZWQKICAgICBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFg1MDlWM197WDUwOSxDUkwsUkVWT0tFRH1fZ2V0X2QyaSgpIGZ1bmN0aW9ucy4gVGhlc2Ugd2lsbCBzZWFyY2gKICAgICBmb3IsIG9idGFpbiBhbmQgZGVjb2RlIGFuZCBleHRlbnNpb24gYW5kIG9idGFpbiBpdHMgY3JpdGljYWwgZmxhZy4KICAgICBUaGlzIGFsbG93cyBhbGwgdGhlIG5lY2Vzc2FyeSBleHRlbnNpb24gY29kZSB0byBiZSBoYW5kbGVkIGluIGEKICAgICBzaW5nbGUgZnVuY3Rpb24gY2FsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSQzQgdHVuZS11cCBmZWF0dXJpbmcgMzAtNDAlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9uIG1vc3QgUklTQwogICAgIHBsYXRmb3Jtcy4gU2VlIGNyeXB0by9yYzQvcmM0X2VuYy5jIGZvciBmdXJ0aGVyIGRldGFpbHMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE5ldyAtbm9vdXQgb3B0aW9uIHRvIGFzbjFwYXJzZS4gVGhpcyBjYXVzZXMgbm8gb3V0cHV0IHRvIGJlIHByb2R1Y2VkCiAgICAgaXRzIG1haW4gdXNlIGlzIHdoZW4gY29tYmluZWQgd2l0aCAtc3RycGFyc2UgYW5kIC1vdXQgdG8gZXh0cmFjdCBkYXRhCiAgICAgZnJvbSBhIGZpbGUgKHdoaWNoIG1heSBub3QgYmUgaW4gQVNOLjEgZm9ybWF0KS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIHBrY3MxMiBwcm9ncmFtLiBJdCB3YXMgaGFzaGluZyBhbiBpbnZhbGlkIGNlcnRpZmljYXRlIHBvaW50ZXIKICAgICB3aGVuIHByb2R1Y2luZyB0aGUgbG9jYWwga2V5IGlkLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBOZXcgb3B0aW9uIC1kaHBhcmFtIGluIHNfc2VydmVyLiBUaGlzIGFsbG93cyBhIERIIHBhcmFtZXRlciBmaWxlIHRvIGJlCiAgICAgc3RhdGVkIGV4cGxpY2l0bHkuIElmIGl0IGlzIG5vdCBzdGF0ZWQgdGhlbiBpdCB0cmllcyB0aGUgZmlyc3Qgc2VydmVyCiAgICAgY2VydGlmaWNhdGUgZmlsZS4gVGhlIHByZXZpb3VzIGJlaGF2aW91ciBoYXJkIGNvZGVkIHRoZSBmaWxlbmFtZQogICAgICJzZXJ2ZXIucGVtIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLXB1YmluIGFuZCAtcHVib3V0IG9wdGlvbnMgdG8gdGhlIHJzYSBhbmQgZHNhIGNvbW1hbmRzLiBUaGVzZSBhbGxvdwogICAgIGEgcHVibGljIGtleSB0byBiZSBpbnB1dCBvciBvdXRwdXQuIEZvciBleGFtcGxlOgogICAgIG9wZW5zc2wgcnNhIC1pbiBrZXkucGVtIC1wdWJvdXQgLW91dCBwdWJrZXkucGVtCiAgICAgQWxzbyBhZGRlZCBuZWNlc3NhcnkgRFNBIHB1YmxpYyBrZXkgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBzbyBQS0NTN19kYXRhVmVyaWZ5KCkgZG9lc24ndCBjcmFzaCBpZiBubyBjZXJ0aWZpY2F0ZXMgYXJlIGNvbnRhaW5lZAogICAgIGluIHRoZSBtZXNzYWdlLiBUaGlzIHdhcyBoYW5kbGVkIGJ5IGFsbG93aW5nCiAgICAgWDUwOV9maW5kX2J5X2lzc3Vlcl9hbmRfc2VyaWFsKCkgdG8gdG9sZXJhdGUgYSBOVUxMIHBhc3NlZCB0byBpdC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBTYW1wbyBLZWxsb21ha2kgPHNhbXBvQG1haWwubmV1cm9uaW8ucHQ+XQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBkMmlfQVNOMV9ieXRlcygpOiBvdGhlciBBU04xIGZ1bmN0aW9ucyBhZGQgYW4gZXh0cmEgbnVsbAogICAgIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZ3Mgd2hlcmVhcyB0aGlzIGRpZG4ndC4gVGhpcyB3b3VsZCBjYXVzZSBwcm9ibGVtcwogICAgIGlmIHN0cmluZ3MgcmVhZCB3aXRoIGQyaV9BU04xX2J5dGVzKCkgd2VyZSBsYXRlciBtb2RpZmllZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBGaXggZm9yIGJhc2U2NCBkZWNvZGUgYnVnLiBXaGVuIGEgYmFzZTY0IGJpbyByZWFkcyBvbmx5IG9uZSBsaW5lIG9mCiAgICAgZGF0YSBhbmQgaXQgY29udGFpbnMgRU9GIGl0IHdpbGwgZW5kIHVwIHJldHVybmluZyBhbiBlcnJvci4gVGhpcyBpcwogICAgIGNhdXNlZCBieSBpbnB1dCA0NiBieXRlcyBsb25nLiBUaGUgY2F1c2UgaXMgZHVlIHRvIHRoZSB3YXkgYmFzZTY0CiAgICAgQklPcyBmaW5kIHRoZSBzdGFydCBvZiBiYXNlNjQgZW5jb2RlZCBkYXRhLiBUaGV5IGRvIHRoaXMgYnkgdHJ5aW5nIGEKICAgICB0cmlhbCBkZWNvZGUgb24gZWFjaCBsaW5lIHVudGlsIHRoZXkgZmluZCBvbmUgdGhhdCB3b3Jrcy4gV2hlbiB0aGV5CiAgICAgZG8gYSBmbGFnIGlzIHNldCBhbmQgaXQgc3RhcnRzIGFnYWluIGtub3dpbmcgaXQgY2FuIHBhc3MgYWxsIHRoZQogICAgIGRhdGEgZGlyZWN0bHkgdGhyb3VnaCB0aGUgZGVjb2Rlci4gVW5mb3J0dW5hdGVseSBpdCBkb2Vzbid0IHJlc2V0CiAgICAgdGhlIGNvbnRleHQgaXQgdXNlcy4gVGhpcyBtZWFucyB0aGF0IGlmIEVPRiBpcyByZWFjaGVkIGFuIGF0dGVtcHQKICAgICBpcyBtYWRlIHRvIHBhc3MgdHdvIEVPRnMgdGhyb3VnaCB0aGUgY29udGV4dCBhbmQgdGhpcyBjYXVzZXMgdGhlCiAgICAgcmVzdWx0aW5nIGVycm9yLiBUaGlzIGNhbiBhbHNvIGNhdXNlIG90aGVyIHByb2JsZW1zIGFzIHdlbGwuIEFzIGlzCiAgICAgdXN1YWwgd2l0aCB0aGVzZSBwcm9ibGVtcyBpdCB0YWtlcyAqYWdlcyogdG8gZmluZCBhbmQgdGhlIGZpeCBpcwogICAgIHRyaXZpYWw6IG1vdmUgb25lIGxpbmUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgaWFuQHVucy5ucy5hYy55dSAoSXZhbiBOZWpnZWJhdWVyKSBdCgogICopIFVnbHkgd29ya2Fyb3VuZCB0byBnZXQgc19jbGllbnQgYW5kIHNfc2VydmVyIHdvcmtpbmcgdW5kZXIgV2luZG93cy4gVGhlCiAgICAgb2xkIGNvZGUgd291bGRuJ3Qgd29yayBiZWNhdXNlIGl0IG5lZWRlZCB0byBzZWxlY3QoKSBvbiBzb2NrZXRzIGFuZCB0aGUKICAgICB0dHkgKGZvciBrZXlwcmVzc2VzIGFuZCB0byBzZWUgaWYgZGF0YSBjb3VsZCBiZSB3cml0dGVuKS4gV2luMzIgb25seQogICAgIHN1cHBvcnRzIHNlbGVjdCgpIG9uIHNvY2tldHMgc28gd2Ugc2VsZWN0KCkgd2l0aCBhIDFzIHRpbWVvdXQgb24gdGhlCiAgICAgc29ja2V0cyBhbmQgdGhlbiBzZWUgaWYgYW55IGNoYXJhY3RlcnMgYXJlIHdhaXRpbmcgdG8gYmUgcmVhZCwgaWYgbm9uZQogICAgIGFyZSBwcmVzZW50IHRoZW4gd2UgcmV0cnksIHdlIGFsc28gYXNzdW1lIHdlIGNhbiBhbHdheXMgd3JpdGUgZGF0YSB0bwogICAgIHRoZSB0dHkuIFRoaXMgaXNuJ3QgbmljZSBiZWNhdXNlIHRoZSBjb2RlIHRoZW4gYmxvY2tzIHVudGlsIHdlJ3ZlCiAgICAgcmVjZWl2ZWQgYSBjb21wbGV0ZSBsaW5lIG9mIGRhdGEgYW5kIGl0IGlzIGVmZmVjdGl2ZWx5IHBvbGxpbmcgdGhlCiAgICAga2V5Ym9hcmQgYXQgMXMgaW50ZXJ2YWxzOiBob3dldmVyIGl0J3MgcXVpdGUgYSBiaXQgYmV0dGVyIHRoYW4gbm90CiAgICAgd29ya2luZyBhdCBhbGwgOi0pIEEgZGVkaWNhdGVkIFdpbmRvd3MgYXBwbGljYXRpb24gbWlnaHQgaGFuZGxlIHRoaXMKICAgICB3aXRoIGFuIGV2ZW50IGxvb3AgZm9yIGV4YW1wbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBSU0FfTUVUSE9EIHN0cnVjdHVyZS4gTm93IHRoZXJlIGFyZSB0d28gZXh0cmEgbWV0aG9kcywgcnNhX3NpZ24KICAgICBhbmQgcnNhX3ZlcmlmeS4gV2hlbiB0aGUgUlNBX0ZMQUdTX1NJR05fVkVSIG9wdGlvbiBpcyBzZXQgdGhlc2UgZnVuY3Rpb25zCiAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiBSU0Ffc2lnbigpIGFuZCBSU0FfdmVyaWZ5KCkgYXJlIHVzZWQuIFRoaXMgaXMgdXNlZnVsCiAgICAgaWYgcnNhX3B1Yl9kZWMoKSBhbmQgcnNhX3ByaXZfZW5jKCkgZXF1aXZhbGVudHMgYXJlIG5vdCBhdmFpbGFibGUuCiAgICAgRm9yIHRoaXMgdG8gd29yayBwcm9wZXJseSBSU0FfcHVibGljX2RlY3J5cHQoKSBhbmQgUlNBX3ByaXZhdGVfZW5jcnlwdCgpCiAgICAgc2hvdWxkICpub3QqIGJlIHVzZWQ6IFJTQV9zaWduKCkgYW5kIFJTQV92ZXJpZnkoKSBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KICAgICBUaGlzIG5lY2Vzc2l0YXRlZCB0aGUgc3VwcG9ydCBvZiBhbiBleHRyYSBzaWduYXR1cmUgdHlwZSBOSURfbWQ1X3NoYTEKICAgICBmb3IgU1NMIHNpZ25hdHVyZXMgYW5kIG1vZGlmaWNhdGlvbnMgdG8gdGhlIFNTTCBsaWJyYXJ5IHRvIHVzZSBpdCBpbnN0ZWFkCiAgICAgb2YgY2FsbGluZyBSU0FfcHVibGljX2RlY3J5cHQoKSBhbmQgUlNBX3ByaXZhdGVfZW5jcnlwdCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgLXZlcmlmeSAtQ0FmaWxlIGFuZCAtQ0FwYXRoIG9wdGlvbnMgdG8gdGhlIGNybCBwcm9ncmFtLCB0aGVzZQogICAgIHdpbGwgbG9va3VwIGEgQ1JMIGlzc3VlcnMgY2VydGlmaWNhdGUgYW5kIHZlcmlmeSB0aGUgc2lnbmF0dXJlIGluIGEKICAgICBzaW1pbGFyIHdheSB0byB0aGUgdmVyaWZ5IHByb2dyYW0uIFRpZHkgdXAgdGhlIGNybCBwcm9ncmFtIHNvIGl0CiAgICAgbm8gbG9uZ2VyIGFjY2Vzc2VzIHN0cnVjdHVyZXMgZGlyZWN0bHkuIE1ha2UgdGhlIEFTTjEgQ1JMIHBhcnNpbmcgYSBiaXQKICAgICBsZXNzIHN0cmljdC4gSXQgd2lsbCBub3cgcGVybWl0IENSTCBleHRlbnNpb25zIGV2ZW4gaWYgaXQgaXMgbm90CiAgICAgYSBWMiBDUkw6IHRoaXMgd2lsbCBhbGxvdyBpdCB0byB0b2xlcmF0ZSBzb21lIGJyb2tlbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWxpemUgYWxsIG5vbi1hdXRvbWF0aWMgdmFyaWFibGVzIGVhY2ggdGltZSBvbmUgb2YgdGhlIG9wZW5zc2wKICAgICBzdWItcHJvZ3JhbXMgaXMgc3RhcnRlZCAodGhpcyBpcyBuZWNlc3NhcnkgYXMgdGhleSBtYXkgYmUgc3RhcnRlZAogICAgIG11bHRpcGxlIHRpbWVzIGZyb20gdGhlICJPcGVuU1NMPiIgcHJvbXB0KS4KICAgICBbTGVubmFydCBCYW5nLCBCb2RvIE1vZWxsZXJdCgogICopIFByZWxpbWluYXJ5IGNvbXBpbGF0aW9uIG9wdGlvbiBSU0FfTlVMTCB3aGljaCBkaXNhYmxlcyBSU0EgY3J5cHRvIHdpdGhvdXQKICAgICByZW1vdmluZyBhbGwgb3RoZXIgUlNBIGZ1bmN0aW9uYWxpdHkgKHRoaXMgaXMgd2hhdCBOT19SU0EgZG9lcykuIFRoaXMKICAgICBpcyBzbyAoZm9yIGV4YW1wbGUpIHRob3NlIGluIHRoZSBVUyBjYW4gZGlzYWJsZSB0aG9zZSBvcGVyYXRpb25zIGNvdmVyZWQKICAgICBieSB0aGUgUlNBIHBhdGVudCB3aGlsZSBhbGxvd2luZyBzdG9yYWdlIGFuZCBwYXJzaW5nIG9mIFJTQSBrZXlzIGFuZCBSU0EKICAgICBrZXkgZ2VuZXJhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOb24tY29weWluZyBpbnRlcmZhY2UgdG8gQklPIHBhaXJzLgogICAgIChzdGlsbCBsYXJnZWx5IHVudGVzdGVkKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBBTlMxX3RhZzJzdHIoKSB0byBjb252ZXJ0IGFuIEFTTjEgdGFnIHRvIGEgZGVzY3JpcHRpdmUKICAgICBBU0NJSSBzdHJpbmcuIFRoaXMgd2FzIGhhbmRsZWQgaW5kZXBlbmRlbnRseSBpbiB2YXJpb3VzIHBsYWNlcyBiZWZvcmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBVVEY4X2dldGMoKSBhbmQgVVRGOF9wdXRjKCkgdGhhdCBwYXJzZSBhbmQgZ2VuZXJhdGUKICAgICBVVEY4IHN0cmluZ3MgYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVzZSBjbGllbnRfdmVyc2lvbiBmcm9tIGNsaWVudCBoZWxsbyB0byBzZWxlY3QgdGhlIHByb3RvY29sCiAgICAgKHMyM19zcnZyLmMpIGFuZCBmb3IgUlNBIGNsaWVudCBrZXkgZXhjaGFuZ2UgdmVyaWZpY2F0aW9uCiAgICAgKHMzX3NydnIuYyksIGFzIHJlcXVpcmVkIGJ5IHRoZSBTU0wgMy4wL1RMUyAxLjAgc3BlY2lmaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGFuZGxlIFNQS0FDcywgdGhlc2Ugd2VyZSBwcmV2aW91c2x5CiAgICAgaGFuZGxlZCBieSBwb2tpbmcgcm91bmQgaW4gdGhlIHN0cnVjdHVyZSBpbnRlcm5hbHMuIEFkZGVkIG5ldyBmdW5jdGlvbgogICAgIE5FVFNDQVBFX1NQS0lfcHJpbnQoKSB0byBwcmludCBvdXQgU1BLQUMgYW5kIGEgbmV3IHV0aWxpdHkgJ3Nwa2FjJyB0bwogICAgIHByaW50LCB2ZXJpZnkgYW5kIGdlbmVyYXRlIFNQS0FDcy4gQmFzZWQgb24gYW4gb3JpZ2luYWwgaWRlYSBmcm9tCiAgICAgTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD4gYnV0IGV4dGVuc2l2ZWx5IG1vZGlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJJUEVNRDE2MCBpcyBvcGVyYXRpb25hbCBvbiBhbGwgcGxhdGZvcm1zIGFuZCBpcyBiYWNrIGluICdtYWtlIHRlc3QnLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBbGxvdyB0aGUgY29uZmlnIGZpbGUgZXh0ZW5zaW9uIHNlY3Rpb24gdG8gYmUgb3ZlcndyaXR0ZW4gb24gdGhlCiAgICAgY29tbWFuZCBsaW5lLiBCYXNlZCBvbiBhbiBvcmlnaW5hbCBpZGVhIGZyb20gTWFzc2ltaWxpYW5vIFBhbGEKICAgICA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pi4gVGhlIG5ldyBvcHRpb24gaXMgY2FsbGVkIC1leHRlbnNpb25zCiAgICAgYW5kIGNhbiBiZSBhcHBsaWVkIHRvIGNhLCByZXEgYW5kIHg1MDkuIEFsc28gLXJlcWV4dHMgdG8gb3ZlcnJpZGUKICAgICB0aGUgcmVxdWVzdCBleHRlbnNpb25zIGluIHJlcSBhbmQgLWNybGV4dHMgdG8gb3ZlcnJpZGUgdGhlIGNybCBleHRlbnNpb25zCiAgICAgaW4gY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmZWF0dXJlIHRvIHRoZSBTUEtBQyBoYW5kbGluZyBpbiBjYS4gIE5vdyB5b3UgY2FuIGluY2x1ZGUKICAgICB0aGUgc2FtZSBmaWVsZCBtdWx0aXBsZSB0aW1lcyBieSBwcmVjZWRpbmcgaXQgYnkgIlhYWFguIiBmb3IgZXhhbXBsZToKICAgICAxLk9VPSJVbml0IG5hbWUgMSIKICAgICAyLk9VPSJVbml0IG5hbWUgMiIKICAgICB0aGlzIGlzIHRoZSBzYW1lIHN5bnRheCBhcyB1c2VkIGluIHRoZSByZXEgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgY2VydGlmaWNhdGUgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0byBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gVGhlc2UKICAgICBhcmUgc3BlY2lmaWVkIGluIGEgJ3JlcV9leHRlbnNpb25zJyBvcHRpb24gb2YgdGhlIHJlcSBzZWN0aW9uIG9mIHRoZQogICAgIGNvbmZpZyBmaWxlLiBUaGV5IGNhbiBiZSBwcmludGVkIG91dCB3aXRoIHRoZSAtdGV4dCBvcHRpb24gdG8gcmVxIGJ1dAogICAgIGFyZSBvdGhlcndpc2UgaWdub3JlZCBhdCBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhIGhvcnJpYmxlIGJ1ZyBpbiBlbmNfcmVhZCgpIGluIGNyeXB0by9ldnAvYmlvX2VuYy5jOiBpZiB0aGUgZmlyc3QKICAgICBkYXRhIHJlYWQgY29uc2lzdHMgb2Ygb25seSB0aGUgZmluYWwgYmxvY2sgaXQgd291bGQgbm90IGRlY3J5cHRlZCBiZWNhdXNlCiAgICAgRVZQX0NpcGhlclVwZGF0ZSgpIHdvdWxkIGNvcnJlY3RseSByZXBvcnQgemVybyBieXRlcyBoYWQgYmVlbiBkZWNyeXB0ZWQuCiAgICAgQSBtaXNwbGFjZWQgJ2JyZWFrJyBhbHNvIG1lYW50IHRoZSBkZWNyeXB0ZWQgZmluYWwgYmxvY2sgbWlnaHQgbm90IGJlCiAgICAgY29waWVkIHVudGlsIHRoZSBuZXh0IHJlYWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBESF9NRVRIT0QuIEFnYWluIGJhc2VkIG9uIFJTQV9NRVRIT0QuIEFsc28gYWRkZWQKICAgICBhIGZldyBleHRyYSBwYXJhbWV0ZXJzIHRvIHRoZSBESCBzdHJ1Y3R1cmU6IHRoZXNlIHdpbGwgYmUgdXNlZnVsIGlmCiAgICAgZm9yIGV4YW1wbGUgd2Ugd2FudCB0aGUgdmFsdWUgb2YgJ3EnIG9yIGltcGxlbWVudCBYOS40MiBESC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIERTQV9NRVRIT0QuIFRoaXMgaXMgYmFzZWQgb24gdGhlIFJTQV9NRVRIT0QgYW5kCiAgICAgcHJvdmlkZXMgaG9va3MgdGhhdCBhbGxvdyB0aGUgZGVmYXVsdCBEU0EgZnVuY3Rpb25zIG9yIGZ1bmN0aW9ucyBvbiBhCiAgICAgInBlciBrZXkiIGJhc2lzIHRvIGJlIHJlcGxhY2VkLiBUaGlzIGFsbG93cyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gYW5kCiAgICAgaGFyZHdhcmUga2V5IHN0b3JhZ2UgdG8gYmUgaGFuZGxlZCB3aXRob3V0IG1ham9yIG1vZGlmaWNhdGlvbiB0byB0aGUKICAgICBsaWJyYXJ5LiBBbHNvIGFkZGVkIGxvdyBsZXZlbCBtb2RleHAgaG9va3MgYW5kIENSWVBUT19FWCBzdHJ1Y3R1cmUgYW5kIAogICAgIGFzc29jaWF0ZWQgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIG5ldyBmbGFnIHRvIG1lbW9yeSBCSU9zLCBCSU9fRkxBR19NRU1fUkRPTkxZLiBUaGlzIG1hcmtzIHRoZSBCSU8KICAgICBhcyAicmVhZCBvbmx5IjogaXQgY2FuJ3QgYmUgd3JpdHRlbiB0byBhbmQgdGhlIGJ1ZmZlciBpdCBwb2ludHMgdG8gd2lsbAogICAgIG5vdCBiZSBmcmVlZC4gUmVhZGluZyBmcm9tIGEgcmVhZCBvbmx5IEJJTyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4KICAgICBhIG5vcm1hbCBtZW1vcnkgQklPLiBUaGlzIHdhcyBhZGRlZCBiZWNhdXNlIHRoZXJlIGFyZSBzZXZlcmFsIHRpbWVzIHdoZW4KICAgICBhbiBhcmVhIG9mIG1lbW9yeSBuZWVkcyB0byBiZSByZWFkIGZyb20gYSBCSU8uIFRoZSBwcmV2aW91cyBtZXRob2Qgd2FzCiAgICAgdG8gY3JlYXRlIGEgbWVtb3J5IEJJTyBhbmQgd3JpdGUgdGhlIGRhdGEgdG8gaXQsIHRoaXMgcmVzdWx0cyBpbiB0d28KICAgICBjb3BpZXMgb2YgdGhlIGRhdGEgYW5kIGFuIE8obl4yKSByZWFkaW5nIGFsZ29yaXRobS4gVGhlcmUgaXMgYSBuZXcKICAgICBmdW5jdGlvbiBCSU9fbmV3X21lbV9idWYoKSB3aGljaCBjcmVhdGVzIGEgcmVhZCBvbmx5IG1lbW9yeSBCSU8gZnJvbQogICAgIGFuIGFyZWEgb2YgbWVtb3J5LiBBbHNvIG1vZGlmaWVkIHRoZSBQS0NTIzcgcm91dGluZXMgdG8gdXNlIHJlYWQgb25seQogICAgIG1lbW9yeSBCSU9zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJ1Z2ZpeDogc3NsMjNfZ2V0X2NsaWVudF9oZWxsbyBkaWQgbm90IHdvcmsgcHJvcGVybHkgd2hlbiBjYWxsZWQgaW4KICAgICBzdGF0ZSBTU0wyM19TVF9TUl9DTE5UX0hFTExPX0IsIGkuZS4gd2hlbiB0aGUgZmlyc3QgNyBieXRlcyBvZgogICAgIGEgU1NMdjItY29tcGF0aWJsZSBjbGllbnQgaGVsbG8gZm9yIFNTTHYzIG9yIFRMU3YxIGNvdWxkIGJlIHJlYWQsCiAgICAgYnV0IGEgcmV0cnkgY29uZGl0aW9uIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlYWQgdGhlIHJlc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVGhlIFBLQ1M3X0VOQ19DT05URU5UX25ldygpIGZ1bmN0aW9uIHdhcyBzZXR0aW5nIHRoZSBjb250ZW50IHR5cGUgYXMKICAgICBOSURfcGtjczdfZW5jcnlwdGVkIGJ5IGRlZmF1bHQ6IHRoaXMgd2FzIHdyb25nIHNpbmNlIHRoaXMgc2hvdWxkIGFsbW9zdAogICAgIGFsd2F5cyBiZSBOSURfcGtjczdfZGF0YS4gQWxzbyBtb2RpZmllZCB0aGUgUEtDUzdfc2V0X3R5cGUoKSB0byBoYW5kbGUKICAgICB0aGUgZW5jcnlwdGVkIGRhdGEgdHlwZTogdGhpcyBpcyBhIG1vcmUgc2Vuc2libGUgcGxhY2UgdG8gcHV0IGl0IGFuZCBpdAogICAgIGFsbG93cyB0aGUgUEtDUyMxMiBjb2RlIHRvIGJlIHRpZGllZCB1cCB0aGF0IGR1cGxpY2F0ZWQgdGhpcwogICAgIGZ1bmN0aW9uYWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlZCBvYmpfZGF0LnBsIHNjcmlwdCBzbyBpdCB0YWtlcyBpdHMgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBvbgogICAgIHRoZSBjb21tYW5kIGxpbmUuIFRoaXMgc2hvdWxkIGF2b2lkIHNoZWxsIGVzY2FwZSByZWRpcmVjdGlvbiBwcm9ibGVtcwogICAgIHVuZGVyIFdpbjMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgY2VydGlmaWNhdGUgZXh0ZW5zaW9uIHJlcXVlc3RzLCB0aGVzZSBhcmUgaW5jbHVkZWQKICAgICBpbiB0aGluZ3MgbGlrZSBYZW5yb2xsIGNlcnRpZmljYXRlIHJlcXVlc3RzLiBJbmNsdWRlZCBmdW5jdGlvbnMgdG8gYWxsb3cKICAgICBleHRlbnNpb25zIHRvIGJlIG9idGFpbmVkIGFuZCBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSAtY3JsZiBvcHRpb24gdG8gc19jbGllbnQgYW5kIHNfc2VydmVyIGZvciBzZW5kaW5nIG5ld2xpbmVzIGFzCiAgICAgQ1JMRiAoYXMgcmVxdWlyZWQgYnkgbWFueSBwcm90b2NvbHMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4zYSBhbmQgMC45LjQgIFswOSBBdWcgMTk5OV0KICAKICAqKSBJbnN0YWxsIGxpYlJTQWdsdWUuYSB3aGVuIE9wZW5TU0wgaXMgYnVpbHQgd2l0aCBSU0FyZWYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEEgZmV3IG1vcmUgYGAjaWZuZGVmIE5PX0ZQX0FQSSAvICNlbmRpZicnIHBhaXJzIGZvciBjb25zaXN0ZW5jeS4KICAgICBbQW5kcmlqYSBBbnRvbmlqZXZpYyA8VGhlQW50b255MkBiaWdmb290LmNvbT5dCgogICopIEZpeCAtc3RhcnRkYXRlIGFuZCAtZW5kZGF0ZSAod2hpY2ggd2FzIG1pc3NpbmcpIGFyZ3VtZW50cyB0byAnY2EnCiAgICAgcHJvZ3JhbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gRFNBX2R1cF9ESCwgd2hpY2ggZHVwbGljYXRlcyBEU0EgcGFyYW1ldGVycy9rZXlzIGFzCiAgICAgREggcGFyYW1ldGVycy9rZXlzIChxIGlzIGxvc3QgZHVyaW5nIHRoYXQgY29udmVyc2lvbiwgYnV0IHRoZSByZXN1bHRpbmcKICAgICBESCBwYXJhbWV0ZXJzIGNvbnRhaW4gaXRzIGxlbmd0aCkuCgogICAgIEZvciAxMDI0LWJpdCBwLCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBmb2xsb3dlZCBieSBEU0FfZHVwX0RIIGlzCiAgICAgbXVjaCBmYXN0ZXIgdGhhbiBESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzICh3aGljaCBjcmVhdGVzIHBhcmFtZXRlcnMKICAgICB3aGVyZSBwID0gMipxICsgMSksIGFuZCBhbHNvIHRoZSBzbWFsbGVyIHEgbWFrZXMgREggY29tcHV0YXRpb25zCiAgICAgbXVjaCBtb3JlIGVmZmljaWVudCAoMTYwLWJpdCBleHBvbmVudGlhdGlvbiBpbnN0ZWFkIG9mIDEwMjQtYml0CiAgICAgZXhwb25lbnRpYXRpb24pOyBzbyB0aGlzIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gc3VwcG9ydCBESEUKICAgICBjaXBoZXJzdWl0ZXMgaW4gU1NML1RMUyBzZXJ2ZXJzIChzZWUgc3NsL3NzbHRlc3QuYykuICBJdCBpcyBvZgogICAgIHV0dGVyIGltcG9ydGFuY2UgdG8gdXNlCiAgICAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoc19jdHgsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKICAgICBvcgogICAgICAgICBTU0xfc2V0X29wdGlvbnMoc19jdHgsIFNTTF9PUF9TSU5HTEVfREhfVVNFKTsKICAgICB3aGVuIHN1Y2ggREggcGFyYW1ldGVycyBhcmUgdXNlZCwgYmVjYXVzZSBvdGhlcndpc2Ugc21hbGwgc3ViZ3JvdXAKICAgICBhdHRhY2tzIG1heSBiZWNvbWUgcG9zc2libGUhCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgbWVtb3J5IGxlYWsgaW4gaTJkX0RIcGFyYW1zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFsbG93IHRoZSAtayBvcHRpb24gdG8gYmUgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgZW5jIHByb2dyYW06CiAgICAgdGhpcyBhbGxvd3MgdGhlIHNhbWUgZW5jcnlwdGVkIG1lc3NhZ2UgdG8gYmUgcmVhZCBieSBtdWx0aXBsZSByZWNpcGllbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBPQkpfb2JqMnR4dChidWYsIGJ1Zl9sZW4sIGEsIG5vX25hbWUpLCB0aGlzIGNvbnZlcnRzCiAgICAgYW4gQVNOMV9PQkpFQ1QgdG8gYSB0ZXh0IHN0cmluZy4gSWYgdGhlICJub19uYW1lIiBwYXJhbWV0ZXIgaXMgc2V0IHRoZW4KICAgICBpdCB3aWxsIGFsd2F5cyB1c2UgdGhlIG51bWVyaWNhbCBmb3JtIG9mIHRoZSBPSUQsIGV2ZW4gaWYgaXQgaGFzIGEgc2hvcnQKICAgICBvciBsb25nIG5hbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgYW4gZXh0cmEgUlNBIGZsYWc6IFJTQV9GTEFHX0VYVF9QS0VZLiBQcmV2aW91c2x5IHRoZSByc2FfbW9kX2V4cAogICAgIG1ldGhvZCBvbmx5IGdvdCBjYWxsZWQgaWYgcCxxLGRtcDEsZG1xMSxpcW1wIGNvbXBvbmVudHMgd2VyZSBwcmVzZW50LAogICAgIG90aGVyd2lzZSBibl9tb2RfZXhwIHdhcyBjYWxsZWQuIEluIHRoZSBjYXNlIG9mIGhhcmR3YXJlIGtleXMgZm9yIGV4YW1wbGUKICAgICBubyBwcml2YXRlIGtleSBjb21wb25lbnRzIG5lZWQgYmUgcHJlc2VudCBhbmQgaXQgbWlnaHQgc3RvcmUgZXh0cmEgZGF0YQogICAgIGluIHRoZSBSU0Egc3RydWN0dXJlLCB3aGljaCBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSBibl9tb2RfZXhwLgogICAgIEJ5IHNldHRpbmcgUlNBX0ZMQUdfRVhUX1BLRVkgcnNhX21vZF9leHAgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGZvcgogICAgIHByaXZhdGUga2V5IG9wZXJhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgU1BBUkMgTGludXguCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIHBlbV9wYXNzd29yZF9jYiBmdW5jdGlvbiB0eXBlIGluY29tcGF0aWJseSBjaGFuZ2VkIGZyb20KICAgICAgICAgIHR5cGVkZWYgaW50IHBlbV9wYXNzd29yZF9jYihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnKTsKICAgICB0bwogICAgICAgICAgLi4uLihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSk7CiAgICAgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHBhc3MgZGF0YSB0byB0aGVpciBjYWxsYmFja3M6CiAgICAgVGhlIFBFTVtfQVNOMV1fe3JlYWQsd3JpdGV9Li4uIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIG5vdyB0YWtlIGFuCiAgICAgYWRkaXRpb25hbCB2b2lkICogYXJndW1lbnQsIHdoaWNoIGlzIGp1c3QgaGFuZGVkIHRocm91Z2ggd2hlbmV2ZXIKICAgICB0aGUgcGFzc3dvcmQgY2FsbGJhY2sgaXMgY2FsbGVkLgogICAgIFtEYW1pZW4gTWlsbGVyIDxkbWlsbGVyQGlsb2dpYy5jb20uYXU+OyB0aW55IGNoYW5nZXMgYnkgQm9kbyBNb2VsbGVyXQoKICAgICBOZXcgZnVuY3Rpb24gU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEuCgogICAgIENvbXBhdGliaWxpdHkgbm90ZTogQXMgbWFueSBDIGltcGxlbWVudGF0aW9ucyBwdXNoIGZ1bmN0aW9uIGFyZ3VtZW50cwogICAgIG9udG8gdGhlIHN0YWNrIGluIHJldmVyc2Ugb3JkZXIsIHRoZSBuZXcgbGlicmFyeSB2ZXJzaW9uIGlzIGxpa2VseSB0bwogICAgIGludGVyb3BlcmF0ZSB3aXRoIHByb2dyYW1zIHRoYXQgaGF2ZSBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIG9sZAogICAgIHBlbV9wYXNzd29yZF9jYiBkZWZpbml0aW9uIChQRU1fd2hhdGV2ZXIgdGFrZXMgc29tZSBkYXRhIHRoYXQKICAgICBoYXBwZW5zIHRvIGJlIG9uIHRoZSBzdGFjayBhcyBpdHMgbGFzdCBhcmd1bWVudCwgYW5kIHRoZSBjYWxsYmFjawogICAgIGp1c3QgaWdub3JlcyB0aGlzIGdhcmJhZ2UpOyBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHdoYXRzb2V2ZXIgdGhhdAogICAgIHRoaXMgd2lsbCB3b3JrLgoKICAqKSBUaGUgLURQTEFURk9STT0iXCIkKFBMQVRGT1JNKVwiIiBkZWZpbml0aW9uIGFuZCB0aGUgc2ltaWxhciAtRENGTEFHUz0uLi4KICAgICAoYm90aCBpbiBjcnlwdG8vTWFrZWZpbGUuc3NsIGZvciB1c2UgYnkgY3J5cHRvL2N2ZXJzaW9uLmMpIGNhdXNlZAogICAgIHByb2JsZW1zIG5vdCBvbmx5IG9uIFdpbmRvd3MsIGJ1dCBhbHNvIG9uIHNvbWUgVW5peCBwbGF0Zm9ybXMuCiAgICAgVG8gYXZvaWQgcHJvYmxlbWF0aWMgY29tbWFuZCBsaW5lcywgdGhlc2UgZGVmaW5pdGlvbnMgYXJlIG5vdyBpbiBhbgogICAgIGF1dG8tZ2VuZXJhdGVkIGZpbGUgY3J5cHRvL2J1aWxkaW5mLmggKGNyZWF0ZWQgYnkgY3J5cHRvL01ha2VmaWxlLnNzbAogICAgIGZvciBzdGFuZGFyZCAibWFrZSIgYnVpbGRzLCBieSB1dGlsL21rMW1mLnBsIGZvciAibWsxbWYiIGJ1aWxkcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTUlQUyBJSUkvSVYgYXNzZW1ibGVyIG1vZHVsZSBpcyByZWltcGxlbWVudGVkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBNb3JlIERFUyBsaWJyYXJ5IGNsZWFudXBzOiByZW1vdmUgcmVmZXJlbmNlcyB0byBzcmFuZC9yYW5kIGFuZAogICAgIGRlbGV0ZSBhbiB1bnVzZWQgZmlsZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHRoZSB0aGUgZnJlZSBOZXR3aWRlIGFzc2VtYmxlciAoTkFTTSkgdW5kZXIgV2luMzIsCiAgICAgc2luY2Ugbm90IG1hbnkgcGVvcGxlIGhhdmUgTUFTTSAobWwpIGFuZCBpdCBjYW4gYmUgaGFyZCB0byBvYnRhaW4uCiAgICAgVGhpcyBpcyBjdXJyZW50bHkgZXhwZXJpbWVudGFsIGJ1dCBpdCBzZWVtcyB0byB3b3JrIE9LIGFuZCBwYXNzIGFsbAogICAgIHRoZSB0ZXN0cy4gQ2hlY2sgb3V0IElOU1RBTEwuVzMyIGZvciBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gczNfY2xudC5jOiBBbGwgbm9uLWFub255bW91cyBTU0wzL1RMUzEgY29ubmVjdGlvbnMKICAgICB3aXRob3V0IHRlbXBvcmFyeSBrZXlzIGtlcHQgYW4gZXh0cmEgY29weSBvZiB0aGUgc2VydmVyIGtleSwKICAgICBhbmQgY29ubmVjdGlvbnMgd2l0aCB0ZW1wb3Jhcnkga2V5cyBkaWQgbm90IGZyZWUgZXZlcnl0aGluZyBpbiBjYXNlCiAgICAgb2YgYW4gZXJyb3IuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFJTQV9jaGVja19rZXkgYW5kIG5ldyBvcGVuc3NsIHJzYSBvcHRpb24gLWNoZWNrCiAgICAgZm9yIHZlcmlmeWluZyB0aGUgY29uc2lzdGVuY3kgb2YgUlNBIGtleXMuCiAgICAgW1VsZiBNb2VsbGVyLCBCb2RvIE1vZWxsZXJdCgogICopIFZhcmlvdXMgY2hhbmdlcyB0byBtYWtlIFdpbjMyIGNvbXBpbGUgd29yazogCiAgICAgMS4gQ2FzdHMgdG8gYXZvaWQgImxvc3Mgb2YgZGF0YSIgd2FybmluZ3MgaW4gcDVfY3JwdDIuYwogICAgIDIuIENoYW5nZSB1bnNpZ25lZCBpbnQgdG8gaW50IGluIGJfZHVtcC5jIHRvIGF2b2lkICJzaWduZWQvdW5zaWduZWQKICAgICAgICBjb21wYXJpc29uIiB3YXJuaW5ncy4KICAgICAzLiBBZGQgc2tfPFRZUEU+X3NvcnQgdG8gREVGIGZpbGUgZ2VuZXJhdG9yIGFuZCBkbyBtYWtlIHVwZGF0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBkZWJ1Z2dpbmcgb3B0aW9uIHRvIFBLQ1MjNSB2MiBrZXkgZ2VuZXJhdGlvbiBmdW5jdGlvbjogd2hlbgogICAgIHlvdSAjZGVmaW5lIERFQlVHX1BLQ1M1VjIgcGFzc3dvcmRzLCBzYWx0cywgaXRlcmF0aW9uIGNvdW50cyBhbmQKICAgICBkZXJpdmVkIGtleXMgYXJlIHByaW50ZWQgdG8gc3RkZXJyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcHkgdGhlIGZsYWdzIGluIEFTTjFfU1RSSU5HX2R1cCgpLgogICAgIFtSb21hbiBFLiBQYXZsb3YgPHByZUBtby5tc2sucnU+XQoKICAqKSBUaGUgeDUwOSBhcHBsaWNhdGlvbiBtaXNoYW5kbGVkIHNpZ25pbmcgcmVxdWVzdHMgY29udGFpbmluZyBEU0EKICAgICBrZXlzIHdoZW4gdGhlIHNpZ25pbmcga2V5IHdhcyBhbHNvIERTQSBhbmQgdGhlIHBhcmFtZXRlcnMgZGlkbid0IG1hdGNoLgoKICAgICBJdCB3YXMgc3VwcG9zZWQgdG8gb21pdCB0aGUgcGFyYW1ldGVycyB3aGVuIHRoZXkgbWF0Y2hlZCB0aGUgc2lnbmluZyBrZXk6CiAgICAgdGhlIHZlcmlmeWluZyBzb2Z0d2FyZSB3YXMgdGhlbiBzdXBwb3NlZCB0byBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgQ0EncwogICAgIHBhcmFtZXRlcnMgaWYgdGhleSB3ZXJlIGFic2VudCBmcm9tIHRoZSBlbmQgdXNlciBjZXJ0aWZpY2F0ZS4KCiAgICAgT21pdHRpbmcgcGFyYW1ldGVycyBpcyBubyBsb25nZXIgcmVjb21tZW5kZWQuIFRoZSB0ZXN0IHdhcyBhbHNvCiAgICAgdGhlIHdyb25nIHdheSByb3VuZCEgVGhpcyB3YXMgcHJvYmFibHkgZHVlIHRvIHVudXN1YWwgYmVoYXZpb3VyIGluCiAgICAgRVZQX2NtcF9wYXJhbWV0ZXJzKCkgd2hpY2ggcmV0dXJucyAxIGlmIHRoZSBwYXJhbWV0ZXJzIG1hdGNoLiAKICAgICBUaGlzIG1lYW50IHRoYXQgcGFyYW1ldGVycyB3ZXJlIG9taXR0ZWQgd2hlbiB0aGV5ICpkaWRuJ3QqIG1hdGNoIGFuZAogICAgIHRoZSBjZXJ0aWZpY2F0ZSB3YXMgdXNlbGVzcy4gQ2VydGlmaWNhdGVzIHNpZ25lZCB3aXRoICdjYScgZGlkbid0IGhhdmUKICAgICB0aGlzIGJ1Zy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBEb3VnIEVyaWNrc29uIDxEb3VnLkVyaWNrc29uQFBhcnQuTkVUPl0KCiAgKikgTWVtb3J5IGxlYWsgY2hlY2tpbmcgKC1EQ1JZUFRPX01ERUJVRykgaGFkIHNvbWUgcHJvYmxlbXMuCiAgICAgVGhlIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgogICAgIEFwcGxpY2F0aW9ucyBjYW4gdXNlCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKSBha2EgTWVtQ2hlY2tfc3RhcnQoKSwKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT0ZGKSBha2EgTWVtQ2hlY2tfc3RvcCgpOwogICAgICJvZmYiIGlzIG5vdyB0aGUgZGVmYXVsdC4KICAgICBUaGUgbGlicmFyeSBpbnRlcm5hbGx5IHVzZXMKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRElTQUJMRSkgYWthIE1lbUNoZWNrX29mZigpLAogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19FTkFCTEUpIGFrYSBNZW1DaGVja19vbigpCiAgICAgdG8gZGlzYWJsZSBtZW1vcnktY2hlY2tpbmcgdGVtcG9yYXJpbHkuCgogICAgIFNvbWUgaW5jb25zaXN0ZW50IHN0YXRlcyB0aGF0IHByZXZpb3VzbHkgd2VyZSBwb3NzaWJsZSAoYW5kIHdlcmUKICAgICBldmVuIHRoZSBkZWZhdWx0KSBhcmUgbm93IGF2b2lkZWQuCgogICAgIC1EQ1JZUFRPX01ERUJVR19USU1FIGlzIG5ldyBhbmQgYWRkaXRpb25hbGx5IHN0b3JlcyB0aGUgY3VycmVudCB0aW1lCiAgICAgd2l0aCBlYWNoIG1lbW9yeSBjaHVuayBhbGxvY2F0ZWQ7IHRoaXMgaXMgb2NjYXNpb25hbGx5IG1vcmUgaGVscGZ1bAogICAgIHRoYW4ganVzdCBoYXZpbmcgYSBjb3VudGVyLgoKICAgICAtRENSWVBUT19NREVCVUdfVEhSRUFEIGlzIGFsc28gbmV3IGFuZCBhZGRzIHRoZSB0aHJlYWQgSUQuCgogICAgIC1EQ1JZUFRPX01ERUJVR19BTEwgZW5hYmxlcyBhbGwgb2YgdGhlIGFib3ZlLCBwbHVzIGFueSBmdXR1cmUKICAgICBleHRlbnNpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEludHJvZHVjZSAibW9kZSIgZm9yIFNTTCBzdHJ1Y3R1cmVzICh3aXRoIGRlZmF1bHRzIGluIFNTTF9DVFgpLAogICAgIHdoaWNoIGxhcmdlbHkgcGFyYWxsZWxzICJvcHRpb25zIiwgYnV0IGlzIGZvciBjaGFuZ2luZyBBUEkgYmVoYXZpb3VyLAogICAgIHdoZXJlYXMgIm9wdGlvbnMiIGFyZSBhYm91dCBwcm90b2NvbCBiZWhhdmlvdXIuCiAgICAgSW5pdGlhbCAibW9kZSIgZmxhZ3MgYXJlOgoKICAgICBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSAgIEFsbG93IFNTTF93cml0ZSB0byByZXBvcnQgc3VjY2VzcyB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSByZWNvcmQgaGFzIGJlZW4gd3JpdHRlbi4KICAgICBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUiAgRG9uJ3QgaW5zaXN0IHRoYXQgU1NMX3dyaXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzIHVzZSB0aGUgc2FtZSBidWZmZXIgbG9jYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQnV0IGFsbCBvZiB0aGUgY29udGVudHMgbXVzdCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29waWVkISkKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IFNTTF9zZXRfb3B0aW9ucyBpZ25vcmVkIGl0cyBwYXJhbWV0ZXIsIG9ubHkgU1NMX0NUWF9zZXRfb3B0aW9ucwogICAgIHdvcmtlZC4KCiAgKikgRml4IHByb2JsZW1zIHdpdGggbm8taG1hYyBldGMuCiAgICAgW1VsZiBN9mxsZXIsIHBvaW50ZWQgb3V0IGJ5IEJyaWFuIFdlbGxpbmd0b24gPGJ3ZWxsaW5nQHRpc2xhYnMuY29tPl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCksIFJTQV9zZXRfbWV0aG9kKCkgYW5kCiAgICAgUlNBX2dldF9tZXRob2QoKS4gVGhlc2UgYWxsb3dzIHJlcGxhY2VtZW50IG9mIFJTQV9NRVRIT0RzIHdpdGhvdXQgaGF2aW5nCiAgICAgdG8gbWVzcyBhcm91bmQgd2l0aCB0aGUgaW50ZXJuYWxzIG9mIGFuIFJTQSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBEU0FfZG9fc2lnbiBhbmQgRFNBX2lzX3ByaW1lLgogICAgIEFsc28gcmVhbGx5IGVuYWJsZSBtZW1vcnkgbGVhayBjaGVja3MgaW4gb3BlbnNzbC5jIGFuZCBpbiBzb21lCiAgICAgdGVzdCBwcm9ncmFtcy4KICAgICBbQ2hhZCBDLiBNdWxsaWdhbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggYSBidWcgaW4gZDJpX0FTTjFfSU5URUdFUigpIGFuZCBpMmRfQVNOMV9JTlRFR0VSKCkgd2hpY2ggY2FuIG1lc3MKICAgICB1cCB0aGUgbGVuZ3RoIG9mIG5lZ2F0aXZlIGludGVnZXJzLiBUaGlzIGhhcyBub3cgYmVlbiBzaW1wbGlmaWVkIHRvIGp1c3QKICAgICBzdG9yZSB0aGUgbGVuZ3RoIHdoZW4gaXQgaXMgZmlyc3QgZGV0ZXJtaW5lZCBhbmQgdXNlIGl0IGxhdGVyLCByYXRoZXIKICAgICB0aGFuIHRyeWluZyB0byBrZWVwIHRyYWNrIG9mIHdoZXJlIGRhdGEgaXMgY29waWVkIGFuZCB1cGRhdGluZyBpdCB0bwogICAgIHBvaW50IHRvIHRoZSBlbmQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgQnJpZW4gV2hlZWxlcgogICAgICA8YndoZWVsZXJAYXV0aGVudGljYS1zZWN1cml0eS5jb20+XQoKICAqKSBBZGQgYSBuZXcgZnVuY3Rpb24gUEtDUzdfc2lnbmF0dXJlVmVyaWZ5LiBUaGlzIGFsbG93cyB0aGUgdmVyaWZpY2F0aW9uCiAgICAgb2YgYSBQS0NTIzcgc2lnbmF0dXJlIGJ1dCB3aXRoIHRoZSBzaWduaW5nIGNlcnRpZmljYXRlIHBhc3NlZCB0byB0aGUKICAgICBmdW5jdGlvbiBpdHNlbGYuIFRoaXMgY29udHJhc3RzIHdpdGggUEtDUzdfZGF0YVZlcmlmeSB3aGljaCBhc3N1bWVzIHRoZQogICAgIGNlcnRpZmljYXRlIGlzIHByZXNlbnQgaW4gdGhlIFBLQ1MjNyBzdHJ1Y3R1cmUuIFRoaXMgaXNuJ3QgYWx3YXlzIHRoZQogICAgIGNhc2U6IGNlcnRpZmljYXRlcyBjYW4gYmUgb21pdHRlZCBmcm9tIGEgUEtDUyM3IHN0cnVjdHVyZSBhbmQgYmUKICAgICBkaXN0cmlidXRlZCBieSAib3V0IG9mIGJhbmQiIG1lYW5zIChzdWNoIGFzIGEgY2VydGlmaWNhdGUgZGF0YWJhc2UpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbXBsZXRlIHRoZSBQRU1fKiBtYWNyb3Mgd2l0aCBERUNMQVJFX1BFTSB2ZXJzaW9ucyB0byByZXBsYWNlIHRoZQogICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgaW4gcGVtLmgsIGFsc28gY2hhbmdlIHV0aWwvbWtkZWYucGwgdG8gYWRkIHRoZQogICAgIG5lY2Vzc2FyeSBmdW5jdGlvbiBuYW1lcy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgbWsxbWYucGwgKHVzZWQgYnkgV2luZG93cyBidWlsZHMpIGRpZCBub3QgcHJvcGVybHkgcmVhZCB0aGUKICAgICBvcHRpb25zIHNldCBieSBDb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBNYWtlZmlsZSwgYW5kIENvbmZpZ3VyZQogICAgIHdhcyBub3QgZXZlbiBhYmxlIHRvIHdyaXRlIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGNvcnJlY3RseS4KICAgICBGaXhlZCwgbm93ICJuby1pZGVhIG5vLXJjNSAtRENSWVBUT19NREVCVUciIGV0Yy4gd29ya3MgYXMgaW50ZW5kZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBDT05GX2xvYWRfYmlvKCkgYW5kIENPTkZfbG9hZF9mcCgpIHRvIGFsbG93IGEgY29uZmlnCiAgICAgZmlsZSB0byBiZSBsb2FkZWQgZnJvbSBhIEJJTyBvciBGSUxFIHBvaW50ZXIuIFRoZSBCSU8gdmVyc2lvbiB3aWxsCiAgICAgZm9yIGV4YW1wbGUgYWxsb3cgbWVtb3J5IEJJT3MgdG8gY29udGFpbiBjb25maWcgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gIkNSWVBUT19udW1fbG9ja3MiIHRoYXQgcmV0dXJucyBDUllQVE9fTlVNX0xPQ0tTLgogICAgIFdob2V2ZXIgaG9wZXMgdG8gYWNoaWV2ZSBzaGFyZWQtbGlicmFyeSBjb21wYXRpYmlsaXR5IGFjcm9zcyB2ZXJzaW9ucwogICAgIG11c3QgdXNlIHRoaXMsIG5vdCB0aGUgY29tcGlsZS10aW1lIG1hY3JvLgogICAgIChFeGVyY2lzZSAwLjkuNDogV2hpY2ggaXMgdGhlIG1pbmltdW0gbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVkIGJ5CiAgICAgc3VjaCBwcm9ncmFtcz8pCiAgICAgTm90ZTogQWxsIHRoaXMgYXBwbGllcyBvbmx5IHRvIG11bHRpLXRocmVhZGVkIHByb2dyYW1zLCBvdGhlcnMgZG9uJ3QKICAgICBuZWVkIGxvY2tzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBtaXNzaW5nIGNhc2UgdG8gczNfY2xudC5jIHN0YXRlIG1hY2hpbmUgLS0gb25lIG9mIHRoZSBuZXcgU1NMIHRlc3RzCiAgICAgdGhyb3VnaCBhIEJJTyBwYWlyIHRyaWdnZXJlZCB0aGUgZGVmYXVsdCBjYXNlLCBpLmUuCiAgICAgU1NMZXJyKC4uLixTU0xfUl9VTktOT1dOX1NUQVRFKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgIkJJTyBwYWlyIiBjb25jZXB0IChjcnlwdG8vYmlvL2Jzc19iaW8uYykgc28gdGhhdCBhcHBsaWNhdGlvbnMKICAgICBjYW4gdXNlIHRoZSBTU0wgbGlicmFyeSBldmVuIGlmIG5vbmUgb2YgdGhlIHNwZWNpZmljIEJJT3MgaXMKICAgICBhcHByb3ByaWF0ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggYSBidWcgaW4gaTJkX0RTQVB1YmxpY0tleSgpIHdoaWNoIG1lYW50IGl0IHJldHVybmVkIHRoZSB3cm9uZyB2YWx1ZQogICAgIGZvciB0aGUgZW5jb2RlZCBsZW5ndGguCiAgICAgW0plb24gS3lvdW5nSG8gPGtoamVvbkBzZHMuc2Ftc3VuZy5jby5rcj5dCgogICopIEFkZCBpbml0aWFsIGRvY3VtZW50YXRpb24gb2YgdGhlIFg1MDlWMyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IHBhaXIgb2YgZnVuY3Rpb25zIFBFTV93cml0ZV9QS0NTOFByaXZhdGVLZXkoKSBhbmQgCiAgICAgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXkoKSB0aGF0IGFyZSBlcXVpdmFsZW50IHRvCiAgICAgUEVNX3dyaXRlX1ByaXZhdGVLZXkoKSBhbmQgUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KCkgYnV0IHVzZSB0aGUgbW9yZQogICAgIHNlY3VyZSBQS0NTIzggcHJpdmF0ZSBrZXkgZm9ybWF0IHdpdGggYSBoaWdoIGl0ZXJhdGlvbiBjb3VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZGV0ZXJtaW5hdGlvbiBvZiBQZXJsIGludGVycHJldGVyOiBBIHBlcmwgb3IgcGVybDUKICAgICBfZGlyZWN0b3J5XyBpbiAkUEFUSCB3YXMgYWxzbyBhY2NlcHRlZCBhcyB0aGUgaW50ZXJwcmV0ZXIuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBkZW1vcy9zaWduL3NpZ24uYzogd2VsbCB0aGVyZSB3YXNuJ3QgYW55dGhpbmcgc3RyaWN0bHkgc3BlYWtpbmcKICAgICB3cm9uZyB3aXRoIGl0IGJ1dCBpdCB3YXMgdmVyeSBvbGQgYW5kIGRpZCB0aGluZ3MgbGlrZSBjYWxsaW5nCiAgICAgUEVNX0FTTjFfcmVhZCgpIGRpcmVjdGx5IGFuZCB1c2VkIE1ENSBmb3IgdGhlIGhhc2ggbm90IHRvIG1lbnRpb24gc29tZQogICAgIHVudXN1YWwgZm9ybWF0dGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZGVtb3Mvc2VsZnNpZ24uYzogaXQgdXNlZCBvYnNvbGV0ZSBhbmQgZGVsZXRlZCBmdW5jdGlvbnMsIGNoYW5nZWQKICAgICB0byB1c2UgdGhlIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXBsZW1lbnQgdGhlIFBFTV9yZWFkL1BFTV93cml0ZSBmdW5jdGlvbnMgaW4gY3J5cHRvL3BlbS9wZW1fYWxsLmMKICAgICB3aXRoIG1hY3Jvcy4gVGhpcyBzaG91bGQgbWFrZSBpdCBlYXNpZXIgdG8gY2hhbmdlIHRoZWlyIGZvcm0sIGFkZCBleHRyYQogICAgIGFyZ3VtZW50cyBldGMuIEZpeCBhIGZldyBQRU0gcHJvdG90eXBlcyB3aGljaCBkaWRuJ3QgaGF2ZSBjaXBoZXIgYXMgYQogICAgIGNvbnN0YW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0byBjb25maWd1cmF0aW9uIHRhYmxlIGEgbmV3IGVudHJ5IHRoYXQgY2FuIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUKICAgICBuYW1lIGZvciB1bmlzdGQuaCAoZm9yIHByZS1QT1NJWCBzeXN0ZW1zKTsgd2UgbmVlZCB0aGlzIGZvciBOZVhUc3RlcCwKICAgICBhY2NvcmRpbmcgdG8gTWFyayBDcmlzcGluIDxNUkNAUGFuZGEuQ09NPi4KICAgICBbQm9kbyBNb2VsbGVyXQoKI2lmIDAKICAqKSBERVMgQ0JDIGRpZCBub3QgdXBkYXRlIHRoZSBJVi4gV2VpcmQuCiAgICAgW0JlbiBMYXVyaWVdCiNlbHNlCiAgICAgZGVzX2NiY19lbmNyeXB0IGRvZXMgbm90IHVwZGF0ZSB0aGUgSVYsIGJ1dCBkZXNfbmNiY19lbmNyeXB0IGRvZXMuCiAgICAgQ2hhbmdpbmcgdGhlIGJlaGF2aW91ciBvZiB0aGUgZm9ybWVyIG1pZ2h0IGJyZWFrIGV4aXN0aW5nIHByb2dyYW1zIC0tCiAgICAgd2hlcmUgSVYgdXBkYXRpbmcgaXMgbmVlZGVkLCBkZXNfbmNiY19lbmNyeXB0IGNhbiBiZSB1c2VkLgojZW5kaWYKCiAgKikgV2hlbiBibnRlc3QgaXMgcnVuIGZyb20gIm1ha2UgdGVzdCIgaXQgZHJpdmVzIGJjIHRvIGNoZWNrIGl0cwogICAgIGNhbGN1bGF0aW9ucywgYXMgd2VsbCBhcyBpbnRlcm5hbGx5IGNoZWNraW5nIHRoZW0uIElmIGFuIGludGVybmFsIGNoZWNrCiAgICAgZmFpbHMsIGl0IG5lZWRzIHRvIGNhdXNlIGJjIHRvIGdpdmUgYSBub24temVybyByZXN1bHQgb3IgbWFrZSB0ZXN0IGNhcnJpZXMKICAgICBvbiB3aXRob3V0IG5vdGljaW5nIHRoZSBmYWlsdXJlLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgREVTIGxpYnJhcnkgY2xlYW51cHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBQQkUgYWxnb3JpdGhtcy4gVGhpcyB3aWxsIHBlcm1pdCBQS0NTIzggdG8gYmUKICAgICB1c2VkIHdpdGggYW55IGNpcGhlciB1bmxpa2UgUEtDUyM1IHYxLjUgd2hpY2ggY2FuIGF0IG1vc3QgaGFuZGxlIDY0IGJpdAogICAgIGNpcGhlcnMuIE5PVEU6IGFsdGhvdWdoIHRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiBoYXMgYmVlbiB2ZXJpZmllZAogICAgIGFnYWluc3Qgc29tZSBwdWJsaXNoZWQgdGVzdCB2ZWN0b3JzIGl0IGhhcyBub3QgYmVlbiBleHRlbnNpdmVseSB0ZXN0ZWQKICAgICB5ZXQuIEFkZGVkIGEgLXYyICJjaXBoZXIiIG9wdGlvbiB0byBwa2NzOCBhcHBsaWNhdGlvbiB0byBhbGxvdyB0aGUgdXNlCiAgICAgb2YgdjIuMC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnN0ZWFkIG9mICJta2RpciAtcCIsIHdoaWNoIGlzIG5vdCBmdWxseSBwb3J0YWJsZSwgdXNlIG5ldwogICAgIFBlcmwgc2NyaXB0ICJ1dGlsL21rZGlyLXAucGwiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgdGhlIHdheSBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIChQQkUpIGlzIGhhbmRsZWQuIEl0IHVzZWQgdG8KICAgICBhc3N1bWUgdGhhdCB0aGUgQVNOMSBBbGdvcml0aG1JZGVudGlmaWVyIHBhcmFtZXRlciB3YXMgYSBQQkVQYXJhbWV0ZXIKICAgICBzdHJ1Y3R1cmUuIFRoaXMgd2FzIHRydWUgZm9yIHRoZSBQS0NTIzUgdjEuNSBhbmQgUEtDUyMxMiBQQkUgYWxnb3JpdGhtcwogICAgIGJ1dCBkb2Vzbid0IGFwcGx5IHRvIFBLQ1MjNSB2Mi4wIHdoZXJlIGl0IGNhbiBiZSBzb21ldGhpbmcgZWxzZS4gTm93CiAgICAgdGhlICdwYXJhbWV0ZXInIGZpZWxkIG9mIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIGlzIHBhc3NlZCB0byB0aGUKICAgICB1bmRlcmx5aW5nIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9uIHNvIGl0IG11c3QgZG8gaXRzIG93biBBU04xIHBhcnNpbmcuCiAgICAgVGhpcyBoYXMgYWxzbyBjaGFuZ2VkIHRoZSBFVlBfUEJFX0NpcGhlckluaXQoKSBmdW5jdGlvbiB3aGljaCBub3cgaGFzIGEKICAgICAncGFyYW1ldGVyJyBhcmd1bWVudCBpbnN0ZWFkIG9mIGxpdGVyYWwgc2FsdCBhbmQgaXRlcmF0aW9uIGNvdW50IHZhbHVlcwogICAgIGFuZCB0aGUgZnVuY3Rpb24gRVZQX1BCRV9BTEdPUl9DaXBoZXJJbml0KCkgaGFzIGJlZW4gZGVsZXRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBQS0NTIzUgdjEuNSBjb21wYXRpYmxlIHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gYWxnb3JpdGhtcwogICAgIGFuZCBQS0NTIzggZnVuY3Rpb25hbGl0eS4gTmV3ICdwa2NzOCcgYXBwbGljYXRpb24gbGlua2VkIHRvIG9wZW5zc2wuCiAgICAgTmVlZGVkIHRvIGNoYW5nZSB0aGUgUEVNX1NUUklOR19FVlBfUEtFWSB2YWx1ZSB3aGljaCB3YXMganVzdCAiUFJJVkFURQogICAgIEtFWSIgYmVjYXVzZSB0aGlzIGNsYXNoZWQgd2l0aCBQS0NTIzggdW5lbmNyeXB0ZWQgc3RyaW5nLiBTaW5jZSB0aGlzCiAgICAgdmFsdWUgd2FzIGp1c3QgdXNlZCBhcyBhICJtYWdpYyBzdHJpbmciIGFuZCBub3QgdXNlZCBkaXJlY3RseSBpdHMKICAgICB2YWx1ZSBkb2Vzbid0IG1hdHRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnRyb2R1Y2Ugc29tZSBzZW1ibGFuY2Ugb2YgY29uc3QgY29ycmVjdG5lc3MgdG8gQk4uIFNoYW1lIEMgZG9lc24ndAogICAgIHN1cHBvcnQgbXV0YWJsZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgImxpbnV4LXNwYXJjNjQiIGNvbmZpZ3VyYXRpb24gKHVsdHJhcGVuZ3VpbikuCiAgICAgW1JheSBNaWxsZXIgPHJheS5taWxsZXJAb3Vjcy5veC5hYy51az5dCiAgICAgImxpbnV4LXNwYXJjIiBjb25maWd1cmF0aW9uLgogICAgIFtDaHJpc3RpYW4gRm9yc3RlciA8Zm9AaGF3by5zdHcudW5pLWVybGFuZ2VuLmRlPl0KCiAgKikgY29uZmlnIG5vdyBnZW5lcmF0ZXMgbm8teHh4IG9wdGlvbnMgZm9yIG1pc3NpbmcgY2lwaGVycy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU3VwcG9ydCB0aGUgRUJDRElDIGNoYXJhY3RlciBzZXQgKHdvcmsgaW4gcHJvZ3Jlc3MpLgogICAgIEZpbGUgZWJjZGljLmMgbm90IHlldCBpbmNsdWRlZCBiZWNhdXNlIGl0IGhhcyBhIGRpZmZlcmVudCBsaWNlbnNlLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgU3VwcG9ydCBCUzIwMDAvT1NELVBPU0lYLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgTWFrZSBjYWxsYmFja3MgZm9yIGtleSBnZW5lcmF0aW9uIHVzZSB2b2lkICogaW5zdGVhZCBvZiBjaGFyICouCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgUy9NSU1FIHNhbXBsZXMgY29tcGlsZSAobm90IHlldCB0ZXN0ZWQpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGRpdGlvbmFsIHR5cGVzYWZlIHN0YWNrcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gdmFyaWFudHMgImJzZGktZWxmLWdjYyIgKEJTRC9PUyA0LngpLgogICAgIFtCb2RvIE1vZWxsZXJdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMyBhbmQgMC45LjNhICBbMjkgTWF5IDE5OTldCgogICopIE5ldyBjb25maWd1cmF0aW9uIHZhcmlhbnQgInNjbzUtZ2NjIi4KCiAgKikgVXBkYXRlZCBzb21lIGRlbW9zLgogICAgIFtTZWFuIE8gUmlvcmRhaW4sIFdhZGUgU2Nob2xpbmVdCgogICopIEFkZCBtaXNzaW5nIEJJT19mcmVlIGF0IGV4aXQgb2YgcGtjczEyIGFwcGxpY2F0aW9uLgogICAgIFtXdSBaaGlnYW5nXQoKICAqKSBGaXggbWVtb3J5IGxlYWsgaW4gY29uZi5jLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZXMgZm9yIFdpbjMyIHRvIGFzc2VtYmxlciB2ZXJzaW9uIG9mIE1ENS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXQgIyEgcGF0aCB0byBwZXJsIGluIGFwcHMvZGVyX2Nob3AgdG8gd2hlcmUgd2UgZm91bmQgaXQKICAgICBpbnN0ZWFkIG9mIHVzaW5nIGEgZml4ZWQgcGF0aC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTSEEgbGlicmFyeSBjaGFuZ2VzIGZvciBpcml4NjQtbWlwczQtY2MuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEltcHJvdmVtZW50cyBmb3IgVk1TIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4yYiBhbmQgMC45LjMgIFsyNCBNYXkgMTk5OV0KCiAgKikgQmlnbnVtIGxpYnJhcnkgYnVnIGZpeC4gSVJJWCA2IHBhc3NlcyAibWFrZSB0ZXN0IiBub3chCiAgICAgVGhpcyBhbHNvIGF2b2lkcyB0aGUgcHJvYmxlbXMgd2l0aCBTQzQuMiBhbmQgdW5wYXRjaGVkIFNDNS4gIAogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIE5ldyBmdW5jdGlvbnMgc2tfbnVtLCBza192YWx1ZSBhbmQgc2tfc2V0IHRvIHJlcGxhY2UgdGhlIHByZXZpb3VzIG1hY3Jvcy4KICAgICBUaGVzZSBhcmUgcmVxdWlyZWQgYmVjYXVzZSBvZiB0aGUgdHlwZXNhZmUgc3RhY2sgd291bGQgb3RoZXJ3aXNlIGJyZWFrIAogICAgIGV4aXN0aW5nIGNvZGUuIElmIG9sZCBjb2RlIHVzZWQgYSBzdHJ1Y3R1cmUgbWVtYmVyIHdoaWNoIHVzZWQgdG8gYmUgU1RBQ0sKICAgICBhbmQgaXMgbm93IFNUQUNLX09GIChmb3IgZXhhbXBsZSBjZXJ0IGluIGEgUEtDUzdfU0lHTkVEIHN0cnVjdHVyZSkgd2l0aAogICAgIHNrX251bSBvciBza192YWx1ZSBpdCB3b3VsZCBwcm9kdWNlIGFuIGVycm9yIGJlY2F1c2UgdGhlIG51bSwgZGF0YSBtZW1iZXJzCiAgICAgYXJlIG5vdCBwcmVzZW50IGluIFNUQUNLX09GLiBOb3cgaXQganVzdCBwcm9kdWNlcyBhIHdhcm5pbmcuIHNrX3NldAogICAgIHJlcGxhY2VzIHRoZSBvbGQgbWV0aG9kIG9mIGFzc2lnbmluZyBhIHZhbHVlIHRvIHNrX3ZhbHVlCiAgICAgKGUuZy4gc2tfdmFsdWUoeCwgaSkgPSB5KSB3aGljaCB0aGUgbGlicmFyeSB1c2VkIGluIGEgZmV3IGNhc2VzLiBBbnkgY29kZQogICAgIHRoYXQgZG9lcyB0aGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsgKGFuZCBzaG91bGQgdXNlIHNrX3NldCBpbnN0ZWFkKSBidXQKICAgICB0aGlzIGNvdWxkIGJlIHJlZ2FyZGVkIGFzIGEgInF1ZXN0aW9uYWJsZSIgYmVoYXZpb3VyIGFueXdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbW9zdCBvZiB0aGUgb3RoZXIgUEtDUyM3IGJ1Z3MuIFRoZSAiZXhwZXJpbWVudGFsIiBjb2RlIGNhbiBub3cKICAgICBjb3JyZWN0bHkgaGFuZGxlIGVuY3J5cHRlZCBTL01JTUUgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdHlwZSBvZiB2YXJpb3VzIERFUyBmdW5jdGlvbiBhcmd1bWVudHMgZnJvbSBkZXNfY2Jsb2NrCiAgICAgKHdoaWNoIG1lYW5zLCBpbiBmdW5jdGlvbiBhcmd1bWVudCBkZWNsYXJhdGlvbnMsIHBvaW50ZXIgdG8gY2hhcikKICAgICB0byBkZXNfY2Jsb2NrICogKG1lYW5pbmcgcG9pbnRlciB0byBhcnJheSB3aXRoIDggY2hhciBlbGVtZW50cyksCiAgICAgd2hpY2ggYWxsb3dzIHRoZSBjb21waWxlciB0byBkbyBtb3JlIHR5cGVjaGVja2luZzsgaXQgd2FzIGxpa2UKICAgICB0aGF0IGJhY2sgaW4gU1NMZWF5LCBidXQgd2l0aCBsb3RzIG9mIHVnbHkgY2FzdHMuCgogICAgIEludHJvZHVjZSBuZXcgdHlwZSBjb25zdF9kZXNfY2Jsb2NrLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlb3JnYW5pc2UgdGhlIFBLQ1MjNyBsaWJyYXJ5IGFuZCBnZXQgcmlkIG9mIHNvbWUgb2YgdGhlIG1vcmUgb2J2aW91cwogICAgIHByb2JsZW1zOiBmaW5kIFJlY2lwaWVudEluZm8gc3RydWN0dXJlIHRoYXQgbWF0Y2hlcyByZWNpcGllbnQgY2VydGlmaWNhdGUKICAgICBhbmQgaW5pdGlhbGlzZSB0aGUgQVNOMSBzdHJ1Y3R1cmVzIHByb3Blcmx5IGJhc2VkIG9uIHBhc3NlZCBjaXBoZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmVsYXRlZGx5IG1ha2UgdGhlIEJOIHRlc3RzIGFjdHVhbGx5IGNoZWNrIHRoZSByZXN1bHRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBuZWdhdGl2ZSBBU04xIElOVEVHRVJTIGFuZCBjb252ZXJzaW9uCiAgICAgdG8gYW5kIGZyb20gQk5zOiBpdCB3YXMgY29tcGxldGVseSBicm9rZW4uIE5ldyBjb21waWxhdGlvbiBvcHRpb24KICAgICBORUdfUFVCS0VZX0JVRyB0byBhbGxvdyBmb3Igc29tZSBicm9rZW4gY2VydGlmaWNhdGVzIHRoYXQgZW5jb2RlIHB1YmxpYwogICAgIGtleSBlbGVtZW50cyBhcyBuZWdhdGl2ZSBpbnRlZ2Vycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXplIGFuZCBzcGVlZCB1cCBNRDUuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgVk1TIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz5dCgogICopIE5ldyBvcHRpb24gLW91dCB0byBhc24xcGFyc2UgdG8gYWxsb3cgdGhlIHBhcnNlZCBzdHJ1Y3R1cmUgdG8gYmUKICAgICBvdXRwdXQgdG8gYSBmaWxlLiBUaGlzIGlzIG1vc3QgdXNlZnVsIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgLXN0cnBhcnNlCiAgICAgb3B0aW9uIHRvIGV4YW1pbmUgdGhlIG91dHB1dCBvZiB0aGluZ3MgbGlrZSBPQ1RFVCBTVFJJTkdTLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgU1NMIGxpYnJhcnkgYSBsaXR0bGUgbW9yZSBmb29sLXByb29mIGJ5IG5vdCByZXF1aXJpbmcgYW55IGxvbmdlcgogICAgIHRoYXQgU1NMX3NldF97YWNjZXB0LGNvbm5lY3R9X3N0YXRlIGJlIGNhbGxlZCBiZWZvcmUKICAgICBTU0xfe2FjY2VwdCxjb25uZWN0fSBtYXkgYmUgdXNlZCAoU1NMX3NldF8uLi5fc3RhdGUgaXMgb21pdHRlZAogICAgIGluIG1hbnkgYXBwbGljYXRpb25zIGJlY2F1c2UgdXN1YWxseSBldmVyeXRoaW5nICphcHBlYXJlZCogdG8gd29yayBhcwogICAgIGludGVuZGVkIGFueXdheSAtLSBub3cgaXQgcmVhbGx5IHdvcmtzIGFzIGludGVuZGVkKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb3ZlIG9wZW5zc2wuY25mIG91dCBvZiBsaWIvLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggdmFyaW91cyB0aGluZ3MgdG8gbGV0IE9wZW5TU0wgZXZlbiBwYXNzIGBgZWdjYyAtcGlwZSAtTzIgLVdhbGwKICAgICAtV3NoYWRvdyAtV3BvaW50ZXItYXJpdGggLVdjYXN0LWFsaWduIC1XbWlzc2luZy1wcm90b3R5cGVzCiAgICAgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV25lc3RlZC1leHRlcm5zIC1XaW5saW5lJycgd2l0aCBFR0NTIDEuMS4yKyAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgVmFyaW91cyBmaXhlcyB0byB0aGUgRVZQIGFuZCBQS0NTIzcgY29kZS4gSXQgbWF5IG5vdyBiZSBhYmxlIHRvCiAgICAgaGFuZGxlIFBLQ1MjNyBlbnZlbG9wZWQgZGF0YSBwcm9wZXJseS4KICAgICBbU2ViYXN0aWFuIEFrZXJtYW4gPHNha0BwYXJhbGxlbGNvbnN1bHRpbmcuY29tPiwgbW9kaWZpZWQgYnkgU3RldmVdCgogICopIENyZWF0ZSBhIGR1cGxpY2F0ZSBvZiB0aGUgU1NMX0NUWCdzIENFUlQgaW4gU1NMX25ldyBpbnN0ZWFkIG9mCiAgICAgY29weWluZyBwb2ludGVycy4gIFRoZSBjZXJ0X3N0IGhhbmRsaW5nIGlzIGNoYW5nZWQgYnkgdGhpcyBpbgogICAgIHZhcmlvdXMgd2F5cyAoYW5kIHRodXMgd2hhdCB1c2VkIHRvIGJlIGtub3duIGFzIGN0eC0+ZGVmYXVsdF9jZXJ0CiAgICAgaXMgbm93IGNhbGxlZCBjdHgtPmNlcnQsIHNpbmNlIHdlIGRvbid0IHJlc29ydCB0byBzLT5jdHgtPltkZWZhdWx0X11jZXJ0CiAgICAgYW55IGxvbmdlciB3aGVuIHMtPmNlcnQgZG9lcyBub3QgZ2l2ZSB1cyB3aGF0IHdlIG5lZWQpLgogICAgIHNzbF9jZXJ0X2luc3RhbnRpYXRlIGJlY29tZXMgb2Jzb2xldGUgYnkgdGhpcyBjaGFuZ2UuCiAgICAgQXMgc29vbiBhcyB3ZSd2ZSBnb3QgdGhlIG5ldyBjb2RlIHJpZ2h0IChwb3NzaWJseSBpdCBhbHJlYWR5IGlzPyksCiAgICAgd2UgaGF2ZSBzb2x2ZWQgYSBjb3VwbGUgb2YgYnVncyBvZiB0aGUgZWFybGllciBjb2RlIHdoZXJlIHMtPmNlcnQKICAgICB3YXMgdXNlZCBhcyBpZiBpdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHNoYXJlZCB3aXRoIG90aGVyIFNTTCBzdHJ1Y3R1cmVzLgoKICAgICBOb3RlIHRoYXQgdXNpbmcgdGhlIFNTTCBBUEkgaW4gY2VydGFpbiBkaXJ0eSB3YXlzIG5vdyB3aWxsIHJlc3VsdAogICAgIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBvYnNlcnZlZCB3aXRoIGVhcmxpZXIgbGlicmFyeSB2ZXJzaW9uczoKICAgICBDaGFuZ2luZyBzZXR0aW5ncyBmb3IgYW4gU1NMX0NUWCAqY3R4IGFmdGVyIGhhdmluZyBkb25lIHMgPSBTU0xfbmV3KGN0eCkKICAgICBkb2VzIG5vdCBpbmZsdWVuY2UgcyBhcyBpdCB1c2VkIHRvLgogICAgIAogICAgIEluIG9yZGVyIHRvIGNsZWFuIHVwIHRoaW5ncyBtb3JlIHRob3JvdWdobHksIGluc2lkZSBTU0xfU0VTU0lPTgogICAgIHdlIGRvbid0IHVzZSBDRVJUIGFueSBsb25nZXIsIGJ1dCBhIG5ldyBzdHJ1Y3R1cmUgU0VTU19DRVJUCiAgICAgdGhhdCBob2xkcyBwZXItc2Vzc2lvbiBkYXRhIChpZiBhdmFpbGFibGUpOyBjdXJyZW50bHksIHRoaXMgaXMKICAgICB0aGUgcGVlcidzIGNlcnRpZmljYXRlIGNoYWluIGFuZCwgZm9yIGNsaWVudHMsIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZQogICAgIGFuZCB0ZW1wb3Jhcnkga2V5LiAgQ0VSVCBob2xkcyBvbmx5IHRob3NlIHZhbHVlcyB0aGF0IGNhbiBoYXZlCiAgICAgbWVhbmluZ2Z1bCBkZWZhdWx0cyBpbiBhbiBTU0xfQ1RYLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5VjNfRVhUX2kyZCgpIHRvIGNyZWF0ZSBhbiBYNTA5X0VYVEVOU0lPTiBzdHJ1Y3R1cmUKICAgICBmcm9tIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gVmFyaW91cyBQS0NTIzcgZml4ZXM6IHJlbW92ZSBzb21lCiAgICAgZXZpbCBjYXN0cyBhbmQgc2V0IHRoZSBlbmNfZGlnX2FsZyBmaWVsZCBwcm9wZXJseSBiYXNlZCBvbiB0aGUgc2lnbmluZwogICAgIGtleSB0eXBlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IFBLQ1MjMTIgcGFzc3dvcmQgdG8gYmUgc2V0IGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciB0aGUKICAgICBlbnZpcm9ubWVudC4gTGV0ICdjYScgZ2V0IGl0cyBjb25maWcgZmlsZSBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50CiAgICAgdmFyaWFibGVzICJPUEVOU1NMX0NPTkYiIG9yICJTU0xFQVlfQ09ORiIgKGZvciBjb25zaXN0ZW5jeSB3aXRoICdyZXEnCiAgICAgYW5kICd4NTA5JykuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgY2VydGlmaWNhdGUgcG9saWNpZXMgZXh0ZW5zaW9uIHRvIHVzZSBhbiBJQTVTVFJJTkcgZm9yIHRoZQogICAgIG9yZ2FuaXphdGlvbiBmaWVsZC4gVGhpcyBpcyBjb250cmFyeSB0byB0aGUgUEtJWCBkZWZpbml0aW9uIGJ1dAogICAgIFZlcmlTaWduIHVzZXMgaXQgYW5kIElFNSBvbmx5IHJlY29nbmlzZXMgdGhpcyBmb3JtLiBEb2N1bWVudCAneDUwOScKICAgICBleHRlbnNpb24gb3B0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBQRURBTlRJQyBjb21waWxlciBmbGFnIHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggZ2NjIC1wZWRhbnRpYywKICAgICB3aXRob3V0IGRpc2FsbG93aW5nIGlubGluZSBhc3NlbWJsZXIgYW5kIHRoZSBsaWtlIGZvciBub24tcGVkYW50aWMgYnVpbGRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTdXBwb3J0IEJvcmxhbmQgQysrIGJ1aWxkZXIuCiAgICAgW0phbmV6IEplcmUgPGpqQHZvaWQuc2k+LCBtb2RpZmllZCBieSBVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IE1pbmd3MzIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNIQS0xIGNsZWFudXBzIGFuZCBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgU3BhcmMgdjhwbHVzIGFzc2VtYmxlciBmb3IgdGhlIGJpZ251bSBsaWJyYXJ5LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIEFjY2VwdCBhbnkgLXh4eCBhbmQgK3h4eCBjb21waWxlciBvcHRpb25zIGluIENvbmZpZ3VyZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgVXBkYXRlIEhQVVggY29uZmlndXJhdGlvbi4KICAgICBbQW5vbnltb3VzXQogIAogICopIEFkZCBtaXNzaW5nIHNrXzx0eXBlPl91bnNoaWZ0KCkgZnVuY3Rpb24gdG8gc2FmZXN0YWNrLmgKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUgdGhhdCBzZXRzIHRoZQogICAgICJleHRyYV9jZXJ0InMgaW4gYWRkaXRpb24gdG8gdGhlIGNlcnRpZmljYXRlLiAgKFRoaXMgbWFrZXMgc2Vuc2UKICAgICBvbmx5IGZvciAiUEVNIiBmb3JtYXQgZmlsZXMsIGFzIGNoYWlucyBhcyBhIHdob2xlIGFyZSBub3QKICAgICBERVItZW5jb2RlZC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3VwcG9ydCB2ZXJpZnlfZGVwdGggZnJvbSB0aGUgU1NMIEFQSS4KICAgICB4NTA5X3ZmeS5jIGhhZCB3aGF0IGNhbiBiZSBjb25zaWRlcmVkIGFuIG9mZi1ieS1vbmUtZXJyb3I6CiAgICAgSXRzIGRlcHRoICh3aGljaCB3YXMgbm90IHBhcnQgb2YgdGhlIGV4dGVybmFsIGludGVyZmFjZSkKICAgICB3YXMgYWN0dWFsbHkgY291bnRpbmcgdGhlIG51bWJlciBvZiBjZXJ0aWZpY2F0ZXMgaW4gYSBjaGFpbjsKICAgICBub3cgaXQgcmVhbGx5IGNvdW50cyB0aGUgZGVwdGguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4IGluIGNyeXB0by94NTA5L3g1MDlfY21wLmM6IFRoZSBTU0xlcnIgbWFjcm8gd2FzIHVzZWQKICAgICBpbnN0ZWFkIG9mIFg1MDllcnIsIHdoaWNoIG9mdGVuIHJlc3VsdGVkIGluIGNvbmZ1c2luZyBlcnJvcgogICAgIG1lc3NhZ2VzIHNpbmNlIHRoZSBlcnJvciBjb2RlcyBhcmUgbm90IGdsb2JhbGx5IHVuaXF1ZQogICAgIChlLmcuIGFuIGFsbGVnZWQgZXJyb3IgaW4gc3NsM19hY2NlcHQgd2hlbiBhIGNlcnRpZmljYXRlCiAgICAgZGlkbid0IG1hdGNoIHRoZSBwcml2YXRlIGtleSkuCgogICopIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQgdGhhdCBhbGxvd3MgdG8gc2V0IGEgZGVmYXVsdAogICAgIHZhbHVlIChzbyB0aGF0IHlvdSBkb24ndCBuZWVkIFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0IGZvciBlYWNoCiAgICAgY29ubmVjdGlvbiB1c2luZyB0aGUgU1NMX0NUWCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgT0FFUCBkZWNvZGluZyBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IElOU1RBTExfUFJFRklYIGZvciBwYWNrYWdlIGJ1aWxkZXJzLCBhcyBwcm9wb3NlZCBieQogICAgIERhdmlkIEhhcnJpcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgInRocmVhZHMiIGFuZCAibm8tdGhyZWFkcyIuICBGb3Igc3lzdGVtcwogICAgIHdoZXJlIHRoZSBwcm9wZXIgY29tcGlsZXIgb3B0aW9ucyBhcmUga25vd24gKGN1cnJlbnRseSBTb2xhcmlzCiAgICAgYW5kIExpbnV4KSwgInRocmVhZHMiIGlzIHRoZSBkZWZhdWx0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBzY3JpcHQgdXRpbC9ta2xpbmsucGwgYXMgYSBmYXN0ZXIgc3Vic3RpdHV0ZSBmb3IgdXRpbC9ta2xpbmsuc2guCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5zdGFsbCB2YXJpb3VzIHNjcmlwdHMgdG8gJChPUEVOU1NMRElSKS9taXNjLCBub3QgdG8KICAgICAkKElOU1RBTExUT1ApL2JpbiAtLSB0aGV5IHNob3VsZG4ndCBjbHV0dGVyIGRpcmVjdG9yaWVzCiAgICAgc3VjaCBhcyAvdXNyL2xvY2FsL2Jpbi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSAibWFrZSBsaW51eC1zaGFyZWQiIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCiAgICAgW05pZWxzIFBvcHBlIDxuaWVsc0BuZXRib3gub3JnPl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb24gbm8tPGNpcGhlcj4gKHJzYSwgaWRlYSwgcmM1LCAuLi4pLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgdGhlIFBLQ1MjMTIgQVBJIGRvY3VtZW50YXRpb24gdG8gb3BlbnNzbC50eHQuIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yCiAgICAgZXh0ZW5zaW9uIGFkZGluZyBpbiB4NTA5IHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIE5PUFJPVE8gc2VjdGlvbnMgYW5kIGVycm9yIGNvZGUgY29tbWVudHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFBhcnRpYWwgcmV3cml0ZSBvZiB0aGUgREVGIGZpbGUgZ2VuZXJhdG9yIHRvIG5vdyBwYXJzZSB0aGUgQU5TSQogICAgIHByb3RvdHlwZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb25zIC0tcHJlZml4PURJUiBhbmQgLS1vcGVuc3NsZGlyPURJUi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQ29tcGxldGUgcmV3cml0ZSBvZiB0aGUgZXJyb3IgY29kZSBzY3JpcHQocykuIEl0IGlzIGFsbCBub3cgaGFuZGxlZAogICAgIGJ5IG9uZSBzY3JpcHQgYXQgdGhlIHRvcCBsZXZlbCB3aGljaCBoYW5kbGVzIGVycm9yIGNvZGUgZ2F0aGVyaW5nLAogICAgIGhlYWRlciByZXdyaXRpbmcgYW5kIEMgc291cmNlIGZpbGUgZ2VuZXJhdGlvbi4gSXQgc2hvdWxkIGJlIG11Y2ggYmV0dGVyCiAgICAgdGhhbiB0aGUgb2xkIG1ldGhvZDogaXQgbm93IHVzZXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIFVsZidzIHBhcnNlciB0bwogICAgIHJlYWQgdGhlIEFOU0kgcHJvdG90eXBlcyBpbiBhbGwgaGVhZGVyIGZpbGVzICh0aHVzIHRoZSBvbGQgSyZSIGRlZmluaXRpb25zCiAgICAgYXJlbid0IG5lZWRlZCBmb3IgZXJyb3IgY3JlYXRpb24gYW55IG1vcmUpIGFuZCBkbyBhIGJldHRlciBqb2Igb2YKICAgICB0cmFuc2xhdGluZyBmdW5jdGlvbiBjb2RlcyBpbnRvIG5hbWVzLiBUaGUgb2xkICdBU04xIGVycm9yIGNvZGUgaW1iZWRkZWQKICAgICBpbiBhIGNvbW1lbnQnIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgYW5kIGl0IGRvZXNuJ3QgdXNlIC5lcnIgZmlsZXMgd2hpY2gKICAgICBoYXZlIG5vdyBiZWVuIGRlbGV0ZWQuIEFsc28gdGhlIGVycm9yIGNvZGUgY2FsbCBkb2Vzbid0IGhhdmUgdG8gYXBwZWFyIGFsbAogICAgIG9uIG9uZSBsaW5lICh3aGljaCByZXN1bHRlZCBpbiBzb21lIGxhcmdlIGxpbmVzLi4uKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgI2luY2x1ZGUgZmlsZW5hbWVzIGZyb20gPGZvby5oPiB0byA8b3BlbnNzbC9mb28uaD4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIGJlaGF2aW91ciBvZiBzc2wyX3JlYWQgd2hlbiBmYWNpbmcgbGVuZ3RoLTAgcGFja2V0czogRG9uJ3QgcmV0dXJuCiAgICAgMCAod2hpY2ggdXN1YWxseSBpbmRpY2F0ZXMgYSBjbG9zZWQgY29ubmVjdGlvbiksIGJ1dCBjb250aW51ZSByZWFkaW5nLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBzb21lIHJhY2UgY29uZGl0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZXh0ZW5zaW9uLiBBZGQgQ2VydGlmaWNhdGUKICAgICBQb2xpY2llcyBhbmQgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZG9jdW1lbnRhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIHRoZSBhdXRvZ2VuZXJhdGVkIGhlYWRlciBmaWxlIHBhcnRzIHRvIGNyeXB0by9vcGVuc3NsY29uZi5oLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggbmV3IDU2LWJpdCBERVMgZXhwb3J0IGNpcGhlcnN1aXRlczogdGhleSB3ZXJlIHVzaW5nIDcgYnl0ZXMgaW5zdGVhZCBvZgogICAgIDggb2Yga2V5aW5nIG1hdGVyaWFsLiBNZXJsaW4gaGFzIGFsc28gY29uZmlybWVkIGludGVyb3Agd2l0aCB0aGlzIGZpeAogICAgIGJldHdlZW4gT3BlblNTTCBhbmQgQmFsdGltb3JlIEMvU1NMIDIuMCBhbmQgSi9TU0wgMi4wLgogICAgIFtNZXJsaW4gSHVnaGVzIDxtZXJsaW5AYmFsdGltb3JlLmllPl0KCiAgKikgRml4IGxvdHMgb2Ygd2FybmluZ3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCiAKICAqKSBJbiBhZGRfY2VydF9kaXIoKSBpbiBjcnlwdG8veDUwOS9ieV9kaXIuYywgYnJlYWsgb3V0IG9mIHRoZSBsb29wIGlmCiAgICAgdGhlIGRpcmVjdG9yeSBzcGVjIGRpZG4ndCBlbmQgd2l0aCBhIExJU1RfU0VQQVJBVE9SX0NIQVIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCiAKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBzaXplb2YobG9uZykgPT0gOC4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBDaGFuZ2UgZnVuY3Rpb25zIHRvIEFOU0kgQy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IHR5cG9zIGluIGVycm9yIGNvZGVzLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPiwgVWxmIE32bGxlcl0KCiAgKikgUmVtb3ZlIGRlZnVuY3QgYXNzZW1ibGVyIGZpbGVzIGZyb20gQ29uZmlndXJlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTUEFSQyB2OCBhc3NlbWJsZXIgQklHTlVNIGltcGxlbWVudGF0aW9uLgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIFN1cHBvcnQgZm9yIENlcnRpZmljYXRlIFBvbGljaWVzIGV4dGVuc2lvbjogYm90aCBwcmludCBhbmQgc2V0LgogICAgIFZhcmlvdXMgYWRkaXRpb25zIHRvIHN1cHBvcnQgdGhlIHIyaSBtZXRob2QgdGhpcyB1c2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEEgbG90IG9mIGNvbnN0aWZpY2F0aW9uLCBhbmQgZml4IGEgYnVnIGluIFg1MDlfTkFNRV9vbmVsaW5lKCkgdGhhdCBjb3VsZAogICAgIHJldHVybiBhIGNvbnN0IHN0cmluZyB3aGVuIHlvdSBhcmUgZXhwZWN0aW5nIGFuIGFsbG9jYXRlZCBidWZmZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBBU04xIHR5cGVzIFVURjhTdHJpbmcgYW5kIFZJU0lCTEVTVFJJTkcsIGFsc28gdGhlIENIT0lDRQogICAgIHR5cGVzIERpcmVjdG9yeVN0cmluZyBhbmQgRGlzcGxheVRleHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvZGUgdG8gYWxsb3cgcjJpIGV4dGVuc2lvbnMgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIGRhdGFiYXNlLAogICAgIGFkZCBhbiBMSEFTSCBkYXRhYmFzZSBkcml2ZXIgYW5kIGFkZCBzZXZlcmFsIGN0eCBoZWxwZXIgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBhbiBldmlsIGJ1ZyBpbiBibl9leHBhbmQyKCkgd2hpY2ggY2F1c2VkIHZhcmlvdXMgQk4gZnVuY3Rpb25zIHRvCiAgICAgZmFpbCB3aGVuIHRoZXkgZXh0ZW5kZWQgdGhlIHNpemUgb2YgYSBCSUdOVU0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgU1hOZXQgZXh0ZW5zaW9uLiBNb2RpZnkgbWtkZWYucGwgdG8KICAgICBzdXBwb3J0IHR5cGVzYWZlIHN0YWNrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0eXBvIGluIFNTTF9bZ3NdZXRfb3B0aW9ucygpLgogICAgIFtOaWxzIEZyb3N0YmVyZyA8bmlsc0BtZWRjb20uc2U+XQoKICAqKSBEZWxldGUgdmFyaW91cyBmdW5jdGlvbnMgYW5kIGZpbGVzIHRoYXQgYmVsb25nZWQgdG8gdGhlIChub3cgb2Jzb2xldGUpCiAgICAgb2xkIFg1MDlWMyBoYW5kbGluZyBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9uICJyc2FyZWYiLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEb24ndCBhdXRvLWdlbmVyYXRlIHBlbS5oLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEludHJvZHVjZSB0eXBlLXNhZmUgQVNOLjEgU0VUcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29udmVydCB2YXJpb3VzIGFkZGl0aW9uYWwgY2FzdGVkIHN0YWNrcyB0byB0eXBlLXNhZmUgU1RBQ0tfT0YoKSB2YXJpYW50cy4KICAgICBbQmVuIExhdXJpZSwgUmFsZiBTLiBFbmdlbHNjaGFsbCwgU3RldmUgSGVuc29uXQoKICAqKSBJbnRyb2R1Y2UgdHlwZS1zYWZlIFNUQUNLcy4gVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgbG90cyBvZiBjb2RlCiAgICAgdGhhdCBsaW5rcyB3aXRoIE9wZW5TU0wgKHdlbGwgYXQgbGVhc3QgY2F1c2UgbG90cyBvZiB3YXJuaW5ncyksIGJ1dCBmZWFyCiAgICAgbm90OiB0aGUgY29udmVyc2lvbiBpcyB0cml2aWFsLCBhbmQgaXQgZWxpbWluYXRlcyBsb2FkcyBvZiBldmlsIGNhc3RzLiBBCiAgICAgZmV3IFNUQUNLZWQgdGhpbmdzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgYWxyZWFkeS4gRmVlbCBmcmVlIHRvIGNvbnZlcnQgbW9yZS4KICAgICBJbiB0aGUgZnVsbG5lc3Mgb2YgdGltZSwgSSdsbCBkbyBhd2F5IHdpdGggdGhlIFNUQUNLIHR5cGUgYWx0b2dldGhlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGBvcGVuc3NsIGNhIC1yZXZva2UgPGNlcnRmaWxlPicgZmFjaWxpdHkgd2hpY2ggcmV2b2tlcyBhIGNlcnRpZmljYXRlCiAgICAgc3BlY2lmaWVkIGluIDxjZXJ0ZmlsZT4gYnkgdXBkYXRpbmcgdGhlIGVudHJ5IGluIHRoZSBpbmRleC50eHQgZmlsZS4KICAgICBUaGlzIHdheSBvbmUgbm8gbG9uZ2VyIGhhcyB0byBlZGl0IHRoZSBpbmRleC50eHQgZmlsZSBtYW51YWxseSBmb3IKICAgICByZXZva2luZyBhIGNlcnRpZmljYXRlLiBUaGUgLXJldm9rZSBvcHRpb24gZG9lcyB0aGUgZ29yeSBkZXRhaWxzIG5vdy4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAb3BlbmNhLm9yZz4sIFJhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBgb3BlbnNzbCBjcmwgLW5vb3V0IC10ZXh0JyBjb21iaW5hdGlvbiB3aGVyZSBgLW5vb3V0JyBraWxsZWQgdGhlCiAgICAgYC10ZXh0JyBvcHRpb24gYXQgYWxsIGFuZCB0aGlzIHdheSB0aGUgYC1ub291dCAtdGV4dCcgY29tYmluYXRpb24gd2FzCiAgICAgaW5jb25zaXN0ZW50IGluIGBvcGVuc3NsIGNybCcgd2l0aCB0aGUgZnJpZW5kcyBpbiBgb3BlbnNzbCB4NTA5fHJzYXxkc2EnLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIHN1cmUgYSBjb3JyZXNwb25kaW5nIHBsYWluIHRleHQgZXJyb3IgbWVzc2FnZSBleGlzdHMgZm9yIHRoZQogICAgIFg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VELzIzIGVycm9yIG51bWJlciB3aGljaCBjYW4gb2NjdXIgd2hlbiBhCiAgICAgdmVyaWZ5IGNhbGxiYWNrIGZ1bmN0aW9uIGRldGVybWluZWQgdGhhdCBhIGNlcnRpZmljYXRlIHdhcyByZXZva2VkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBCdWdmaXg6IEluIHRlc3QvdGVzdGVuYywgZG9uJ3QgdGVzdCAib3BlbnNzbCA8Y2lwaGVyPiIgZm9yCiAgICAgY2lwaGVycyB0aGF0IHdlcmUgZXhjbHVkZWQsIGUuZy4gYnkgLUROT19JREVBLiAgQWxzbywgdGVzdAogICAgIGFsbCBhdmFpbGFibGUgY2lwZXJzIGluY2x1ZGluZyByYzUsIHdoaWNoIHdhcyBmb3Jnb3R0ZW4gdW50aWwgbm93LgogICAgIEluIG9yZGVyIHRvIGxldCB0aGUgdGVzdGluZyBzaGVsbCBzY3JpcHQga25vdyB3aGljaCBhbGdvcml0aG1zCiAgICAgYXJlIGF2YWlsYWJsZSwgYSBuZXcgKHVwIHRvIG5vdyB1bmRvY3VtZW50ZWQpIGNvbW1hbmQKICAgICAib3BlbnNzbCBsaXN0LWNpcGhlci1jb21tYW5kcyIgaXMgdXNlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IHNfY2xpZW50IG9jY2FzaW9uYWxseSB3b3VsZCBzbGVlcCBpbiBzZWxlY3QoKSB3aGVuCiAgICAgaXQgc2hvdWxkIGhhdmUgY2hlY2tlZCBTU0xfcGVuZGluZygpIGZpcnN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbnMgRFNBX2RvX3NpZ24gYW5kIERTQV9kb192ZXJpZnkgdG8gcHJvdmlkZSBhY2Nlc3MgdG8KICAgICB0aGUgcmF3IERTQSB2YWx1ZXMgcHJpb3IgdG8gQVNOLjEgZW5jb2RpbmcuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFR3ZWFrcyB0byBDb25maWd1cmUKICAgICBbTmllbHMgUG9wcGUgPG5pZWxzQG5ldGJveC5vcmc+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgQVNOMSBQQkVTMiBzdHJ1Y3R1cmVzLiBObyBvdGhlciBzdXBwb3J0LAogICAgIHlldC4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyB2YXJpYWJsZXMgJChSQU5MSUIpIGFuZCAkKFBFUkwpIGluIHRoZSBNYWtlZmlsZXMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE5ldyBjb25maWcgb3B0aW9uIHRvIGF2b2lkIGluc3RydWN0aW9ucyB0aGF0IGFyZSBpbGxlZ2FsIG9uIHRoZSA4MDM4Ni4KICAgICBUaGUgZGVmYXVsdCBjb2RlIGlzIGZhc3RlciwgYnV0IHJlcXVpcmVzIGF0IGxlYXN0IGEgNDg2LgogICAgIFtVbGYgTfZsbGVyXQogIAogICopIEdvdCByaWQgb2Ygb2xkIFNTTDJfQ0xJRU5UX1ZFUlNJT04gKGluY29uc2lzdGVudGx5IHVzZWQpIGFuZAogICAgIFNTTDJfU0VSVkVSX1ZFUlNJT04gKG5vdCB1c2VkIGF0IGFsbCkgbWFjcm9zLCB3aGljaCBhcmUgbm93IHRoZQogICAgIHNhbWUgYXMgU1NMMl9WRVJTSU9OIGFueXdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgIi1zaG93Y2VydHMiIG9wdGlvbiBmb3Igc19jbGllbnQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3RpbGwgbW9yZSBQS0NTIzEyIGludGVncmF0aW9uLiBBZGQgcGtjczEyIGFwcGxpY2F0aW9uIHRvIG9wZW5zc2wKICAgICBhcHBsaWNhdGlvbi4gVmFyaW91cyBjbGVhbnVwcyBhbmQgZml4ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBQS0NTIzEyIGludGVncmF0aW9uLiBBZGQgbmV3IHBrY3MxMiBkaXJlY3Rvcnkgd2l0aCBNYWtlZmlsZS5zc2wgYW5kCiAgICAgbW9kaWZ5IGVycm9yIHJvdXRpbmVzIHRvIHdvcmsgaW50ZXJuYWxseS4gQWRkIGVycm9yIGNvZGVzIGFuZCBQQkUgaW5pdAogICAgIHRvIGxpYnJhcnkgc3RhcnR1cCByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdXJ0aGVyIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZGVkIHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24sIFBLQ1MjOCBhbmQKICAgICBwYWNraW5nIGZ1bmN0aW9ucyB0byBhc24xIGFuZCBldnAuIENoYW5nZWQgZnVuY3Rpb24gbmFtZXMgYW5kIGVycm9yCiAgICAgY29kZXMgYWxvbmcgdGhlIHdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQS0NTMTIgaW50ZWdyYXRpb246IGFuZCBzbyBpdCBiZWdpbnMuLi4gRmlyc3Qgb2Ygc2V2ZXJhbCBwYXRjaGVzIHRvCiAgICAgc2xvd2x5IGludGVncmF0ZSBQS0NTIzEyIGZ1bmN0aW9uYWxpdHkgaW50byBPcGVuU1NMLiBBZGQgUEtDUyMxMgogICAgIG9iamVjdHMgdG8gb2JqZWN0cy5oCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3ICdpbmRlbnQnIG9wdGlvbiB0byBzb21lIFg1MDlWMyBleHRlbnNpb24gY29kZS4gSW5pdGlhbCBBU04xCiAgICAgYW5kIGRpc3BsYXkgc3VwcG9ydCBmb3IgVGhhd3RlIHN0cm9uZyBleHRyYW5ldCBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIExpbnV4UFBDIHN1cHBvcnQuCiAgICAgW0plZmYgRHVicnVsZSA8aWdvckBwb2JveC5vcmc+XQoKICAqKSBHZXQgcmlkIG9mIHJlZHVuZGFudCBCTiBmaWxlIGJuX211bHcuYywgYW5kIHJlbmFtZSBibl9kaXY2NCB0bwogICAgIGJuX2Rpdl93b3JkcyBpbiBhbHBoYS5zLgogICAgIFtIYW5uZXMgUmVpbmVja2UgPEguUmVpbmVja2VAaHcuYWMudWs+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBNYWtlIHN1cmUgdGhlIFJTQSBPQUVQIHRlc3QgaXMgc2tpcHBlZCB1bmRlciAtRFJTQXJlZiBiZWNhdXNlCiAgICAgT0FFUCBpc24ndCBzdXBwb3J0ZWQgd2hlbiBPcGVuU1NMIGlzIGJ1aWx0IHdpdGggUlNBcmVmLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgTW92ZSBkZWZpbml0aW9ucyBvZiBJU19TRVQvSVNfU0VRVUVOQ0UgaW5zaWRlIGNyeXB0by9hc24xL2FzbjEuaCAKICAgICBzbyB0aGV5IG5vIGxvbmdlciBhcmUgbWlzc2luZyB1bmRlciAtRE5PUFJPVE8uIAogICAgIFtTb3JlbiBTLiBKb3J2YW5nIDxzb3JlbkB0LmRrPl0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYyBhbmQgMC45LjJiICBbMjIgTWFyIDE5OTldCgogICopIE1ha2UgU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oKSB3b3JrIGluIHNlcnZlcnMuIFVuZm9ydHVuYXRlbHksIGl0IHN0aWxsCiAgICAgZG9lc24ndCB3b3JrIHdoZW4gdGhlIHNlc3Npb24gaXMgcmV1c2VkLiBDb21pbmcgc29vbiEKICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGEgc2VjdXJpdHkgaG9sZSwgdGhhdCBhbGxvd3Mgc2Vzc2lvbnMgdG8gYmUgcmV1c2VkIGluIHRoZSB3cm9uZwogICAgIGNvbnRleHQgdGh1cyBieXBhc3NpbmcgY2xpZW50IGNlcnQgcHJvdGVjdGlvbiEgQWxsIHNvZnR3YXJlIHRoYXQgdXNlcwogICAgIGNsaWVudCBjZXJ0cyBhbmQgc2Vzc2lvbiBjYWNoZXMgaW4gbXVsdGlwbGUgY29udGV4dHMgTkVFRFMgUEFUQ0hJTkcgdG8KICAgICBhbGxvdyBzZXNzaW9uIHJldXNlISBBIGZ1bGxlciBzb2x1dGlvbiBpcyBpbiB0aGUgd29ya3MuCiAgICAgW0JlbiBMYXVyaWUsIHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgSG9sZ2VyIFJlaWYsIEJvZG8gTW9lbGxlciAoYW5kID8/PyldCgogICopIFNvbWUgbW9yZSBzb3VyY2UgdHJlZSBjbGVhbnVwcyAocmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcwogICAgIGNyeXB0by9iZi9hc20vYmY1ODYucGwsIHRlc3QvdGVzdC50eHQgYW5kIGNyeXB0by9zaGEvYXNtL2YuczsgY2hhbmdlZAogICAgIHBlcm1pc3Npb24gb24gImNvbmZpZyIgc2NyaXB0IHRvIGJlIGV4ZWN1dGFibGUpIGFuZCBhIGZpeCBmb3IgdGhlIElOU1RBTEwKICAgICBkb2N1bWVudC4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBzb21lIGxlZ2FjeSBhbmQgZXJyb25lb3VzIHVzZXMgb2YgbWFsbG9jLCBmcmVlIGluc3RlYWQgb2YKICAgICBNYWxsb2MsIEZyZWUuCiAgICAgW0xlbm5hcnQgQmFuZyA8bG9iQG5ldHN0cmVhbS5zZT4sIHdpdGggbWlub3IgY2hhbmdlcyBieSBTdGV2ZV0KCiAgKikgTWFrZSByc2Ffb2FlcF90ZXN0IHJldHVybiBub24temVybyBvbiBlcnJvci4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBuYXRpdmUgU29sYXJpcyBzaGFyZWQgbGlicmFyaWVzLiBDb25maWd1cmUKICAgICBzb2xhcmlzLXNwYXJjLXNjNC1waWMsIG1ha2UsIHRoZW4gcnVuIHNobGliL3NvbGFyaXMtc2M0LnNoLiBJdCdkIGJlIG5pY2UKICAgICBpZiBzb21lb25lIHdvdWxkIG1ha2UgdGhhdCBsYXN0IHN0ZXAgYXV0b21hdGljLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBBZE5vdnVtLkNIPl0KCiAgKikgY3R4X3NpemUgd2FzIG5vdCBidWlsdCB3aXRoIHRoZSByaWdodCBjb21waWxlciBkdXJpbmcgIm1ha2UgbGlua3MiLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIHRoZSBtZWFuaW5nIG9mICdBTEwnIGluIHRoZSBjaXBoZXIgbGlzdC4gSXQgbm93IG1lYW5zICJldmVyeXRoaW5nCiAgICAgZXhjZXB0IE5VTEwgY2lwaGVycyIuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgY2lwaGVyIGxpc3Qgd2lsbCBubyBsb25nZXIKICAgICBlbmFibGUgTlVMTCBjaXBoZXJzLiBUaGV5IG5lZWQgdG8gYmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQgZS5nLiB3aXRoCiAgICAgdGhlIHN0cmluZyAiREVGQVVMVDplTlVMTCIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRvIFJTQSBwcml2YXRlIGVuY3J5cHRpb24gcm91dGluZXM6IGlmIHAgPCBxIHRoZW4gaXQgd291bGQKICAgICBvY2Nhc2lvbmFsbHkgcHJvZHVjZSBhbiBpbnZhbGlkIHJlc3VsdC4gVGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdpdGgKICAgICBleHRlcm5hbGx5IGdlbmVyYXRlZCBrZXlzIGJlY2F1c2UgT3BlblNTTCAoYW5kIFNTTGVheSkgZW5zdXJlIHAgPiBxLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlIGxlc3MgcmVzdHJpY3RpdmUgYW5kIGFsbG93IGFsc28gYHBlcmwgdXRpbC9wZXJscGF0aC5wbAogICAgIC9wYXRoL3RvL2Jpbi9wZXJsJyBpbiBhZGRpdGlvbiB0byBgcGVybCB1dGlsL3BlcmxwYXRoLnBsIC9wYXRoL3RvL2JpbicsCiAgICAgYmVjYXVzZSB0aGlzIHdheSBvbmUgY2FuIGFsc28gdXNlIGFuIGludGVycHJldGVyIG5hbWVkIGBwZXJsNScgKHdoaWNoIGlzCiAgICAgdXN1YWxseSB0aGUgbmFtZSBvZiBQZXJsIDUueHh4IG9uIHBsYXRmb3JtcyB3aGVyZSBhbiBQZXJsIDQueCBpcyBzdGlsbAogICAgIGluc3RhbGxlZCBhcyBgcGVybCcpLgogICAgIFtNYXR0aGlhcyBMb2VwZmUgPE1hdHRoaWFzLkxvZXBmZUBhZG5vdnVtLmNoPl0KCiAgKikgTGV0IHV0aWwvY2xlYW4tZGVwZW5kLnBsIHdvcmsgYWxzbyB3aXRoIG9sZGVyIFBlcmwgNS4wMHggdmVyc2lvbnMuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBGaXggTWFrZWZpbGUub3JnIHNvIENDLENGTEFHIGV0YyBhcmUgcGFzc2VkIHRvICdtYWtlIGxpbmtzJyBhZGQKICAgICBhZHZhcGkzMi5saWIgdG8gV2luMzIgYnVpbGQgYW5kIGNoYW5nZSB0aGUgcGVtIHRlc3QgY29tcGFyaXNpb24KICAgICB0byBmYy5leGUgKHRoYW5rcyB0byBVbHJpY2ggS3JvZW5lciA8a3JvbmVydUB5YWhvby5jb20+IGZvciB0aGUKICAgICBzdWdnZXN0aW9uKS4gRml4IG1pc3BsYWNlZCBBU05JIHByb3RvdHlwZXMgYW5kIGRlY2xhcmF0aW9ucyBpbiBldnAuaAogICAgIGFuZCBjcnlwdG8vZGVzL2VkZV9jYmNtX2VuYy5jLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERFUyBxdWFkIGNoZWNrc3VtIHdhcyBicm9rZW4gb24gYmlnLWVuZGlhbiBhcmNoaXRlY3R1cmVzLiBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29tbWVudCBvdXQgdHdvIGZ1bmN0aW9ucyBpbiBiaW8uaCB0aGF0IGFyZW4ndCBpbXBsZW1lbnRlZC4gRml4IHVwIHRoZQogICAgIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZSBzbyBpdCAobWlnaHQpIHdvcmsgYWdhaW4uIFRoZSBXaW4zMiB0ZXN0IGJhdGNoIGZpbGUKICAgICBpcyBob3JyaWJsZTogSSBmZWVsIGlsbC4uLi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIHZhcmlvdXMgI2lmZGVmcyBhcm91bmQgc28gTk9fU1lTTE9HLCBOT19ESVJFTlQgZXRjIGFyZSBub3cgc2VsZWN0ZWQKICAgICBpbiBlX29zLmguIEF1ZGl0IG9mIGhlYWRlciBmaWxlcyB0byBjaGVjayBBTlNJIGFuZCBub24gQU5TSQogICAgIHNlY3Rpb25zOiAxMCBmdW5jdGlvbnMgd2VyZSBhYnNlbnQgZnJvbSBub24gQU5TSSBzZWN0aW9uIGFuZCBub3QgZXhwb3J0ZWQKICAgICBmcm9tIFdpbmRvd3MgRExMcy4gRml4ZWQgdXAgbGliZWF5Lm51bSBmb3IgbmV3IGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGBvcGVuc3NsIHZlcnNpb24nIG91dHB1dCBsaW5lcyBjb25zaXN0ZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggV2luMzIgc3ltYm9sIGV4cG9ydCBsaXN0cyBmb3IgQklPIGZ1bmN0aW9uczogQWRkZWQKICAgICBCSU9fZ2V0X2V4X25ld19pbmRleCwgQklPX2dldF9leF9udW0sIEJJT19nZXRfZXhfZGF0YSBhbmQgQklPX3NldF9leF9kYXRhCiAgICAgdG8gbXMvbGliZWF5ezE2LDMyfS5kZWYuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNlY29uZCByb3VuZCBvZiBmaXhpbmcgdGhlIE9wZW5TU0wgcGVybC8gc3R1ZmYuIEl0IG5vdyBhdCBsZWFzdCBjb21waWxlZAogICAgIGZpbmUgdW5kZXIgVW5peCBhbmQgcGFzc2VzIHNvbWUgdHJpdmlhbCB0ZXN0cyBJJ3ZlIG5vdyBhZGRlZC4gQnV0IHRoZQogICAgIHdob2xlIHN0dWZmIGlzIGhvcnJpYmx5IGluY29tcGxldGUsIHNvIGEgUkVBRE1FLjFTVCB3aXRoIGEgZGlzY2xhaW1lciB3YXMKICAgICBhZGRlZCB0byBtYWtlIHN1cmUgbm8gb25lIGV4cGVjdHMgdGhhdCB0aGlzIHN0dWZmIHJlYWxseSB3b3JrcyBpbiB0aGUKICAgICBPcGVuU1NMIDAuOS4yIHJlbGVhc2UuICBBZGRpdGlvbmFsbHkgSSd2ZSBzdGFydGVkIHRvIGNsZWFuIHRoZSBYUyBzb3VyY2VzCiAgICAgdXAgYW5kIGZpeGVkIGEgZmV3IGxpdHRsZSBidWdzIGFuZCBpbmNvbnNpc3RlbmNpZXMgaW4gT3BlblNTTC57cG0seHN9IGFuZAogICAgIG9wZW5zc2xfYmlvLnhzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGdlbmVyYXRpb24gb2YgdHdvIHBhcnQgYWRkcmVzc2VzIGluIHBlcmwuCiAgICAgW0tlbmppIE1peWFrZSA8a2VuamlAbWl5YWtlLm9yZz4sIGludGVncmF0ZWQgYnkgQmVuIExhdXJpZV0KCiAgKikgQWRkIGNvbmZpZyBlbnRyeSBmb3IgTGludXggb24gTUlQUy4KICAgICBbSm9obiBUb2JleSA8anRvYmV5QGNoYW5uZWwxLmNvbT5dCgogICopIE1ha2UgbGlua3Mgd2hlbmV2ZXIgQ29uZmlndXJlIGlzIHJ1biwgdW5sZXNzIHdlIGFyZSBvbiBXaW5kb3plLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBQZXJtaXQgZXh0ZW5zaW9ucyB0byBiZSBhZGRlZCB0byBDUkxzIHVzaW5nIGNybF9zZWN0aW9uIGluIG9wZW5zc2wuY25mLgogICAgIEN1cnJlbnRseSBvbmx5IGlzc3VlckFsdE5hbWUgYW5kIEF1dGhvcml0eUtleUlkZW50aWZpZXIgbWFrZSBhbnkgc2Vuc2UKICAgICBpbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHVzZWZ1bCBrbHVkZ2UgdG8gYWxsb3cgcGFja2FnZSBtYWludGFpbmVycyB0byBzcGVjaWZ5IGNvbXBpbGVyIGFuZAogICAgIG90aGVyIHBsYXRmb3JtcyBkZXRhaWxzIG9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aG91dCBoYXZpbmcgdG8gcGF0Y2ggdGhlCiAgICAgQ29uZmlndXJlIHNjcmlwdCBldmVyeXRpbWU6IE9uZSBub3cgY2FuIHVzZSBgYHBlcmwgQ29uZmlndXJlCiAgICAgPGlkPjo8ZGV0YWlscz4nJywgaS5lLiBwbGF0Zm9ybSBpZHMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBkZXRhaWxzIGFwcGVuZGVkCiAgICAgdG8gdGhlbSAoc2VwZXJhdGVkIGJ5IGNvbG9ucykuIFRoaXMgaXMgdHJlYXRlZCBhcyB0aGVyZSB3b3VsZCBiZSBhIHN0YXRpYwogICAgIHByZS1jb25maWd1cmVkIGVudHJ5IGluIENvbmZpZ3VyZSdzICV0YWJsZSB1bmRlciBrZXkgPGlkPiB3aXRoIHZhbHVlCiAgICAgPGRldGFpbHM+IGFuZCBgYHBlcmwgQ29uZmlndXJlIDxpZD4nJyBpcyBjYWxsZWQuICBTbywgd2hlbiB5b3Ugd2FudCB0bwogICAgIHBlcmZvcm0gYSBxdWljayB0ZXN0LWNvbXBpbGUgdW5kZXIgRnJlZUJTRCAzLjEgd2l0aCBwZ2NjIGFuZCB3aXRob3V0CiAgICAgYXNzZW1ibGVyIHN0dWZmIHlvdSBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUgIkZyZWVCU0QtZWxmOnBnY2M6LU82Ojo6IicnCiAgICAgbm93LCB3aGljaCBvdmVycmlkZXMgdGhlIEZyZWVCU0QtZWxmIGVudHJ5IG9uLXRoZS1mbHkuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIERpc2FibGUgbmV3IFRMUzEgY2lwaGVyc3VpdGVzIGJ5IGRlZmF1bHQ6IHRoZXkgYXJlbid0IG9mZmljaWFsIHlldC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWxsb3cgRFNPIGZsYWdzIGxpa2UgLWZwaWMsIC1mUElDLCAtS1BJQyBldGMuIHRvIGJlIHNwZWNpZmllZAogICAgIG9uIHRoZSBgcGVybCBDb25maWd1cmUgLi4uJyBjb21tYW5kIGxpbmUuIFRoaXMgd2F5IG9uZSBjYW4gY29tcGlsZQogICAgIE9wZW5TU0wgbGlicmFyaWVzIHdpdGggUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAoUElDKSB3aGljaCBpcyBuZWVkZWQKICAgICBmb3IgbGlua2luZyBpdCBpbnRvIERTT3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFJlbWFya2FibHksIGV4cG9ydCBjaXBoZXJzIHdlcmUgdG90YWxseSBicm9rZW4gYW5kIG5vLW9uZSBoYWQgbm90aWNlZCEKICAgICBGaXhlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2xlYW5lZCB1cCB0aGUgTElDRU5TRSBkb2N1bWVudDogVGhlIG9mZmljaWFsIGNvbnRhY3QgZm9yIGFueSBsaWNlbnNlCiAgICAgcXVlc3Rpb25zIG5vdyBpcyB0aGUgT3BlblNTTCBjb3JlIHRlYW0gdW5kZXIgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgogICAgIEFuZCBhZGQgYSBwYXJhZ3JhcGggYWJvdXQgdGhlIGR1YWwtbGljZW5zZSBzaXR1YXRpb24gdG8gbWFrZSBzdXJlIHBlb3BsZQogICAgIHJlY29nbml6ZSB0aGF0IF9CT1RIXyB0aGUgT3BlblNTTCBsaWNlbnNlIF9BTkRfIHRoZSBTU0xlYXkgbGljZW5zZSBhcHBseQogICAgIHRvIHRoZSBPcGVuU1NMIHRvb2xraXQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEdlbmVyYWwgc291cmNlIHRyZWUgbWFrZWZpbGUgY2xlYW51cHM6IE1hZGUgYG1ha2luZyB4eHggaW4geXl5Li4uJwogICAgIGRpc3BsYXkgY29uc2lzdGVudCBpbiB0aGUgc291cmNlIHRyZWUgYW5kIHJlcGxhY2VkIGAvYmluL3JtJyBieSBgcm0nLgogICAgIEFkZGl0b25hbGx5IGNsZWFuZWQgdXAgdGhlIGBtYWtlIGxpbmtzJyB0YXJnZXQ6IFJlbW92ZSB1bm5lY2Vzc2FyeQogICAgIHNlbWljb2xvbnMsIHN1YnNlcXVlbnQgcmVkdW5kYW50IHJlbW92ZXMsIGlubGluZSBwb2ludC5zaCBpbnRvIG1rbGluay5zaAogICAgIHRvIHNwZWVkIHByb2Nlc3NpbmcgYW5kIG5vIGxvbmdlciBjbHV0dGVyIHRoZSBkaXNwbGF5IHdpdGggY29uZnVzaW5nCiAgICAgc3R1ZmYuIEluc3RlYWQgb25seSB0aGUgYWN0dWFsbHkgZG9uZSBsaW5rcyBhcmUgZGlzcGxheWVkLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBQZXJtaXQgbnVsbCBlbmNyeXB0aW9uIGNpcGhlcnN1aXRlcywgdXNlZCBmb3IgYXV0aGVudGljYXRpb24gb25seS4gSXQgdXNlZAogICAgIHRvIGJlIG5lY2Vzc2FyeSB0byBzZXQgdGhlIHByZXByb2Nlc3NvciBkZWZpbmUgU1NMX0FMTE9XX0VOVUxMIHRvIGRvIHRoaXMuCiAgICAgSXQgaXMgbm93IG5lY2Vzc2FyeSB0byBzZXQgU1NMX0ZPUkJJRF9FTlVMTCB0byBwcmV2ZW50IHRoZSB1c2Ugb2YgbnVsbAogICAgIGVuY3J5cHRpb24uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBhIGJ1bmNoIG9mIGZpeGVzIHRvIHRoZSBQS0NTIzcgc3R1ZmYuIEl0IHVzZWQgdG8gc29tZXRpbWVzIHJlb3JkZXIKICAgICBzaWduZWQgYXR0cmlidXRlcyB3aGVuIHZlcmlmeWluZyBzaWduYXR1cmVzICh0aGlzIHdvdWxkIGJyZWFrIHRoZW0pLCAKICAgICB0aGUgZGV0YWNoZWQgZGF0YSBlbmNvZGluZyB3YXMgd3JvbmcgYW5kIHB1YmxpYyBrZXlzIG9idGFpbmVkIHVzaW5nCiAgICAgWDUwOV9nZXRfcHVia2V5KCkgd2VyZW4ndCBmcmVlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGV4dCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQlVGRkVSIGZ1bmN0aW9ucy4gQWxzbyBhZGRlZCBhIHdvcmsgYXJvdW5kCiAgICAgdG8gYSBXaW45NSBjb25zb2xlIGJ1Zy4gVGhpcyB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBwYXNzd29yZCByZWFkIHN0dWZmOiB0aGUKICAgICBsYXN0IGNoYXJhY3RlciB0eXBlZCBnZXRzIGNhcnJpZWQgb3ZlciB0byB0aGUgbmV4dCBmcmVhZCgpLiBJZiB5b3Ugd2VyZSAKICAgICBnZW5lcmF0aW5nIGEgbmV3IGNlcnQgcmVxdWVzdCB1c2luZyAncmVxJyBmb3IgZXhhbXBsZSB0aGVuIHRoZSBsYXN0CiAgICAgY2hhcmFjdGVyIG9mIHRoZSBwYXNzcGhyYXNlIHdvdWxkIGJlIENSIHdoaWNoIHdvdWxkIHRoZW4gZW50ZXIgdGhlIGZpcnN0CiAgICAgZmllbGQgYXMgYmxhbmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgdGhlIG5ldyBgSW5jbHVkZXMgT3BlblNTTCBDcnlwdG9ncmFwaHkgU29mdHdhcmUnIGJ1dHRvbiBhcwogICAgIGRvYy9vcGVuc3NsX2J1dHRvbi57Z2lmLGh0bWx9IHdoaWNoIGlzIHNpbWlsYXIgaW4gc3R5bGUgdG8gdGhlIG9sZCBTU0xlYXkKICAgICBidXR0b24gYW5kIGNhbiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBiYXNlZCBvbiBPcGVuU1NMIHRvIHNob3cgdGhlCiAgICAgcmVsYXRpb25zaGlwIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuICAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlIGNvbmZ1c2luZyB2YXJpYWJsZXMgaW4gZnVuY3Rpb24gc2lnbmF0dXJlcyBpbiBmaWxlcwogICAgIHNzbC9zc2xfbGliLmMgYW5kIHNzbC9zc2wuaC4KICAgICBbTGVubmFydCBCb25nIDxsb2JAa3VsdGhlYS5zdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGluc3RhbGwgYnNzX2ZpbGUuYyB1bmRlciBQUkVGSVgvaW5jbHVkZS8KICAgICBbTGVubmFydCBCb25nIDxsb2JAa3VsdGhlYS5zdGFja2VuLmt0aC5zZT5dCgogICopIEdldCB0aGUgV2luMzIgY29tcGlsZSB3b3JraW5nIGFnYWluLiBNb2RpZnkgbWtkZWYucGwgc28gaXQgY2FuIGhhbmRsZQogICAgIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBmdW5jdGlvbiBwb2ludGVycyBhbmQgaGFzIHN1cHBvcnQgZm9yIE5UIHNwZWNpZmljCiAgICAgc3R1ZmYuIEZpeCBtazFtZi5wbCBhbmQgVkMtMzIucGwgdG8gc3VwcG9ydCBOVCBkaWZmZXJlbmNlcyBhbHNvLiBWYXJpb3VzCiAgICAgI2lmZGVmIFdJTjMyIGFuZCBXSU5OVHMgc3ByaW5rbGVkIGFib3V0IHRoZSBwbGFjZSBhbmQgc29tZSBjaGFuZ2VzIGZyb20KICAgICB1bnNpZ25lZCB0byBzaWduZWQgdHlwZXM6IHRoaXMgd2FzIGtpbGxpbmcgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBjZXJ0aWZpY2F0ZSBmaWxlIHRvIHN0YWNrIGZ1bmN0aW9ucywKICAgICBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKCkgYW5kCiAgICAgU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKS4gIFRoZXNlIGxhcmdlbHkgc3VwcGxhbnQKICAgICBTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZSgpLCBhbmQgY2FuIGJlIHVzZWQgdG8gYWRkIG11bHRpcGxlIGNlcnRzIGVhc2lseQogICAgIHRvIGEgc3RhY2sgKHVzdWFsbHkgdGhpcyBpcyB0aGVuIGhhbmRlZCB0byBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdCgpKS4KICAgICBUaGlzIG1lYW5zIHRoYXQgQXBhY2hlLVNTTCBhbmQgc2ltaWxhciBwYWNrYWdlcyBkb24ndCBoYXZlIHRvIG1lc3MgYXJvdW5kCiAgICAgdG8gYWRkIGFzIG1hbnkgQ0FzIGFzIHRoZXkgd2FudCB0byB0aGUgcHJlZmVycmVkIGxpc3QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEV4cGVyaW1lbnQgd2l0aCBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIEN1cnJlbnRseSBvbmx5IHBhcnRpYWxseSBhcHBsaWVkIHRvCiAgICAgc3NsL3NzbF9saWIuYy4KICAgICBTZWUgaHR0cDovL3d3dy5zdGFjay5ubC9+ZGltaXRyaS9kb3h5Z2VuL2luZGV4Lmh0bWwsIGFuZCBydW4gZG94eWdlbiB3aXRoCiAgICAgb3BlbnNzbC5kb3h5IGFzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCiAgICAgW0JlbiBMYXVyaWVdCiAgCiAgKikgR2V0IHJpZCBvZiByZW1haW5pbmcgQysrLXN0eWxlIGNvbW1lbnRzIHdoaWNoIHN0cmljdCBDIGNvbXBpbGVycyBoYXRlLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBwb2ludGVkIG91dCBieSBDYXJsb3MgQW1lbmd1YWxdCgogICopIENoYW5nZWQgQk5fUkVDVVJTSU9OIGluIGJuX21vbnQuYyB0byBCTl9SRUNVUlNJT05fTU9OVCBzbyBpdCBpcyBub3QKICAgICBjb21waWxlZCBpbiBieSBkZWZhdWx0OiBpdCBoYXMgcHJvYmxlbXMgd2l0aCBsYXJnZSBrZXlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIFNTTF94eHgoKSBmdW5jdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSB0ZW1wb3JhcnkgUlNBIGFuZAogICAgIERIIHByaXZhdGUga2V5cyBhbmQvb3IgY2FsbGJhY2sgZnVuY3Rpb25zIHdoaWNoIGRpcmVjdGx5IGNvcnJlc3BvbmQgdG8KICAgICB0aGVpciBTU0xfQ1RYX3h4eCgpIGNvdW50ZXJwYXJ0cyBidXQgd29yayBvbiBhIHBlci1jb25uZWN0aW9uIGJhc2lzLiBUaGlzCiAgICAgaXMgbmVlZGVkIGZvciBhcHBsaWNhdGlvbnMgd2hpY2ggaGF2ZSB0byBjb25maWd1cmUgY2VydGlmaWNhdGVzIG9uIGEKICAgICBwZXItY29ubmVjdGlvbiBiYXNpcyAoZS5nLiBBcGFjaGUrbW9kX3NzbCkgaW5zdGVhZCBvZiBhIHBlci1jb250ZXh0IGJhc2lzCiAgICAgKGUuZy4gc19zZXJ2ZXIpLiAKICAgICAgICBGb3IgdGhlIFJTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gaXMgbWFrZXMgbm8gZGlmZmVyZW5jZSwgYnV0CiAgICAgZm9yIHRoZSBEU0EgY2VydGlmaWNhdGUgc2l0dWF0aW9uIHRoaXMgZml4ZXMgdGhlICJubyBzaGFyZWQgY2lwaGVyIgogICAgIHByb2JsZW0gd2hlcmUgdGhlIE9wZW5TU0wgY2lwaGVyIHNlbGVjdGlvbiBwcm9jZWR1cmUgZmFpbGVkIGJlY2F1c2UgdGhlCiAgICAgdGVtcG9yYXJ5IGtleXMgd2VyZSBub3Qgb3ZlcnRha2VuIGZyb20gdGhlIGNvbnRleHQgYW5kIHRoZSBBUEkgcHJvdmlkZWQKICAgICBubyB3YXkgdG8gcmVjb25maWd1cmUgdGhlbS4gCiAgICAgICAgVGhlIG5ldyBmdW5jdGlvbnMgbm93IGxldCBhcHBsaWNhdGlvbnMgcmVjb25maWd1cmUgdGhlIHN0dWZmIGFuZCB0aGV5CiAgICAgYXJlIGluIGRldGFpbDogU1NMX25lZWRfdG1wX1JTQSwgU1NMX3NldF90bXBfcnNhLCBTU0xfc2V0X3RtcF9kaCwKICAgICBTU0xfc2V0X3RtcF9yc2FfY2FsbGJhY2sgYW5kIFNTTF9zZXRfdG1wX2RoX2NhbGxiYWNrLiAgQWRkaXRpb25hbGx5IGEgbmV3CiAgICAgbm9uLXB1YmxpYy1BUEkgZnVuY3Rpb24gc3NsX2NlcnRfaW5zdGFudGlhdGUoKSBpcyB1c2VkIGFzIGEgaGVscGVyCiAgICAgZnVuY3Rpb24gYW5kIGFsc28gdG8gcmVkdWNlIGNvZGUgcmVkdW5kYW5jeSBpbnNpZGUgc3NsX3JzYS5jLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNb3ZlIHNfc2VydmVyIC1kY2VydCBhbmQgLWRrZXkgb3B0aW9ucyBvdXQgb2YgdGhlIHVuZG9jdW1lbnRlZCBmZWF0dXJlCiAgICAgYXJlYSBiZWNhdXNlIHRoZXkgYXJlIHVzZWZ1bCBmb3IgdGhlIERTQSBzaXR1YXRpb24gYW5kIHNob3VsZCBiZQogICAgIHJlY29nbml6ZWQgYnkgdGhlIHVzZXJzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIGNpcGhlciBkZWNpc2lvbiBzY2hlbWUgZm9yIGV4cG9ydCBjaXBoZXJzOiB0aGUgZXhwb3J0IGJpdHMgYXJlCiAgICAgKm5vdCogd2l0aGluIFNTTF9NS0VZX01BU0sgb3IgU1NMX0FVVEhfTUFTSywgdGhleSBhcmUgd2l0aGluCiAgICAgU1NMX0VYUF9NQVNLLiAgU28sIHRoZSBvcmlnaW5hbCB2YXJpYWJsZSBoYXMgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZQogICAgIGFscmVhZHkgbWFza2VkIHZhcmlhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBGaXggJ3BvcnQnIHZhcmlhYmxlIGZyb20gYGludCcgdG8gYHVuc2lnbmVkIGludCcgaW4gY3J5cHRvL2Jpby9iX3NvY2suYwogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBDaGFuZ2UgdHlwZSBvZiBhbm90aGVyIG1kX2xlbiB2YXJpYWJsZSBpbiBwazdfZG9pdC5jOlBLQ1M3X2RhdGFGaW5hbCgpCiAgICAgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBiZWNhdXNlIGl0J3MgYSBsZW5ndGggYW5kIGluaXRpYWxpemVkIGJ5CiAgICAgRVZQX0RpZ2VzdEZpbmFsKCkgd2hpY2ggZXhwZWN0cyBhbiBgdW5zaWduZWQgaW50IConLgogICAgIFtSaWNoYXJkIExldml0dGUgPGxldml0dGVAc3RhY2tlbi5rdGguc2U+XQoKICAqKSBEb24ndCBoYXJkLWNvZGUgcGF0aCB0byBQZXJsIGludGVycHJldGVyIG9uIHNoZWJhbmcgbGluZSBvZiBDb25maWd1cmUKICAgICBzY3JpcHQuIEluc3RlYWQgdXNlIHRoZSB1c3VhbCBTaGVsbC0+UGVybCB0cmFuc2l0aW9uIHRyaWNrLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNYWtlIGBvcGVuc3NsIHg1MDkgLW5vb3V0IC1tb2R1bHVzJyBmdW5jdGlvbmFsIGFsc28gZm9yIERTQSBjZXJ0aWZpY2F0ZXMKICAgICAoaW4gYWRkaXRpb24gdG8gUlNBIGNlcnRpZmljYXRlcykgdG8gbWF0Y2ggdGhlIGJlaGF2aW91ciBvZiBgb3BlbnNzbCBkc2EKICAgICAtbm9vdXQgLW1vZHVsdXMnIGFzIGl0J3MgYWxyZWFkeSB0aGUgY2FzZSBmb3IgYG9wZW5zc2wgcnNhIC1ub291dAogICAgIC1tb2R1bHVzJy4gIEZvciBSU0EgdGhlIC1tb2R1bHVzIGlzIHRoZSByZWFsICJtb2R1bHVzIiB3aGlsZSBmb3IgRFNBCiAgICAgY3VycmVudGx5IHRoZSBwdWJsaWMga2V5IGlzIHByaW50ZWQgKGEgZGVjaXNpb24gd2hpY2ggd2FzIGFscmVhZHkgZG9uZSBieQogICAgIGBvcGVuc3NsIGRzYSAtbW9kdWx1cycgaW4gdGhlIHBhc3QpIHdoaWNoIHNlcnZlcyBhIHNpbWlsYXIgcHVycG9zZS4KICAgICBBZGRpdGlvbmFsbHkgdGhlIE5PX1JTQSBubyBsb25nZXIgY29tcGxldGVseSByZW1vdmVzIHRoZSB3aG9sZSAtbW9kdWx1cwogICAgIG9wdGlvbjsgaXQgbm93IG9ubHkgYXZvaWRzIHVzaW5nIHRoZSBSU0Egc3R1ZmYuIFNhbWUgYXBwbGllcyB0byBOT19EU0EKICAgICBub3csIHRvby4KICAgICBbUmFsZiBTLiAgRW5nZWxzY2hhbGxdCgogICopIEFkZCBBcm5lIEFuc3BlcidzIHJlbGlhYmxlIEJJTyAtIHRoaXMgaXMgYW4gZW5jcnlwdGVkLCBibG9jay1kaWdlc3RlZAogICAgIEJJTy4gU2VlIHRoZSBzb3VyY2UgKGNyeXB0by9ldnAvYmlvX29rLmMpIGZvciBtb3JlIGluZm8uCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIER1bXAgdGhlIG9sZCB5dWNreSByZXEgY29kZSB0aGF0IHRyaWVkIChhbmQgZmFpbGVkKSB0byBhbGxvdyByYXcgT0lEcwogICAgIHRvIGJlIGFkZGVkLiBOb3cgYm90aCAncmVxJyBhbmQgJ2NhJyBjYW4gdXNlIG5ldyBvYmplY3RzIGRlZmluZWQgaW4gdGhlCiAgICAgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvb2wgQklPIHRoYXQgZG9lcyBzeXNsb2cgKG9yIGV2ZW50IGxvZyBvbiBOVCkuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT4sIGludGVncmF0ZWQgYnkgQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG5ldyBUTFMgY2lwaGVyc3VpdGVzLCBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfUkM0XzU2X01ENSwKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfUkMyX0NCQ181Nl9NRDUgYW5kCiAgICAgVExTX1JTQV9FWFBPUlQ1Nl9XSVRIX0RFU19DQkNfU0hBLCBhcyBzcGVjaWZpZWQgaW4gIjU2LWJpdCBFeHBvcnQgQ2lwaGVyCiAgICAgU3VpdGVzIEZvciBUTFMiLCBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTAwLnR4dC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHByZWxpbWluYXJ5IGNvbmZpZyBpbmZvIGZvciBuZXcgZXh0ZW5zaW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBSU0FfTk9fUEFERElORyByZWFsbHkgdXNlIG5vIHBhZGRpbmcuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBHZW5lcmF0ZSBlcnJvcnMgd2hlbiBwcml2YXRlL3B1YmxpYyBrZXkgY2hlY2sgaXMgZG9uZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgT3ZlcmhhdWwgZm9yICdjcmwnIHV0aWxpdHkuIE5ldyBmdW5jdGlvbiBYNTA5X0NSTF9wcmludC4gUGFydGlhbCBzdXBwb3J0CiAgICAgZm9yIHNvbWUgQ1JMIGV4dGVuc2lvbnMgYW5kIG5ldyBvYmplY3RzIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlYWxseSBmaXggdGhlIEFTTjEgSU1QTElDSVQgYnVnIHRoaXMgdGltZS4uLiBQYXJ0aWFsIHN1cHBvcnQgZm9yIHByaXZhdGUKICAgICBrZXkgdXNhZ2UgZXh0ZW5zaW9uIGFuZCBmdWxsZXIgc3VwcG9ydCBmb3IgYXV0aG9yaXR5IGtleSBpZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgT0FFUCBlbmNyeXB0aW9uIGZvciB0aGUgT3BlblNTTCBjcnlwdG8gbGlicmFyeS4gT0FFUCBpcyB0aGUgaW1wcm92ZWQKICAgICBwYWRkaW5nIG1ldGhvZCBmb3IgUlNBLCB3aGljaCBpcyByZWNvbW1lbmRlZCBmb3IgbmV3IGFwcGxpY2F0aW9ucyBpbiBQS0NTCiAgICAgIzEgdjIuMCAoUkZDIDI0MzcsIE9jdG9iZXIgMTk5OCkuCiAgICAgT0FFUCAoT3B0aW1hbCBBc3ltbWV0cmljIEVuY3J5cHRpb24gUGFkZGluZykgaGFzIGJldHRlciB0aGVvcmV0aWNhbAogICAgIGZvdW5kYXRpb25zIHRoYW4gdGhlIGFkLWhvYyBwYWRkaW5nIHVzZWQgaW4gUEtDUyAjMSB2MS41LiBJdCBpcyBzZWN1cmUKICAgICBhZ2FpbnN0IEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBSU0EuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+LCByZWZvcm1hdHRlZCwgY29ycmVjdGVkIGFuZCBpbnRlZ3JhdGVkIGJ5CiAgICAgIEJlbiBMYXVyaWVdCgogICopIFVwZGF0ZXMgdG8gdGhlIG5ldyBTU0wgY29tcHJlc3Npb24gY29kZQogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEZpeCBzbyB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBpbiB0aGUgbWFzdGVyIHNlY3JldCwgd2hlbiBwYXNzZWQKICAgICB2aWEgUlNBLCBjaGVja3MgdGhhdCBpZiBUTFMgd2FzIHByb3Bvc2VkLCBidXQgd2Ugcm9sbCBiYWNrIHRvIFNTTHYzCiAgICAgKGJlY2F1c2UgdGhlIHNlcnZlciB3aWxsIG5vdCBhY2NlcHQgaGlnaGVyKSwgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIKICAgICBpcyAweDAzLDB4MDEsIG5vdCAweDAzLDB4MDAKICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBSdW4gZXh0ZW5zaXZlIG1lbW9yeSBsZWFrIGNoZWNrcyBvbiBTU0wgYXBwcy4gRml4ZWQgKmxvdHMqIG9mIG1lbW9yeQogICAgIGxlYWtzIGluIHNzbC8gcmVsYXRpbmcgdG8gbmV3IFg1MDlfZ2V0X3B1YmtleSgpIGJlaGF2aW91ci4gQWxzbyBmaXhlcwogICAgIGluIGFwcHMvIGFuZCBhbiB1bnJlbGF0ZWQgbGVhayBpbiBjcnlwdG8vZHNhL2RzYV92cmYuYwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFJBVyBleHRlbnNpb25zIHdoZXJlIGFuIGFyYml0cmFyeSBleHRlbnNpb24gY2FuIGJlCiAgICAgY3JlYXRlZCBieSBpbmNsdWRpbmcgaXRzIERFUiBlbmNvZGluZy4gU2VlIGFwcHMvb3BlbnNzbC5jbmYgZm9yCiAgICAgYW4gZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHN1cmUgbGF0ZXN0IFBlcmwgdmVyc2lvbnMgZG9uJ3QgaW50ZXJwcmV0IHNvbWUgZ2VuZXJhdGVkIEMgYXJyYXkKICAgICBjb2RlIGFzIFBlcmwgYXJyYXkgY29kZSBpbiB0aGUgY3J5cHRvL2Vyci9lcnJfZ2VuYy5wbCBzY3JpcHQuCiAgICAgW0xhcnMgV2ViZXIgPDN3ZWJlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgTW9kaWZ5IG1zL2RvX21zLmJhdCB0byBub3QgZ2VuZXJhdGUgYXNzZW1ibHkgbGFuZ3VhZ2UgbWFrZWZpbGVzIHNpbmNlCiAgICAgbm90IG1hbnkgcGVvcGxlIGhhdmUgdGhlIGFzc2VtYmxlci4gVmFyaW91cyBXaW4zMiBjb21waWxhdGlvbiBmaXhlcyBhbmQKICAgICB1cGRhdGUgdG8gdGhlIElOU1RBTEwuVzMyIGZpbGUgd2l0aCAoaG9wZWZ1bGx5KSBtb3JlIGFjY3VyYXRlIFdpbjMyCiAgICAgYnVpbGQgaW5zdHJ1Y3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBjb25maWd1cmUgc2NyaXB0ICdDb25maWd1cmUnIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGNyeXB0by9kYXRlLmgKICAgICBmaWxlIHVuZGVyIFdpbjMyIGFuZCBhbHNvIGJ1aWxkIHBlbS5oIGZyb20gcGVtLm9yZy4gTmV3IHNjcmlwdAogICAgIHV0aWwvbWtmaWxlcy5wbCB0byBjcmVhdGUgdGhlIE1JTkZPIGZpbGUgb24gZW52aXJvbm1lbnRzIHRoYXQgY2FuJ3QgZG8gYQogICAgICdtYWtlIGZpbGVzJzogcGVybCB1dGlsL21rZmlsZXMucGwgPk1JTkZPIHNob3VsZCB3b3JrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ham9yIHJld29yayBvZiBERVMgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBpbiB0aGUgcHVyc3VpdCBvZiBjb3JyZWN0bmVzcwogICAgIGFuZCBwdXJpdHkuIEFzIGEgcmVzdWx0LCBtYW55IGV2aWwgY2FzdHMgZXZhcG9yYXRlZCwgYW5kIHNvbWUgd2VpcmRuZXNzLAogICAgIHRvby4gWW91IG1heSBmaW5kIHRoaXMgY2F1c2VzIHdhcm5pbmdzIGluIHlvdXIgY29kZS4gWmFwcGluZyB5b3VyIGV2aWwKICAgICBjYXN0cyB3aWxsIHByb2JhYmx5IGZpeCB0aGVtLiBNb3N0bHkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBmb3IgYSB0eXBvIGluIGFzbjEuaC4gQnVnIGZpeCB0byBvYmplY3QgY3JlYXRpb24gc2NyaXB0CiAgICAgb2JqX2RhdC5wbC4gSXQgY29uc2lkZXJlZCBhIHplcm8gaW4gYW4gb2JqZWN0IGRlZmluaXRpb24gdG8gbWVhbgogICAgICJlbmQgb2Ygb2JqZWN0Ijogbm9uZSBvZiB0aGUgb2JqZWN0cyBpbiBvYmplY3RzLmggaGF2ZSBhbnkgemVyb3MKICAgICBzbyBpdCB3YXNuJ3Qgc3BvdHRlZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBFcndhbm4gQUJBTEVBIDxlYWJhbGVhQGNlcnRwbHVzLmNvbT5dCgogICopIEFkZCBzdXBwb3J0IGZvciBUcmlwbGUgREVTIENpcGhlciBCbG9jayBDaGFpbmluZyB3aXRoIE91dHB1dCBGZWVkYmFjawogICAgIE1hc2tpbmcgKENCQ00pLiBJbiB0aGUgYWJzZW5jZSBvZiB0ZXN0IHZlY3RvcnMsIHRoZSBiZXN0IEkgaGF2ZSBiZWVuIGFibGUKICAgICB0byBkbyBpcyBjaGVjayB0aGF0IHRoZSBkZWNyeXB0IHVuZG9lcyB0aGUgZW5jcnlwdCwgc28gZmFyLiBTZW5kIG1lIHRlc3QKICAgICB2ZWN0b3JzIGlmIHlvdSBoYXZlIHRoZW0uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvcnJlY3QgY2FsY3VsYXRpb24gb2Yga2V5IGxlbmd0aCBmb3IgZXhwb3J0IGNpcGhlcnMgKHRvbyBtdWNoIHNwYWNlIHdhcwogICAgIGFsbG9jYXRlZCBmb3IgbnVsbCBjaXBoZXJzKS4gVGhpcyBoYXMgbm90IGJlZW4gdGVzdGVkIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNb2RpZmljYXRpb25zIHRvIHRoZSBta2RlZi5wbCBmb3IgV2luMzIgREVGIGZpbGUgY3JlYXRpb24uIFRoZSB1c2FnZQogICAgIG1lc3NhZ2UgaXMgbm93IGNvcnJlY3QgKGl0IHVuZGVyc3RhbmRzICJjcnlwdG8iIGFuZCAic3NsIiBvbiBpdHMKICAgICBjb21tYW5kIGxpbmUpLiBUaGVyZSBpcyBhbHNvIG5vdyBhbiAidXBkYXRlIiBvcHRpb24uIFRoaXMgd2lsbCB1cGRhdGUKICAgICB0aGUgdXRpbC9zc2xlYXkubnVtIGFuZCB1dGlsL2xpYmVheS5udW0gZmlsZXMgd2l0aCBhbnkgbmV3IGZ1bmN0aW9ucy4KICAgICBJZiB5b3UgZG8gYTogCiAgICAgcGVybCB1dGlsL21rZGVmLnBsIGNyeXB0byBzc2wgdXBkYXRlCiAgICAgaXQgd2lsbCB1cGRhdGUgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPdmVyaGF1bGVkIHRoZSBQZXJsIGludGVyZmFjZSAocGVybC8qKToKICAgICAtIHBvcnRlZCBCTiBzdHVmZiB0byBPcGVuU1NMJ3MgZGlmZmVyZW50IEJOIGxpYnJhcnkKICAgICAtIG1hZGUgdGhlIHBlcmwvIHNvdXJjZSB0cmVlIENWUy1hd2FyZQogICAgIC0gcmVuYW1lZCB0aGUgcGFja2FnZSBmcm9tIFNTTGVheSB0byBPcGVuU1NMICh0aGUgZmlsZXMgc3RpbGwgY29udGFpbgogICAgICAgdGhlaXIgaGlzdG9yeSBiZWNhdXNlIEkndmUgY29waWVkIHRoZW0gaW4gdGhlIHJlcG9zaXRvcnkpCiAgICAgLSByZW1vdmVkIG9ic29sZXRlIGZpbGVzICh0aGUgdGVzdCBzY3JpcHRzIHdpbGwgYmUgcmVwbGFjZWQKICAgICAgIGJ5IGJldHRlciBUZXN0OjpIYXJuZXNzIHZhcmlhbnRzIGluIHRoZSBmdXR1cmUpCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpcnN0IGN1dCBmb3IgYSB2ZXJ5IGNvbnNlcnZhdGl2ZSBzb3VyY2UgdHJlZSBjbGVhbnVwOgogICAgIDEuIG1lcmdlIHZhcmlvdXMgb2Jzb2xldGUgcmVhZG1lIHRleHRzIGludG8gZG9jL3NzbGVheS50eHQKICAgICB3aGVyZSB3ZSBjb2xsZWN0IHRoZSBvbGQgZG9jdW1lbnRzIGFuZCByZWFkbWUgdGV4dHMuCiAgICAgMi4gcmVtb3ZlIHRoZSBmaXJzdCBwYXJ0IG9mIGZpbGVzIHdoZXJlIEknbSBhbHJlYWR5IHN1cmUgdGhhdCB3ZSBubwogICAgIGxvbmdlciBuZWVkIHRoZW0gYmVjYXVzZSBvZiB0aHJlZSByZWFzb25zOiBlaXRoZXIgdGhleSBhcmUganVzdCB0ZW1wb3JhcnkKICAgICBmaWxlcyB3aGljaCB3ZXJlIGxlZnQgYnkgRXJpYyBvciB0aGV5IGFyZSBwcmVzZXJ2ZWQgb3JpZ2luYWwgZmlsZXMgd2hlcmUKICAgICBJJ3ZlIHZlcmlmaWVkIHRoYXQgdGhlIGRpZmYgaXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIENWUyB2aWEgImN2cyBkaWZmCiAgICAgLXJTU0xlYXlfMF84XzFiIiBvciB0aGV5IHdlcmUgcmVuYW1lZCAoYXMgaXQgd2FzIGRlZmluaXRlbHkgdGhlIGNhc2UgZm9yCiAgICAgdGhlIGNyeXB0by9tZC8gc3R1ZmYpLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBNb3JlIGV4dGVuc2lvbiBjb2RlLiBJbmNvbXBsZXRlIHN1cHBvcnQgZm9yIHN1YmplY3QgYW5kIGlzc3VlciBhbHQKICAgICBuYW1lLCBpc3N1ZXIgYW5kIGF1dGhvcml0eSBrZXkgaWQuIENoYW5nZSB0aGUgaTJ2IGZ1bmN0aW9uIHBhcmFtZXRlcnMKICAgICBhbmQgYWRkIGFuIGV4dHJhICdjcmwnIHBhcmFtZXRlciBpbiB0aGUgWDUwOVYzX0NUWCBzdHJ1Y3R1cmU6IGd1ZXNzCiAgICAgd2hhdCB0aGF0J3MgZm9yIDotKSBGaXggdG8gQVNOMSBtYWNybyB3aGljaCBtZXNzZWQgdXAKICAgICBJTVBMSUNJVCB0YWcgYW5kIGFkZCBmX2VudW0uYyB3aGljaCBhZGRzIGEyaSwgaTJhIGZvciBFTlVNRVJBVEVELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIEVOVU1FUkFURUQgdHlwZS4gVGhpcyBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIHRoZQogICAgIElOVEVHRVIgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9uLCBFVlBfTURfQ1RYX2NvcHkoKSB0byByZXBsYWNlIGZyZXF1ZW50IHVzZSBvZiBtZW1jcHkuCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgTWFrZSBzdXJlIGBtYWtlIHJlaGFzaCcgdGFyZ2V0IHJlYWxseSBmaW5kcyB0aGUgYG9wZW5zc2wnIHByb2dyYW0uCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIE1hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBTcXVlZXplIGFub3RoZXIgNyUgb2Ygc3BlZWQgb3V0IG9mIE1ENSBhc3NlbWJsZXIsIGF0IGxlYXN0IG9uIGEgUDIuIEknZAogICAgIGxpa2UgdG8gaGVhciBhYm91dCBpdCBpZiB0aGlzIHNsb3dzIGRvd24gb3RoZXIgcHJvY2Vzc29ycy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIEN5Z1dpbjMyIHBsYXRmb3JtIGluZm9ybWF0aW9uIHRvIENvbmZpZ3VyZSBzY3JpcHQuCiAgICAgW0FsYW4gQmF0aWUgPGJhdGllQGFhaHouamYuaW50ZWwuY29tPl0KCiAgKikgRml4ZWQgbXMvMzJhbGwuYmF0IHNjcmlwdDogYG5vX2FzbScgLT4gYG5vLWFzbScKICAgICBbUmFpbmVyIFcuIEdlcmxpbmcgPGdlcmxpbmdAbXBnLWd2Lm1wZy5kZT5dCiAgCiAgKikgTmV3IHByb2dyYW0gbnNlcSB0byBtYW5pcHVsYXRlIG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSBjcmwycGtjczcgc28gaXQgc3VwcG9ydHMgbXVsdGlwbGUgLWNlcnRmaWxlIGFyZ3VtZW50cy4gRml4IGEKICAgICBmZXcgdHlwb3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gQk4gY29kZS4gIFByZXZpb3VzbHkgdGhlIGRlZmF1bHQgd2FzIHRvIGRlZmluZSBCTl9SRUNVUlNJT04KICAgICBidXQgdGhlIEJOIGNvZGUgaGFkIHNvbWUgcHJvYmxlbXMgdGhhdCB3b3VsZCBjYXVzZSBmYWlsdXJlcyB3aGVuCiAgICAgZG9pbmcgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEFTTjEgYW5kIFBFTSBjb2RlIHRvIHN1cHBvcnQgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzZXZlcmFsIFBLSVggYW5kIHByaXZhdGUgZXh0ZW5kZWQga2V5IHVzYWdlIE9JRHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSAnY2EnIHByb2dyYW0gdG8gaGFuZGxlIHRoZSBuZXcgZXh0ZW5zaW9uIGNvZGUuIE1vZGlmeQogICAgIG9wZW5zc2wuY25mIGZvciBuZXcgZXh0ZW5zaW9uIGZvcm1hdCwgYWRkIGNvbW1lbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vcmUgWDUwOSBWMyBjaGFuZ2VzLiBGaXggdHlwbyBpbiB2M19iaXRzdHIuYy4gQWRkIHN1cHBvcnQgdG8gJ3JlcScKICAgICBhbmQgYWRkIGEgc2FtcGxlIHRvIG9wZW5zc2wuY25mIHNvIHJlcSAteDUwOSBub3cgYWRkcyBhcHByb3ByaWF0ZQogICAgIENBIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29udGludWVkIFg1MDkgVjMgY2hhbmdlcy4gQWRkIHRvIG90aGVyIG1ha2VmaWxlcywgaW50ZWdyYXRlIHdpdGggdGhlCiAgICAgZXJyb3IgY29kZSwgYWRkIGluaXRpYWwgc3VwcG9ydCB0byBYNTA5X3ByaW50KCkgYW5kIHg1MDkgYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGFrZXMgYSBkZWVwIGJyZWF0aCBhbmQgc3RhcnQgYWRkZGluZyBYNTA5IFYzIGV4dGVuc2lvbiBzdXBwb3J0IGNvZGUuIEFkZAogICAgIGZpbGVzIGluIGNyeXB0by94NTA5djMuIE1vdmUgb3JpZ2luYWwgc3R1ZmYgdG8gY3J5cHRvL3g1MDl2My9vbGQuIEFsbCB0aGlzCiAgICAgc3R1ZmYgaXMgY3VycmVudGx5IGlzb2xhdGVkIGFuZCBpc24ndCBldmVuIGNvbXBpbGVkIHlldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51aW5nIHBhdGNoZXMgZm9yIEdlbmVyYWxpemVkVGltZS4gRml4IHVwIGNlcnRpZmljYXRlIGFuZCBDUkwKICAgICBBU04xIHRvIHVzZSBBU04xX1RJTUUgYW5kIG1vZGlmeSBwcmludCByb3V0aW5lcyB0byB1c2UgQVNOMV9USU1FX3ByaW50LgogICAgIFJlbW92ZWQgdGhlIHZlcnNpb25zIGNoZWNrIGZyb20gWDUwOSByb3V0aW5lcyB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9uczoKICAgICB0aGlzIGFsbG93cyBjZXJ0YWluIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBkb24ndCBzZXQgdGhlIHZlcnNpb24KICAgICBwcm9wZXJseSB0byBiZSBwcm9jZXNzZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGVhbCB3aXRoIGlycml0YXRpbmcgc2hpdCB0byBkbyB3aXRoIGRlcGVuZGVuY2llcywgaW4gWUFBSFcgKFlldCBBbm90aGVyCiAgICAgQWQgSG9jIFdheSkgLSBNYWtlZmlsZS5zc2xzIG5vdyBhbGwgY29udGFpbiBsb2NhbCBkZXBlbmRlbmNpZXMsIHdoaWNoCiAgICAgY2FuIHN0aWxsIGJlIHJlZ2VuZXJhdGVkIHdpdGggIm1ha2UgZGVwZW5kIi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU3BlbGxpbmcgbWlzdGFrZSBpbiBDIHZlcnNpb24gb2YgQ0FTVC0xMjguCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkIGJ5IEplcmVteSBIeWx0b24gPGplcmVteUBjbnJpLnJlc3Rvbi52YS51cz5dCgogICopIENoYW5nZXMgdG8gdGhlIGVycm9yIGdlbmVyYXRpb24gY29kZS4gVGhlIHBlcmwgc2NyaXB0IGVyci1jb2RlLnBsIAogICAgIG5vdyByZWFkcyBpbiB0aGUgb2xkIGVycm9yIGNvZGVzIGFuZCByZXRhaW5zIHRoZSBvbGQgbnVtYmVycywgb25seQogICAgIGFkZGluZyBuZXcgb25lcyBpZiBuZWNlc3NhcnkuIEl0IGFsc28gb25seSBjaGFuZ2VzIHRoZSAuZXJyIGZpbGVzIGlmIG5ldwogICAgIGNvZGVzIGFyZSBhZGRlZC4gVGhlIG1ha2VmaWxlcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gb25seSBpbnNlcnQgZXJyb3JzCiAgICAgd2hlbiBuZWVkZWQgKHRvIGF2b2lkIG5lZWRsZXNzbHkgbW9kaWZ5aW5nIGhlYWRlciBmaWxlcykuIFRoaXMgaXMgZG9uZQogICAgIGJ5IG9ubHkgaW5zZXJ0aW5nIGVycm9ycyBpZiB0aGUgLmVyciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGF1dG8gZ2VuZXJhdGVkCiAgICAgQyBmaWxlLiBUbyByZWJ1aWxkIGFsbCB0aGUgZXJyb3IgY29kZXMgZnJvbSBzY3JhdGNoICh0aGUgb2xkIGJlaGF2aW91cikKICAgICBlaXRoZXIgbW9kaWZ5IGNyeXB0by9NYWtlZmlsZS5zc2wgdG8gcGFzcyB0aGUgLXJlZ2VuIGZsYWcgdG8gZXJyX2NvZGUucGwKICAgICBvciBkZWxldGUgYWxsIHRoZSAuZXJyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENBU1QtMTI4IHdhcyBpbmNvcnJlY3RseSBpbXBsZW1lbnRlZCBmb3Igc2hvcnQga2V5cy4gVGhlIEMgdmVyc2lvbiBoYXMKICAgICBiZWVuIGZpeGVkLCBidXQgaXMgdW50ZXN0ZWQuIFRoZSBhc3NlbWJsZXIgdmVyc2lvbnMgYXJlIGFsc28gZml4ZWQsIGJ1dAogICAgIG5ldyBhc3NlbWJsZXIgSEFTIE5PVCBCRUVOIEdFTkVSQVRFRCBGT1IgV0lOMzIgLSB0aGUgTWFrZWZpbGUgbmVlZHMgZml4aW5nCiAgICAgdG8gcmVnZW5lcmF0ZSBpdCBpZiBuZWVkZWQuCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkICh3aXRoIGZpeCBmb3IgQyB2ZXJzaW9uKSBieSBKdW4taWNoaXJvIGl0b2p1bgogICAgICBIYWdpbm8gPGl0b2p1bkBrYW1lLm5ldD5dCgogICopIEZpbGUgd2FzIG9wZW5lZCBpbmNvcnJlY3RseSBpbiByYW5kZmlsZS5jLgogICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBCZWdpbm5pbmcgb2Ygc3VwcG9ydCBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBkMmksIGkyZCwgY2hlY2sgYW5kIHByaW50CiAgICAgZnVuY3Rpb25zLiBBbHNvIEFTTjFfVElNRSBzdWl0ZSB3aGljaCBpcyBhIENIT0lDRSBvZiBVVENUaW1lIG9yCiAgICAgR2VuZXJhbGl6ZWRUaW1lLiBBU04xX1RJTUUgaXMgdGhlIHByb3BlciB0eXBlIHVzZWQgaW4gY2VydGlmaWNhdGVzIGV0CiAgICAgYWw6IGl0J3MganVzdCBhbG1vc3QgYWx3YXlzIGEgVVRDVGltZS4gTm90ZSB0aGlzIHBhdGNoIGFkZHMgbmV3IGVycm9yCiAgICAgY29kZXMgc28gZG8gYSAibWFrZSBlcnJvcnMiIGlmIHRoZXJlIGFyZSBwcm9ibGVtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3JyZWN0IExpbnV4IDEgcmVjb2duaXRpb24gaW4gY29uZmlnLgogICAgIFtVbGYgTfZsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBSZW1vdmUgcG9pbnRsZXNzIE1ENSBoYXNoIHdoZW4gdXNpbmcgRFNBIGtleXMgaW4gY2EuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBHZW5lcmF0ZSBhbiBlcnJvciBpZiBnaXZlbiBhbiBlbXB0eSBzdHJpbmcgYXMgYSBjZXJ0IGRpcmVjdG9yeS4gQWxzbwogICAgIGdlbmVyYXRlIGFuIGVycm9yIGlmIGhhbmRlZCBOVUxMIChwcmV2aW91c2x5IHJldHVybmVkIDAgdG8gaW5kaWNhdGUgYW4KICAgICBlcnJvciwgYnV0IGRpZG4ndCBzZXQgb25lKS4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFNTTCBtZXRob2RzLiBNYWtlIFNTTF93cml0ZSdzIGJ1ZmZlciBjb25zdCwgYXQgbGFzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBkdW1teSBmdW5jdGlvbiBCTl9yZWZfbW9kX2V4cCgpIGluIHJzYXJlZi5jIHRvIGhhdmUgdGhlIGNvcnJlY3QKICAgICBwYXJhbWV0ZXJzLiBUaGlzIHdhcyBjYXVzaW5nIGEgd2FybmluZyB3aGljaCBraWxsZWQgb2ZmIHRoZSBXaW4zMiBjb21waWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBDKysgc3R5bGUgY29tbWVudHMgZnJvbSBjcnlwdG8vYm4vYm5fbG9jYWwuaC4KICAgICBbTmVpbCBDb3N0aWdhbiA8bmVpbC5jb3N0aWdhbkBjZWxvY29tLmNvbT5dCgogICopIFRoZSBmdW5jdGlvbiBPQkpfdHh0Mm5pZCB3YXMgYnJva2VuLiBJdCB3YXMgc3VwcG9zZWQgdG8gcmV0dXJuIGEgbmlkCiAgICAgYmFzZWQgb24gYSB0ZXh0IHN0cmluZywgbG9va2luZyB1cCBzaG9ydCBhbmQgbG9uZyBuYW1lcyBhbmQgZmluYWxseQogICAgICJkb3QiIGZvcm1hdC4gVGhlICJkb3QiIGZvcm1hdCBzdHVmZiBkaWRuJ3Qgd29yay4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgT0JKX3R4dDJvYmogdG8gZG8gdGhlIHNhbWUgYnV0IHJldHVybiBhbiBBU04xX09CSkVDVCBhbmQgcmV3cm90ZSAKICAgICBPQkpfdHh0Mm5pZCB0byB1c2UgaXQuIE9CSl90eHQyb2JqIGNhbiBhbHNvIHJldHVybiBvYmplY3RzIGV2ZW4gaWYgdGhlCiAgICAgT0lEIGlzIG5vdCBwYXJ0IG9mIHRoZSB0YWJsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdG90eXBlcyB0byBYNTA5IGxvb2t1cC92ZXJpZnkgbWV0aG9kcywgZml4aW5nIGEgYnVnIGluCiAgICAgWDUwOV9MT09LVVBfYnlfYWxpYXMoKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgU29ydCBvcGVuc3NsIGZ1bmN0aW9ucyBieSBuYW1lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZXQgdGhlIGdlbmRzYSBwcm9ncmFtIHdvcmtpbmcgKGhvcGVmdWxseSkgYW5kIGFkZCBpdCB0byBhcHAgbGlzdC4gUmVtb3ZlCiAgICAgZW5jcnlwdGlvbiBmcm9tIHNhbXBsZSBEU0Ega2V5cyAoaW4gY2FzZSBhbnlvbmUgaXMgaW50ZXJlc3RlZCB0aGUgcGFzc3dvcmQKICAgICB3YXMgIjEyMzQiKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIF9hbGxfICpfZnJlZSBmdW5jdGlvbnMgYWNjZXB0IGEgTlVMTCBwb2ludGVyLgogICAgIFtGcmFucyBIZXltYW5zIDxmaGV5bWFuc0Bpc2FzZXJ2ZXIuYmU+XQoKICAqKSBJZiBhIERIIGtleSBpcyBnZW5lcmF0ZWQgaW4gczNfc3J2ci5jLCBkb24ndCBibG93IGl0IGJ5IHRyeWluZyB0byB1c2UKICAgICBOVUxMIHBvaW50ZXJzLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgc19zZXJ2ZXIgc2hvdWxkIHNlbmQgdGhlIENBZmlsZSBhcyBhY2NlcHRhYmxlIENBcywgbm90IGl0cyBvd24gY2VydC4KICAgICBbQm9kbyBNb2VsbGVyIDwzbW9lbGxlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgRG9uJ3QgYmxvdyBpdCBmb3IgbnVtZXJpYyAtbmV3a2V5IGFyZ3VtZW50cyB0byBhcHBzL3JlcS4KICAgICBbQm9kbyBNb2VsbGVyIDwzbW9lbGxlckBpbmZvcm1hdGlrLnVuaS1oYW1idXJnLmRlPl0KCiAgKikgVGVtcCBrZXkgImZvciBleHBvcnQiIHRlc3RzIHdlcmUgd3JvbmcgaW4gczNfc3J2ci5jLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZSBmb3IgdGVtcCBrZXkgY2FsbGJhY2sgZnVuY3Rpb25zCiAgICAgU1NMX0NUWF9zZXRfdG1wX3tyc2EsZGh9X2NhbGxiYWNrKCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREhfZnJlZSgpIHRvbGVyYXRlIGJlaW5nIHBhc3NlZCBhIE5VTEwgcG9pbnRlciAobGlrZSBSU0FfZnJlZSgpIGFuZAogICAgIERTQV9mcmVlKCkpLiBNYWtlIFg1MDlfUFVCS0VZX3NldCgpIGNoZWNrIGZvciBlcnJvcnMgaW4gZDJpX1B1YmxpY0tleSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFg1MDlfbmFtZV9hZGRfZW50cnkoKSBmcmVlZCB0aGUgd3JvbmcgdGhpbmcgYWZ0ZXIgYW4gZXJyb3IuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIHJzYV9lYXkuYyB3b3VsZCBhdHRlbXB0IHRvIGZyZWUgYSBOVUxMIGNvbnRleHQuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19zX3NvY2tldCgpIGhhZCBhIGJyb2tlbiBzaG91bGRfcmV0cnkoKSBvbiBXaW5kb3plLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBCSU9fZl9idWZmZXIoKSBkaWRuJ3QgcGFzcyBvbiBCSU9fQ1RSTF9GTFVTSC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgTWFrZSBzdXJlIHRoZSBhbHJlYWR5IGV4aXN0aW5nIFg1MDlfU1RPUkUtPmRlcHRoIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkCiAgICAgaW4gWDUwOV9TVE9SRV9uZXcoKSwgYnV0IGRvY3VtZW50IHRoZSBmYWN0IHRoYXQgdGhpcyB2YXJpYWJsZSBpcyBzdGlsbAogICAgIHVudXNlZCBpbiB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgdmFyaW91cyBsaWJyYXJ5IGFuZCBhcHBzIGZpbGVzIHRvIGZyZWUgdXAgcGtleXMgb2J0YWluZWQgZnJvbQogICAgIFg1MDlfUFVCS0VZX2dldCgpIGV0IGFsLiBBbHNvIGFsbG93IHg1MDkuYyB0byBoYW5kbGUgbmV0c2NhcGUgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggcmVmZXJlbmNlIGNvdW50aW5nIGluIFg1MDlfUFVCS0VZX2dldCgpLiBUaGlzIG1ha2VzCiAgICAgZGVtb3MvbWF1cmljZS9leGFtcGxlMi5jIHdvcmssIGFtb25nc3Qgb3RoZXJzLCBwcm9iYWJseS4KICAgICBbU3RldmUgSGVuc29uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBGaXJzdCBjdXQgb2YgYSBjbGVhbnVwIGZvciBhcHBzLy4gRmlyc3QgdGhlIGBzc2xlYXknIHByb2dyYW0gaXMgbm93IG5hbWVkCiAgICAgYG9wZW5zc2wnIGFuZCBzZWNvbmQsIHRoZSBzaG9ydGN1dCBzeW1saW5rcyBmb3IgdGhlIGBvcGVuc3NsIDxjb21tYW5kPicKICAgICBhcmUgbm8gbG9uZ2VyIGNyZWF0ZWQuIFRoaXMgd2F5IHdlIGhhdmUgYSBzaW5nbGUgYW5kIGNvbnNpc3RlbnQgY29tbWFuZAogICAgIGxpbmUgaW50ZXJmYWNlIGBvcGVuc3NsIDxjb21tYW5kPicsIHNpbWlsYXIgdG8gYGN2cyA8Y29tbWFuZD4nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBQYXVsIFN1dHRvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgY2EuYzogbW92ZSB0ZXN0IGZvciBEU0Ega2V5cyBpbnNpZGUgI2lmbmRlZiBOT19EU0EuIE1ha2UgcHVia2V5CiAgICAgQklUIFNUUklORyB3cmFwcGVyIGFsd2F5cyBoYXZlIHplcm8gdW51c2VkIGJpdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIENBLnBsLCBwZXJsIHZlcnNpb24gb2YgQ0Euc2gsIGFkZCBleHRlbmRlZCBrZXkgdXNhZ2UgT0lELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIHRvcC1sZXZlbCBJTlNUQUxMIGRvY3VtZW50YXRpb24gZWFzaWVyIHRvIHVuZGVyc3RhbmQuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBNYWtlZmlsZXMgdXBkYXRlZCB0byBleGl0IGlmIGFuIGVycm9yIG9jY3VycyBpbiBhIHN1Yi1kaXJlY3RvcnkKICAgICBtYWtlIChpbmNsdWRpbmcgaWYgdXNlciBwcmVzc2VzIF5DKSBbUGF1bCBTdXR0b25dCgogICopIE1ha2UgTW9udGdvbWVyeSBjb250ZXh0IHN0dWZmIGV4cGxpY2l0IGluIFJTQSBkYXRhIHN0cnVjdHVyZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGJ1aWxkIG9yZGVyIG9mIHBlbSBhbmQgZXJyIHRvIGFsbG93IGZvciBnZW5lcmF0ZWQgcGVtLmguCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCByZW51bWJlcmluZyBidWcgaW4gWDUwOV9OQU1FX2RlbGV0ZV9lbnRyeSgpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbmhhbmNlZCB0aGUgZXJyLWlucy5wbCBzY3JpcHQgc28gaXQgbWFrZXMgdGhlIGVycm9yIGxpYnJhcnkgbnVtYmVyIAogICAgIGdsb2JhbCBhbmQgY2FuIGFkZCBhIGxpYnJhcnkgbmFtZS4gVGhpcyBpcyBuZWVkZWQgZm9yIGV4dGVybmFsIEFTTjEgYW5kCiAgICAgb3RoZXIgZXJyb3IgbGlicmFyaWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVkIHNrX2luc2VydCB3aGljaCBuZXZlciB3b3JrZWQgcHJvcGVybHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IEFTTjEgbWFjcm9zIHNvIHRoZXkgY2FuIGhhbmRsZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1dGVkIAogICAgIEVYUExJQ0lUIHRhZ3MuIFNvbWUgbm9uIHN0YW5kYXJkIGNlcnRpZmljYXRlcyB1c2UgdGhlc2U6IHRoZXkgY2FuIG5vdwogICAgIGJlIHJlYWQgaW4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2VkIHRoZSB2YXJpb3VzIG9sZC9vYnNvbGV0ZSBTU0xlYXkgZG9jdW1lbnRhdGlvbiBmaWxlcyAoZG9jL3h4eC5kb2MpCiAgICAgaW50byBhIHNpbmdsZSBkb2Mvc3NsZWF5LnR4dCBidW5kbGUuIFRoaXMgd2F5IHRoZSBpbmZvcm1hdGlvbiBpcyBzdGlsbAogICAgIHByZXNlcnZlZCBidXQgbm8gbG9uZ2VyIG1lc3NlcyB1cCB0aGlzIGRpcmVjdG9yeS4gTm93IGl0J3MgbmV3IHJvb20gZm9yCiAgICAgdGhlIG5ldyBzZXQgb2YgZG9jdW1lbmF0aW9uIGZpbGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBTRVRzIHdlcmUgaW5jb3JyZWN0bHkgREVSIGVuY29kZWQuIFRoaXMgd2FzIGEgbWFqb3IgcGFpbiwgYmVjYXVzZSB0aGV5CiAgICAgc2hhcmVkIGNvZGUgd2l0aCBTRVFVRU5DRXMsIHdoaWNoIGFyZW4ndCBjb2RlZCB0aGUgc2FtZS4gVGhpcyBtZWFucyB0aGF0CiAgICAgYWxtb3N0IGV2ZXJ5dGhpbmcgdG8gZG8gd2l0aCBTRVRzIG9yIFNFUVVFTkNFcyBoYXMgZWl0aGVyIGNoYW5nZWQgbmFtZSBvcgogICAgIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgW0JlbiBMYXVyaWUsIGJhc2VkIG9uIGEgcGFydGlhbCBmaXggYnkgR1AgSmF5YW4gPGdwQG5zai5jby5qcD5dCgogICopIEZpeCB0ZXN0IGRhdGEgdG8gd29yayB3aXRoIHRoZSBhYm92ZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBSU0EgaGVhZGVyIGRlY2xhcmF0aW9ucyB0aGF0IGhpZCBhIGJ1ZyBJIGZpeGVkIGluIDAuOS4wYiBidXQKICAgICB3YXMgYWxyZWFkeSBmaXhlZCBieSBFcmljIGZvciAwLjkuMSBpdCBzZWVtcy4KICAgICBbQmVuIExhdXJpZSAtIHBvaW50ZWQgb3V0IGJ5IFVsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEF1dG9kZXRlY3QgRnJlZUJTRDMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgaW4gQ29uZmlndXJlLiBUaGlzIGFmZmVjdHMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6CiAgICAgbmV4dHN0ZXAKICAgICBuY3Itc2NkZQogICAgIHVuaXh3YXJlLTIuMAogICAgIHVuaXh3YXJlLTIuMC1wZW50aXVtCiAgICAgc2NvNS1jYy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRWxpbWluYXRlIGdlbmVyYXRlZCBmaWxlcyBmcm9tIENWUy4gUmVvcmRlciB0ZXN0cyB0byByZWdlbmVyYXRlIGZpbGVzCiAgICAgYmVmb3JlIHRoZXkgYXJlIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgR2VuZXJhdGUgTWFrZWZpbGUuc3NsIGZyb20gTWFrZWZpbGUub3JnICh0byBrZWVwIENWUyBoYXBweSkuCiAgICAgW0JlbiBMYXVyaWVdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMWIgYW5kIDAuOS4xYyAgWzIzLURlYy0xOTk4XQoKICAqKSBBZGRlZCBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIHRvIGNyeXB0by9jcnlwdG8uaCBhbmQgCiAgICAgY2hhbmdlZCBTU0xlYXkgdG8gT3BlblNTTCBpbiB2ZXJzaW9uIHN0cmluZ3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAgCiAgKikgU29tZSBmaXh1cHMgdG8gdGhlIHRvcC1sZXZlbCBkb2N1bWVudHMuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBGaXhlZCB0aGUgbmFzdHkgYnVnIHdoZXJlIHJzYXJlZi5oIHdhcyBub3QgZm91bmQgdW5kZXIgY29tcGlsZS10aW1lCiAgICAgYmVjYXVzZSB0aGUgc3ltbGluayB0byBpbmNsdWRlLyB3YXMgbWlzc2luZy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSW5jb3Jwb3JhdGVkIHRoZSBwb3B1bGFyIG5vLVJTQS9EU0Etb25seSBwYXRjaGVzIAogICAgIHdoaWNoIGFsbG93IHRvIGNvbXBpbGUgYSBSU0EtZnJlZSBTU0xlYXkuCiAgICAgW0FuZHJldyBDb29rZSAvIEludGVycmFkZXIgTGR0LiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgbmFzdHkgcmVoYXNoIHByb2JsZW0gdW5kZXIgYG1ha2UgLWYgTWFrZWZpbGUuc3NsIGxpbmtzJwogICAgIHdoZW4gInNzbGVheSIgaXMgc3RpbGwgbm90IGZvdW5kLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCBtb3JlIHBsYXRmb3JtcyB0byBDb25maWd1cmU6IENyYXkgVDNFLCBIUFVYIDExLCAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgQmVja21hbm4gPGJlY2ttYW5AYWNsLmxhbmwuZ292Pl0KCiAgKikgVXBkYXRlZCB0aGUgUkVBRE1FIGZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgLmN2c2lnbm9yZSBmaWxlcyBpbiB0aGUgQ1ZTIHJlcG9zaXRvcnkgc3ViZGlycwogICAgIHRvIG1ha2UgYSAiY3ZzIHVwZGF0ZSIgcmVhbGx5IHNpbGVudC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVjb21waWxlZCB0aGUgZXJyb3ItZGVmaW5pdGlvbiBoZWFkZXIgZmlsZXMgYW5kIGFkZGVkCiAgICAgbWlzc2luZyBzeW1ib2xzIHRvIHRoZSBXaW4zMiBsaW5rZXIgdGFibGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbmVkIHVwIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnRzOwogICAgIG8gbmV3IGZpbGVzOiBDSEFOR0VTIGFuZCBMSUNFTlNFCiAgICAgbyBtZXJnZWQgVkVSU0lPTiwgSElTVE9SWSogYW5kIFJFQURNRSogZmlsZXMgYSBDSEFOR0VTLlNTTGVheSAKICAgICBvIG1lcmdlZCBDT1BZUklHSFQgaW50byBMSUNFTlNFCiAgICAgbyByZW1vdmVkIG9ic29sZXRlIFRPRE8gZmlsZQogICAgIG8gcmVuYW1lZCBNSUNST1NPRlQgdG8gSU5TVEFMTC5XMzIKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlZCBkdW1teSBmaWxlcyBmcm9tIHRoZSAwLjkuMWIgc291cmNlIHRyZWU6IAogICAgIGNyeXB0by9hc24xL3ggY3J5cHRvL2Jpby9jZCBjcnlwdG8vYmlvL2ZnIGNyeXB0by9iaW8vZ3JlcCBjcnlwdG8vYmlvL3ZpCiAgICAgY3J5cHRvL2JuL2FzbS8uLi4uLi5hZGQuYyBjcnlwdG8vYm4vYXNtL2Eub3V0IGNyeXB0by9kc2EvZiBjcnlwdG8vbWQ1L2YKICAgICBjcnlwdG8vcGVtL2dtb24ub3V0IGNyeXB0by9wZXJsYXNtL2YgY3J5cHRvL3BrY3M3L2J1aWxkIGNyeXB0by9yc2EvZgogICAgIGNyeXB0by9zaGEvYXNtL2YgY3J5cHRvL3RocmVhZHMvZiBtcy96enogc3NsL2Ygc3NsL2YubWFrIHRlc3QvZgogICAgIHV0aWwvZi5tYWsgdXRpbC9wbC9mIHV0aWwvcGwvZi5tYWsgY3J5cHRvL2JmL2JmX2xvY2wub2xkIGFwcHMvZgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCB2YXJpb3VzIHBsYXRmb3JtIHBvcnRhYmlsaXR5IGZpeGVzLgogICAgIFtNYXJrIEouIENveF0KCiAgKikgVGhlIEdlbmVzaXMgb2YgdGhlIE9wZW5TU0wgcnBqZWN0OgogICAgIFdlIHN0YXJ0IHdpdGggdGhlIGxhdGVzdCAodW5yZWxlYXNlZCkgU1NMZWF5IHZlcnNpb24gMC45LjFiIHdoaWNoIEVyaWMgQS4KICAgICBZb3VuZyBhbmQgVGltIEouIEh1ZHNvbiBjcmVhdGVkIHdoaWxlIHRoZXkgd2VyZSB3b3JraW5nIGZvciBDMk5ldCB1bnRpbAogICAgIHN1bW1lciAxOTk4LgogICAgIFtUaGUgT3BlblNTTCBQcm9qZWN0XQogCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4wYiBhbmQgMC45LjFiICBbbm90IHJlbGVhc2VkXQoKICAqKSBVcGRhdGVkIGEgZmV3IENBIGNlcnRpZmljYXRlcyB1bmRlciBjZXJ0cy8KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQ2hhbmdlZCBzb21lIEJJR05VTSBhcGkgc3R1ZmYuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIFZhcmlvdXMgcGxhdGZvcm0gcG9ydHM6IE9wZW5CU0QsIFVsdHJpeCwgSVJJWCA2NGJpdCwgTmV0QlNELCAKICAgICBER1VYIHg4NiwgTGludXggQWxwaGEsIGV0Yy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTmV3IENPTVAgbGlicmFyeSBbY3J5cHRvL2NvbXAvXSBmb3IgU1NMIFJlY29yZCBMYXllciBDb21wcmVzc2lvbjogCiAgICAgUkxFIChkdW1teSBpbXBsZW1lbnRlZCkgYW5kIFpMSUIgKHJlYWxseSBpbXBsZW1lbnRlZCB3aGVuIFpMSUIgaXMKICAgICBhdmFpbGFibGUpLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGQgLXN0cnBhcnNlIG9wdGlvbiB0byBhc24xcGFycyBwcm9ncmFtIHdoaWNoIHBhcnNlcyBuZXN0ZWQgCiAgICAgYmluYXJ5IHN0cnVjdHVyZXMgCiAgICAgW0RyIFN0ZXBoZW4gSGVuc29uIDxzaGVuc29uQGJpZ2Zvb3QuY29tPl0KCiAgKikgQWRkZWQgIm9pZF9maWxlIiB0byBzc2xlYXkuY25mIGZvciAiY2EiIGFuZCAicmVxIiBwcm9ncmFtcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRFNBIGZpeCBmb3IgImNhIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAiLWdlbmtleSIgb3B0aW9uIHRvICJkc2FwYXJhbSIgcHJvZ3JhbS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgUklQRSBNRDE2MCAocm1kMTYwKSBtZXNzYWdlIGRpZ2VzdC4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgLWEgKGFsbCkgb3B0aW9uIHRvICJzc2xlYXkgdmVyc2lvbiIgY29tbWFuZC4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgUExBVEZPUk0gZGVmaW5lIHdoaWNoIGlzIHRoZSBpZCBnaXZlbiB0byBDb25maWd1cmUuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIE1lbUNoZWNrX1hYWFggZnVuY3Rpb25zIHRvIGNyeXB0by9tZW0uYyBmb3IgbWVtb3J5IGNoZWNraW5nLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBFeHRlbmRlZCB0aGUgQVNOLjEgcGFyc2VyIHJvdXRpbmVzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBFeHRlbmRlZCBCSU8gcm91dGluZXMgdG8gc3VwcG9ydCBSRVVTRUFERFIsIHNlZWssIHRlbGwsIGV0Yy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgYSBCTl9DVFggdG8gdGhlIEJOIGxpYnJhcnkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIHRoZSB3ZWFrIGtleSB2YWx1ZXMgaW4gREVTIGxpYnJhcnkKICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQ2hhbmdlZCBBUEkgaW4gRVZQIGxpYnJhcnkgZm9yIGNpcGhlciBhbGlhc2VzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBSQzIvNjRiaXQgY2lwaGVyLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDb252ZXJ0ZWQgdGhlIGxoYXNoIGxpYnJhcnkgdG8gdGhlIGNyeXB0by9tZW0uYyBmdW5jdGlvbnMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgcmVjb2duaXplZCBBU04uMSBvYmplY3QgaWRzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBtb3JlIFJTQSBwYWRkaW5nIGNoZWNrcyBmb3IgU1NML1RMUy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgQklPIHByb3h5L2ZpbHRlciBmdW5jdGlvbmFsaXR5LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBleHRyYV9jZXJ0cyB0byBTU0xfQ1RYIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgc2VuZCBleHRyYSBDQSBjZXJ0aWZpY2F0ZXMgdG8gdGhlIGNsaWVudCBpbiB0aGUgQ0EgY2VydCBjaGFpbiBzZW5kaW5nCiAgICAgcHJvY2Vzcy4gSXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIE5vdyBGb3J0ZXp6YSBpcyBkZW5pZWQgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHBoYXNlIGJlY2F1c2UKICAgICB0aGlzIGlzIGtleSBleGNoYW5nZSBtZWNoYW5pc20gaXMgbm90IHN1cHBvcnRlZCBieSBTU0xlYXkgYXQgYWxsLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRpdGlvbmFsIFBLQ1MxIGNoZWNrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgU3VwcG9ydCB0aGUgc3RyaW5nICJUTFN2MSIgZm9yIGFsbCBUTFMgdjEgY2lwaGVycy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgZnVuY3Rpb24gU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCgpIHdoaWNoIGdpdmVzIHRoZQogICAgIGV4X2RhdGEgaW5kZXggb2YgdGhlIFNTTCBjb250ZXh0IGluIHRoZSBYNTA5X1NUT1JFX0NUWCBleF9kYXRhLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBGaXhlZCBhIGZldyBtZW1vcnkgbGVha3MuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIHZhcmlvdXMgY29kZSBhbmQgY29tbWVudCB0eXBvcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQSBtaW5vciBidWcgaW4gc3NsL3MzX2NsbnQuYyB3aGVyZSB0aGVyZSB3b3VsZCBhbHdheXMgYmUgNCAwIAogICAgIGJ5dGVzIHNlbnQgaW4gdGhlIGNsaWVudCByYW5kb20uCiAgICAgW0Vkd2FyZCBCaXNob3AgPGViaXNob3BAc3B5Z2xhc3MuY29tPl0KCg==