U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCgpWZXJzaW9uIDIuMC41ICgxOSBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgcGF0Y2ggIzM1MTc0MzUgZnJvbSBNaWxlcyBCYWRlciAtIHByZWZlciB0byB1c2UgTHVhX3B1c2hnbG9iYWx0YWJsZQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNTE3NzY5IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggY29tcGlsZSBlcnJvciBvbiBNYWNSdWJ5IHVzaW5nIFJTVFJJTkdfUFRSLgoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM1MTEwMDkgZnJvbSBMZWlmIE1pZGRlbHNjaHVsdGUgZm9yIHNsaWdodGx5IG9wdGltaXNlZCBjaGFyICogdmFyaWFibGUgd3JhcHBlcnMuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjMzIxOTY3NiBmcm9tIFNoYW5lIExpZXNlZ2FuZyB3aGljaCBhZGRzOgogICAgICAgICAgICAtIHN1cHBvcnQgZm9yICVmYWN0b3J5CiAgICAgICAgICAgIC0gYSBfX3Rvc3RyaW5nIG1ldGhvZAogICAgICAgICAgICAtIGEgX19kaXNvd24gbWV0aG9kCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBBcHBseSAjMzUxMzU2OSB3aGljaCBhZGRzIGEgY2F0Y2hsaXN0IHRvIHRoZSB4bWwgb3V0cHV0LgoKMjAxMi0wNC0wNTogb2xseQoJICAgIFtMdWFdIEFkZCBzdXBwb3J0IGZvciBMdWEgNS4yIChwYXRjaCBTRiMzNTE0NTkzIGZyb20gTWlsZXMgQmFkZXIpCgoyMDEyLTAzLTI2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEFwcGx5IHBhdGNoICMzNDI1OTkzIGZyb20gamdpbGxpczogYWRkIGV4dHJhIGxvZ2ljIHRvIHRoZSBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKHZvaWQpIG1ldGhvZDogaXQgY2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgX19kaW1zX18gbWV0aG9kIGFuZCB1c2VzIHRoaXMgaW4gc3RlYWQgb2YgcmV0dXJuaW5nICgxLDEpCgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjQ4MzMgZnJvbSBqZ2lsbGlzOiBtYWtlIGlzX29iamVjdCByZXR1cm4gdHJ1ZSBmb3Igc3dpZyB0eXBlcwoKMjAxMi0wMy0yNDogd3NmdWx0b24KICAgICAgICAgICAgW0RdIEFwcGx5ICMzNTAyNDMxIHRvIGZpeCBkdXBsaWNhdGUgc3ltYm9scyBpbiBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMi0wMy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDk0NzkxIC0gJSRpc2dsb2JhbCBmb3IgJXJlbmFtZSBtYXRjaGluZy4KCjIwMTItMDMtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQ4NzcwNiBhbmQgIzMzOTE5MDYgLSBtaXNzaW5nIHN0ZGRlZi5oIGluY2x1ZGUgZm9yIHB0cmRpZmZfdCB3aGVuIHVzaW5nICVpbXBvcnQKICAgICAgICAgICAgZm9yIFNUTCBjb250YWluZXJzIGFuZCBjb21waWxpbmcgd2l0aCBnKystNC42LiBBbiBpbmNsdWRlIG9mIHN0ZGRlZi5oIGlzIG5vdyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIFNXSUcgZ2VuZXJhdGVzIFNUTCBoZWxwZXIgdGVtcGxhdGVzIHdoaWNoIHJlcXVpcmUgcHRyZGlmZl90LiBJZiB5b3UgCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSByZWx5aW5nIG9uICIjaW5jbHVkZSA8c3RkZGVmLmg+IiBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgYQogICAgICAgICAgICAlaW5jbHVkZSBvZiBhbiBTVEwgaGVhZGVyLCB5b3UgbWF5IG5vdyBuZWVkIHRvIGFkZCB0aGlzIGluIG1hbnVhbGx5LgoKMjAxMi0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMzOTIyNjQgZnJvbSBTZWJhc3RpZW4gQmluZSB0byBwYXJzZSAodW5zaWduZWQpIGxvbmcgbG9uZyB0eXBlcyBpbiBlbnVtIHZhbHVlIGFzc2lnbm1lbnQuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUwNTUzMCBmcm9tIEthcmwgV2V0dGUgdG8gYWxsb3cgY3VzdG9tIGFsbG9jYXRvcnMgaW4gU1RMIHN0cmluZyBjbGFzc2VzIGZvciB0aGUgVVRMIGxhbmd1YWdlcy4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNDY4MzYyIGZyb20gS2FybCBXZXR0ZSB0byBmaXggJWluY2x1ZGUgaW5zaWRlICVkZWZpbmUuCgoyMDEyLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmUsIFJdIEZpeCAjMzQ3NTQ5MiAtIGl0ZXJhdGluZyB0aHJvdWdoIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9mIGVudW1lcmF0aW9ucy4KCjIwMTItMDItMjc6IHhhdmllcjk4IChwYXRjaGVzIGZyb20gS2FybCBXZXR0ZSkKCSAgICBbT2N0YXZlXSBVc2UgLWdsb2JhbHMgLiB0byBsb2FkIGdsb2JhbCB2YXJpYWJsZXMgaW4gbW9kdWxlIG5hbWVzcGFjZQoJICAgIFtPY3RhdmVdIENvbW1lbnQgZGVjbGFyYXRpb24gb2YgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBzd2lnX3JlZ2lzdGVyX2RpcmVjdG9yCgkgICAgW09jdGF2ZV0gRml4IE9DVEFWRV9QQVRIIGluIG9jdGF2ZSBNYWtlZmlsZXMKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IC0gZml4IGxpX3N0ZF9jb250YWluZXJzX2ludCB0ZXN0CgkgICAgW09jdGF2ZV0gRml4IGltcG9ydHMgdGVzdAoKMjAxMi0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1ha2UgZ2VuZXJhdGVkIHN1cHBvcnQgZnVuY3Rpb25zIGluIGFycmF5c19qYXZhLmkgc3RhdGljIHNvIHRoYXQgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgZnJvbSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgU1dJRyBjYW4gYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB0b2dldGhlciAtIHByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgRXZhbiBLcmF1c2UuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY3Jhc2ggd2l0aCBiYWQgcmVnZXggLSBidWcgIzM0NzQyNTAuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgUHl0aG9uIHN0ZXBwZWQgc2xpY2luZyBzdXBwb3J0IHRvIHRoZSBTVEwgd3JhcHBlcnMgKHN0ZDo6dmVjdG9yLCBzdGQ6Omxpc3QpLgogICAgICAgICAgICBBc3NpZ25pbmcgdG8gYSBzbGljZSwgcmVhZGluZyBhIHNsaWNlIGFuZCBkZWxldGluZyBhIHNsaWNlIHdpdGggc3RlcHMgbm93IHdvcmsuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIHZpID0gdmVjdG9yX2kocmFuZ2UoMTApKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgdmlbMTo0OjJdID0gWzExMSwgMzMzXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgZGVsIHZpWzM6MTA6M10KICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmlbOjotMV0pCgogICAgICAgICAgICBnaXZlcyAoc2FtZSBiZWhhdmlvdXIgYXMgbmF0aXZlIFB5dGhvbiBzZXF1ZW5jZXMgc3VjaCBhcyBsaXN0KToKCiAgICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgMzMzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgICAgICAgICAgIFswLCAxMTEsIDIsIDQsIDUsIDcsIDhdCiAgICAgICAgICAgICAgWzgsIDcsIDUsIDQsIDIsIDExMSwgMF0KCjIwMTItMDEtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBDb3JyZWN0bHkgYW5ub3RhdGUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCBDIGxpbmthZ2UuCiAgICAgICAgICAgIFtEXSBFeGNlcHRpb24gYW5kIEVycm9yIGhhdmUgYmVjb21lIGJsZXNzZWQgbmFtZXM7IHJlbW92ZWQgZF9leGNlcHRpb25fbmFtZSB0ZXN0IGNhc2UuCgoyMDEyLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSBpbmRleGluZyBidWdzIGluIFB5dGhvbiBTVEwgd3JhcHBlcnMgd2hlbiB0aGUgaW5kZXggaXMgbmVnYXRpdmUsIGVnOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIGl2PXZlY3Rvcl9pKFswLDEsMiwzLDQsNV0pCiAgICAgICAgICAgICAgaXZbLTc6XQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDVdIGluc3RlYWQgb2YgWzVdLgoKICAgICAgICAgICAgICB2dls3OjldID0gWzIyLDMzXQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDUsIDIyLCAzM10gaW5zdGVhZCBvZiAiaW5kZXggb3V0IHJhbmdlIiBlcnJvci4KCiAgICAgICAgICAgIEFsc28gZml4IHNvbWUgc2VnZmF1bHRzIHdoZW4gcmVwbGFjaW5nIHJhbmdlcywgZWcgd2hlbiBpbCBpcyBhIHN0ZDo6bGlzdCB3cmFwcGVyOgoKICAgICAgICAgICAgICBpbFswOjJdID0gWzExXQoKMjAxMi0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjbGFzcyB3aGVuIHVzZWQgYXMgYSBiYXNlLgoKMjAxMi0wMS0wNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTItMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMzQ1MjU2MCBmcm9tIEJyYW50IEt5c2VyIC0gYWRkIHN1cHBvcnQgZm9yICVuc3BhY2Ugd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDExLTEyLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgJ2RpcmVjdG9yaW4nIHR5cGVtYXAgbm93IGFjY2VwdHMgJDEsICQyIGV0YyBleHBhbnNpb25zIGluc3RlYWQgb2YgaGF2aW5nIHRvIHVzZSB3b3JrYXJvdW5kcyAtCiAgICAgICAgICAgICQxX25hbWUsICQyX25hbWUgZXRjLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBkaXJlY3RvciB0eXBlbWFwcy4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgR28sIEphdmEsIERdIEFkZCBzdXBwb3J0IGZvciB0aGUgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW09jYW1sLCBPY3RhdmUsIFBIUCwgUHl0aG9uLCBSdWJ5XSBDb3JyZWN0IHNwZWNpYWwgdmFyaWFibGVzIGluICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBhbnkgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwcyB5b3UgbWF5IGhhdmUgd3JpdHRlbi4gUGxlYXNlIGNoYW5nZToKICAgICAgICAgICAgICAkcmVzdWx0IHRvICQxCiAgICAgICAgICAgICAgJGlucHV0IHRvICRyZXN1bHQKCiAgICAgICAgICAgIEFsc28gZml4IHRoZSBuYW1lZCAnZGlyZWN0b3JhcmdvdXQnIERJUkVDVE9ST1VUIHR5cGVtYXBzIGZvciB0aGVzZSBsYW5ndWFnZXMgd2hpY2ggZGlkbid0CiAgICAgICAgICAgIHByZXZpb3VzbHkgY29tcGlsZSBhbmQgYWRkIGluICQxLCAkMiBldGMgZXhwYW5zaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMS0xMi0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTV0lHX2Vycm9yKCkgbm93IGdldHMgZGVjb3JhdGVkIHdpdGggcGVybCBzb3VyY2UgZmlsZS9saW5lIG51bWJlci4KICAgICAgICAgICAgW3Blcmw1XSBlcnJvciBoYW5kbGluZyBub3cgY29uZm9ybXMgdG8gcHVibGljIFhTIGFwaSAoZml4ZXMgcGVybCB2NS4xNCBpc3N1ZSkuCgoyMDExLTEyLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQW5kcm9pZC9KYXZhXSBGaXggZGlyZWN0b3JzIHRvIGNvbXBpbGUgb24gQW5kcm9pZC4KCiAgICAgICAgICAgIEFkZGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIGZvciBBbmRyb2lkLgoKMjAxMS0xMi0wODogdmFkegoJICAgIEJ1ZyBmaXg6IEhhbmRsZSBtZXRob2RzIHJlbmFtZWQgb3IgaWdub3JlZCBpbiB0aGUgYmFzZSBjbGFzcyBjb3JyZWN0bHkgaW4gdGhlIGRlcml2ZWQgY2xhc3NlcwoJICAgICh0aGV5IGNvdWxkIGJlIHNvbWV0aW1lcyBteXN0ZXJpb3VzbHkgbm90IHJlbmFtZWQgb3IgaWdub3JlZCB0aGVyZSBiZWZvcmUpLgoKMjAxMS0xMi0wMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeCBleGNlcHRpb24gZ2x1ZSBjb2RlIGZvciBuZXdlciBETUQgMiB2ZXJzaW9ucy4KICAgICAgICAgICAgW0RdIERvIG5vdCBkZWZhdWx0IHRvIDMyIGJpdCBnbHVlIGNvZGUgZm9yIERNRCBhbnltb3JlLgogICAgICAgICAgICBbRF0gVXNlIHN0ZGMuY29uZmlnLmNfbG9uZy9jX3Vsb25nIHRvIHJlcHJlc2VudCBDIGxvbmcgdHlwZXMuCgoyMDExLTEyLTAxOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBidWcgMzQ0NzQyNjogbWVtb3J5IGxlYWsgaW4gdmVjdG9yLl9fZ2V0aXRlbV9fLgoKMjAxMS0xMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFJlbW92ZSBDKysgY29tbWVudHMgZnJvbSBnZW5lcmF0ZWQgQyBjb2RlLgoKMjAxMS0xMS0yNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBzb21lIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVycyB3aXRoCgkgICAgY2VydGFpbiBHQ0Mgd2FybmluZyBvcHRpb25zIChEZWJpYW4gYnVnICM2NTAyNDYpLgoKMjAxMS0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDMzNTQxICV0eXBlbWFwKGluLCBudW1pbnB1dHM9MCkgd2l0aCAxMCsgYXJndW1lbnRzLgoKMjAxMS0xMS0yODogb2xseQoJICAgIFtQZXJsXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGggY2VydGFpbgoJICAgIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzQzNjcxMSkuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIGtleXdvcmQgbGlzdCB0byBpbmNsdWRlIGtleXdvcmRzIGFkZGVkIGluIFBIUCByZWxlYXNlcyB1cCB0byA1LjMuCgoyMDExLTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAnaW50ZXJuYWwnIGJ5IGRlZmF1bHQgYW5kIGlmIG11bHRpcGxlCiAgICAgICAgICAgIFNXSUcgbW9kdWxlcyBhcmUgYmVpbmcgdXNlZCBhbmQgY29tcGlsZWQgaW50byBkaWZmZXJlbnQgYXNzZW1ibGllcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LgogICAgICAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXRpZXMgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3M6CgogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0NTQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFtKYXZhXSBQcm92aWRlIGFuIGVhc3kgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIHRoZSBwcm94eSBjbGFzcyBwb2ludGVyCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZ2V0Q1B0cigpIG1ldGhvZC4gVGhlIHZpc2liaWxpdHkgaXMgJ3Byb3RlY3RlZCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBwYWNrYWdlcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWShwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGZvciBKYXZhIGhhcyBjaGFuZ2VkIGZyb20gcHVibGljIHRvIHByb3RlY3RlZCBmb3IgdGhlIHByb3h5IGNsYXNzZXMuIFVzZSB0aGUKICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWSBtYWNybyBhYm92ZSB0byByZXN0b3JlIHRvIHRoZSBwcmV2aW91cyB2aXNpYmlsaXRpZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTExLTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQ0MDA0NDogI2lmZGVmIG91dCBTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0ciBpZiAtYnVpbHRpbgoJICAgIGlzbid0IGJlaW5nIHVzZWQsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJpbmFyeSBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuCgkgICAgcHl0aG9uIGluc3RhbGxhdGlvbnMuCgoyMDExLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgZml4OiBSZW1vdmUgcm9vdCBkaXJlY3RvcnkgZnJvbSBkaXJlY3Rvcnkgc2VhcmNoIGxpc3QgaW4gV2luZG93cy4KCjIwMTEtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzQyMTg3NiBmcm9tIFJvYmluIFN0b2NrZXIgdG8gZml4ICMzNDE2ODE4IC0gc2FtZSBjbGFzcyBuYW1lIGluIAogICAgICAgICAgICBkaWZmZXJlbnQgbmFtZXNwYWNlcyBjb25mdXNpb24gd2hlbiB1c2luZyBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBjcmUtYnVpbGQuc2ggdG8gd29yayB3aXRoIG5vbi1jb21wcmVzc2VkIHRhcmJhbGxzIC0gcHJvYmxlbSByZXBvcnRlZCBieSBBZHJpYW4gQmxha2VseS4KCjIwMTEtMTEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4cGFuZCBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0eXBlbWFwIHdhcm5pbmdzLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIHdhcm5pbmc9IjEwMDA6VGVzdCB3YXJuaW5nIGZvciAnaW4nIHR5cGVtYXAgZm9yICQxX3R5cGUgJDFfbmFtZSIpIGludCAiLi4uIgoKMjAxMS0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVkIG91dHB1dCB0eXBlbWFwcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBzeW1ib2wgdXNlcyBhIHF1YWxpZmllciBhbmQgY29udGFpbnMKICAgICAgICAgICAgYSBudW1iZXIsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGRvdWJsZSBBQkM6Om0xICIuLi4iCgoyMDExLTEwLTI0OiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMzQyMzExOSAtIG92ZXJsb2FkIGRpc3BhdGNoIHN0YWNrIGNvcnJ1cHRpb24gZml4LiAgQmV0dGVyLCBidXQgbW9yZSByZXNlYXJjaAogICAgICAgICAgICBpcyBuZWVkZWQgb24gYSBzdGFibGUgcGF0aCBmb3IgdGFpbCBjYWxscyBpbiBYUy4KCiAgICAgICAgICAgIEFsc28sIGZpeCBmb3IgbGFyZ2UgbG9uZyBsb25ncyBpbiAzMiBiaXQgcGVybC4KCjIwMTEtMTAtMTM6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQWxsb3cgT2N0YXZlIG1vZHVsZXMgdG8gYmUgcmUtbG9hZGVkIGFmdGVyIGEgImNsZWFyIGFsbCIuCgoyMDExLTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjEgcmVwb3J0ZWQgYnkgVGVlbXUgSWtvbm9uZSBsZWFkaW5nIHRvIHVuY29tcGlsYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdHlwZWRlZiBhbmQgZnVuY3Rpb24gcG9pbnRlciByZWZlcmVuY2VzLCBmb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IEZOKGNvbnN0IGludCAmYSwgaW50IGIpOwogICAgICAgICAgICAgIHZvaWQgKnR5cGVkZWZfY2FsbDEoRk4gKiYgcHJlY2FsbGJhY2ssIEZOICogcG9zdGNhbGxiYWNrKTsKCjIwMTEtMDktMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMzNDA4MDEyIGZyb20gUmFtYW4gR29wYWxhbiAtIGFkZCBzdXBwb3J0IGZvciBlbWJlZGRlZCBMdWEgKGVMdWEpCiAgICAgICAgICAgIGluY2x1ZGluZyBvcHRpb25zIGZvciB0YXJnZXRpbmcgTHVhIFRpbnkgUkFNIChMVFIpLgoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGxpYnJhcnkgY29udHJpYnV0aW9uIGZyb20gcGF0Y2ggIzM0MDE1NzEuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgd2FybmluZ3MgZm9yIGJhZGx5IG5hbWVkIGRlc3RydWN0b3JzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEtTdHJ1Y3QgewogICAgICAgICAgICAgICAgfk5PVF9LU3RydWN0KCkge30KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgY3BwX2V4dGVuZF9kZXN0cnVjdG9ycy5pOjkyOiBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgfk5PVF9LU3RydWN0LiBJZ25vcmVkLgoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVleHRlbmQgYW5kIGRlc3RydWN0b3JzIGZvciB0ZW1wbGF0ZXMuIFRoZSBkZXN0cnVjdG9yIGluICVleHRlbmQgd2FzIG5vdCBhbHdheXMgd3JhcHBlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleHRlbmQgRm9vVCB7CiAgICAgICAgICAgICAgICB+Rm9vVCgpIHsgZGVsZXRlICRzZWxmOyB9IC8vIHdhcyBub3Qgd3JhcHBlZCBhcyBleHBlY3RlZAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vVCB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vVGkpIEZvb1Q8aW50PjsKCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzcGVjaWFsIHZhcmlhYmxlcyBzdWNoIGFzICIkZGVjbCIgYW5kICIkZnVsbGRlY2wiIGluIGRlc3RydWN0b3JzIHRvIGluY2x1ZGUgdGhlIH4gY2hhcmFjdGVyLgoKMjAxMS0wOS0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTRiBidWcgIzE0ODE5NTggLSBJbXByb3ZlIHJhbmdlIGNoZWNraW5nIGZvciBpbnRlZ2VyIHR5cGVzLgogICAgICAgICAgICBFbmhhbmNlIGxpX3R5cGVtYXBzX3J1bm1lLnBsCgoyMDExLTA5LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBvbiB0eXBlZGVmIGNsYXNzZXMgaW4gYSBuYW1lc3BhY2UgdXNpbmcgdGhlIHR5cGVkZWYgbmFtZSwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgJWV4dGVuZCBDU3RydWN0IHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdDU3RydWN0IHsgLi4uIH0gQ1N0cnVjdDsKICAgICAgICAgICAgfQoKMjAxMS0wOC0zMTogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBwYXRjaGVzIGZyb20gS2FybCBXZXR0ZTogaW1wcm92ZW1lbnRzIHRvIG1vZHVsZSBsb2FkaW5nIGJlaGF2aW9yOwoJICAgIGFkZGVkIGV4YW1wbGUgb2YgZnJpZW5kIG9wZXJhdG9yIHRvIG9wZXJhdG9yIGV4YW1wbGU7IGZpeGVkIG9jdGF2ZSBwYW5pYy9jcmFzaCBpbiAzLjAuNTsKCSAgICBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwoKMjAxMS0wOC0zMDogc3phZ2VyCgkgICAgW3B5dGhvbl0gQnVnIDM0MDA0ODYsIGZpeCBlcnJvciBzaWduYWxsaW5nIGZvciBidWlsdC1pbiBjb25zdHJ1Y3RvcnMuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmaWxlL2xpbmUgbnVtYmVyIGRpc3BsYXkgZm9yICJnb3R5cGUiIHdoZW4gdXNpbmcgdHlwZW1hcCBkZWJ1Z2dpbmcgb3B0aW9ucwogICAgICAgICAgICAtdG1zZWFyY2ggYW5kIC10bXVzZWQuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIERdIEZpeCAlY2FsbGJhY2sgd2hpY2ggd2FzIGdlbmVyYXRpbmcgdW5jb21waWxlYWJsZSBjb2RlLgoKMjAxMS0wOC0yNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvbnN0cnVjdG9ycyBpbiBuYW1lZCB0eXBlZGVmIGNsYXNzIGRlY2xhcmF0aW9ucyBhcyByZXBvcnRlZCBieSBHcmVnb3J5IEJyb25uZXI6CgogICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBBIHsKICAgICAgICAgICAgICBBKCl7fSAvLyBDb25zdHJ1Y3RvciB3aGljaCB3YXMgbm90IGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgICBCKCl7fSAvLyBOT1QgYSBjb25zdHJ1Y3RvciAtLWlsbGVnYWwsIGJ1dCB3YXMgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICB9IEI7CgogICAgICAgICAgICBGb3IgQyBjb2RlLCB0aGUgZml4IG5vdyByZXN1bHRzIGluIHRoZSB1c2Ugb2YgJ3N0cnVjdCBBIConIGluc3RlYWQgb2YganVzdCAnQiAqJyBpbgogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hlbiB3cmFwcGluZyBtZW1iZXJzIGluIEEsIGJ1dCB1bHRpbWF0ZWx5IHRoaXMgZG9lcyBub3QgbWF0dGVyLCBhcwogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSB0aGluZy4KCjIwMTEtMDgtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlbmV3b2JqZWN0IHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoICVmZWF0dXJlKCJyZWYiKSBhcyByZXBvcnRlZCBieSBKYW4gQmVja2VyLiBUaGUKICAgICAgICAgICAgY29kZSBmcm9tIHRoZSAicmVmIiBmZWF0dXJlIHdhcyBub3QgYWx3YXlzIGJlaW5nIGdlbmVyYXRlZCBmb3IgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSAlbmV3b2JqZWN0LgogICAgICAgICAgICBEb2N1bWVudGF0aW9uIGZvciAicmVmIiBhbmQgInVucmVmIiBtb3ZlZCBmcm9tIFB5dGhvbiB0byB0aGUgQysrIGNoYXB0ZXIuCgoyMDExLTA4LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBtZW1vcnkgbGVhayB3aXRoIC0tYnVpbHRpbiBvcHRpb24gKGJ1ZyAzMzg1MDg5KS4KCjIwMTEtMDgtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFNGIHBhdGNoICMzMzk0MzM5IGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIC0gbmV3IG9wdGlvbiAtbm9tb2R1bGVnbG9iYWwgdG8gZGlzYWJsZSBpbnN0YWxsaW5nIAogICAgICAgICAgICB0aGUgbW9kdWxlIHRhYmxlIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFJlcXVpcmUgY2FsbCBhbHNvIHJldHVybnMgdGhlIG1vZHVsZSB0YWJsZSBpbnN0ZWFkIAogICAgICAgICAgICBvZiBhIHN0cmluZy4KCjIwMTEtMDgtMDk6IHhhdmllcjk4CiAgICAgICAgICAgIEZpeCBidWcgMzM4NzM5NDsgT2N0YXZlIHBhdGNoZXMgZm9yIDMuNC4wIGNvbXBhdGliaWxpdHksIGV0Yy4gKGZyb20gS2FybCBXZXR0ZSkKCjIwMTEtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBpbiAkc3ltbmFtZSBleHBhbnNpb24gZm9yIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDExLTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRG9uJ3QgZ2VuZXJhdGUgInJldHVybiAkcjsiIGluIGNhc2VzIHdoZXJlICRyIGhhc24ndCBiZWVuIHNldC4KCSAgICBUaGlzIHdhcyBiYXNpY2FsbHkgaGFybWxlc3MsIGV4Y2VwdCBpdCBnZW5lcmF0ZWQgYSBQSFAgRV9OT1RJQ0UgaWYKCSAgICB0aGUgY2FsbGluZyBjb2RlIGhhZCBlbmFibGVkIHRoZW0uCgoyMDExLTA3LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2NvcGluZyBvZiBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBuZXN0ZWQgd2l0aGluIGEgY2xhc3MgKGZvciBDKyspLiBQcmV2aW91c2x5IHRoZSBzeW1ib2wKICAgICAgICAgICAgd2FzIGluY29ycmVjdGx5IHB1dCBpbnRvIHRoZSBvdXRlciBuYW1lc3BhY2UsIGVnCgogICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+IHN0cnVjdCBtYXAgewogICAgICAgICAgICAgICAgY2xhc3MgaXRlcmF0b3I7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpdGVyYXRvciB3YXMgc2NvcGVkIGFzIHN0ZDo6aXRlcmF0b3IsIGJ1dCBub3cgaXQgaXMgY29ycmVjdGx5IHN0ZDo6bWFwPEtleSwgVD46Oml0ZXJhdG9yOwoKICAgICAgICAgICAgQWxzbyBmaXhlZCBpcyAldGVtcGxhdGUgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBhcmUgYSB0eXBlZGVmIHdoZW4gdGhlIHRlbXBsYXRlIGNvbnRhaW5zCiAgICAgICAgICAgIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycywgZWc6CgogICAgICAgICAgICBuYW1lc3BhY2UgU3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEMgPSBpbnQ+IHN0cnVjdCBNYXAgewogICAgICAgICAgICAgICAgdHlwZWRlZiBLZXkga2V5X3R5cGU7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFQgbWFwcGVkX3R5cGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5ZXBkZWYgZG91YmxlIERPVUJMRTsKICAgICAgICAgICAgJXR5cGVtYXAoTU0pIFN0ZDo6TWFwPGludCwgRE9VQkxFPjsKCiAgICAgICAgICAgIEFsbCBzeW1ib2xzIHdpdGhpbiBNYXAgd2lsbCBiZSByZXNvbHZlZCBjb3JyZWN0bHksIGVnIGtleV90eXBlIGFuZCBtYXBwZWRfdHlwZSBubyBtYXR0ZXIgaWYgdGhlCiAgICAgICAgICAgIHdyYXBwZWQgY29kZSB1c2VzIFN0ZDo6TWFwPGludCwgZG91YmxlPiBvciBzdGQ6Ok1hcDxpbnQsIERPVUJMRT4gb3IgU3RkOjpNYXA8aW50LCBkb3VibGUsIGludD4KCiAgICAgICAgICAgIEFsc28gZml4ZXMgYnVnICMzMzc4MTQ1IC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC40IC0gJXRlbXBsYXRlIHVzaW5nIHRyYWl0cy4KCjIwMTEtMDctMjAgIHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBjbG9zdXJlIGZvciB0cF9jYWxsIHNsb3QuCgoyMDExLTA3LTE2OiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEZpeCBkaXJlY3RvciB0eXBlbWFwIHVzaW5nIFB5T2JqZWN0ICouCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBTRiBwYXRjaCAjMzM2NTkwOCAtIEFkZCBhbGwgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBtYXAgc3VwcG9ydCBjb2RlIGluIHN0ZF9tYXAuaQoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGZvciBidWcgMzMyNDc1MzogJXJlbmFtZSBtZW1iZXIgdmFyaWFibGVzIHdpdGggLWJ1aWx0aW4uCgoyMDExLTA3LTAxOiB3c2Z1bHRvbgoJICAgIEZpeCBzb21lIHNjb3BlIGFuZCBzeW1ib2wgbG9va3VwIHByb2JsZW1zIHdoZW4gdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFyZSBiZWluZwogICAgICAgICAgICB1c2VkIHdpdGggdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBYWCwgdHlwZW5hbWUgVFQgPSBTb21lVHlwZT4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgdHlwZWRlZiBYWCBYOwogICAgICAgICAgICAgIHR5cGVkZWYgVFQgVDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVFQ+IHN0cnVjdCBVc2VzRm9vIHsKICAgICAgICAgICAgICB2b2lkIHgodHlwZW5hbWUgRm9vPFRUPjo6VCwgdHlwZW5hbWUgRm9vPFRUPjo6WCk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGZpeGVzIHVzZSBvZiBzdGQ6OnZlY3RvcjxpbnQ+OjpzaXplX3R5cGUgZm9yIFB5dGhvbiBhcyByZXBvcnRlZCBieSBBdWJyZXkgQmFybmFyZC4KCjIwMTEtMDYtMjM6IG9sbHkKCSAgICBbUEhQXSBGaXggZGlyZWN0b3IgY29kZSB0byB3b3JrIHdoZW4gUEhQIGlzIGJ1aWx0IHdpdGggWlRTIGVuYWJsZWQsCgkgICAgd2hpY2ggaXMgdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gb24gTWljcm9zb2Z0IFdpbmRvd3MuCgoyMDExLTA2LTIxOiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSB2YXJpb3VzIHNtYWxsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzLgoJICAgIC0gQXZvaWQgbmFtZSBjb25mbGljdHMgYmV0d2VlbiBzbWFydCBwb2ludGVyIHdyYXBwZXJzIGFuZCB0aGUgd3JhcHBlcnMgZm9yCgkgICAgdGhlIGFjdHVhbCBjbGFzcy4KCSAgICAtIEZpeCBkZWZhdWx0IHR5cGVtYXBzIGZvciBDIGJpbmRpbmdzLCB3aGljaCB3ZXJlIGluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8KCSAgICBjYWxsIG5vbi1leGlzdGVudCBkZXN0cnVjdG9ycyBvbiB1c2VyLWRlZmluZWQgdHlwZXMuCgkgICAgLSBOZXcgZmVhdHVyZSwgZmVhdHVyZTphY2xtaXhpbnMsIGZvciBhZGRpbmcgc3VwZXJjbGFzcyB0byB0aGUgZm9yZWlnbiBjbGFzcwoJICAgIHdyYXBwZXJzLgoJICAgIC0gSW1wcm92ZSBsb25nbG9uZyB0eXBlbWFwcy4KCjIwMTEtMDYtMTk6IHdzZnVsdG9uCgkgICAgRml4IGluY29ycmVjdCB0eXBlbWFwcyBiZWluZyB1c2VkIGZvciBhIHN5bWJvbCB3aXRoaW4gYSB0ZW1wbGF0ZWQgdHlwZSwgZWc6CiAgICAgICAgICAgIEE8aW50Pjo6dmFsdWVfdHlwZSB3b3VsZCBpbmNvcnJlY3RseSB1c2UgYSB0eXBlbWFwIGZvciB0eXBlIEEuCgoyMDExLTA2LTE4OiBvbGx5CgkgICAgW1RjbF0gRml4IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBpbiBtaWRkbGUgb2YgYmxvY2tzIHdoaWNoIGlzbid0CgkgICAgcGVybWl0dGVkIGluIEM5MCAoaXNzdWUgcHJvYmFibHkgaW50cm9kdWNlZCBpbiAyLjAuMyBieSBwYXRjaCAjMzIyNDY2MykuCgkgICAgUmVwb3J0ZWQgYnkgUGF1bCBPYmVybWVpZXIgaW4gU0YjMzI4ODU4Ni4KCjIwMTEtMDYtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIFNGICMzMzEyNTA1IC0gc2xpZ2h0bHkgZWFzaWVyIHRvIHdyYXAgY2hhcltdIG9yIGNoYXJbQU5ZXSB3aXRoIGEgSmF2YSBieXRlW10KICAgICAgICAgICAgdXNpbmcgYXJyYXlzX2phdmEuaS4KCjIwMTEtMDYtMTM6IHdzZnVsdG9uCgkgICAgW1J1YnksIE9jdGF2ZV0gU0YgIzMzMTA1MjggQXV0b2RvYyBmaXhlcyBzaW1pbGFyIHRvIHRob3NlIGRlc2NyaWJlZCBiZWxvdyBmb3IgUHl0aG9uLgoKMjAxMS0wNi0xMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGZXcgc3VidGxlIGJ1Z2ZpeGVzIGluIGF1dG9kb2MgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uLAogICAgICAgICAgICAtIFVubmFtZWQgYXJndW1lbnQgbmFtZXMgZml4IGZvciBhdXRvZG9jIGxldmVscyA+IDAuCiAgICAgICAgICAgIC0gRGlzcGxheSBvZiB0ZW1wbGF0ZSB0eXBlcyBmaXhlZCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEZpeCBTRiAjMzMxMDUyOCAtIGRpc3BsYXkgb2YgdHlwZWRlZiBzdHJ1Y3RzIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gQWRkIG1pc3NpbmcgdHlwZSBmb3Igc2VsZiBmb3IgYXV0b2RvYyBsZXZlbHMgMSBhbmQgMy4KICAgICAgICAgICAgLSBhdXRvZG9jIGxldmVscyAyIGFuZCAzIGRvY3VtZW50ZWQuCiAgICAgICAgICAgIC0gTWlub3IgdHdlYWtzIHRvIGF1dG9kb2Mgc3R5bGUgdG8gY29uZm9ybSB3aXRoIFBFUDguCgoyMDExLTA1LTMwOiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIGRpcmVjdG9ycyB3aGVuIC1wcmVmaXggaXMgdXNlZC4KCjIwMTEtMDUtMjQ6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgbWV0aG9kcyBvZiBjbGFzc2VzIHdpdGggYSB2aXJ0dWFsIGJhc2UgY2xhc3MgKFNGIzMxMjQ2NjUpLgoKVmVyc2lvbiAyLjAuNCAoMjEgTWF5IDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbR3VpbGVdIFBhdGNoICMzMTkxNjI1IGZpeGluZyBvdmVybG9hZGluZyBvZiBpbnRlZ2VyIHR5cGVzLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUGVybF0gUGF0Y2ggIzMyNjAyNjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIG5vbi1wcmltaXRpdmUgdHlwZXMgYW5kIGludGVnZXJzIGluIAogICAgICAgICAgICBQZXJsIDUuMTIgYW5kIGxhdGVyLgoKMjAxMS0wNS0xOTogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICVpbXBvcnQgd2hlcmUgb25lIG9mIHRoZSBpbXBvcnRlZCBmaWxlcyAlaW5jbHVkZSBvbmUgb2YgdGhlIFNUTCBpbmNsdWRlCiAgICAgICAgICAgIGZpbGVzIHN1Y2ggYXMgc3RkX3ZlY3Rvci5pLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gQXBwbHkgIzMyODk4NTEgZnJvbSBBbGFuIEhhcmRlciB0byBmaXggbWVtb3J5IGxlYWsgaW4gZGlyZWN0b3JzIHdoZW4gY2hlY2tpbmcKICAgICAgICAgICAgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucy4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW1RjbF0gQXBwbHkgIzMzMDAwNzIgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUgdG8gZml4IG11bHRpcGxlIG1vZHVsZSBsb2FkaW5nIG5vdAogICAgICAgICAgICBhbHdheXMgc2hhcmluZyB2YXJpYWJsZXMgYWNyb3NzIG1vZHVsZXMuCgoyMDExLTA1LTE2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEZpeCBhbiBpbmNvbXBhdGliaWxpdHkgd2l0aCBuZXZlciB2ZXJzaW9ucyBvZiBPY3RhdmUuIENhc2Ugb24gT2N0YXZlCgkgICAgQVBJID49IDQwIHRvIGhhbmRsZSByZW5hbWUgb2YgT2N0YXZlX21hcCB0byBvY3RhdmVfbWFwLgoJICAgIFtvY3RhdmVdIEFkZCBzdXBwb3J0IGZvciB5Ll9fcm9wX18oeCkgb3BlcmF0b3JzIHdoZW4geC5fX29wX18oeSkgZG9lc24ndCBleGlzdC4KCSAgICBbb2N0YXZlXSBBbGxvdyBnbG9iYWwgb3BlcmF0b3JzIHRvIGJlIGRlZmluZWQgYnkgU1dJRy13cmFwcGVkIGZ1bmN0aW9ucy4KCSAgICBbb2N0YXZlXSBGaXggc2V2ZXJhbCBidWdzIGFyb3VuZCBtb2R1bGUgbmFtZXNwYWNlczsgYWRkIC1nbG9iYWwsIC1ub2dsb2JhbCwKCSAgICAtZ2xvYmFscyA8bmFtZT4gY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gdGhlIG1vZHVsZS4KCjIwMTEtMDUtMTQ6IHdzZnVsdG9uCgkgICAgJXZhcmFyZ3Mgd2hlbiB1c2VkIHdpdGggYSBudW1lcmljIGFyZ3VtZW50IHVzZWQgdG8gY3JlYXRlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgCiAgICAgICAgICAgIHdoaWNoIHdhcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgZ3VhcmFudGVlZCBzZW50aW5lbCB2YWx1ZS4gVGhpcyBuZXZlciB3b3JrZWQgYW5kIG5vdwogICAgICAgICAgICB0aGUgYWRkaXRpb25hbCBhcmd1bWVudCBpcyBub3QgZ2VuZXJhdGVkLgoKMjAxMS0wNS0xMzogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBBZGRpdGlvbmFsIGZpeGVzIGZvciBweXRob24zLjIgc3VwcG9ydC4KCjIwMTEtMDUtMDc6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIFB5R2V0U2V0RGVzY3IgZm9yIHB5dGhvbjMuMi4KCjIwMTEtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWEsIFB5dGhvbiwgVGNsXSBDL0MrKyBwcm90b3R5cGVzIHNob3duIGluIGVycm9yIG1lc3NhZ2Ugd2hlbiBjYWxsaW5nIGFuIG92ZXJsb2FkZWQKICAgICAgICAgICAgbWV0aG9kIHdpdGggaW5jb3JyZWN0IGFyZ3VtZW50cyBpbXByb3ZlZCB0byBzaG93IGFsd2F5cyBzaG93IGZ1bGx5IHF1YWxpZmllZCBuYW1lCiAgICAgICAgICAgIGFuZCBpZiBhIGNvbnN0IG1ldGhvZC4gCgogICAgICAgICAgICBBbHNvIGZpeGVkIG90aGVyIEx1YSBlcnJvciBtZXNzYWdlcyBpbiBnZW5lcmF0ZWQgY29kZSB3aGljaCB3ZXJlbid0IGNvbnNpc3RlbnRseQogICAgICAgICAgICB1c2luZyB0aGUgZnVsbHkgcXVhbGlmaWVkIEMrKyBuYW1lIC0gcmVxdWVzdGVkIGJ5IEdlZGFsaWEgUGFzdGVybmFrLgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgQnVnIDI2MzU5MTk6IENvbnZlbmllbmNlIG1ldGhvZCB0byBjb252ZXJ0IHN0ZDo6bWFwIHRvIGEgcHl0aG9uIGRpY3QuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMjgxMTU0OTogcmV0dXJuIG5vbi1jb25zdCBpdGVyYXRvcnMgZnJvbSBTVEwKCSAgICBtZXRob2RzIGJlZ2luKCksIGVuZCgpLCByYmVnaW4oKSwgcmVuZCgpLgoKMjAxMS0wNC0yNTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDE0OTg5Mjk6IEFjY2VzcyB0byBtZW1iZXIgZmllbGRzIGluIG1hcCBlbGVtZW50cwoKMjAxMS0wNC0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogQ29ycmVjdGx5IGdlbmVyYXRlIGlkZW50aWZpZXJzIGZvciBiYXNlIGNsYXNzZXMgd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMTM6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAzMjg2MzMzOiBpbmZpbml0ZSByZWN1cnNpb24gd2l0aCBtdXR1YWwgJ3VzaW5nIG5hbWVzcGFjZScgY2xhdXNlcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAxMTYzNDQwOiB2YXJhcmcgdHlwZW1hcHMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgIzMyODUzODY6IHBhcnNlIGVycm9yIGZyb20gJ29wZXJhdG9yIFQqJigpJy4gIEFkZGVkIG9wZXJhdG9yX3BvaW50ZXJfcmVmCgkgICAgdGVzdCBjYXNlIHRvIGRlbW9uc3RyYXRlLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyODQzMjYgZnJvbSBDb2xpbiBNY0RvbmFsZCB0byBmaXggc29tZSBjb21waWxlciB3YXJuaW5ncy4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBGaXhlZCB3cmFwcGluZyBvZiBlbnVtcyB0aGF0IGFyZSB0eXBlIGNoYXIsIGZvciBleGFtcGxlOgogICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfSAodGhpcyB3YXMgYWxyZWFkeSBpbiAyLjAuMyBmb3IgQyMgYW5kIEphdmEpCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBGaXhlZCByZWZlcmVuY2luZyB0eXBlcyBpbiB0aGUgcm9vdCBuYW1lc3BhY2Ugd2hlbgogICAgICAgICAgICBub3QgaW4gc3BsaXQgcHJveHkgbW9kZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggIzE5MzI0ODQ6IG1pZ3JhdGUgUHlDT2JqZWN0IHRvIFB5Q2Fwc3VsZS4KCjIwMTEtMDQtMDk6IHN6YWdlcgoJICAgIFtQeXRob25dIEFkZGVkIHByZXByb2Nlc3NvciBndWFyZHMgZm9yIHB5dGhvbiBmdW5jdGlvbnMgUHlVbmljb2RlX0FzV2lkZUNoYXIgYW5kCgkgICAgUHlTbGljZV9HZXRJbmRpY2VzLCB3aGljaCBjaGFuZ2VkIHNpZ25hdHVyZXMgaW4gcHl0aG9uMy4yLgoKMjAxMS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNvbnN0IGFycmF5IHR5cGVkZWZzIHdoaWNoIHdlcmUgZ2VuZXJhdGluZyB1bmNvbXBpbGVhYmxlIGNvZGUgYXMKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgS2FybCBXZXR0ZS4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIHRoZSBiZWhhdmlvciBvZiAlcHl0aG9ubm9uZHluYW1pYyB0byBjb25mb3JtIHRvIHRoZSBzcGVjIGluIExpYi9weXVzZXJkaXIuc3dnLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gTWVyZ2VkIGluIHRoZSBzemFnZXItcHl0aG9uLWJ1aWx0aW4gYnJhbmNoLCBhZGRpbmcgdGhlIC1idWlsdGluIGZlYXR1cmUKCSAgICBmb3IgcHl0aG9uLiAgVGhlIC1idWlsdGluIG9wdGlvbiBtYXkgcHJvdmlkZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW4KCSAgICBpbiBweXRob24gd3JhcHBlcnMuICBGb3IgZnVsbCBkZXRhaWxzIGFuZCBsaW1pdGF0aW9ucywgcmVmZXIgdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbC4KCSAgICBBIHNtYWxsIHRlc3Qgc3VpdGUgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgdGhlIHBlcmZvcm1hbmNlIGdhaW4gaXMgaW4KCSAgICBFeGFtcGxlcy9weXRob24vcGVyZm9ybWFuY2UuCgoyMDExLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gbWlzc2luZyB3cmFwcGVycyBmb3IgZnJpZW5kIGZ1bmN0aW9ucyBmb3Igc29tZSB0YXJnZXQgbGFuZ3VhZ2VzLCBtb3N0bHkKICAgICAgICAgICAgdGhlIG5vbi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSmF2YSBhbmQgQyMuCgpWZXJzaW9uIDIuMC4zICgyOSBNYXJjaCAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFwcGx5IHBhdGNoICMzMjM5MDc2IGZyb20gTWFyaWUgV2hpdGUgZml4aW5nIHN0cmluZ3MgZm9yIFIgPj0gMi43LjAKCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjQ4MjgwIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHdoaWNoIGFkZHMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIHdoZW4KICAgICAgICAgICAgdGhlIGluY29ycmVjdCBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBvdmVybG9hZGVkIG1ldGhvZHMuCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzIyNDY2MyBmcm9tIENocmlzdGlhbiBEZWxiYWVyZS4KICAgICAgICAgICAgMS4gRml4IHdoZW4gZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgdmFsdWUsIGEgIk5VTEwiIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgYW5kIGNhbGxpbmcgdGhpcyBjb21tYW5kIHdpbGwgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQuIAoKICAgICAgICAgICAgMi4gUHJldmlvdXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIGNsYXNzIG1ldGhvZHMgdXNpbmcgYSBsaW5lYXIgc2VhcmNoIGNhdXNpbmcgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICAgICAgICAgIGluIHdyYXBwZXJzIGZvciBjbGFzc2VzIHdpdGggbWFueSBtZW1iZXIgZnVuY3Rpb25zLiBUaGUgcGF0Y2ggYWRkcyBhIG1ldGhvZCBoYXNoIHRhYmxlIHRvIGNsYXNzZXMgYW5kCiAgICAgICAgICAgIGNoYW5nZXMgbWV0aG9kIG5hbWUgbG9va3VwIHRvIHVzZSB0aGUgaGFzaCB0YWJsZSBpbnN0ZWFkIG9mIGRvaW5nIGEgbGluZWFyIHNlYXJjaC4KCjIwMTEtMDMtMjY6IHdzZnVsdG9uCgkgICAgW0MjLCBKYXZhXSBTRiBidWcgIzMxOTUxMTIgLSBmaXggd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfQoKMjAxMS0wMy0yMTogdmFkegoJICAgIEFsbG93IHNldHRpbmcgUENSRV9DRkxBR1MgYW5kIFBDUkVfTElCUyBkdXJpbmcgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CgkgICAgcGNyZS1jb25maWcsIGUuZy4gdG8gYWxsb3cgdXNpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQQ1JFIGxpYnJhcnkuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIFtVVExdIEFkZCBtaXNzaW5nIGhlYWRlcnMgaW4gZ2VuZXJhdGVkIFNUTCB3cmFwcGVycyB0byBmaXggY29tcGlsYXRpb24gd2l0aCBnY2MtNC42LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjIgd2hlcmUgZmlsZW5hbWVzIHdpdGggc3BhY2VzIHdlcmUgbm90IGZvdW5kCgkgICAgd2hlbiB1c2VkIHdpdGggJWluY2x1ZGUgYW5kICVpbXBvcnQuIFJlcG9ydGVkIGJ5IFNoYW5lIExpZXNlZ2FuZy4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4IG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgY29uc3QgY2hhcltdLCBwcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIE1heHdlbGwuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgY2hhcltBTlldIGFuZCBjb25zdCBjaGFyW0FOWV0uCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtDI10gQXBwbHkgcGF0Y2ggIzMyMTI2MjQgZml4aW5nIHN0ZDo6bWFwIEtleXMgcHJvcGVydHkuCgoyMDExLTAzLTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcy9mdW5jdGlvbnMgd2hlcmUgc29tZQoJICAgIHJldHVybiB2b2lkIGFuZCBvdGhlcnMgZG9uJ3QgLSB3aGV0aGVyIHRoaXMgd29ya2VkIG9yIG5vdCBkZXBlbmRlZAoJICAgIG9uIHRoZSBvcmRlciB0aGV5IHdlcmUgZW5jb3VudGVyZWQgaW4gKFNGIzMyMDgyOTkpLgoJCjIwMTEtMDMtMTM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBFeHRlbmRlZCBzdXBwb3J0IGZvciBDKysgbmFtZXNwYWNlcyAobnNwYWNlIGZlYXR1cmUpLgoKMjAxMS0wMy0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzaGFyaW5nIG9mIHR5cGUgaW5mb3JtYXRpb24gYmV0d2VlbiBtdWx0aXBsZSBTV0lHLXdyYXBwZWQKCSAgICBtb2R1bGVzIChTRiMzMjAyNDYzKS4KCjIwMTEtMDMtMDk6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IFNGICMzMTk0Mjk0IC0gY29ybmVyIGNhc2UgYnVnIHdoZW4gJ05VTEwnIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgZm9yIGEgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVyIGluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgoKMjAxMS0wMy0wNzogb2xseQoJICAgIFtQSFBdIERvbid0IHVzZSB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgZm9yIGNhc2VzIHdoZXJlIHRoZSBmdW5jdGlvbgoJICAgIHJldHVybnMgdm9pZCAtIG5vdyB0aGlzIGlzc3VlIGNhbiBvbmx5IG1hdHRlciBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCgkgICAgb3IgbWV0aG9kIHdoaWNoIGlzIGRpcmVjdGVkIGFuZCByZXR1cm5zIG5vbi12b2lkLgoKMjAxMS0wMy0wNjogb2xseQoJICAgIFtQSFBdIEFkZCBjYXN0cyB0byB0aGUgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZwoJICAgIGxvbmcgdG8gYXZvaWQgaXNzdWVzIHdoZW4gdGhleSBhcmUgdXNlZCB3aXRoIHNob3J0ZXIgdHlwZXMgdmlhCgkgICAgJWFwcGx5LgoKMjAxMS0wMy0wMjogd3NmdWx0b24KCSAgICBUZW1wbGF0ZWQgc21hcnQgcG9pbnRlcnMgb3ZlcmxvYWRlZCB3aXRoIGJvdGggY29uc3QgYW5kIG5vbiBjb25zdCBvcGVyYXRvci0+IGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKCSAgICBjb2RlIHdoZW4gdGhlIHBvaW50ZWUgd2FzIGEgY2xhc3Mgd2l0aCBlaXRoZXIgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgb3Igc3RhdGljIG1ldGhvZHMuCgkgICAgUmVncmVzc2lvbiBpbiAyLjAueCByZXBvcnRlZCBhcyB3b3JraW5nIGluIDEuMy40MCBieSB4YW50YXJlcyBvbiBzd2lnLXVzZXIgbWFpbGluZyBsaXN0LgoKVmVyc2lvbiAyLjAuMiAoMjAgRmVicnVhcnkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDItMTk6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdGhlIHR5cGVtYXBzLmkgbGlicmFyeQogICAgICAgICAgICBmb3IgcHJpbWl0aXZlIHJlZmVyZW5jZSB0eXBlcyBhcyB3ZWxsIGFzIHNpZ25lZCBjaGFyICogYW5kIGJvb2wgKi4KCjIwMTEtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBBZGRyZXNzIGJ1ZyBpbiBQSFAgb24gc29tZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyB3aGljaAoJICAgIHJlc3VsdHMgaW4gemVuZF9lcnJvcl9ub3JldHVybigpIG5vdCBiZWluZyBhdmFpbGFibGUgdXNpbmcKCSAgICBTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk4gd2hpY2ggZGVmYXVsdHMgdG8gemVuZF9lcnJvcl9ub3JldHVybiBidXQKCSAgICBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGJ1aWxkaW5nIHRoZSBtb2R1bGUgYnkgcGFzc2luZwoJICAgIC1EU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOPXplbmRfZXJyb3IgdG8gdGhlIGNvbXBpbGVyLiAgVGhpcyBtYXkKCSAgICByZXN1bHQgaW4gY29tcGlsZXIgd2FybmluZ3MsIGJ1dCBzaG91bGQgYXQgbGVhc3QgYWxsb3cgYSBtb2R1bGUKCSAgICB0byBiZSBidWlsdCBvbiB0aG9zZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyAoU0YjMzE2NjQyMykuCgoyMDExLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxODQ1NDkgLSB2YXJhcmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBvdmVybG9hZGluZyB3aGVuIHVzaW5nIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbi4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBBbiBvdmVybG9hZGVkIG1ldGhvZCB3aGljaCBjYW4gcmV0dXJuIGFuIG9iamVjdCBvciBhCgkgICAgcHJpbWl0aXZlIHR5cGUgbm8gbG9uZ2VyIGNhdXNlcyBTV0lHIHRvIHNlZ2ZhdWx0LiAgUmVwb3J0ZWQgYnkgUGF1bAoJICAgIENvbGJ5IGluIFNGIzMxNjg1MzEuCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGludmFsaWQgZXJhc2UgZHVyaW5nIGl0ZXJhdGlvbiBvZiBzdGQ6Om1hcCBpbiBnZW5lcmF0ZWQKCSAgICBkaXJlY3RvciBjb2RlLiAgUmVwb3J0ZWQgYnkgQ29yeSBCZW5uZXR0IGluIFNGIzMxNzU4MjAuCgoyMDExLTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBQcmVwcm9jZXNzaW5nIG5vdyB3YXJucyBpZiBleHRyYSB0b2tlbnMgYXBwZWFyIGFmdGVyICNlbHNlIGFuZCAjZW5kLgoKMjAxMS0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNjUzMDkyIFByZXByb2Nlc3NvciBkb2VzIG5vdCBlcnJvciBvdXQgd2hlbiAjZWxpZiBpcyBtaXNzaW5nIGFuIGV4cHJlc3Npb24uCiAgICAgICAgICAgIFRoaXMgYW5kIG90aGVyIGNhc2VzIG9mIG1pc3NpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gYW4gZXJyb3IuCgoyMDExLTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWxdIEFwcGx5IHBhdGNoICMzMTUxNzg4IGZyb20gSm9lbCBSZXltb250LiBCcmluZ3MgT2NhbWwgc3VwcG9ydCB1cCB0byBkYXRlIAogICAgICAgICAgICAodmVyIDMuMTEgYW5kIDMuMTIpLCBpbmNsdWRpbmcgc3RkOjpzdHJpbmcuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzMxNzYyNzQgZnJvbSBKYW1lcyBNYXN0ZXJzIC0gdHlwZWNoZWNrIHR5cGVtYXAgZm9yIHRpbWVfdC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMTcxNzkzIGZyb20gc3phZ2VyIC0gcHJvdGVjdGVkIGRpcmVjdG9yIG1ldGhvZHMgZmFpbGluZyB3aGVuIC1mdmlydHVhbCBpcyB1c2VkLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTI3ODUyIC0gI2luY2x1ZGUgZGlyZWN0aXZlcyBkb24ndCBwcmVwcm9jZXNzIHRoZSBmaWxlIHBhc3NlZCB0byBpdC4gVGhlIGZpeCBpcyBmb3IKICAgICAgICAgICAgI2luY2x1ZGUgd2l0aCAtaW1wb3J0YWxsIG9yIC1pbmNsdWRlYWxsLCAlaW5jbHVkZSBhbmQgJWltcG9ydCwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSBGSUxFTkFNRSAiYWJjLmgiCiAgICAgICAgICAgICAgJWluY2x1ZGUgRklMRU5BTUUKCjIwMTEtMDItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk0MDUzNiwgb3ZlcmFjdGl2ZSBwcmVwcm9jZXNzb3Igd2hpY2ggd2FzIGV4cGFuZGluZyBkZWZpbmVkKC4uLikgb3V0c2lkZSBvZiAjaWYgYW5kICNlbGlmCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBTRiAjMjk0Mjg5OSBBZGQgdXNlciBzdXBwbGllZCBkb2N1bWVudGF0aW9uIHRvIGhlbHAgZ2V0dGluZyBzdGFydGVkIHdpdGggTXpTY2hlbWUuCiAgICAgICAgICAgIFVwZGF0ZSBjaGFwdGVyIG5hbWUgdG8gTXpTY2hlbWUvUmFja2V0IGFjY291bnRpbmcgZm9yIHRoZSByZW5hbWUgb2YgTXpTY2hlbWUgdG8gUmFja2V0LgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTRiAjMzA4NTkwNiAtIFBvc3NpYmxlIGZpeCBydW5uaW5nIHRlc3Qtc3VpdGUgb24gTWFjIE9TWC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTczMzY3IEJldHRlciBpbmZvcm1hdGlvbiBkdXJpbmcgY29uZmlndXJlIGFib3V0IEJvb3N0IHByZXJlcXVpc2l0ZSBmb3IgcnVubmluZwogICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZS4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMzMTI3NjMzIEZpeCBpbmZpbml0ZSBsb29wIGluIHJlY3Vyc2l2ZSB0eXBlZGVmIHJlc29sdXRpb24uCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gU0YgIzMxNjg2NzYgRml4ICVyZW5hbWUgbm90IHdvcmtpbmcgZm9yIG1lbWJlciB2YXJpYWJsZXMgYW5kIG1ldGhvZHMuCgoyMDExLTAyLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2xpc3BdIFNGICMzMTQ4MjAwIEZpeCBzZWdmYXVsdCBwYXJzaW5nIG5lc3RlZCB1bmlvbnMuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9ycyAtIGEgY2FsbCB0byBhIG1ldGhvZCBiZWluZyBkZWZpbmVkIGluIHRoZSBiYXNlIGNsYXNzLCBub3QKICAgICAgICAgICAgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLCBidXQgYWdhaW4gb3ZlcnJpZGRlbiBpbiBhIGNsYXNzIGRlcml2ZWQgZnJvbQogICAgICAgICAgICB0aGUgZmlyc3Qgc3ViY2xhc3Mgd2FzIG5vdCBiZWluZyBkaXNwYXRjaGVkIGNvcnJlY3RseSB0byB0aGUgbW9zdCBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICBTZWUgZGlyZWN0b3JfYWx0ZXJuYXRpbmcuaSBmb3IgYW4gZXhhbXBsZS4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQW55ICd1c2luZycgc3RhdGVtZW50cyBpbiB0aGUgcHJvdGVjdGVkIHNlY3Rpb24gb2YgYSBjbGFzcyB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgaWdub3JlZCB3aXRoIGRpcmVjdG9yIHByb3RlY3RlZCAoZGlycHJvdCkgbW9kZS4KCjIwMTEtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBvdmVybG9hZGluZyB3aXRoIGNvbnN0IHBvaW50ZXIgcmVmZXJlbmNlIChTV0lHVFlQRSAqY29uc3QmKSBwYXJhbWV0ZXJzIGZvciBhCiAgICAgICAgICAgIG51bWJlciBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2VzLgoKMjAxMS0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHdhcm5pbmcgZm9yIHNtYXJ0IHBvaW50ZXJzIGlmIG9ubHkgc29tZSBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UKICAgICAgICAgICAgY2hhaW4gYXJlIG1hcmtlZCBhcyBzbWFydCBwb2ludGVyLCBlZywgJXNoYXJlZF9wdHIgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgc28gdGhpcyBuZXcgd2FybmluZyBoaWdobGlnaHRzIGNvZGUgd2hlcmUgdGhpcyBpcwogICAgICAgICAgICBub3QgdGhlIGNhc2UuCgogICAgICAgICAgICAgIGV4YW1wbGUuaToxMjogV2FybmluZyA1MjA6IEJhc2UgY2xhc3MgJ0EnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjE2OiBXYXJuaW5nIDUyMDogRGVyaXZlZCBjbGFzcyAnQycgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KCjIwMTEtMDEtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHNvbWUgbWlzc2luZyBtdWx0aS1hcmd1bWVudCB0eXBlbWFwczogKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgYW5kIAogICAgICAgICAgICAoY2hhciAqU1RSSU5HLCBpbnQgTEVOR1RIKS4gRG9jdW1lbnRhdGlvbiBmb3IgdGhpcyB1cGRhdGVkLiBKYXZhIHBhdGNoIGZyb20KICAgICAgICAgICAgVm9sa2VyIEdyYWJzY2guCgoyMDExLTAxLTExOiBpYW50CgkgICAgUmVxdWlyZSBHbyB2ZXJzaW9uIDcwNzcgb3IgbGF0ZXIuCgoyMDEwLTEyLTMwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbQyMsIEQsIEphdmFdIENoZWNrIGZvciBjb2xsaXNpb24gb2YgcGFyYW1ldGVyIG5hbWVzIHdpdGggdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlIGtleXdvcmRzIHdoZW4gZ2VuZXJhdGluZyB0aGUgZGlyZWN0b3IgZ2x1ZSBjb2RlLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgZ2VuZXJhdGVkIGNvdWxkIHdvdWxkIHByZXZpb3VzbHkgYmUKICAgICAgICAgICAgaW52YWxpZCBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgbmV3ICdkaXJlY3Rvcl9rZXl3b3JkcycgdGVzdCBjYXNlLgoKMjAxMC0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBub3QgYmVpbmcgZXhwYW5kZWQgZm9yIGNzdmFyaW4gdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMC0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRiYXNlbWFuZ2xlIGV4cGFuc2lvbiBpbiBhcnJheSB0eXBlbWFwcy4gRm9yIGV4YW1wbGUgaWYgdHlwZSBpcyBpbnQgKlszXSwKICAgICAgICAgICAgJGJhc2VtYW5nbGUgZXhwYW5kcyB0byBfcF9pbnQuCgoyMDEwLTEyLTA3OiBpYW50CgkgICAgQ2hlY2sgdGhhdCB3ZSBhcmUgdXNpbmcgYSBzdWZmaWNpZW50bHkgbmV3IHZlcnNpb24gb2YgdGhlCgkgICAgNmcgb3IgOGcgR28gY29tcGlsZXIgZHVyaW5nIGNvbmZpZ3VyZSB0aW1lLiBJZiBub3QsIGRpc2FibGUgR28uCiAgICAgICAgICAgIE1pbmltdW0gdmVyc2lvbiBpcyBub3cgNjcwNy4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTEyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxMjczOTQgLSB1c2Ugb2YgbmV0d29yayBwYXRocyBvbiBXaW5kb3dzL01TeXMuCgoyMDEwLTExLTE4OiBrbGlja3ZlcmJvdAoJICAgIFtEXSBBZGRlZCB0aGUgRCBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTExLTEyOiB2YWR6CgkgICAgRml4IGhhbmRsaW5nIG9mIG11bHRpcGxlIHJlZ2V4LXVzaW5nICVyZW5hbWVzIGF0dGFjaGVkIHRvIHRoZSBzYW1lCgkgICAgZGVjbGFyYXRpb24uIEZvciBleGFtcGxlLCBub3cKCgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4L15TZXQoLiopL3B1dFxcMS8pcyIpICIiOwoJICAgICAgJXJlbmFtZSgiJShyZWdleC9eR2V0KC4qKS9nZXRcXDEvKXMiKSAiIjsKCgkgICAgd29ya3MgYXMgZXhwZWN0ZWQgd2hlcmVhcyBiZWZvcmUgb25seSB0aGUgbGFzdCBhbm9ueW1vdXMgcmVuYW1lIHdhcwoJICAgIHRha2VuIGludG8gYWNjb3VudC4KCjIwMTAtMTAtMTc6IGRyam9lCgkgICAgW1JdIEZpeCBmYWlsdXJlIGluIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdoaWNoIHdhcyBicmVha2luZwoJICAgIFF1YW50TGliLVNXSUcKCjIwMTAtMTAtMTQ6IG9sbHkKCSAgICBbUEhQXSBBbGxvdyBjb21waWxhdGlvbiBvbiBub24tY29uZm9ybWluZyBNaWNyb3NvZnQgQysrIGNvbXBpbGVycwoJICAgIHdoaWNoIGRvbid0IGFjY2VwdDogcmV0dXJuIGZ1bmN0aW9uX3JldHVybmluZ192b2lkKCk7CgkgICAgUmVwb3J0ZWQgYnkgRnJhbmsgVmFuZGVuIEJlcmdoZW4gb24gdGhlIFNXSUcgbWFpbGluZyBsaXN0LgoKMjAxMC0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgKGdsb2JhbCBzY29wZSkgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC4wLCByZXBvcnRlZCBieQogICAgICAgICAgICBCZW4gV2Fsa2VyLiBUaGUgbWFuZ2xlZCBzeW1ib2wgbmFtZXMgd2VyZSBpbmNvcnJlY3QsIHNvbWV0aW1lcyByZXN1bHRpbmcgaW4gdHlwZXMgYmVpbmcKICAgICAgICAgICAgaW5jb3JyZWN0bHkgdHJlYXRlZCBhcyBvcGFxdWUgdHlwZXMuCgogICAgICAgICAgICBBbHNvIGZpeGVzICMyOTU4NzgxIGFuZCBzb21lIG90aGVyIHR5cGUgcHJvYmxlbXMgZHVlIHRvIGJldHRlciB0eXBlZGVmIHJlc29sdXRpb24sIGVnIAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUICo+Ojp2YWx1ZV90eXBlIGRpZG4ndCByZXNvbHZlIHRvIFQgKiB3aGVuIGl0IHNob3VsZCBoYXZlLiBUaGUgbWFuZ2xlZCB0eXBlCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBTV0lHVFlQRV9zdGRfX3ZlY3RvclRfVGVzdF9wX3N0ZF9fYWxsb2NhdG9yVF9UZXN0X3BfdF90X192YWx1ZV90eXBlIGFuZCBub3cKICAgICAgICAgICAgaXQgaXMgY29ycmVjdGx5IFNXSUdUWVBFX3BfVGVzdC4KClZlcnNpb24gMi4wLjEgKDQgT2N0b2JlciAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMTAtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMDY2OTU4IGZyb20gTWlrYWVsIEpvaGFuc3NvbiB0byBmaXggZGVmYXVsdCBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIGhhbmRsaW5nIHdoZW4gdGhlIHNtYXJ0IHBvaW50ZXIgY29udGFpbnMgYm90aCBhIGNvbnN0IGFuZCBub24tY29uc3Qgb3BlcmF0b3ItPi4KCjIwMTAtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtcGNyZXZlcnNpb24gb3B0aW9uIHRvIGRpc3BsYXkgUENSRSB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKMjAxMC0xMC0wMTogb2xseQoJICAgIFtSdWJ5XSBBdm9pZCBzZWdmYXVsdCB3aGVuIGEgbWV0aG9kIG5vZGUgaGFzIG5vIHBhcmVudE5vZGUKCSAgICAoU0YjMzAzNDA1NCkuCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1B5dGhvbl0gQWxsb3cgcmVpbml0aWFsaXNhdGlvbiB0byB3b3JrIHdpdGggYW4gZW1iZWRkZWQgUHl0aG9uCgkgICAgaW50ZXJwcmV0ZXIgKHBhdGNoIGZyb20gSmltIENhcnJvbGwgaW4gU0YjMzA3NTE3OCkuCgoyMDEwLTA5LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoIGZyb20gVG9tYXMgRGlydmFuYXVza2FzIGZvciBzdGQ6Om1hcCB3cmFwcGVycyB0byBhdm9pZAogICAgICAgICAgICB0aHJvd2luZyBleGNlcHRpb25zIHdpdGggbm9ybWFsIHVzYWdlIG9mIGl0ZXJhdG9ycy4KCjIwMTAtMDktMjc6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gd2hlbiBhIHBhcmFtZXRlciBvZiB0aGUgd3JvbmcKCSAgICB0eXBlIGlzIHBhc3NlZCB0byBhbiBvdmVybG9hZGVkIG1ldGhvZCAoU0YjMzAyNzM1NSkuCgoyMDEwLTA5LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBTRiBwYXRjaCAjMzA3NTE1MCAtIEphdmEgZGlyZWN0b3JzIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMgaW4KICAgICAgICAgICAgbmFtZWQgbmFtZXNwYWNlLgoKMjAxMC0wOS0yNDogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIHdoZXJlIFNXSUcgbWFjcm9zCiAgICAgICAgICAgIGFyZSB1c2VkIHdpdGhpbiB7fSBicmFjZXMgKHdoZXJlIHRoZSBwcmVwcm9jZXNzb3IgZXhwYW5kcyBtYWNyb3MpLAogICAgICAgICAgICBmb3IgZXhhbXBsZSBtYWNyb3Mgd2l0aGluICVpbmxpbmUgey4uLn0gYW5kICVmcmFnbWVudCguLi4pIHsuLi59CiAgICAgICAgICAgIGFuZCBuZXN0ZWQgc3RydWN0cy4KCjIwMTAtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZmlsZSBhbmQgbGluZSBlcnJvci93YXJuaW5nIHJlcG9ydGluZyBmaXhlcyBmb3IgdmFyaW91cyBpbmhlcml0ZWQKICAgICAgICAgICAgY2xhc3MgcHJvYmxlbXMuCgoyMDEwLTA5LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBBIG11Y2ggaW1wcm92ZWQgZGVidWdnaW5nIG9mIFNXSUcgc291cmNlIGV4cGVyaWVuY2UgaXMgbm93IGF2YWlsYWJsZSBhbmQKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiB0aGUgIkRlYnVnZ2luZyBTV0lHIiBzZWN0aW9uIGluIHRoZSBEb2MvRGV2ZWwvaW50ZXJuYWxzLmh0bWwKICAgICAgICAgICAgZmlsZSwgaW5jbHVkaW5nIGEgc3dpZy5kYmcgc3VwcG9ydCBmaWxlIGZvciB0aGUgZ2RiIGRlYnVnZ2VyLgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIHdoZW4gYSBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9uIGVuZHMgd2l0aCAnLycgYW5kIGl0IGlzIG5vdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIGFmdGVyIHBhcnNpbmcKICAgICAgICAgICAgbWFjcm8gaW52b2NhdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIG92ZXIgbW9yZSB0aGFuIG9uZSBsaW5lLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgbGluZSBpbiBwcmVwcm9jZXNzZWQgb3V0cHV0IGFmdGVyIGluY2x1ZGluZyBmaWxlcwogICAgICAgICAgICB3aGljaCB3b3VsZCBzb21ldGltZXMgbGVhZCB0byBlcnJvci93YXJuaW5nIG1lc3NhZ2VzIHR3byBsaW5lcyBhZnRlciB0aGUKICAgICAgICAgICAgZW5kIG9mIHRoZSBmaWxlLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMTQ5NTIzIC0gSW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMgYWZ0ZXIgcGFyc2luZyBtYWNyb3MKICAgICAgICAgICAgY29udGFpbmluZyBDKysgY29tbWVudHMuCgoyMDEwLTA5LTA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIE9VVFBVVCB0eXBlbWFwcyAoUGF0Y2ggZnJvbSBSeWFuIGluIFNGIzMwNTgzOTQpLgoKMjAxMC0wOS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGVycm9uZW91cyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgZm9yIG1hY3JvIGV4cGFuc2lvbnMsIGZvciBleGFtcGxlLAogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSBub3cgcG9pbnRzIHRvIGluc3RhbnRpYXRpb24gb2YgdGhlIG1hY3JvLCBpZSB0aGUgbGFzdCBsaW5lIGhlcmU6CgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8yKGEsIGIpIAoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPMShOQU1FKSBNQUNSTzIoTkFNRSwyLDMpIAoKICAgICAgICAgICAgICBNQUNSTzEoYWJjKQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBmb3IgcHJlcHJvY2Vzc29yIG1lc3NhZ2VzIHdpdGhpbgogICAgICAgICAgICAlaW5saW5lLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSIDEKICAgICAgICAgICAgICAjZGVmaW5lIEZPT0JBUiAiaGkiCiAgICAgICAgICAgICAgJX0KCjIwMTAtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgd2hpY2ggd2VyZSBjdW11bGF0aXZlbHkgb25lCiAgICAgICAgICAgIGxlc3MgdGhhbiB0aGV5IHNob3VsZCBoYXZlIGJlZW4gYWZ0ZXIgcGFyc2luZyBlYWNoICVpbmNsdWRlLyVpbXBvcnQgLSBidWcKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTEuMy4zMi4gQWxzbyBmaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgIHdoZW4gbmV3IGxpbmUgY2hhcmFjdGVycyBhcHBlYXIgYmV0d2VlbiB0aGUgJWluY2x1ZGUgLyAlaW1wb3J0IHN0YXRlbWVudCBhbmQKICAgICAgICAgICAgdGhlIGZpbGVuYW1lLgoKMjAxMC0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1hY3JvIHByZXByb2Nlc3NvciB3YXJuaW5ncy4KICAgICAgICAgICAgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBtYWNybyBhcmd1bWVudCBoYXMgYmVlbiBjb3JyZWN0ZWQgYW5kIHRoZSBsaW5lIG51bWJlcgogICAgICAgICAgICBvZiB0aGUgc3RhcnQgb2YgdGhlIG1hY3JvIGluc3RlYWQgb2Ygb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgbWFjcm8gaXMgdXNlZC4KICAgICAgICAgICAgU29tZSBleGFtcGxlczoKICAgICAgICAgICAgICBmaWxlLmg6MTE6IEVycm9yOiBJbGxlZ2FsIG1hY3JvIGFyZ3VtZW50IG5hbWUgJy4uJwogICAgICAgICAgICAgIGZpbGUuaDoxOTogRXJyb3I6IE1hY3JvICdEVVBMSUNBVEUnIHJlZGVmaW5lZCwKICAgICAgICAgICAgICBmaWxlLmg6MTU6IEVycm9yOiBwcmV2aW91cyBkZWZpbml0aW9uIG9mICdEVVBMSUNBVEUnLgogICAgICAgICAgICAgIGZpbGUuaDoyNTogRXJyb3I6IFZhcmlhYmxlLWxlbmd0aCBtYWNybyBhcmd1bWVudCBtdXN0IGJlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICAgZmlsZS5oOjMyOiBFcnJvcjogSWxsZWdhbCBjaGFyYWN0ZXIgaW4gbWFjcm8gYXJndW1lbnQgbmFtZQogICAgICAgICAgICAgIGZpbGUuaTozNzogRXJyb3I6IE1hY3JvICdTSVQnIGV4cGVjdHMgMiBhcmd1bWVudHMKCjIwMTAtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBfX0xJTkVfXyBhbmQgX19GSUxFX18gZXhwYW5zaW9uIHJlcG9ydGVkIGJ5IENhbWlsbGUgR2lsbG90LiBNb3N0bHkgdGhpcwogICAgICAgICAgICBkaWQgbm90IHdvcmsgYXQgYWxsLiBBbHNvIGZpeGVzIFNGICMyODIyODIyLgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBjb3JuZXIgY2FzZSBtYXJzaGFsbGluZyBvZiBkb3VibGVzIC0gZXJybm8gd2FzIG5vdCBiZWluZyBjb3JyZWN0bHkKICAgICAgICAgICAgc2V0IGJlZm9yZSBjYWxsaW5nIHN0cnRvZCAtIHBhdGNoIGZyb20gSnVzdGluIFZhbGxvbiAtIFNGIEJ1ZyAjMzAzODkzNi4KCjIwMTAtMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtYWtlIGRpc3RjbGVhbiB3aGVuIHNvbWUgb2YgdGhlIG1vcmUgb2JzY3VyZSBsYW5ndWFnZXMgYXJlIGRldGVjdGVkIGJ5CiAgICAgICAgICAgIGNvbmZpZ3VyZSAtIGZpeGVzIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0yODogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZSBjb25maWd1cmluZyBvdXQgb2Ygc291cmNlIGZvciB0aGUgdGVzdC1zdWl0ZSBzaW5jZSBpdCBicm9rZSBpbiAxLjMuMzcuCiAgICAgICAgICAgIEFzIHByZXZpb3VzbHksIGlmIHJ1bm5pbmcgJ21ha2UgY2hlY2stdGVzdC1zdWl0ZScgb3V0IG9mIHNvdXJjZSwgaXQgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBieSBpbnZva2luZyBjb25maWd1cmUgd2l0aCBhIHJlbGF0aXZlIHBhdGguIEludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGFuCiAgICAgICAgICAgIGFic29sdXRlIHBhdGggd2lsbCBub3Qgd29yay4gUnVubmluZyB0aGUgZnVsbCAnbWFrZSBjaGVjaycgc3RpbGwgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBpbiB0aGUgc291cmNlIHRyZWUuCgoyMDEwLTA3LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgICAgICByZXR1cm5zIGJ5IHJlZmVyZW5jZS4KCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgb2xkIGV4cGVyaW1lbnRhbCAicnhzcGVuY2VyIiBlbmNvZGVyIGFuZAogICAgICAgICAgICAiW25vdF1yeHNtYXRjaCIgaW4gJXJlbmFtZSAoc2VlIHRoZSAwMS8xNi8yMDA2IGVudHJ5KS4gVGhlIG5ldyBhbmQKICAgICAgICAgICAgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgInJlZ2V4IiBlbmNvZGVyIGFuZCAiW25vdF1yZWdleG1hdGNoIiBjaGVja3MKICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCAoc2VlIHRoZSB0d28gcHJldmlvdXMgZW50cmllcykuIFBsZWFzZQogICAgICAgICAgICByZXBsYWNlICIlKHJ4c3BlbmNlcjpbcGF0XVtzdWJzdF0pcyIgd2l0aCAiJShyZWdleDovcGF0L3N1YnN0LylzIgogICAgICAgICAgICB3aGVuIHVwZ3JhZGluZy4gTm90aWNlIHRoYXQgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHJlcGxhY2UgdGhlIGJhY2stCiAgICAgICAgICAgIHJlZmVyZW5jZXMgb2YgZm9ybSAiQDEiIHdpdGggdGhlIG1vcmUgc3RhbmRhcmQgIlxcMSIgYW5kIG1heSBuZWVkIHRvCiAgICAgICAgICAgIGFkanVzdCB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3ludGF4IGFzIHRoZSBuZXcgcmVnZXggZW5jb2RlciB1c2VzCiAgICAgICAgICAgIFBlcmwtY29tcGF0aWJsZSBzeW50YXggYW5kIG5vdCAoZXh0ZW5kZWQpIFBPU0lYIHN5bnRheCBhcyB0aGUgb2xkIG9uZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgInJlZ2V4bWF0Y2giLCAicmVnZXh0YXJnZXQiIGFuZCAibm90cmVnZXhtYXRjaCIgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgJXJlbmFtZSBkaXJlY3RpdmVzIHRvIHRoZSBkZWNsYXJhdGlvbnMgbWF0Y2hpbmcgdGhlCiAgICAgICAgICAgIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gb25seS4gVGhlIGZpcnN0IHR3byBjYW4gYmUgdXNlZAogICAgICAgICAgICBpbnRlcmNoYW5nZWFibHksIGJvdGggb2YgdGhlICVyZW5hbWVzIGJlbG93IGRvIHRoZSBzYW1lIHRoaW5nOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleG1hdGNoJG5hbWU9Ik9sZCQiKSAiIjsKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleHRhcmdldD0xKSAiT2xkJCI7CgogICAgICAgICAgICAobmFtZWx5IGlnbm9yZSB0aGUgZGVjbGFyYXRpb25zIGhhdmluZyAiT2xkIiBzdWZmaXgpLgoKICAgICAgICAgICAgIm5vdHJlZ2V4bWF0Y2giIHJlc3RyaWN0cyB0aGUgbWF0Y2ggdG8gb25seSB0aGUgZGVjbGFyYXRpb25zIHdoaWNoCiAgICAgICAgICAgIGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uLCBlLmcuIGhlcmUgaXMgaG93IHRvIHJlbmFtZSB0bwogICAgICAgICAgICBsb3dlciBjYXNlIHZlcnNpb25zIGFsbCBkZWNsYXJhdGlvbnMgZXhjZXB0IHRob3NlIGNvbnNpc3RpbmcgZnJvbQogICAgICAgICAgICBjYXBpdGFsIGxldHRlcnMgb25seToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkKGxvd2VyY2FzZSlzIiwgbm90cmVnZXhtYXRjaCRuYW1lPSJeW0EtWl0rJCIpICIiOwoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgdGhlIG5ldyAicmVnZXgiIGVuY29kZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiAlcmVuYW1lLCBlLmcuCgogICAgICAgICAgICAgICAgJXJlbmFtZSgicmVnZXg6LyhcXHcrKV8oLiopL1xcMi8iKSAiIjsKCiAgICAgICAgICAgIHRvIHJlbW92ZSBhbnkgYWxwaGFiZXRpY2FsIHByZWZpeCBmcm9tIGFsbCBpZGVudGlmaWVycy4gVGhlIHN5bnRheAogICAgICAgICAgICBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpcyBQZXJsLWxpa2UgYW5kIFBDUkUgbGlicmFyeQogICAgICAgICAgICAoaHR0cDovL3d3dy5wY3JlLm9yZy8pIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgZmVhdHVyZSBidXQgbm90aWNlCiAgICAgICAgICAgIHRoYXQgYmFja3NsYXNoZXMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHVzdWFsIGluc2lkZSBDIHN0cmluZ3MuCgogICAgICAgICAgICBPcmlnaW5hbCBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMTAtMDctMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzAyNDg3NSAtIHNoYXJlZF9wdHIgb2YgY2xhc3NlcyB3aXRoIG5vbi1wdWJsaWMgZGVzdHJ1Y3RvcnMuIFRoaXMgYWxzbyBmaXhlcwogICAgICAgICAgICB0aGUgInVucmVmIiBmZWF0dXJlIHdoZW4gdXNlZCBvbiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4KCjIwMTAtMDYtMTc6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gQWRkIHRoZSBHbyBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTA2LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggU1dJR19sdWFfaXNuaWxzdHJpbmcgbXVsdGlwbHkgZGVmaW5lZCB3aGVuIHVzaW5nIG11bHRpcGxlCiAgICAgICAgICAgIG1vZHVsZXMgYW5kIHdyYXBwaW5nIHN0cmluZ3MuIFBhdGNoIGZyb20gJ051bWJlciBDcnVuY2hlcicuCgoyMDEwLTA2LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9ycyB0byBjb3JyZWN0bHkgY2FsbCBhIG1ldGhvZCB3aXRoIGhhcyBhCgkgICAgZGlmZmVyZW50IG5hbWUgaW4gUEhQIHRvIEMrKyAod2Ugd2VyZSBhbHdheXMgdXNpbmcgdGhlIEMrKyBuYW1lCgkgICAgaW4gdGhpcyBjYXNlKS4KCjIwMTAtMDYtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1bmNvbXBpbGVhYmxlIGNvZGUgd2hlbiAlcmVuYW1lIHJlc3VsdHMgaW4gdHdvIGVudW0gaXRlbXMKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKVmVyc2lvbiAyLjAuMCAoMiBKdW5lIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0wNi0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEIG1hY3JvIHVzZWQgaW4gc3RkOjp2ZWN0b3IgdG8gd29yayB3aXRoCiAgICAgICAgICAgIHR5cGVzIGNvbnRhaW5pbmcgY29tbWFzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKHN0ZDo6cGFpcjwgZG91YmxlLCBzdGQ6OnN0cmluZyA+KQoKMjAxMC0wNi0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIHN0ZF9zaGFyZWRfcHRyLmkgZm9yIHdyYXBwaW5nIHN0ZDo6c2hhcmVkX3B0ci4gUmVxdWlyZXMgdGhlICVzaGFyZWRfcHRyCiAgICAgICAgICAgIG1hY3JvIGxpa2UgaW4gdGhlIGJvb3N0X3NoYXJlZF9wdHIuaSBsaWJyYXJ5LiBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZQogICAgICAgICAgICB3cmFwcGVkIGlmIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVmaW5lZDoKCiAgICAgICAgICAgICAgI2RlZmluZSBTV0lHX1NIQVJFRF9QVFJfU1VCTkFNRVNQQUNFIHRyMQogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc2hhcmVkX3B0ci5pPgoKICAgICAgICAgICAgc2hhcmVkX3B0ciBpcyBhbHNvIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sIG5vdy4KCjIwMTAtMDUtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSBmb3IgJHR5cGVtYXAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG8gY2FsbCBvdGhlciAkdHlwZW1hcAogICAgICAgICAgICBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQ0MgIkNDIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQkIgIiR0eXBlbWFwKGNzdHlwZSwgQ0MpIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQUEgIiR0eXBlbWFwKGNzdHlwZSwgQkIpIgogICAgICAgICAgICAgIHZvaWQgaGFoKEFBIGFhKTsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBDIyBzdGQ6OnZlY3RvciBjb250YWluZXJzIG9mIHNoYXJlZF9wdHIgYW5kICVzaGFyZWRfcHRyLgoKICAgICAgICAgICAgQWxzbyBhZGRlZCBkaWFnbm9zdGljcyBmb3IgJHR5cGVtYXAgd2l0aCAtZGVidWctdG1zZWFyY2gsIGZvciBleGFtcGxlLCB0aGUKICAgICAgICAgICAgYWJvdmUgZGlzcGxheXMgYWRkaXRpb25hbCBkaWFnbm9zdGljIGxpbmVzIHN0YXJ0aW5nICJDb250YWluaW5nOiAiOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBBQQogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBCQikKICAgICAgICAgICAgICBleGFtcGxlLmk6MzE6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQkIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBCQgogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQkIKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQ0MpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjI5OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IENDCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQ0MKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIENDCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgRml4ICVhdHRyaWJ1dGUycmVmIG5vdCB0byBwcm9kdWNlIGEgc3ludGF4IGVycm9yIGlmIHRoZSBsYXN0CgkgICAgYXJndW1lbnQgKEFjY2Vzc29yTWV0aG9kKSBpcyBvbWl0dGVkLiAgUGF0Y2ggZnJvbSBEYXZpZCBQaWVwZ3JhcwoJICAgIGluIFNGIzIyMzU3NTYuCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgW1BIUF0gV2hlbiB1c2luZyAldGhyb3dzIG9yICVjYXRjaGVzLCBTV0lHLWdlbmVyYXRlZCBQSFA1IHdyYXBwZXJzCgkgICAgbm93IHRocm93IFBIUCBFeGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIGdpdmluZyBhIFBIUCBlcnJvciBvZgoJICAgIHR5cGUgRV9FUlJPUi4KCgkgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkbid0IGNhdXNlIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHNpbmNlIHlvdSBjYW4ndAoJICAgIHNldCBhbiBlcnJvciBoYW5kbGVyIGZvciBFX0VSUk9SLCBzbyBwcmV2aW91c2x5IFBIUCB3b3VsZCBqdXN0IGV4aXQKCSAgICB3aGljaCBhbHNvIGhhcHBlbnMgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLiAgVGhlIGJlbmVmaXQgaXMgeW91IGNhbgoJICAgIG5vdyBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvLgoKCSAgICBGaXhlcyBTRiMyNTQ1NTc4IGFuZCBTRiMyOTU1NTIyLgoKMjAxMC0wNS0yNTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY29uc3Qgc3RkOjpzdHJpbmcgJi4KCSAgICBGaXhlcyBTRiMzMDA2NDA0IHJlcG9ydGVkIGJ5IHQtTGVnaWF3LgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzI5NTczNzUgLSBTV0lHU3RyaW5nSGVscGVyIGFuZCBTV0lHRXhjZXB0aW9uSGVscGVyIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSBpbiAuTkVUIDQgYXMgdGhlIGNsYXNzZXMgd2VyZSBub3QgbWFya2VkIGJlZm9yZWZpZWxkaW5pdC4KICAgICAgICAgICAgQSBzdGF0aWMgY29uc3RydWN0b3IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVwcmFnbWEoY3NoYXJwKSBpbWNsYXNzY29kZT0lewogICAgICAgICAgICAgICAgc3RhdGljICRpbWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgSWYgeW91IGhhZCBhZGRlZCB5b3VyIG93biBjdXN0b20gc3RhdGljIGNvbnN0cnVjdG9yIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgaW4KICAgICAgICAgICAgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLCB5b3Ugd2lsbCBoYXZlIHRvIG1vZGlmeSB5b3VyIGFwcHJvYWNoIHRvIHVzZSBzdGF0aWMgdmFyaWFibGUKICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb3IgZGVmaW5lIFNXSUdfQ1NIQVJQX05PX0lNQ0xBU1NfU1RBVElDX0NPTlNUUlVDVE9SIC0gU2VlIGNzaGFycGhlYWQuc3dnLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQwODIzMi4gSW1wcm92ZSBzaGFyZWRfcHRyIGFuZCBpbnRydXNpdmVfcHRyIHdyYXBwZXJzIGZvciBjbGFzc2VzIGluIGFuCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gTm8gc3BlY2lhbCB0cmVhdG1lbnQgaXMgbmVlZGVkIGZvciBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBwcm94eSBjbGFzcyBhbHNvIG5vIGxvbmdlciBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgZGVkdWNlZC4gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVzaGFyZWRfcHRyKFRZUEUpCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgaW50cnVzaXZlX3B0ciB3cmFwcGVycywgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlaW50cnVzaXZlX3B0cihUWVBFKQoKMjAxMC0wNS0yMTogb2xseQoJICAgIFtQSFBdIFN0b3AgZ2VuZXJhdGluZyBhIGJvZ3VzIGxpbmUgb2YgY29kZSBpbiBjZXJ0YWluIGNvbnN0cnVjdG9ycy4KCSAgICBUaGlzIHdhcyBtb3N0bHkgaGFybWxlc3MsIGJ1dCBjYXVzZWQgYSBQSFAgbm90aWNlIHRvIGJlIGlzc3VlZCwgaWYKCSAgICBlbmFibGVkIChTRiMyOTg1Njg0KS4KCjIwMTAtMDUtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoyMDEwLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgQysrIGVudW0gYm9vbGVhbiB2YWx1ZXMgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmOgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7IFBMQVkgPSB0cnVlLCBTVE9QID0gZmFsc2UgfSBwbGF5X3N0YXRlOwoKMjAxMC0wNS0xNDogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIHdhcyBwcm9kdWNpbmcKCSAgICB1bmNvbXBpbGFibGUgY29kZSBpbiBzb21lIGNhc2VzLgoKMjAxMC0wNS0xMjogZHJqb2UKCSAgICBbUl0gQWRkIHR3byBtb3JlIGNoYW5nZXMgZnJvbSBXaWwgTm9sYW4uICBHZXQgZ2FyYmFnZQoJICAgIGNvbGxlY3Rpb24gdG8gd29yay4gIEltcGxlbWVudCBuZXdmcmVlCgoyMDEwLTA1LTA5OiBkcmpvZQogICAgICAgICAgICBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbCBOb2xhbiBjaGFuZ2UgY3JlYXRpb24gb2Ygc3RyaW5nIHNvCiAgICAgICAgICAgIHRoYXQgUiAyLjcuMCsgY2FuIHVzZSBjaGFyIGhhc2hlcwoKMjAxMC0wNS0wNzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzI5NTUxNDYgZnJvbSBTZXJnZXkgU2F0c2tpeSB0byBmaXggZXhwcmVzc2lvbnMgY29udGFpbmluZyBkaXZpZGUgYnkKICAgICAgICAgICAgb3BlcmF0b3IgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdHMuCgoyMDEwLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gTWVtb3J5IGxlYWsgZml4IGhhbmRsaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5wdXRzLCByZXBvcnRlZCBieSBXaWxsIE5vbGFuLgoKMjAxMC0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBtYXRjaGluZyBlbmhhbmNlbWVudCBmb3Igbm9uLWRlZmF1bHQgdHlwZW1hcHMuIFByZXZpb3VzbHkgYWxsCiAgICAgICAgICAgIHF1YWxpZmllcnMgd2VyZSBzdHJpcHBlZCBpbiBvbmUgc3RlcCwgbm93IHRoZXkgYXJlIHN0cmlwcGVkIG9uZSBhdCBhIHRpbWUKICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdCBtb3N0IHF1YWxpZmllci4gRm9yIGV4YW1wbGUsIGludCBjb25zdCpjb25zdCAKICAgICAgICAgICAgaXMgZmlyc3Qgc3RyaXBwZWQgdG8gaW50ICpjb25zdCB0aGVuIGludCAqLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDQtMjU6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5ODU2NTUgLSBicm9rZW4gY29uc3RydWN0b3IgcmVuYW1pbmcuCgoyMDEwLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIGZyYWdtZW50cyBhcmUgbm93IG9mZmljaWFsIGFuZCBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMyMDQ4MDY0IGFuZCAjMjQwODAyMC4KICAgICAgICAgICAgQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBSdWJ5IGFuZCBzdGQ6OnZlY3RvciB3cmFwcGVycyB3aXRoIC1taW5oZXJpdC4KICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzUyMjg3NAoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW016c2NoZW1lXSBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IHN0ZDo6bWFwIHdyYXBwZXJzOgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvMjAzODc2CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjk1MjM3NCAtIGZpeCBkaXJlY3RvcnMgYW5kIHRoZSAtbm9ydHRpIG9wdGlvbi4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMjg4NzI1NCBhbmQgIzI5NDYwMzIgLSBTV0lHX0x1YV90eXBlbmFtZSB1c2luZyB3cm9uZyBzdGFjayBpbmRleC4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBleGNlcHRpb25zIGJlaW5nIHRocm93biB3aXRoIHRoZSAtdGhyZWFkcyBvcHRpb24gYmFzZWQgb24gcGF0Y2ggZnJvbSBBcnRvIFZ1b3JpLgogICAgICAgICAgICBGaXhlcyBidWcgIzI4MTg0OTkuCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggTWFrZWZpbGUgdGFyZ2V0czogZGlzdGNsZWFuIGFuZCBtYWludGFpbmVyLWNsZWFuCgoyMDEwLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggY2hhciBwb2ludGVycywgd2NoYXJfdCBwb2ludGVycyBhbmQgY2hhciBhcnJheXMgc28gdGhhdCBuaWwgY2FuIGJlIHBhc3NlZCBhcyBhCiAgICAgICAgICAgIHZhbGlkIHZhbHVlLiBCdWcgcmVwb3J0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDEwLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBOdW1lcm91cyBzdWJ0bGUgdHlwZW1hcCBtYXRjaGluZyBydWxlIGZpeGVzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGVtYXAKICAgICAgICAgICAgbWF0Y2hpbmcgcnVsZXMgYXJlIHRvIHRha2UgYSB0eXBlIGFuZCBmaW5kIHRoZSBiZXN0IGRlZmF1bHQgdHlwZW1hcCAoU1dJR1RZUEUsIFNXSUdUWVBFKiBldGMpLAogICAgICAgICAgICB0aGVuIGxvb2sgZm9yIHRoZSBuZXh0IGJlc3QgbWF0Y2ggYnkgcmVkdWNpbmcgdGhlIGNob3NlbiBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBub3cgZm9sbG93cyBDKysgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBtYXRjaGluZyBydWxlcy4KCiAgICAgICAgICAgIEJlbG93IGFyZSB0aGUgc2V0IG9mIGNoYW5nZXMgbWFkZSBzaG93aW5nIHRoZSBkZWZhdWx0IHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIGFsb25nIHdpdGggdGhlIG9sZCByZWR1Y2VkIHR5cGUgYW5kIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcmVkdWNlZCB0eXBlOgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICZbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJltdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoJilbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0IComCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICoKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICoKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoqCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIComCgogICAgICAgICAgICBBZGRpdGlvbmFsbHksIGEgY29uc3QgU1dJR1RZUEUgbG9va3VwIGlzIHVzZWQgbm93IGZvciBhbnkgY29uc3RhbnQgdHlwZS4gU29tZSBleGFtcGxlcywgd2hlcmUKICAgICAgICAgICAgVCBpcyBzb21lIHJlZHVjZWQgdHlwZSwgZWcgaW50LCBzdHJ1Y3QgRm9vOgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKmNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0W10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0W10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFW10KCiAgICAgICAgICAgICAgICAgICBlbnVtIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IGVudW0gU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IGVudW0gU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCopW10KCiAgICAgICAgICAgIFJlbWluZGVyOiB0aGUgdHlwZW1hcCBtYXRjaGluZyBydWxlcyBjYW4gbm93IGJlIHNlZW4gZm9yIGFueSB0eXBlcyBiZWluZyB3cmFwcGVkIGJ5IHVzaW5nCiAgICAgICAgICAgIGVpdGhlciB0aGUgLWRlYnVnLXRtc2VhcmNoIG9yIC1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCiAgICAgICAgICAgIEluIHByYWN0aWNlIHRoaXMgbGVhZHMgdG8gc29tZSBzdWJ0bGUgbWF0Y2hpbmcgcnVsZSBjaGFuZ2VzIGFuZCB0aGUgbWFqb3JpdHkgb2YgdXNlcnMKICAgICAgICAgICAgd29uJ3Qgbm90aWNlIGFueSBjaGFuZ2VzLCBleGNlcHQgaW4gdGhlIHByaW1lIGFyZWEgb2YgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2U6IEltcHJvdmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lcnMgb2YgY29uc3QgcG9pbnRlcnMgYW5kIHBhc3NpbmcgY29uc3QgcG9pbnRlcnMgYnkgcmVmZXJlbmNlLiBUaGlzIGlzIGZpeGVkCiAgICAgICAgICAgIGJlY2F1c2UgbWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMgdXNlIGEgdHlwZSAnVCBjb25zdCYnIGFzIHBhcmFtZXRlcnMgYW5kIHdoZW4gVCBpcyAKICAgICAgICAgICAgYSBjb25zdCBwb2ludGVyLCBmb3IgZXhhbXBsZSwgJ0sgY29uc3QqJywgdGhlbiB0aGUgZnVsbCB0eXBlIGlzICdLIGNvbnN0KmNvbnN0JicuIFRoaXMKICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgJ1NXSUdUWVBFICpjb25zdCYnIHR5cGVtYXBzIG5vdyBtYXRjaCB3aGVuIFQgaXMgZWl0aGVyIGEgbm9uLWNvbnN0IG9yCiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIuIEZ1cnRoZXJtb3JlLCBzb21lIHRhcmdldCBsYW5ndWFnZXMgaW5jb3JyZWN0bHkgaGFkICdTV0lHVFlQRSAqJicgdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB0aGVzZSBzaG91bGQgaGF2ZSBiZWVuICdTV0lHVFlQRSAqY29uc3QmJy4gVGhlc2UgaGF2ZSBiZWVuIGNvcnJlY3RlZCAoSmF2YSwgQyMsIEx1YSwgUEhQKS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU29tZSB2ZXJ5IG9sZCBkZXByZWNhdGVkIHByYWdtYSB3YXJuaW5ncyBhcmUgbm93IGVycm9ycy4KCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZmlsZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkb3VibGUvbXVsdGlwbGUgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMy0xMDogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIFVzZSBmdWxseSBxdWFsaWZpZWQgc3ltYm9sIG5hbWUgb2YgY2w6OmlkZW50aXR5IGluIGVtaXRfZGVmdW4oKS4KCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUaGUgaW50ZXJtZWRpYXJ5IEpOSSBjbGFzcyBtb2RpZmllcnMgYXJlIG5vdyBwdWJsaWMgYnkgZGVmYXVsdCBtZWFuaW5nIHRoZXNlCiAgICAgICAgICAgIGludGVybWVkaWFyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFyZSBub3cgYWNjZXNzaWJsZSBieSBkZWZhdWx0IGZyb20gb3V0c2lkZSBhbnkgcGFja2FnZQogICAgICAgICAgICB1c2VkLiBUaGUgcHJveHkgY2xhc3MgcG9pbnRlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFsc28gbm93IHB1YmxpYy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIG5zcGFjZSBvcHRpb24gdG8gd29yayB3aXRob3V0IGFueSBvdGhlciBtb2RzLgogICAgICAgICAgICBUaGUgcHJldmlvdXMgZGVmYXVsdCBvZiBwcm90ZWN0ZWQgYWNjZXNzIGNhbiBiZSByZXN0b3JlZCB1c2luZzoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9NRVRIT0RTKHByb3RlY3RlZCwgcHJvdGVjdGVkLCBTV0lHVFlQRSkKICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgPSAiY2xhc3MiCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZSBmb3IgQyMuIERvY3VtZW50YXRpb24gZm9yIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyBub3cgYXZhaWxhYmxlLgoKMjAxMC0wMy0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlLiBUaGlzIGFkZHMgc29tZSBpbXByb3ZlZCBuYW1lc3BhY2Ugc3VwcG9ydC4gQ3VycmVudGx5IG9ubHkgSmF2YQogICAgICAgICAgICBpcyBzdXBwb3J0ZWQgZm9yIHRhcmdldCBsYW5ndWFnZXMsIHdoZXJlIEMrKyBuYW1lc3BhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgICBKYXZhIHBhY2thZ2VzLiBUaGUgZmVhdHVyZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3NlcyxzdHJ1Y3QsdW5pb25zIGFuZCBlbnVtcyBkZWNsYXJlZCB3aXRoaW4KICAgICAgICAgICAgYSBuYW1lc3BhY2UuIE1ldGhvZHMgYW5kIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBuYW1lc3BhY2VzIHN0aWxsIGVmZmVjdGl2ZWx5IGhhdmUgdGhlaXIKICAgICAgICAgICAgbmFtZXNwYWNlcyBmbGF0dGVuZWQuIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMTo6Q29sb3I7CiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIyOjpDb2xvcjsKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjEgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIEphdmEsIHRoZSAtcGFja2FnZSBvcHRpb24gaXMgYWxzbyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBuc3BhY2UgZmVhdHVyZS4gU2F5CiAgICAgICAgICAgIHdlIHVzZSAtcGFja2FnZSBjb20ubXljbywgdGhlIHR3byBjbGFzc2VzIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGFzIGZvbGxvd3MgZnJvbSBKYXZhOgoKICAgICAgICAgICAgICBjb20ubXljby5PdXRlci5Jbm5lcjEuQ29sb3IgYW5kIGNvbS5teWNvLk91dGVyLklubmVyMi5Db2xvci4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSAtZGlydnRhYmxlIGZyb20gdGhlIG9wdGltaXphdGlvbnMgaW5jbHVkZWQgYnkgLU8gYXMgaXQgdGhpcyBvcHRpb24KICAgICAgICAgICAgY3VycmVudGx5IGxlYWRzIHRvIG1lbW9yeSBsZWFrcyBhcyByZXBvcnRlZCBieSBKb2hhbiBCbGFrZS4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIExpY2Vuc2UgY29kZSBjaGFuZ2VzOiBTV0lHIFNvdXJjZSBpcyBHUEwtdjMgYW5kIGxpYnJhcnkgY29kZSBsaWNlbnNlIGlzIG5vdyBjbGVhcmVyCiAgICAgICAgICAgIGFuZCBpcyBwcm92aWRlZCB1bmRlciBhIHZlcnkgcGVybWlzc2l2ZSBsaWNlbnNlLiBTZWUgaHR0cDovL3d3dy5zd2lnLm9yZy9sZWdhbC5odG1sLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEEgZmV3IGZpeGVzIGZvciBjb21waWxpbmcgdW5kZXIgcnVieS0xLjkueCBpbmNsdWRpbmcgcGF0Y2ggZnJvbSAnTmliYmxlJy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCBmcm9tIFBhdHJpY2sgQmVubmV0dCB0byBmaXggUkFSUkFZX0xFTiBhbmQgUkFSUkFZX1BUUiB1c2FnZSBmb3IgUnVieSAxLjkueAogICAgICAgICAgICB1c2VkIGluIHZhcmlvdXMgU1RMIHdyYXBwZXJzLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggaW5jb3JyZWN0IG11bHRpcGx5IGRlZmluZWQgc3ltYm9sIG5hbWUgZXJyb3Igd2hlbiBhbiBlbnVtIGl0ZW0KICAgICAgICAgICAgYW5kIGNsYXNzIG5hbWUgaGF2ZSB0aGUgc2FtZSBuYW1lLCBhcyByZXBvcnRlZCBieSBOYXRoYW4gS3JpZWdlci4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVmVjdG9yIHt9OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBUZXh0IHsKICAgICAgICAgICAgICAgIGVudW0gUHJlZmVyZW5jZSB7IFZlY3RvciB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBvdGhlciBpbmNvcnJlY3QgY29ybmVyIGNhc2UgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDEwLTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIC1kZWJ1Zy1sc3ltYm9scyBvcHRpb24gZm9yIGRpc3BsYXlpbmcgdGhlIHRhcmdldCBsYW5ndWFnZSBsYXllciBzeW1ib2xzLgoKMjAxMC0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1NTSBhbmQgLU1NRCBvcHRpb25zIG9uIFdpbmRvd3MuIFRoZXkgd2VyZSBub3Qgb21pdHRpbmcgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeSBhcwogICAgICAgICAgICB0aGV5IHNob3VsZCBiZS4KCjIwMTAtMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTgwNzMyOSAtIFdoZW4gTWFrZWZpbGUgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgdXNpbmcgdGhlIC1NIGZhbWlseSBvZiBvcHRpb25zCiAgICAgICAgICAgIG9uIFdpbmRvd3MsIHRoZSBmaWxlIHBhdGhzIGhhdmUgYmVlbiBjb3JyZWN0ZWQgdG8gdXNlIHNpbmdsZSBiYWNrc2xhc2hlcyByYXRoZXIgdGhhbiBkb3VibGUKICAgICAgICAgICAgYmFja3NsYXNoZXMgYXMgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTE4OTAyIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiBjb3JyZWN0IGRpcmVjdG9yeSBvbgogICAgICAgICAgICBXaW5kb3dzIHdoZW4gdXNpbmcgZm9yd2FyZCBzbGFzaGVzIGZvciAtbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1jKysgLW8gc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZV93cmFwLmNwcCBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlLmkKCjIwMTAtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjg5NDQwNSAtIGFzc2VydGlvbiB3aGVuIHVzaW5nIC14bWxvdXQuCgoyMDEwLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZW1hcCBtYXRjaGluZyBidWcgd2hlbiBhIHRlbXBsYXRlZCB0eXBlIGhhcyBhIHR5cGVtYXAgYm90aCBzcGVjaWFsaXplZCBhbmQgbm90CiAgICAgICAgICAgIHNwZWNpYWxpemVkLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFhYIHsgLi4uIH07CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYICYgIi4uLiIKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFg8IGludCA+ICYgIi4uLiIKCiAgICAgICAgICAgIHJlc3VsdGVkIGluIHRoZSAybmQgdHlwZW1hcCBiZWluZyBhcHBsaWVkIGZvciBhbGwgVCBpbiBYWDwgVCA+LgoKMjAxMC0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTMzMTI5IC0gdHlwZW1hcHMgbm90IGJlaW5nIGZvdW5kIHdoZW4gdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgaXMgdXNlZCB0byBkZW5vdGUKICAgICAgICAgICAgZ2xvYmFsIHNjb3BlLCB0aGUgdHlwZW1hcCBpcyBub3cgdXNlZCBpbiBzaXR1YXRpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCA6OlggJik7CgogICAgICAgICAgICBhbmQgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IDo6WCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IFggJik7CgoyMDEwLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSBwcm9ibGVtcyBpbiB0aGUgdHlwZXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIGludG8gdGhlIEMrKyBsYXllci4gUHJldmlvdXNseSB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3Igd2FzIGRyb3BwZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIGlmIHRoZSB0eXBlIGhhZCBhbnkgc29ydCBvZiBxdWFsaWZpZXIsIGZvciBleGFtcGxlIHdoZW4gdXNpbmcgcG9pbnRlcnMsIHJlZmVyZW5jZXMsIGxpa2UKICAgICAgICAgICAgOjpmb28qLCA6OmZvbyYsIGJhcjwgOjpmb28qID4uCgoyMDEwLTAxLTEzOiBvbGx5CgkgICAgW1BIUF0gQWRkIGRhdGV0aW1lIHRvIHRoZSBsaXN0IG9mIFBIUCBwcmVkZWZpbmVkIGNsYXNzZXMgKHBhdGNoCgkgICAgZnJvbSBEYXZpZCBGbGV0Y2hlciBpbiBTRiMyOTMxMDQyKS4KCjIwMTAtMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gd2FybmluZywgZXJyb3IgYW5kIGRpYWdub3N0aWMgcmVwb3J0aW5nLiBUaGUgd2FybmluZyBudW1iZXIgaXMgbm8gCiAgICAgICAgICAgIGxvbmdlciBzaG93biB3aXRoaW4gYnJhY2tldHMuIFRoaXMgaXMgdG8gaGVscCBkZWZhdWx0IHBhcnNpbmcgb2Ygd2FybmluZyBtZXNzYWdlcyBieQogICAgICAgICAgICBvdGhlciB0b29scywgdmltIG9uIFVuaXggaW4gcGFydGljdWxhci4KCiAgICAgICAgICAgIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheSB1c2luZyAtRnN0YW5kYXJkOgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgoKICAgICAgICAgICAgQWxzbyBzdWJ0bGUgZml4IHRvIC1GbWljcm9zb2Z0IGZvcm1hdCBhZGRpbmcgaW4gbWlzc2luZyBzcGFjZS4gRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCk6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKSA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGEgZmV3IGluY29uc2lzdGVuY2llcyBpbiByZXBvcnRpbmcgb2YgZmlsZS9saW5lIG51bWJlcmluZ3MgaW5jbHVkaW5nIG1vZGlmeWluZwogICAgICAgICAgICB0aGUgb3ZlcmxvYWQgd2FybmluZ3MgNTA5LCA1MTIsIDUxNiwgNDc0LCA0NzUgdG8gbm93IGJlIHR3byBsaW5lIHdhcm5pbmdzLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IC1kZWJ1Zy10YWdzIG91dHB1dCB0byB1c2Ugc3RhbmRhcmQgZmlsZSBuYW1lL2xpbmUgcmVwb3J0aW5nIHNvIHRoYXQgZWRpdG9ycwogICAgICAgICAgICBjYW4gZWFzaWx5IG5hdmlnYXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBsaW5lcy4KICAgICAgICAgICAgV2FzIHR5cGljYWxseToKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyKQogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOSkKICAgICAgICAgICAgbm93OgogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTI6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlCiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6Mzk6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZQoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1pc3NpbmcgZmlsZS9saW5lIG51bWJlcnMgZm9yIHR5cGVtYXAgd2FybmluZ3MgYW5kIGluIG91dHB1dCBmcm9tIHRoZQogICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaC8tZGVidWctdG11c2VkIG9wdGlvbnMuCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdHlwZW1hcHMgdXNlZCBkZWJ1Z2dpbmcgb3B0aW9uICgtZGVidWctdG11c2VkKS4gV2hlbiB1c2VkIGVhY2ggbGluZSBkaXNwbGF5cwogICAgICAgICAgICB0aGUgdHlwZW1hcCB1c2VkIGZvciBlYWNoIHR5cGUgZm9yIHdoaWNoIGNvZGUgaXMgYmVpbmcgZ2VuZXJhdGVkIGluY2x1ZGluZyB0aGUgZmlsZQogICAgICAgICAgICBhbmQgbGluZSBudW1iZXIgcmVsYXRlZCB0byB0aGUgdHlwZS4gVGhpcyBpcyBlZmZlY3RpdmVseSBhIGNvbmRlbnNlZCBmb3JtIG9mIHRoZQogICAgICAgICAgICAtZGVidWctdG1zZWFyY2ggb3B0aW9uLiBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVqYXZhZXhjZXB0aW9uIGFuZCBkaXJlY3RvcnMgc28gdGhhdCBhbGwgdGhlIGFwcHJvcHJpYXRlIHRocm93cyBjbGF1c2VzIAogICAgICAgICAgICBhcmUgZ2VuZXJhdGVkLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBldGVyIEdyZWVud29vZC4KCjIwMDktMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtZGVidWctdG1zZWFyY2ggb3B0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIHR5cGVtYXAgcGF0dGVybiBtYXRjaGluZyBydWxlcy4KICAgICAgICAgICAgRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIHRoZSAtYXBpIG9wdGlvbiBhbmQgdXNlIHRoZSBuZXcgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUgogICAgICAgICAgICBtYWNybyBwcm92aWRlZCBpbiB0aGUgb2N0YXZlIGhlYWRlcnMgZm9yIGRldGVybWluaW5nIHRoZSBhcGkgdmVyc2lvbiBpbnN0ZWFkLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtSdWJ5XSBJbXByb3ZlIHN1cHBvcnQgZm9yIFJ1YnkgMS45IHVuZGVyIEdDQy4gIEFkZHJlc3NlcyBwYXJ0IG9mCgkgICAgU0YjMjg1OTYxNC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgbW9kdWxvIG9wZXJhdG9yICglKSBpbiBjb25zdGFudCBleHByZXNzaW9ucwoJICAgIChTRiMyODE4NTYyKS4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUEhQXSAiZW1wdHkiIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQSFAsIHNvIHJlbmFtZSBlbXB0eSgpIG1ldGhvZAoJICAgIG9uIFNUTCBjbGFzc2VzIHRvICJpc19lbXB0eSgpIiAocHJldmlvdXNseSB0aGlzIHdhcyBhdXRvbWF0aWNhbGx5CgkgICAgcmVuYW1lZCB0byAiY19lbXB0eSgpIikuCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTEyLTAzOiBvbGx5CgkgICAgW1BIUF0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZywgYW5kIGZvcgoJICAgIHBvaW50ZXIgdG8gbWV0aG9kLgoKMjAwOS0xMi0wMjogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIGFuZCByZW5hbWUgb2YgcmVzZXJ2ZWQgY2xhc3MgbmFtZSB0byBiZSBjYXNlCgkgICAgaW5zZW5zaXRpdmUuCgoyMDA5LTEyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXZlcnQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMgYWRkZWQgaW4gc3dpZy0xLjMuMzkuIFRoZQoJICAgIG1lbWJlcmluIHR5cGVtYXBzIGFyZSBpZ25vcmVkIGFnYWluIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gaW5jb25zaXN0ZW5jeSByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDA5LTExLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBnZW5lcmF0ZWQgcXVvdGluZyB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIAogICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEE7CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBBID0gJ0EnOyAKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3Igc3RhdGljIGNvbnN0IG1lbWJlciB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgdXNlIHRoZSBhY3R1YWwgY29uc3RhbnQgdmFsdWUgaWYgaXQgaXMgc3BlY2lmaWVkLCByYXRoZXIgdGhhbiB0aGUgQysrIGNvZGUgdG8KICAgICAgICAgICAgYWNjZXNzIHRoZSBtZW1iZXIuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBFTiA9IDI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKyBuZXN0ZWQgdHlwZWRlZiBjbGFzc2VzIGNhbiBub3cgYmUgaGFuZGxlZCB0b28sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyB7IH0gRm9vVHlwZWRlZjEsIEZvb1R5cGVkZWYyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZm9yIEMgbmVzdGVkIHN0cnVjdHMgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgZGVjbGFyZWQgCiAgICAgICAgICAgIGluIHRoZSBwYXJzZWQgY29kZS4KCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDkxNDc2IC0gbXVsdGlwbGUgZGVjbGFyYXRpb25zIG9mIG5lc3RlZCBzdHJ1Y3RzLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgIH0gaW5uZXIxLCBpbm5lcjIsICppbm5lcjMsIGlubmVyNFsxXTsKICAgICAgICAgICAgICB9IG91dGVyOwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2YgZW51bSBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIEFCQyB7CiAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgIGMKICAgICAgICAgICAgICB9IEEgPSBhLCAqcEMgPSAmQywgYXJyYXlbM10gPSB7YSwgYiwgY307CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBzdHJ1Y3QgZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IFMgewogICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgIH0gaW5zdGFuY2UgPSB7IDEwIH07CgoyMDA5LTExLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5NjA5NzcgLSBTeW50YXggZXJyb3IgcGFyc2luZyBkZXJpdmVkIG5lc3RlZCBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgbWVtYmVyCiAgICAgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlLgoKMjAwOS0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMzEwNDgzIC0gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmIHdpdGhpbiBleHRlcm4gIkMiIGJsb2NrLgoKMjAwOS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiB0ZW1wbGF0ZWQgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGVhYmxlIGNvZGUgCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZC4KCjIwMDktMTEtMTM6IG9sbHkKCSAgICBbcGhwXSBGaXggcGxhY2Ugd2hlcmUgY2xhc3MgcHJlZml4IChhcyBzcGVjaWZpZWQgd2l0aCAtcHJlZml4KQoJICAgIHdhc24ndCBiZWluZyB1c2VkLiAgUGF0Y2ggZnJvbSBndmVyYnJ1Z2dlbiBpbiBTRiMyODkyNjQ3LgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHNvIHRoYXQgY29tcGlsZWFibGUgY29kZSBpcyBnZW5lcmF0ZWQgLSB0aGUgbmVzdGVkCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIGlzIG5vdyB0cmVhdGVkIGxpa2UgYSBub3JtYWwgbmVzdGVkIGNsYXNzZXMsIHRoYXQgaXMsIGFzIGFuIG9wYXF1ZSB0eXBlCiAgICAgICAgICAgIHVubGVzcyB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGlzIHVzZWQuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXBsYWNlIFNXSUdXQVJOX1BBUlNFX05FU1RFRF9DTEFTUyB3aXRoIFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUyBhbmQKICAgICAgICAgICAgU1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MgZm9yIG5hbWVkIGFuZCB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KCiAgICAgICAgICAgIE5hbWVkIG5lc3RlZCBjbGFzcyBpZ25vcmVkIHdhcm5pbmdzIGNhbiBub3cgYmUgc3VwcHJlc3NlZCBieSBuYW1lIHVzaW5nICV3YXJuZmlsdGVyLCBlZzoKCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTKSBPdXRlcjo6SW5uZXI7CgogICAgICAgICAgICBidXQgY2xlYXJseSB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIGNhbm5vdCBhbmQgdGhlIGdsb2JhbCBzdXBwcmVzc2lvbiBpcyBzdGlsbCByZXF1aXJlZCwgZWc6CgogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49U1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MKCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgYXMgYSB3YXkgdG8gdXNlIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgYSBuZXN0ZWQgY2xhc3MgCiAgICAgICAgICAgIChDKysgbW9kZSBvbmx5KS4gSXQgcmVtb3ZlcyB0aGUgbmVzdGVkIGNsYXNzIGZyb20gU1dJRydzIHR5cGUgaW5mb3JtYXRpb24gc28gaXQgaXMgYXMgaWYgU1dJRwogICAgICAgICAgICBoYWQgbmV2ZXIgcGFyc2VkIHRoZSBuZXN0ZWQgY2xhc3MuIFRoZSBkb2N1bWVudGVkIG5lc3RlZCBjbGFzcyB3b3JrYXJvdW5kcyB1c2luZyBhIGdsb2JhbAogICAgICAgICAgICBmYWtlIGNsYXNzIHN0b3BwZWQgd29ya2luZyB3aGVuIFNXSUcgdHJlYXRlZCB0aGUgbmVzdGVkIGNsYXNzIGFzIGFuIG9wYXF1ZSBwb2ludGVyLCBhbmQKICAgICAgICAgICAgdGhpcyBmZWF0dXJlIHJldmVydHMgdGhpcyBiZWhhdmlvdXIuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBkZXRhaWxzIG9mIGhvdwogICAgICAgICAgICB0byB1c2UgYW5kIGltcGxlbWVudCBpdCwgc2VlIHRoZSAiTmVzdGVkIGNsYXNzZXMiIHNlY3Rpb24gaW4gU1dJR1BsdXMuaHRtbC4KCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZXJlIHdlcmUgYSBudW1iZXIgb2YgQysrIGNhc2VzIHdoZXJlIG5lc3RlZCBjbGFzc2VzL3N0cnVjdHMvdW5pb25zIHdlcmUgYmVpbmcgaGFuZGxlZAogICAgICAgICAgICBhcyBpZiBDIGNvZGUgd2FzIGJlaW5nIHBhcnNlZCB3aGljaCB3b3VsZCBvZnRlbnRpbWVzIGxlYWQgdG8gdW5jb21waWxlYWJsZSBjb2RlIGFzIGFuCiAgICAgICAgICAgIGF0dGVtcHQgd2FzIG1hZGUgdG8gd3JhcCB0aGUgbmVzdGVkIHN0cnVjdHMgbGlrZSBpdCBpcyBkb2N1bWVudGVkIGZvciBDIGNvZGUuIE5vdyBhbGwKICAgICAgICAgICAgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgYXJlIGlnbm9yZWQgaW4gQysrIG1vZGUsIGFzIHdhcyBhbHdheXMgZG9jdW1lbnRlZC4gSG93ZXZlciwKICAgICAgICAgICAgdGhlcmUgaXMgYW4gaW1wcm92ZW1lbnQgYXMgdXNhZ2Ugb2YgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgaXMgbm93IGFsd2F5cyB0cmVhdGVkCiAgICAgICAgICAgIGFzIGFuIG9wYXF1ZSB0eXBlIGJ5IGRlZmF1bHQsIHJlc3VsdGluZyBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHNob3VsZCBhbHdheXMgY29tcGlsZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMS0wOTogZHJqb2UKCSAgICBGaXggUiBmb3IgLWZjb21wYWN0IGFuZCBhZGQgc3RkX21hcC5pCgoyMDA5LTExLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb25zaXN0ZW5jeSBmb3IgbmVzdGVkIHN0cnVjdHMvdW5pb25zL2NsYXNzZXMuIFVuY29tcGlsZWFibGUgY29kZSB3YXMgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5uZXIgc3RydWN0IGFuZCB1bmlvbiBkZWNsYXJhdGlvbnMgd2VyZSB1c2VkIGFzIHR5cGVzIHdpdGhpbiB0aGUKICAgICAgICAgICAgaW5uZXIgc3RydWN0LiBUaGUgaW5uZXIgc3RydWN0L3VuaW9uIGlzIG5vdyB0cmVhdGVkIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBtYWtpbmcgdGhlCiAgICAgICAgICAgIGJlaGF2aW91ciB0aGUgc2FtZSBhcyBhbiBpbm5lciBjbGFzcy4gKEMrKyBjb2RlKSwgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeyBpbnQgeDsgfTsKICAgICAgICAgICAgICAgIElubmVyU3RydWN0KiBnZXRJbm5lclN0cnVjdCgpOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTA4OiB3c2Z1bHRvbgoJICAgIElnbm9yZWQgbmVzdGVkIGNsYXNzL3N0cnVjdCB3YXJuaW5ncyBub3cgZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgaWdub3JlZCBjbGFzcy9zdHJ1Y3QuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMTUxNDY4MSAtIEZpeCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyB3aXRoaW4gYSBuYW1lc3BhY2UgZ2VuZXJhdGVkIHVuY29tcGlsZWFibGUKICAgICAgICAgICAgY29kZSBhbmQgaW50cm9kdWNlZCBzdHJhbmdlIHNpZGUgZWZmZWN0cyB0byBvdGhlciB3cmFwcGVyIGNvZGUgZXNwZWNpYWxseSBjb2RlCiAgICAgICAgICAgIGFmdGVyIHRoZSBuZXN0ZWQgdGVtcGxhdGUgY2xhc3MuIE5vdGUgdGhhdCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBhcmUgc3RpbGwgaWdub3JlZC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW10YWJzICAgIC0gRGlzcGxheSBzeW1ib2wgdGFibGVzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgLWRlYnVnLXN5bWJvbHMgICAgLSBEaXNwbGF5IHRhcmdldCBsYW5ndWFnZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCiAgICAgICAgICAgICAgLWRlYnVnLWNzeW1ib2xzICAgLSBEaXNwbGF5IEMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwoKMjAwOS0xMS0wMzogd3NmdWx0b24KCSAgICBGaXggc29tZSB1c2FnZSBvZiB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBQSB7IC8qIC4uLiAqLyB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6QUE7CgogICAgICAgICAgICBhbmQgYnVnICMxODE2ODAyIC0gU3dpZ1ZhbHVlV3JhcHBlciBzaG91bGQgYmUgdXNlZDoKCiAgICAgICAgICAgICAgc3RydWN0IENDIHsKICAgICAgICAgICAgICAgIENDKGludCk7IC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIDo6Q0MgeCgpOwoKICAgICAgICAgICAgYW5kIGluIHRlbXBsYXRlIHBhcmFtZXRlciBzcGVjaWFsaXphdGlvbnM6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHt9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IHZvaWQgYSgpIHt9OyB9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDw+IHN0cnVjdCBYPFM+IHsgdm9pZCBiKCkge307IH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKE15VENvbmNyZXRlKSBYPCA6OlMgPjsKCiAgICAgICAgICAgIHBsdXMgcHJvYmFibHkgc29tZSBvdGhlciBjb3JuZXIgY2FzZSB1c2FnZSBvZiA6Oi4KCjIwMDktMTEtMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcG90ZW50aWFsIG1lbW9yeSBsZWFrIGluIGluaXRpYWxpc2F0aW9uIGNvZGUgZm9yIHRoZQoJICAgIGdlbmVyYXRlZCBtb2R1bGUuCgoyMDA5LTEwLTIzOiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBhIG5hbWVkIG5lc3RlZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIHVzaW5nICV0ZW1wbGF0ZShuYW1lKSAKICAgICAgICAgICAgd2l0aGluIGEgY2xhc3MuIEEgd2FybmluZyB0aGF0IHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGlzIG5vdyBpc3N1ZWQgcGx1cyBwcm9jZXNzaW5nIAogICAgICAgICAgICBjb250aW51ZXMgYXMgaWYgbm8gbmFtZSB3YXMgZ2l2ZW4uCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBzdGQ6OnZlY3Rvcjxjb25zdCBUKj4uIFRoaXMgd291bGQgcHJldmlvdXNseSBjb21waWxlLCBidXQgbm90IHJ1biBjb3JyZWN0bHkuCgoyMDA5LTEwLTIwOiB3c2Z1bHRvbgoJICAgIEZpeGVkIHByZXZpb3VzbHkgZmFpcmx5IHBvb3IgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhbmQgZXhwbGljaXQgCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIHN1cHBvcnQuIE51bWVyb3VzIGJ1Z3MgaW4gdGhpcyBhcmVhIGhhdmUgYmVlbiBmaXhlZCBpbmNsdWRpbmc6CgogICAgICAgICAgICAtIFRlbXBsYXRlIGFyZ3VtZW50IGRlZHVjdGlvbiBpbXBsZW1lbnRlZCBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMsIGVnIHRoaXMgbm93CiAgICAgICAgICAgICAgd29ya3M6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYICAgICAge307CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBYPFQgKj4ge307CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoWDEpIFg8Y29uc3QgaW50ICo+OyAvLyBDaG9vc2VzIFQgKiBzcGVjaWFsaXphdGlvbgoKICAgICAgICAgICAgICBhbmQgbW9yZSBjb21wbGV4IGNhc2VzIHdpdGggbXVsdGlwbGUgcGFyYW1ldGVycyBhbmQgYSBtaXggb2YgdGVtcGxhdGUgYXJndW1lbnQKICAgICAgICAgICAgICBkZWR1Y3Rpb24gYW5kIGV4cGxpY2l0bHkgc3BlY2lhbGlzZWQgcGFyYW1ldGVycywgZWc6CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPiBzdHJ1Y3QgVHdvUGFybSAgICAgICAgICAgICAgIHsgdm9pZCBhKCkge30gfTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMT4gICAgICAgICAgICAgIHN0cnVjdCBUd29QYXJtPFQxICosIGludCAqPiAgeyB2b2lkIGUoKSB7fSB9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEUpIFR3b1Bhcm08aW50ICoqLCBpbnQgKj47CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHByaW1hcnkgdGVtcGxhdGUgbXVzdCBub3cgYmUgaW4gc2NvcGUsIGxpa2UgaW4gQysrLCB3aGVuCiAgICAgICAgICAgIGFuIGV4cGxpY2l0IG9yIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMgaW5zdGFudGlhdGVkIHdpdGggJXRlbXBsYXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA5LTE0OiB3c2Z1bHRvbgoJICAgIFtDI10gQWRkICVjc2F0dHJpYnV0ZXMgZm9yIGFkZGluZyBDIyBhdHRyaWJ1dGVzIHRvIGVudW0gdmFsdWVzLCBzZWUgZG9jcyBmb3IgZXhhbXBsZS4KCjIwMDktMDktMTE6IHdzZnVsdG9uCgkgICAgRml4IG1lbW1vdmUgcmVncmVzc2lvbiBpbiBjZGF0YS5pIGFzIHJlcG9ydGVkIGJ5IEFkcmlhYW4gUmVudGluZy4KCjIwMDktMDktMDc6IHdzZnVsdG9uCgkgICAgRml4IGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgPD0gb3IgPj0uCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIFRoZSBmb2xsb3dpbmcgb3BlcmF0b3JzIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gdHlwZSBib29sIGZvciBDKysgCiAgICAgICAgICAgIHdyYXBwZXJzIGFuZCByZW1haW4gYXMgdHlwZSBpbnQgZm9yIEMgd3JhcHBlcnMsIGFzIHBlciBlYWNoIHN0YW5kYXJkOiAKCiAgICAgICAgICAgICAgJiYgfHwgPT0gIT0gPCA+IDw9ID49IChBY3R1YWxseSB0aGUgbGFzdCA0IGFyZSBzdGlsbCBicm9rZW4pLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBBIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBCIDEwCiAgICAgICAgICAgICAgI2RlZmluZSBBX0VRX0IgIEEgPT0gQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwogICAgICAgICAgICAgICNkZWZpbmUgQV9BTkRfQiBBICYmIEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgRml4ICMyODQ1NzQ2LiB0cnVlIGFuZCBmYWxzZSBhcmUgbm93IHJlY29nbmlzZWQga2V5d29yZHMgKG9ubHkgd2hlbiB3cmFwcGluZyBDKyspLgogICAgICAgICAgICBDb25zdGFudHMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIGFyZSBub3cgd3JhcHBlZCAoYXMgdHlwZSBib29sKToKICAgICAgICAgICAgICAjZGVmaW5lIEZPTyB0cnVlCiAgICAgICAgICAgICAgI2RlZmluZSBCQVIgRk9PICYmIGZhbHNlCgpWZXJzaW9uIDEuMy40MCAoMTggQXVndXN0IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUGVybF0gQWRkICIjdW5kZWYgZG9fZXhlYyIgdG8gb3VyIGNsZWFuIHVwIG9mIFBlcmwgZ2xvYmFsCgkgICAgbmFtZXNwYWNlIHBvbGx1dGlvbi4KCjIwMDktMDgtMTc6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd3JhcCBhIHJlc291cmNlIHJldHVybmVkIGJ5IF9fZ2V0KCkgaW4gYSBQSFAgb2JqZWN0IChTRiMyNTQ5MjE3KS4KCjIwMDktMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjc5NzQ4NSBBZnRlciBkb2luZyBhICdtYWtlIGNsZWFuJywgaW5zdGFsbCBmYWlscyBpZiB5b2RsMm1hbiBvciB5b2RsMmh0bWwgCiAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBDYXVnaHQgZXhjZXB0aW9ucyBkaXNwbGF5IHRoZSB0eXBlIG9mIHRoZSBDKysgZXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgIGdlbmVyaWMgImMrKy1zaWRlIHRocmV3IGFuIGV4Y2VwdGlvbiIgbWVzc2FnZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBXaGVuICVjYXRjaGVzIGlzIHVzZWQsIGZpeCBzbyB0aGF0IGFueSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgInRocm93cyIKICAgICAgICAgICAgYXR0cmlidXRlIG9mIHRoZSAidGhyb3dzIiB0eXBlbWFwIGFyZSBnZW5lcmF0ZWQgaW50byB0aGUgSmF2YSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZXhjZXB0aW9uIGhhbmRsaW5nIHdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgcmVwb3J0ZWQgYnkgSnVhbiBNYW51ZWwgQWx2YXJlei4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAldGVtcGxhdGUgc2VnIGZhdWx0IG9uIHNvbWUgY2FzZXMgb2Ygb3ZlcmxvYWRpbmcgdGhlIHRlbXBsYXRlZCBtZXRob2QuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBKYW4gS3VwZWMuCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBBZGQgbnVtZXJvdXMgbWlzc2luZyB3cmFwcGVkIG1ldGhvZHMgZm9yIHN0ZDo6dmVjdG9yPGJvb2w+IHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIGJ5IFlvdXNzZWYgSm9uZXMuCgoyMDA5LTA4LTE0OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBBZGQgU1dJR19Db252ZXJ0UHRyQW5kT3duKCkgbWV0aG9kIGludG8gdGhlIHJ1bnRpbWUgZm9yIHNtYXJ0IHBvaW50ZXIgCiAgICAgICAgICAgIG1lbW9yeSBvd25lcnNoaXAgY29udHJvbC4gc2hhcmVkX3B0ciBzdXBwb3J0IHN0aWxsIHRvIGJlIGFkZGVkLiBQYXRjaCBmcm9tIAogICAgICAgICAgICBEYXZpZCBGbGV0Y2hlci4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBQSFA1IG5vdyB3cmFwcyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcyBkb2N1bWVudGVkLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgUEhQICJjbGFzcyIgZXhhbXBsZSB0byB3b3JrIHdpdGggUEhQNSBhbmQgdXNlCgkgICAgbW9kZXJuIHdyYXBwaW5nIGZlYXR1cmVzLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBzdGQ6OnZlY3RvciB3cmFwcGVycyBvdmVyaGF1bC4gVGhleSBubyBsb25nZXIgcmVxdWlyZSB0aGUgCiAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX3ZlY3RvcigpIG1hY3JvLiBBZGRlZCB3cmFwcGVycyBmb3IgY2FwYWNpdHkoKSBhbmQgcmVzZXJ2ZSgpLgoKMjAwOS0wOC0xMzogd3NmdWx0b24KCSAgICBbUEhQXSBBZGQgY29uc3QgcmVmZXJlbmNlIHR5cGVtYXBzLiBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIGFyZQogICAgICAgICAgICBub3cgcGFzc2VkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIHBvaW50ZXIgbGlrZSB0aGUgb3RoZXIgdGFyZ2V0IGxhbmd1YWdlcy4KCSAgICBGaXhlcyBTRiMyNTI0MDI5LgoKMjAwOS0wOC0wODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBNb3JlIHVzZXIgZnJpZW5kbHkgQXR0cmlidXRlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgYXJlCiAgICAgICAgICAgIG5vIGNvbnN0cnVjdG9ycyBnZW5lcmF0ZWQgZm9yIHRoZSBwcm94eSBjbGFzcyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUKICAgICAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3QgLSB0aGUgZXJyb3IgbWVzc2FnZSBpcyBub3cgCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIC0gY2xhc3MgaXMgYWJzdHJhY3QiIHdoZXJlYXMgaWYgdGhlcmUgYXJlIG5vCiAgICAgICAgICAgIHB1YmxpYyBjb25zdHJ1Y3RvcnMgZm9yIGFueSBvdGhlciByZWFzb24gYW5kIHRoZSBjbGFzcyBpcyBub3QgYWJzdHJhY3QsCiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHJlbWFpbnMKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiLgogICAgICAgICAgICBbdGNsXSBTaW1pbGFybHkgZm9yIHRjbCB3aGVuIHVzaW5nIC1pdGNsLgoKMjAwOS0wOC0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggUEhQIDUuMy4KCjIwMDktMDgtMDQ6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVmFyaW91cyBtYXRoZW1hdGljYWwgZnVuY3Rpb25zICh3aGljaCB3b3VsZCBjb25mbGljdAogICAgICAgICAgICB3aXRoIHRoZSBidWlsdC1pbiBQSFAgb25lcykgYXJlIG5vdyBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnkKICAgICAgICAgICAgYWRkaW5nIGEgJ2NfJyBwcmVmaXguCgoyMDA5LTA4LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBzdGQ6OnZlY3RvcjxUPiBpbXBsZW1lbnRhdGlvbiBpcyBpbXByb3ZlZCBhbmQgbm93IHVzZXMgJHR5cGVtYXAgc3VjaAogICAgICAgICAgICB0aGF0IHRoZSBwcm94eSBjbGFzcyBmb3IgVCBubyBsb25nZXIgaGFzIHRvIGJlIHNwZWNpZmllZCBpbiBzb21lIG1hY3JvcwogICAgICAgICAgICBmb3IgY29ycmVjdCBDIyBjb21waWxhdGlvbjsgdGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQsIHdoZXJlCiAgICAgICAgICAgIENTVFlQRSB3YXMgdGhlIEMjIHR5cGUgZm9yIHRoZSBDKysgY2xhc3MgQ1RZUEU6CgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRV9NSU5JTVVNKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgdXNhZ2Ugc2hvdWxkIGJlIHJlbW92ZWQgYWx0b2dldGhlcgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkUoQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aDoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKENUWVBFKQoKICAgICAgICAgICAgU29tZSBtb3JlIGRldGFpbHMgaW4gY3NoYXJwL3N0ZF92ZWN0b3IuaQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA3LTMxOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGluZGVudGF0aW9uIHNvIHRoYXQgd2UgZ2l2ZSBhIHVzZWZ1bCBlcnJvciBpZiB0aGUKCSAgICBtb2R1bGUgY2FuJ3QgYmUgbG9hZGVkLiAgUGF0Y2ggZnJvbSBHYWV0YW4gTGVobWFubiBpbiBTRiMyODI5ODUzLgoKMjAwOS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgQWRkICR0eXBlbWFwKG1ldGhvZCwgdHlwZWxpc3QpIHNwZWNpYWwgdmFyaWFibGUgbWFjcm8uIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhIHR5cGVtYXAgdG8gYmUgaW5zZXJ0ZWQgd2l0aGluIGFub3RoZXIgdHlwZW1hcC4KICAgICAgICAgICAgRnVsbHkgZG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0wNy0yOTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBTdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyBhcmUgbm93IHByZWZpeGVkIHdpdGggdGhlCiAgICAgICAgICAgIGNsYXNzIG5hbWUuIFRoaXMgYWxsb3dzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgY2xhc3Nlcy4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgbWlzc2luZyBsb2NrcyB0byBzdGQ6Om1hcCB3cmFwcGVycy4gIFBhdGNoIGZyb20gCgkgICAgUGF1bCBIYW1wc29uIGluIFNGIzI4MTM4MzYuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCBPVVRQVVQgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBIaXRvc2hpCgkgICAgQW1hbm8gaW4gU0YjMjgyNjMyMi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIHJlc291cmNlIGRlc3RydWN0b3IgZm9yIGNsYXNzZXMKCSAgICB3aXRob3V0IGEgZGVzdHJ1Y3RvciBhbmQgbm9uLWNsYXNzIHR5cGVzLiAgUGF0Y2ggZnJvbSBIaXRvc2hpIEFtYW5vCgkgICAgaW4gU0YjMjgyNTMwMy4KCjIwMDktMDctMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgd2FybmluZ3MgYWJvdXQgY2xhc2hlcyBiZXR3ZWVuIGlkZW50aWZpZXJzIGFuZCBQSFAKCSAgICBrZXl3b3JkcyBhbmQgYXV0b21hdGljIHJlbmFtaW5nIHRvIHdvcmsgd2l0aCB0aGUgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXJzLiAgRml4ZXMgU0YjMTYxMzY3OS4KCjIwMDktMDctMjg6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gSWYgYSBtZW1iZXIgZnVuY3Rpb24gaXMgbm90IHB1YmxpYyBidXQgaXQgaGFzIGEgYmFzZQogICAgICAgICAgICB3aGljaCBpcyBwdWJsaWMsIHRoZW4gbm93IGEgd2FybmluZyBpcyBpc3N1ZWQgYW5kIHRoZSBtZW1iZXIKICAgICAgICAgICAgZnVuY3Rpb24gd2lsbCBiZSBwdWJsaWMsIGFzIFBIUCByZXF1aXJlcyB0aGlzLgoKMjAwOS0wNy0yMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBEaXJlY3RvciBzdXBwb3J0IGFkZGVkLgoKMjAwOS0wNy0xNTogb2xseQoJICAgIFtQZXJsXSBEb24ndCBzcGVjaWZ5IFBlcmwgcHJvdG90eXBlICIoKSIgZm9yIGEgY29uc3RydWN0b3Igd2l0aCBhCgkgICAgZGlmZmVyZW50IG5hbWUgdG8gdGhlIGNsYXNzLCBhcyBzdWNoIGNvbnN0cnVjdG9ycyBjYW4gc3RpbGwgdGFrZQoJICAgIHBhcmFtZXRlcnMuCgoyMDA5LTA3LTEyOiB4YXZpZXI5OAoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBPY3RhdmUgMy4yIEFQSQoKMjAwOS0wNy0wNTogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB0aGUgbGlzdCBvZiBQSFAga2V5d29yZHMgLSAiY2Z1bmN0aW9uIiBpcyBubyBsb25nZXIgYQoJICAgIGtleXdvcmQgaW4gUEhQNSBhbmQgUEhQIDUuMyBhZGRlZCAiZ290byIsICJuYW1lc3BhY2UiLCAiX19ESVJfXyIsCgkgICAgYW5kICJfX05BTUVTUEFDRV9fIi4KCjIwMDktMDctMDM6IG9sbHkKCSAgICBbVGNsXSBUbyBjb21wbGVtZW50IFVTRV9UQ0xfU1RVQlMsIGFkZCBzdXBwb3J0IGZvciBVU0VfVEtfU1RVQlMKCSAgICBhbmQgU1dJR19UQ0xfU1RVQlNfVkVSU0lPTi4gIERvY3VtZW50IGFsbCB0aHJlZSBpbiB0aGUgVGNsIGNoYXB0ZXIKCSAgICBvZiB0aGUgbWFudWFsLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBTRiMyODEwMzgwIGJ5IENocmlzdGlhbgoJICAgIEdvbGx3aXR6ZXIuCgoyMDA5LTA3LTAyOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZGVkIGZhY3RvcnkuaSBmb3IgUEhQLCBzZWUgdGhlIGxpX2ZhY3RvcnkgdGVzdGNhc2UKICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBvbiBob3cgdG8gdXNlIGl0LgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1XYWxsa3cgb3B0aW9uIGFzIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gYSBuZXN0ZWQgc3RydWN0IGNvbnRhaW5zIGEgY29tbWVudCBjb250YWluaW5nIGEgKiBmb2xsb3dlZCAKICAgICAgICAgICAgZXZlbnR1YWxseSBieSBhIC8uIFJlZ3Jlc3Npb24gZnJvbSAxLjMuMzcsIHJlcG9ydGVkIGJ5IFNvbG9tb24gR2liYnMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFVua25vd24gcHJvcGVydGllcyBhcmUgbm8gbG9uZ2VyIGlnbm9yZWQgaW4gcHJveHkKICAgICAgICAgICAgY2xhc3Nlcy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRml4ZWQgJW5ld29iamVjdCBiZWhhdmlvdXIsIHByZXZpb3VzbHkgYW55IG1ldGhvZAogICAgICAgICAgICBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IHdhcyBoYW5kbGVkIGFzIGEgY29uc3RydWN0b3IuCgoyMDA5LTA2LTMwOiBvbGx5CgkgICAgW1J1YnldIFVuZGVmaW5lIGNsb3NlIGFuZCBjb25uZWN0IG1hY3JvcyBkZWZpbmVkIGJ5IFJ1YnkgQVBJCgkgICAgaGVhZGVycyBhcyB3ZSBkb24ndCBuZWVkIHRoZW0gYW5kIHRoZXkgY2FuIGNsYXNoIHdpdGggQysrIG1ldGhvZHMKCSAgICBiZWluZyB3cmFwcGVkLiAgUGF0Y2ggZnJvbSBWaXQgT25kcnVjaCBpbiBTRiMyODE0NDMwLgoKMjAwOS0wNi0yNjogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gaGFuZGxlIEZJWE5VTSB2YWx1ZXMgZ3JlYXRlciB0aGFuIE1BWElOVCBwYXNzZWQgZm9yIGEKCSAgICBkb3VibGUgcGFyYW1ldGVyLgoKMjAwOS0wNi0yNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgdGhlIGNvbXBhY3RkZWZhdWx0YXJncyBmZWF0dXJlIAogICAgICAgICAgICB3aGVyZSBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhbmQgaXMgYXNzaWduZWQgYSBkZWZhdWx0IHZhbHVlLiBUaGUgU3dpZ1ZhbHVlV3JhcHBlcgogICAgICAgICAgICB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBhIG1pc3NpbmcgZGVmYXVsdCBjb25zdHJ1Y3RvciBpcyBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSAKICAgICAgICAgICAgZ2VuZXJhdGVkIGRvZXMgbm90IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCgoyMDA5LTA2LTE2OiB3c2Z1bHRvbgoJICAgIFtKYXZhLEMjXSBGaXggZW51bSBtYXJzaGFsbGluZyB3aGVuICVpZ25vcmUgaXMgdXNlZCBvbiBvbmUgb2YgdGhlIGVudW0gaXRlbXMuCiAgICAgICAgICAgIEluY29ycmVjdCBlbnVtIHZhbHVlcyB3ZXJlIGJlaW5nIHBhc3NlZCB0byB0aGUgQysrIGxheWVyIG9yIGNvbXBpbGF0aW9uIGVycm9ycyByZXN1bHRlZC4KCjIwMDktMDYtMDI6IHRhbGJ5CgkgICAgW1BlcmxdIFJlc29sdmVkIHJlZmVyZW5jZS5pIG92ZXJsb2FkIHN1cHBvcnQgcHJvYmxlbQoJICAgIGlkZW50aWZpZWQgYnkgSm9obiBQb3Rvd3NreS4KCjIwMDktMDUtMjY6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6Om1hcCB3cmFwcGVycyBiYXNlZCBvbiBwYXRjaCBmcm9tIFl1dmFsIEJhcm9yLiBUaGUgQyMgcHJveHkKICAgICAgICAgICAgbm93IGltcGxlbWVudHMgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuSURpY3Rpb25hcnk8Pi4KCgkgICAgVGhlc2Ugc3RkOm1hcCB3cmFwcGVycyBoYXZlIGEgbm9uLWJhY2t3YXJkcyBjb21wYXRpYmxlIG92ZXJoYXVsIHRvIG1ha2UgdGhlbQogICAgICAgICAgICBsaWtlIGEgLk5FVCBJRGljdGlvbmFyeS4gU29tZSBtZXRob2QgbmFtZXMgaGF2ZSBjaGFuZ2VkIGFzIGZvbGxvd2luZzoKICAgICAgICAgICAgICBzZXQgLT4gc2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgZ2V0IC0+IGdldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGhhc19rZXkgLT4gQ29udGFpbnNLZXkKICAgICAgICAgICAgICBkZWwgLT4gUmVtb3ZlCiAgICAgICAgICAgICAgY2xlYXIgLT4gQ2xlYXIKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIHVzZWQgZm9yIHN0ZDo6bWFwIHdyYXBwZXJzIGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIG5vIGxvbmdlciB3b3JrOgogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9rZXkKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fdmFsdWUKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fYm90aAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTA1LTIwOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEFkZCB0aGUgJ3RoaXNvd24nIG1lbWJlciB0byBjbGFzc2VzLiBUaGUgdXNhZ2Ugb2YgaXQKICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgdGhlIFB5dGhvbiB0aGlzb3duIG9uZTogaXQncyAxIGJ5IGRlZmF1bHQgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gc2V0IGl0IHRvIDAgaWYgeW91IHdhbnQgdG8gcHJldmVudCBmcmVlaW5nIGl0LiAoRm9yCiAgICAgICAgICAgIGV4YW1wbGUgdG8gcHJldmVudCBhIGRvdWJsZSBmcmVlLikKCjIwMDktMDUtMTQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIHdyb25nIHBvaW50ZXIgdmFsdWUgcmV0dXJuZWQgYnkgU3dpZ1B5T2JqZWN0X3JlcHIoKS4KCjIwMDktMDUtMTM6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXSBNaW5vciB0d2VhayB3aGVuIHdyYXBwaW5nIGluIC1ub2N3cmFwIG1vZGUuCgoyMDA5LTA1LTExOiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb24gdGhlIEMjIHByb3h5IHNpZGUgZnJvbSBZdXZhbCBCYXJvci4gVGhlc2UKCSAgICBpbXBsZW1lbnQgSUxpc3Q8PiBpbnN0ZWFkIG9mIElFbnVtZXJhYmxlPD4gd2hlcmUgcG9zc2libGUuCgoyMDA5LTA0LTI5OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gQWRkIHRoZSAnbm90ZGVyaXZlZCcgYXR0cmlidXRlIHRvIHRoZSBqYXZhYmFzZSBhbmQgY3NiYXNlIHR5cGVtYXBzLgoJICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgdHlwZW1hcCB3aWxsIG5vdCBhcHBseSB0byBjbGFzc2VzIHRoYXQgYXJlIGRlcml2ZWQKCSAgICBmcm9tIGEgQysrIGJhc2UgY2xhc3MsIGVnIAoJICAgICAgJXR5cGVtYXAoY3NiYXNlLCBub3RkZXJpdmVkPSIxIikgU1dJR1RZUEUgIkNvbW1vbkJhc2UiCgoyMDA5LTA0LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgYXR0ZW1wdCB0byBhY3F1aXJlIHRoZSBHSUwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZQoJICAgIGtub3cgdGhhdCBpdCB3aWxsIGFscmVhZHkgYmUgbG9ja2VkLiAgVGhpcyBhdm9pZHMgc29tZSBkZWFkLWxvY2tzCgkgICAgd2l0aCBtb2RfcHl0aG9uIChkdWUgdG8gbW9kX3B5dGhvbiBidWdzIHdoaWNoIGFyZSBhcHBhcmVudGx5CgkgICAgdW5saWtlbHkgdG8gZXZlciBiZSBmaXhlZCksIGFuZCByZXN1bHRzIGluIHNtYWxsZXIgd3JhcHBlcnMgd2hpY2gKCSAgICBydW4gYSBsaXR0bGUgZmFzdGVyIChpbiB0ZXN0cyB3aXRoIFhhcGlhbiBvbiB4ODYtNjQgVWJ1bnR1IDkuMDQsCgkgICAgdGhlIHN0cmlwcGVkIHdyYXBwZXIgbGlicmFyeSB3YXMgMTElIHNtYWxsZXIgYW5kIHJhbiAyLjclIGZhc3RlcikuCgoyMDA5LTA0LTIxOiB3c2Z1bHRvbgoJICAgIFtDI10gRml4ICMyNzUzNDY5IC0gYm9vbCAmT1VUUFVUIGFuZCBib29sICpPVVRQVVQgdHlwZW1hcHMgaW5pdGlhbGlzYXRpb24uCgoyMDA5LTA0LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCAjMjc0Njg1OCAtIEMgbWFjcm8gZXhwcmVzc2lvbiB1c2luZyBmbG9hdGluZyBwb2ludCBudW1iZXJzCgoyMDA5LTAzLTMwOiBvbGx5CgkgICAgW1BIUF0gVGhlIGRlZmF1bHQgb3V0IHR5cGVtYXAgZm9yIGNoYXJbQU5ZXSBub3cgcmV0dXJucyB0aGUgc3RyaW5nIHVwIHRvIGEKCSAgICB6ZXJvIGJ5dGUsIG9yIHRoZSBlbmQgb2YgdGhlIGFycmF5IGlmIHRoZXJlIGlzIG5vIHplcm8gYnl0ZS4gIFRoaXMKCSAgICBpcyB0aGUgc2FtZSBhcyBQeXRob24gZG9lcywgYW5kIHNlZW1zIG1vcmUgZ2VuZXJhbGx5IHVzZWZ1bCB0aGFuCgkgICAgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiByZXR1cm5pbmcgdGhlIHdob2xlIGNvbnRlbnRzIG9mIHRoZSBhcnJheQoJICAgIGluY2x1ZGluZyBhbnkgemVybyBieXRlcy4gIElmIHlvdSB3YW50IHRoZSBvbGQgYmVoYXZpb3VyLCB5b3UgY2FuIHByb3ZpZGUKCSAgICB5b3VyIG93biB0eXBlbWFwIHRvIGRvIHRoaXM6CgoJICAgICV0eXBlbWFwKG91dCkgY2hhciBbQU5ZXQoJICAgICV7CgkJUkVUVkFMX1NUUklOR0woJDEsICQxX2RpbTAsIDEpOwoJICAgICV9CgpWZXJzaW9uIDEuMy4zOSAoMjEgTWFyY2ggMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAzLTE5OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSBtZW1vcnkgbGVhayByZWxhdGVkIHRvIFB5dGhvbiAzIHVuaWNvZGUgYW5kIEMgY2hhciogY29udmVyc2lvbiwKICAgICAgICAgICAgd2hpY2ggY2FuIGJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBiZWZvcmUgdGhpcyBmaXg6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmcm9tIGxpX2NzdHJpbmcgaW1wb3J0ICoKICAgICAgICAgICAgICAgICAgaT0wCiAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKICAgICAgICAgICAgICAgICAgICAgIG4gPSBzdHIoaSkqMTAKICAgICAgICAgICAgICAgICAgICAgIHRlc3QzKG4pCgogICAgICAgICAgICBUaGlzIGZpeCBhZmZlY3RlZCBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBzbyB5b3UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgIGEgbnVsbCBhbGxvYyBhbmQgbm9uLW51bGwgY3B0ciBhcmd1bWVudCBpbiBQeXRob24gMywgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvcgogICAgICAgICAgICB3aWxsIGJlIHJhaXNlZC4KCjIwMDktMDMtMTg6IHdzZnVsdG9uCgkgICAgW0MjXSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGltcHJvdmVtZW50cyBmb3IgLk5FVCAyIGFuZCBhbHNvIHByb3ZpZGluZyB0aGUKCSAgICBuZWNlc3NhcnkgbWFjaGluZXJ5IHRvIHVzZSB0aGUgc3RkOjp2ZWN0b3I8VD4gd3JhcHBlcnMgd2l0aCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIHN1Y2gKCSAgICBhcyBMSU5RIC0gdGhlIEMjIHByb3h5IGNsYXNzIG5vdyBkZXJpdmVzIGZyb20gSUVudW1lcmFibGU8Pi4gVGhlIGRlZmF1bHQgaXMgbm93IHRvIAoJICAgIGdlbmVyYXRlIGNvZGUgcmVxdWlyaW5nIC5ORVQgMiBhcyBhIG1pbmltdW0sIGFsdGhvdWdoIHRoZSBDIyBjb2RlIGNhbiBiZSBjb21waWxlZCAKCSAgICBmb3IgLk5FVCAxIGJ5IGRlZmluaW5nIHRoZSBTV0lHX0RPVE5FVF8xIEMjIHByZXByb2Nlc3NvciBjb25zdGFudC4gU2VlIHRoZSAKCSAgICBzdGRfdmVjdG9yLmkgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggIzI2NzY3MzggU1dJRyBnZW5lcmF0ZWQgc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBTb21lIGZpeGVzIGZvciBQeXRob24gMy4wLjEgYW5kIGhpZ2hlciBzdXBwb3J0LiBJbiAzLjAuMSwgdGhlIEMgQVBJIGZ1bmN0aW9uCiAgICAgICAgICAgIFB5T2JqZWN0X0NvbXBhcmUgaXMgcmVtb3ZlZCwgc28gUHlPYmplY3RfUmljaENvbXBhcmVCb29sIGlzIHVzZWQgZm9yIHJlcGxhY2VtZW50LgogICAgICAgICAgICBTdHJ1Y3QgaW5pdGlsaXphdGlvbiBvZiBTd2lnUHlPYmplY3QgYW5kIFN3aWdQeU9iamVjdF9hc19udW1iZXIgY2hhbmdlZCB0byByZWZsZWN0CiAgICAgICAgICAgIHRoZSBkcm9wIG9mIHRwX2NvbXBhcmUgYW5kIG5iX2xvbmcuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1ODMxNjAuIE5vdyB0aGUgaW1wb3J0ZXIgaW4gUHl0aG9uIHNoYWRvdyB3cmFwcGVyIHRha2UgY2FyZSBvZiB0aGUKICAgICAgICAgICAgY2FzZSB0aGF0IG1vZHVsZSBhbHJlYWR5IGltcG9ydGVkIGF0IG90aGVyIHBsYWNlLgoKMjAwOS0wMi0yODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNjM3MzUyLiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiBvZiBTV0lHX21vZHVsZSBpbiBweWluaXQuc3dnIGJlZm9yZQogICAgICAgICAgICB0aGUgbWV0aG9kIGNhbGxzLCBzaW5jZSBzb21lIEMgY29tcGlsZXIgZG9uJ3QgYWxsb3cgZGVjbGFyYXRpb24gaW4gbWlkZGxlIG9mIGZ1bmN0aW9uCiAgICAgICAgICAgIGJvZHkuCgoyMDA5LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtBbGxlZ3JvY2xdIEZpeCBzZWcgZmF1bHQgd3JhcHBpbmcgc29tZSBjb25zdGFudCB2YXJpYWJsZSAoJWNvbnN0YW50KSB0eXBlcy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgW0NGRkldIEZpeCBzZWcgZmF1bHRzIHdoZW4gZm9yICVleHRlbmQgYW5kIHVzaW5nIHN0YXRlbWVudHMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIEZpeCBTRiAjMjYwNTk1NTogLWNvIG9wdGlvbiB3aGljaCBicm9rZSBpbiAxLjMuMzcuIAoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBOZXcgJWluc2VydCgiYmVnaW4iKSBzZWN0aW9uIGFkZGVkLiBBbHNvIGNhbiBiZSB1c2VkIGFzICViZWdpbi4gVGhpcyBpcyBhIG5ldwoJICAgIGNvZGUgc2VjdGlvbiByZXNlcnZlZCBlbnRpcmVseSBmb3IgdXNlcnMgYW5kIHRoZSBjb2RlIHdpdGhpbiB0aGUgc2VjdGlvbiBpcyBnZW5lcmF0ZWQKCSAgICBhdCB0aGUgdG9wIG9mIHRoZSBDL0MrKyB3cmFwcGVyIGZpbGUgYW5kIHNvIHByb3ZpZGVzIGEgbWVhbnMgdG8gcHV0IGN1c3RvbSBjb2RlCgkgICAgaW50byB0aGUgd3JhcHBlciBmaWxlIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCgoyMDA5LTAyLTE3OiB3c2Z1bHRvbgoJICAgICdtYWtlIGNsZWFuLXRlc3Qtc3VpdGUnIHdpbGwgbm93IHJ1biBjbGVhbiBvbiBBTEwgbGFuZ3VhZ2VzLiBQcmV2aW91c2x5IGl0IG9ubHkKCSAgICByYW4gdGhlIGNvcnJlY3RseSBjb25maWd1cmVkIGxhbmd1YWdlcy4gVGhpcyB3YXkgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGNsZWFuIHVwCgkgICAgcHJvcGVybHkgYWZ0ZXIgcnVubmluZyAnbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZScuCgoyMDA5LTAyLTE0OiB3c2Z1bHRvbgoJICAgIEV4dGVuZCBhdHRyaWJ1dGUgbGlicmFyeSBzdXBwb3J0IGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgdXNlCgkgICAgcGFzcy9yZXR1cm4gYnkgdmFsdWUgc2VtYW50aWNzLiBUd28gbmV3IG1hY3JvcyBhcmUgYXZhaWxhYmxlIGFuZCB1c2FnZSBpcyBpZGVudGljYWwKCSAgICB0byAlYXR0cmlidXRlLiBUaGVzZSBhcmUgJWF0dHJpYnV0ZXZhbCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCAlYXR0cmlidXRlc3RyaW5nIGZvcgoJICAgIHN0cmluZyBjbGFzc2VzLCBsaWtlIHN0ZDo6c3RyaW5nLiBTZWUgYXR0cmlidXRlLnN3ZyBmb3IgbW9yZSBkZXRhaWxzLgoKMjAwOS0wMi0xMzogd3NmdWx0b24KCSAgICBBZGQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMuIFByZXZpb3VzbHkgdGhlIG1lbWJlcmluIHR5cGVtYXBzIHdlcmUKCSAgICBpZ25vcmVkIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCgoyMDA5LTAyLTEyOiB3c2Z1bHRvbgoJICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZW1wb3JhcnkgdmFyaWFibGUgd2hlbiB3cmFwcGluZyByZXR1cm4gdmFsdWVzIHRoYXQgYXJlIHJlZmVyZW5jZXMuIAoJICAgIEV4YW1wbGUgb2YgZ2VuZXJhdGVkIGNvZGUgZm9yIHdyYXBwaW5nOgoKCSAgICAgIHN0cnVjdCBYWVogewoJCXN0ZDo6c3RyaW5nJiByZWZSZXR1cm4oKTsKCSAgICAgIH07CgoJICAgIHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmX3Jlc3VsdF9yZWYgPSAoYXJnMSktPnJlZlJldHVybigpOwogICAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICZfcmVzdWx0X3JlZjsKICAgICAgICAgICAgICB9CgoJICAgICBOb3cgaXQgaXM6CgogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpyZXN1bHQgPSAwIDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJihhcmcxKS0+cmVmUmV0dXJuKCk7CgoyMDA5LTAyLTA4OiBiaHkKICAgICAgICAgICAgQ2hhbmdlIHRoZSBTSVpFIG1hcHBlZCBieSAlcHlidWZmZXJfbXV0YWJsZV9iaW5hcnkgYW5kICVweWJ1ZmZlcl9iaW5hcnkgaW4gcHlidWZmZXIuaSBmcm9tCiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBidWZmZXIuCgoyMDA5LTAyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWZlYXR1cmUgbm90IHdvcmtpbmcgZm9yIGNvbnZlcnNpb24gb3BlcmF0b3JzLCByZXBvcnRlZCBieSBNYXR0IFNwcmFndWUsIGZvciBleGFtcGxlOgoJICAgICAgJWZlYXR1cmUoImNzOm1ldGhvZG1vZGlmaWVycyIpIG9wZXJhdG9yIGJvb2wgInByb3RlY3RlZCI7CgoyMDA5LTAyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpTY2hlbWVdIEFwcGx5ICMyMDgxOTY3IGNvbmZpZ3VyZSBjaGFuZ2VzIGZvciBleGFtcGxlcyB0byBidWlsZCB3aXRoIHJlY2VudCBQTFQgdmVyc2lvbnMuCgkgICAgQWxzbyBmaXhlcyBNYWtlZmlsZSBlcnJvcnMgYnVpbGRpbmcgU1dJRyBleGVjdXRhYmxlIHdoZW4gbXpzY2hlbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQgCgkgICAgKHZlcnNpb24gMy43MiBhcHByb3ggYW5kIGxhdGVyKS4KCjIwMDktMDItMDQ6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBGaXggU0YjMjU2NDE5MiByZXBvcnRlZCBieSBEYXZpZCBLb2xvdnJhdG5rLgogICAgICAgICAgICBTV0lHX0FzQ2hhclB0ckFuZFNpemUoKSBub3cgaGFuZGxlcyAiZ2V0IiBtYWdpYy4KClZlcnNpb24gMS4zLjM4ICgzMSBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTI0ODggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIE5vdyAlcHl0aG9ucHJlcGVuZAogICAgICAgICAgICBhbmQgJXB5dGhvbmFwcGVuZCBoYXZlIGNvcnJlY3QgaW5kZW50YXRpb24uCgoyMDA5LTAxLTMxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI1NTIwNDggcmVwb3J0ZWQgYnkgR2FldGFuIExlaG1hbm4uIFRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICBvZiBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBwcm94eSBjb2RlIHNob3VsZCBub3QgaGF2ZSB0aGUKICAgICAgICAgICAgJ3NlbGYnIHBhcmFtZXRlci4KCjIwMDktMDEtMjk6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAxLjMuMzcgd2hlcmUgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeQoJICAgIGZvciB0YXJnZXQgbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgKGluIHRoZSBhYnNlbmNlIG9mIC1vdXRkaXIpIHdhcyBubwoJICAgIGxvbmdlciB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGdlbmVyYXRlZCBjL2MrKyBmaWxlLgoKMjAwOS0wMS0yODogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEZpeCBwcm94eSBjbGFzcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBnbG9iYWwgc2NvcGUgb3BlcmF0b3IKCSAgICB3YXMgdXNlZCBmb3IgcGFyYW1ldGVycyBwYXNzZWQgYnkgdmFsdWUuIFJlcG9ydGVkIGJ5IERhdmlkIFBpZXBncmFzcy4KCjIwMDktMDEtMTU6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBzZWcgZmF1bHQgd2hlbiBydW5uaW5nIHdpdGggLXYgb3B0aW9uLCByZXBvcnRlZCBieSBKb2huIEt5LgoKVmVyc2lvbiAxLjMuMzcgKDEzIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMTM6IG1nb3NzYWdlCgkgICAgW0x1YV0gQWRkZWQgY29udHJhY3Qgc3VwcG9ydCBmb3IgcmVxdWlyaW5nIHRoYXQgdW5zaWduZWQgbnVtYmVycyBhcmUgPj0wCgkgICAgUmV3cm90ZSBtdWNoIG9mIEV4YW1wbGVzL0x1YS9lbWJlZDMuIAoJICAgIEFkZGVkIGEgbG90IHRvIHRoZSBMdWEgZG9jdW1lbnRhdGlvbi4KCjIwMDktMDEtMTM6IHdzZnVsdG9uCgkgICAgRml4IGNvbXBpbGF0aW9uIGVycm9yIHdoZW4gdXNpbmcgZGlyZWN0b3JzIG9uIHByb3RlY3RlZCB2aXJ0dWFsIG92ZXJsb2FkZWQgCgkgICAgbWV0aG9kcyByZXBvcnRlZCBieSBTYW0gSGVuZGxleS4KCjIwMDktMDEtMTI6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBoYW5kbGluZyBvZiBpbnRlZ2VyIGFycmF5cwoKMjAwOS0wMS0xMDogZHJqb2UKCSAgICBbUl0gRml4IGludGVnZXIgaGFuZGxpbmcgaW4gciB0byBkZWFsIGNvcnJlY3RseSB3aXRoIHNpZ25lZAoJICAgIGFuZCB1bnNpZ25lZCBpc3N1ZXMKCjIwMDktMDEtMTA6IHdzZnVsdG9uCgkgICAgUGF0Y2ggICMxOTkyNzU2IGZyb20gQ29saW4gTWNEb25hbGQgLSAlY29udHJhY3Qgbm90IHdvcmtpbmcgZm9yIGNsYXNzZXMgCgkgICAgaW4gbmFtZXNwYWNlCgoyMDA5LTAxLTA1OiBvbGx5CgkgICAgTWFyayBTV0lHUEVSTDUsIFNXSUdQSFA1LCBhbmQgU1dJR1RDTDggYXMgZGVwcmVjYXRlZCBpbiB0aGUgc291cmNlCgkgICAgY29kZSBhbmQgcmVtb3ZlIGRvY3VtZW50YXRpb24gb2YgdGhlbS4KCjIwMDgtMTItMzA6IHdzZnVsdG9uCgkgICAgQnVnICMyNDMwNzU2LiBBbGwgdGhlIGxhbmd1YWdlcyBub3cgZGVmaW5lIGEgbWFjcm8gaW4gdGhlIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgZmlsZSBpbmRpY2F0aW5nIHdoaWNoIGxhbmd1YWdlIGlzIGJlaW5nIHdyYXBwZWQuIFRoZSBtYWNybyBuYW1lIGlzIHRoZQoJICAgIHNhbWUgYXMgdGhvc2UgZGVmaW5lZCB3aGVuIFNXSUcgaXMgcnVuLCBlZyBTV0lHSkFWQSwgU1dJR09DVEFWRSwgU1dJR0NTSEFSUCBldGMKCSAgICBhbmQgYXJlIGxpc3RlZCBpbiB0aGUgIkNvbmRpdGlvbmFsIENvbXBpbGF0aW9uIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAwOC0xMi0yMzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMyMTUzNzczIC0gJW5vamF2YWV4Y2VwdGlvbiB3YXMgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgIGluc3RlYWQgb2YgZGlzYWJsaW5nIGl0LiBDbGVhcmluZyBjaGVja2VkIEphdmEgZXhjZXB0aW9ucyBhbHNvIGRpZG4ndCB3b3JrLiAKCSAgICBUaGUgbmV3ICVjbGVhcmphdmFleGNlcHRpb24gY2FuIGJlIHVzZWQgZm9yIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZS4KCjIwMDgtMTItMjI6IHdzZnVsdG9uCgkgICAgRml4ICMyNDMyODAxIC0gTWFrZSBTd2lnVmFsdWVXcmFwcGVyIGV4Y2VwdGlvbiBzYWZlIGZvciB3aGVuIGNvcHkgY29uc3RydWN0b3JzCgkgICAgdGhyb3cgZXhjZXB0aW9ucy4KCjIwMDgtMTItMjE6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzI0NDAwNDYgd2hpY2ggZml4ZXMgcG9zc2libGUgc2VnIGZhdWx0cyBmb3IgbWVtYmVyIGFuZCBnbG9iYWwKCSAgICB2YXJpYWJsZSBjaGFyIGFycmF5cyB3aGVuIHRoZSBzdHJpbmdzIGFyZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIGFycmF5IHNpemUuCgoyMDA4LTEyLTIwOiB3c2Z1bHRvbgoJICAgIFRoZSBjY2FjaGUgY29tcGlsZXIgY2FjaGUgaGFzIGJlZW4gYWRhcHRlZCB0byB3b3JrIHdpdGggU1dJRyBhbmQKCSAgICBuYW1lZCBjY2FjaGUtc3dpZy4gSXQgbm93IHdvcmtzIHdpdGggQy9DKysgY29tcGlsZXJzIGFzIHdlbGwgYXMgU1dJRwoJICAgIGFuZCBjYW4gcmVzdWx0IGluIGltcHJlc3NpdmUgc3BlZWR1cHMgd2hlbiB1c2VkIHRvIHJlY29tcGlsZSB1bmNoYW5nZWQKCSAgICBjb2RlIHdpdGggZWl0aGVyIGEgQy9DKysgY29tcGlsZXIgb3IgU1dJRy4gRG9jdW1lbnRhdGlvbiBpcyBpbiBDQ2FjaGUuaHRtbAoJICAgIG9yIHRoZSBpbnN0YWxsZWQgY2NhY2hlLXN3aWcgbWFuIHBhZ2UuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoIGZyb20gS2FseWFub3YgRG1pdHJ5IHdoaWNoIGZpeGVzIHBhcnNpbmcgb2YgbmVzdGVkIHN0cnVjdHMKCSAgICBjb250YWluaW5nIGNvbW1lbnRzLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBGaXggZXJyb3IgbWVzc2FnZSBpbiBzb21lIG5lc3RlZCBzdHJ1Y3QgYW5kICVpbmxpbmUgcGFyc2luZyBlcnJvciBzaXR1YXRpb25zCgkgICAgc3VjaCBhcyB1bnRlcm1pbmF0ZWQgc3RyaW5ncyBhbmQgY29tbWVudHMuCgoyMDA4LTEyLTA3OiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVyIHdpdGggR0NDIDQuMy4KCjIwMDgtMTItMDY6IHdzZnVsdG9uCgkgICAgW1BIUF0gRGVwcmVjYXRlICVwcmFnbWEocGhwNCkuIFBsZWFzZSB1c2UgJXByYWdtYShwaHApIGluc3RlYWQuCgkgICAgVGhlIGZvbGxvd2luZyB0d28gd2FybmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQ6CgkgICAgV0FSTl9QSFA0X01VTFRJUExFX0lOSEVSSVRBTkNFIC0+IFdBUk5fUEhQX01VTFRJUExFX0lOSEVSSVRBTkNFCgkgICAgV0FSTl9QSFA0X1VOS05PV05fUFJBR01BICAgICAgIC0+IFdBUk5fUEhQX1VOS05PV05fUFJBR01BCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDQ6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoIFNGIzIxNTg5Mzg6IGFsbCB0aGUgU1dJRyBzeW1ib2wgbmFtZXMgc3RhcnRlZCB3aXRoIFB5CiAgICAgICAgICAgIGFyZSBjaGFuZ2VkLCBzaW5jZSB0aGV5IGFyZSBpbmFwcHJvcHJpYXRlIGFuZCBkaXNjb3VyYWdlZCBpbiBQeXRob24KICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiAoZnJvbSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNS4yL2FwaS9pbmNsdWRlcy5odG1sKToKCiAgICAgICAgICAgICJBbGwgdXNlciB2aXNpYmxlIG5hbWVzIGRlZmluZWQgYnkgUHl0aG9uLmggKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGJ5CiAgICAgICAgICAgIHRoZSBpbmNsdWRlZCBzdGFuZGFyZCBoZWFkZXJzKSBoYXZlIG9uZSBvZiB0aGUgcHJlZml4ZXMgIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgTmFtZXMgYmVnaW5uaW5nIHdpdGggIl9QeSIgYXJlIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGV4dGVuc2lvbiB3cml0ZXJzLiBTdHJ1Y3R1cmUgbWVtYmVyIG5hbWVzIGRvCiAgICAgICAgICAgIG5vdCBoYXZlIGEgcmVzZXJ2ZWQgcHJlZml4LgoKICAgICAgICAgICAgSW1wb3J0YW50OiB1c2VyIGNvZGUgc2hvdWxkIG5ldmVyIGRlZmluZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGggIlB5IiBvciAiX1B5Ii4KICAgICAgICAgICAgVGhpcyBjb25mdXNlcyB0aGUgcmVhZGVyLCBhbmQgamVvcGFyZGl6ZXMgdGhlIHBvcnRhYmlsaXR5IG9mIHRoZSB1c2VyCiAgICAgICAgICAgIGNvZGUgdG8gZnV0dXJlIFB5dGhvbiB2ZXJzaW9ucywgd2hpY2ggbWF5IGRlZmluZSBhZGRpdGlvbmFsIG5hbWVzIGJlZ2lubmluZwogICAgICAgICAgICB3aXRoIG9uZSBvZiB0aGVzZSBwcmVmaXhlcy4iCgogICAgICAgICAgICBIZXJlIGlzIGEgYnJpZWYgbGlzdCBvZiB3aGF0IGNoYW5nZWQ6CgogICAgICAgICAgICAgICAgUHlTd2lnKiAtPiBTd2lnUHkqCiAgICAgICAgICAgICAgICBQeU9iamVjdF9wdHIgLT4gU3dpZ1B0cl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlPYmplY3RfdmFyIC0+IFN3aWdWYXJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQmFzZSwgUHlTZXF1ZW5jZV9Db250LCBQeVNlcXVlbmNlX1JlZiAtPgogICAgICAgICAgICAgICAgICAgICAgICBTd2lnUHlTZXF1ZW5jZV9CYXNlLCBTd2lnUHlTZXF1ZW5jZV9Db250LCBTd2lnUHlTZXF1ZW5jZV9SZWYKICAgICAgICAgICAgICAgIFB5TWFwKiAtPiBTd2lnUHlNYXAqCgogICAgICAgICAgICBXZSBwcm92aWRlZCBhIHB5bmFtZV9jb21wYXQuaSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gVXNlcnMgd2hvc2UgY29kZSBoYXZpbmcKICAgICAgICAgICAgdGhlc2Ugc3ltYm9scyBhbmQgZG8gbm90IHdhbnQgdG8gY2hhbmdlIGl0IGNvdWxkIHNpbXBseSBpbmNsdWRlIHRoaXMgZmlsZQogICAgICAgICAgICBhdCBmcm9udCBvZiB5b3VyIGNvZGUuIEEgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJ1biB0aGUgY29udmVydGluZyB0b29sIG9uCiAgICAgICAgICAgIHlvdXIgY29kZSwgd2hpY2ggaGFzIGJlZW4gcHV0IGluIFNXSUcncyBTVk4gdHJ1bmsgKFRvb2xzL3B5bmFtZV9wYXRjaC5weSkgYW5kCiAgICAgICAgICAgIHlvdSBjYW4gZG93bmxvYWQgaXQgaGVyZToKICAgICAgICAgICAgaHR0cHM6Ly9zd2lnLnN2bi5zb3VyY2Vmb3JnZS5uZXQvc3Zucm9vdC9zd2lnL3RydW5rL1Rvb2xzL3B5bmFtZV9wYXRjaC5weSAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wMjogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjE0MzcyNyBmcm9tIFNlcmdlIE1vbmtld2l0eiB0byBmaXggaW1wb3J0aW5nIGJhc2UgY2xhc3NlcyAKCSAgICB3aGVuIHRoZSBwYWNrYWdlIG9wdGlvbiBpcyBzcGVjaWZpZWQgaW4gJW1vZHVsZSBhbmQgdGhhdCBtb2R1bGUgaXMgJWltcG9ydCdlZC4KCjIwMDgtMTEtMjg6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4ICMyMDgwNDk3LiBTb21lIGluY29ycmVjdCBhY2NlcHRhbmNlIG9mIHR5cGVzIGluIHRoZSBTVEwsIGVnIGEgZG91YmxlICogZWxlbWVudAoJICAgIHBhc3NlZCBpbnRvIGEgdmVjdG9yPGludCAqPiBjb25zdHJ1Y3RvciB3b3VsZCBiZSBhY2NlcHRlZCwgYnV0IHRoZSBlbnN1aW5nIGJlaGF2aW91cgoJICAgIHdhcyB1bmRlZmluZWQuIE5vdyB0aGUgdHlwZSBjb252ZXJzaW9uIGNvcnJlY3RseSByYWlzZXMgYW4gZXhjZXB0aW9uLgoKMjAwOC0xMS0yNDogd3NmdWx0b24KCSAgICBBZGQgLW91dGN1cnJlbnRkaXIgb3B0aW9uLiBUaGlzIHNldHMgdGhlIGRlZmF1bHQgb3V0cHV0IGRpcmVjdG9yeSB0byB0aGUgY3VycmVudCAKCSAgICBkaXJlY3RvcnkgaW5zdGVhZCBvZiB0aGUgcGF0aCBzcGVjaWZpZWQgYnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGVuYWJsZXMKCSAgICBiZWhhdmlvdXIgc2ltaWxhciB0byBjL2MrKyBjb21waWxlcnMuIE5vdGUgdGhhdCB0aGlzIGNvbnRyb2xzIHRoZSBvdXRwdXQgZGlyZWN0b3J5LAoJICAgIGJ1dCBvbmx5IGluIHRoZSBhYnNlbmNlIG9mIHRoZSAtbyBhbmQvb3IgLW91dGRpciBvcHRpb25zLgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBbcnVieV0gQXBwbHkgcGF0Y2ggIzIyNjM4NTAgdG8gZml4IHJ1YnkvZmlsZS5pIC4uLiBydWJ5aW8uaCBmaWxlbmFtZSBjaGFuZ2UgaW4gCgkgICAgcnVieSAxLjkuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyMzE5NzkwIGZyb20gSm9oYW4gSGFrZSB0byBmaXggc2hhcmVkX3B0ciB1c2FnZSBpbiBzdGQ6OnRyMSBuYW1lc3BhY2UuCgoyMDA4LTExLTIxOiB3c2Z1bHRvbgoJICAgIFRoZSB1c2Ugb2YgdGhlIGluY2x1ZGUgcGF0aCB0byBmaW5kIHRoZSBpbnB1dCBmaWxlIGlzIG5vdyBkZXByZWNhdGVkLgoJICAgIFRoaXMgbWFrZXMgdGhlIGJlaGF2aW91ciBvZiBTV0lHIHRoZSBzYW1lIGFzIEMvQysrIGNvbXBpbGVycyBpbiBwcmVwYXJhdGlvbgoJICAgIGZvciB1c2Ugd2l0aCBjY2FjaGUuCgoyMDA4LTExLTE2OiB3c2Z1bHRvbgoJICAgIEZpeCAtbm9wcmVwcm9jZXNzIG9wdGlvbiB0bzoKCSAgICAtIGNvcnJlY3RseSByZXBvcnQgZmlsZSBuYW1lcyBpbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcy4KCSAgICAtIHVzZSB0aGUgb3JpZ2luYWwgaW5wdXQgZmlsZW5hbWUgdGhhdCBjcmVhdGVkIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdoZW4gCgkgICAgICBkZXRlcm1pbmluZyB0aGUgQysrIHdyYXBwZXIgZmlsZSBuYW1lIChpbiB0aGUgYWJzZW5jZSBvZiAtbykuIFByZXZpb3VzbHkgCgkgICAgICB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIHRoZSBwcmVwcm9jZXNzZWQgb3V0cHV0IHdhcyB1c2VkLgoKMjAwOC0xMS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHBhdGNoICMyMTUyNjkxIGZyb20gTUFUU1VVUkEgVGFrYW5vcmkgd2hpY2ggZml4ZXMgY29tcGlsZXMgdXNpbmcgdGhlCgkgICAgSW50ZWwgY29tcGlsZXIKCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBwYXRjaCAjMjEyODI0OSBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrIHdoaWNoIGNvcnJlY3RzIHRoZSBDL0MrKyBwcm94eQogICAgICAgICAgICBjbGFzcyBiZWluZyByZXBvcnRlZCBmb3IgUHl0aG9uIGRvY3N0cmluZ3Mgd2hlbiAlcmVuYW1lIGlzIHVzZWQuCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIHN0cmlwIGVuY29kZXIgcGF0Y2ggZnJvbSBBbmF0b2x5IFRlY2h0b25payAjMjEzMDAxNi4gVGhpcyBlbmFibGVzIGFuIAogICAgICAgICAgICBlYXN5IHdheSB0byByZW5hbWUgc3ltYm9scyBieSBzdHJpcHBpbmcgYSBjb21tb25seSB1c2VkIHByZWZpeCBpbiBhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uL3N0cnVjdCBuYW1lcy4gSXQgd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBvdGhlciBlbmNvZGVycywgc3VjaCBhcwogICAgICAgICAgICB0aXRsZSwgbG93ZXIsIGNvbW1hbmQgZXRjIG91dGxpbmVkIGluIENIQU5HRVMgZmlsZSBkYXRlZCAxMi8zMC8yMDA1LiBFeGFtcGxlCiAgICAgICAgICAgIGJlbG93IHdpbGwgcmVuYW1lIHd4QW5vdGhlcldpZGdldCB0byBBbm90aGVyV2lkZ2V0IGFuZCB3eERvU29tZXRoaW5nIHRvIAogICAgICAgICAgICBEb1NvbWV0aGluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShzdHJpcDpbd3hdKXMiKSAiIjsgCgogICAgICAgICAgICAgIHN0cnVjdCB3eEFub3RoZXJXaWRnZXQgewogICAgICAgICAgICAgICAgICB2b2lkIHd4RG9Tb21ldGhpbmcoKTsKICAgICAgICAgICAgICB9OwoKMjAwOC0wOS0yNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIExvdHMgb2YgdGVzdC1zdWl0ZSB3b3JrLgoJICAgIC0gRml4IG9yZGVyaW5nIG9mIHdyYXBwZXIgb3V0cHV0IGFuZCAleyAlfSBoZWFkZXIgb3V0cHV0LgoJICAgIC0gRml4IGRlY2xhcmF0aW9ucyBvZiBsb2NhbCB2YXJzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgZGVmaW5lZCBjb25zdGFudHMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBFbnVtVmFsdWVzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBhZGQgc29tZSBjb25zdCB0eXBlbWFwcyB0byBhbGxlZ3JvY2wuc3dnCgkgICAgLSBhZGQgcmVuYW1lIGZvciBvcGVyYXRvciBib29sKCkgb3ZlcmxvYWRzLgoJCjIwMDgtMDktMjU6IG9sbHkKCSAgICBbUEhQNV0gRmlsbCBpbiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgYW5kIHZvaWQgKiAoU0YjMjA5NTE4NikuCgoyMDA4LTA5LTIyOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIFN1cHBvcnQgd3JhcHBpbmcgb2YgdHlwZXMgd2hvc2UgZGVmaW5pdGlvbnMgYXJlIG5vdCBzZWVuIGJ5CgkgICAgU1dJRy4gVGhleSBhcmUgdHJlYXRlZCBhcyBmb3J3YXJkLXJlZmVyZW5jZWQgY2xhc3NlcyBhbmQgaWYgYQoJICAgIGRlZmluaXRpb24gaXMgbm90IHNlZW4gYXJlIHRyZWF0ZWQgYXMgKCogOnZvaWQpLgoJICAgIC0gRG9uJ3Qgd3JhcCB0aGUgY29udGVudHMgb2YgdW5uYW1lZCBuYW1lc3BhY2VzLgoJICAgIC0gTW9yZSBjb2RlIGNsZWFudXAuIFJlbW92ZWQgc29tZSBleHRyYW5lb3VzIHdhcm5pbmdzLgoJICAgIC0gc3RhcnQgd29yayBvbiBoYXZpbmcgdGhlIGFsbGVncm9jbCBtb2QgcGFzcyB0aGUgY3BwIHRlc3Qtc3VpdGUuCgoyMDA4LTA5LTE5OiBvbGx5CgkgICAgW1BIUDVdIEFkZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIEMjIGFycmF5IHR5cGVtYXBzIHByb3ZpZGVkIGJ5IEFudHRpIEthcmFudGEuCiAgICAgICAgICAgIFRoZSBhcnJheXMgcHJvdmlkZSBhIHdheSB0byB1c2UgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBBcnJheSkKICAgICAgICAgICAgYW5kIHBpbm5pbmcgdGhlIGFycmF5IHVzaW5nICdmaXhlZCcuIFNlZSBhcnJheXNfY3NoYXJwLmkgbGlicmFyeSBmaWxlCiAgICAgICAgICAgIGZvciBkZXRhaWxzLgoKMjAwOC0wOS0xODogd3NmdWx0b24KCSAgICBEb2N1bWVudCB0aGUgb3B0aW9uYWwgbW9kdWxlIGF0dHJpYnV0ZSBpbiB0aGUgJWltcG9ydCBkaXJlY3RpdmUsCiAgICAgICAgICAgIHNlZSBNb2R1bGVzLmh0bWwuIEFkZCBhIHdhcm5pbmcgZm9yIFB5dGhvbiB3cmFwcGVycyB3aGVuIHRoZQogICAgICAgICAgICBtb2R1bGUgbmFtZSBmb3IgYW4gaW1wb3J0ZWQgYmFzZSBjbGFzcyBpcyBtaXNzaW5nLCByZXF1aXJpbmcgdGhlCiAgICAgICAgICAgIG1vZHVsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gJWltcG9ydCwgZWcgCgogICAgICAgICAgICAgICVpbXBvcnQobW9kdWxlPSJGb29Nb2R1bGUiKSBmb28uaAoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBDaGFuZ2UgdGhlIGRlZmF1bHQgaW5wdXQgdHlwZW1hcCBmb3IgY2hhciAqIHRvIHR1cm4gUEhQCgkgICAgTnVsbCBpbnRvIEMgTlVMTCAocHJldmlvdXNseSBpdCB3YXMgY29udmVydGVkIHRvIGFuIGVtcHR5IHN0cmluZykuCgkgICAgVGhlIG5ldyBiZWhhdmlvdXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQKCSAgICB0eXBlbWFwIHdvcmtzIChTRiMyMDI1NzE5KS4KCgkgICAgSWYgeW91IHdhbnQgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgYWRkIHRoZSBmb2xsb3dpbmcgdHlwZW1hcAoJICAgIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgKFBIUCdzIGNvbnZlcnRfdG9fc3RyaW5nX2V4KCkgZnVuY3Rpb24gZG9lcwoJICAgIHRoZSBjb252ZXJ0aW5nIGZyb20gUEhQIE51bGwgdG8gYW4gZW1wdHkgc3RyaW5nKToKCgkgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7CgkJY29udmVydF90b19zdHJpbmdfZXgoJGlucHV0KTsKCQkkMSA9IFpfU1RSVkFMX1BQKCRpbnB1dCk7CgkgICAgfQoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggZXh0cmEgY29kZSBhZGRlZCB0byBwcm94eSBjbGFzcyBjb25zdHJ1Y3RvcnMgaW4gdGhlIGNhc2UKCSAgICB3aGVyZSB0aGUgb25seSBjb25zdHJ1Y3RvciB0YWtlcyBubyBhcmd1bWVudHMuCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCB3cmFwcGluZyBvZiBhIHJlbmFtZWQgZW51bWVyYXRlZCB2YWx1ZSBvZiBhbiBlbnVtIGNsYXNzCgkgICAgbWVtYmVyIChTRiMyMDk1MjczKS4KCjIwMDgtMDktMTc6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gRml4IGhvdyBmb3J3YXJkIHJlZmVyZW5jZSB0eXBlZGVmcyBhcmUgaGFuZGxlZCwgc28gYXMgbm90IHRvIGNvbmZsaWN0CgkgICAgd2l0aCBvdGhlciBsZWdpdCB0eXBlZGVmcy4KCSAgICAtIERvbid0IChmb3Igbm93KSBwZXJmb3JtIGFuIGZmaXR5cGUgdHlwZW1hcCBsb29rdXAgd2hlbiB0cnlpbmcgdG8KCSAgICB3aGVuIGNhbGxpbmcgY29tcG9zZV9mb3JlaWduX3R5cGUoKS4gVGhpcyBpcyBhY3R1YWxseSBhIHVzZWZ1bCB0aGluZwoJICAgIHRvIGRvIGluIGNlcnRhaW4gY2FzZXMsIHRoZSB0ZXN0IGNhc2VzIGZvciB3aGljaCBJIGNhbid0IGN1cnJlbnRseQoJICAgIGxvY2F0ZSA6Ly4gSXQncyBicmVha2luZyBzb21lIHdyYXBwaW5nIGJlaGF2aW9yIHRoYXQgaXMgbW9yZSBjb21tb25seQoJICAgIHNlZW4sIGhvd2V2ZXIuIEknbGwgcmVhZGQgaW4gYSBtb3JlIGFwcHJvcHJpYXRlIHdheSB3aGVuIEkgY2FuCgkgICAgcmVjcmVhdGUgdGhlIG5lZWRlZCB0ZXN0IGNhc2UsIG9yIGEgdXNlciBjb21wbGFpbnMgKHdoaWNoIG1lYW5zCgkgICAgdGhleSBwcm9iYWJseSBoYXZlIGEgdGVzdCBjYXNlKS4KCSAgICAtIGRvY3VtZW50IHRoZSAtaXNvbGF0ZSBjb21tYW5kLWxpbmUgYXJnIGluIHRoZSAnc3dpZyAtaGVscCcgb3V0cHV0LgoJICAgIEl0IHdhcyBpbiB0aGUgaHRtbCBkb2NzLCBidXQgbm90IHRoZXJlLgoJICAgIC0gc21hbGwgYW1vdW50IG9mIGNvZGUgY2xlYW51cCwgcmVtb3ZlZCBzb21lIHVudXNlZCBjb2RlLgoJICAgIC0gc29tZSBtaW5vciBhZXN0aGV0aWMgY2hhbmdlcy4KCjIwMDgtMDktMTI6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy4wIHN1cHBvcnQgYnJhbmNoIG1lcmdlZCBpbnRvIFNXSUcgdHJ1bmsuIFRoYW5rcyB0bwogICAgICAgICAgICBHb29nbGUgU3VtbWVyIG9mIENvZGUgMjAwOCBmb3Igc3VwcG9ydGluZyB0aGlzIHByb2plY3QhIEJ5IGRlZmF1bHQKICAgICAgICAgICAgU1dJRyB3aWxsIGdlbmVyYXRlIGludGVyZmFjZSBmaWxlcyBjb21wYXRpYmxlIHdpdGggYm90aCBQeXRob24gMi54CiAgICAgICAgICAgIGFuZCAzLjAuIEFuZCB0aGVyZSdzIGFsc28gc29tZSBQeXRob24gMyBuZXcgZmVhdHVyZXMgdGhhdCBjYW4gYmUKICAgICAgICAgICAgZW5hYmxlZCBieSBwYXNzaW5nIGEgIi1weTMiIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gU1dJRy4gVGhlc2UKICAgICAgICAgICAgZmVhdHVyZXMgYXJlOgoKICAgICAgICAgICAgICAtIEZ1bmN0aW9uIGFubm90YXRpb24gc3VwcG9ydAogICAgICAgICAgICAgICAgICBBbHNvLCB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgcHJveHkgZnVuY3Rpb24gd2lsbCBiZSBnZW5lcmF0ZWQsCiAgICAgICAgICAgICAgICAgIGV2ZW4gd2l0aG91dCB0aGUgIi1weTMiIG9wdGlvbi4gSG93ZXZlciwgdGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgICAgICAgIHdpbGwgZmFsbGJhY2sgdG8gKmFyZ3MgaWYgdGhlIGZ1bmN0aW9uIChvciBtZXRob2QpIGlzIG92ZXJsb2FkZWQuCiAgICAgICAgICAgICAgLSBCdWZmZXIgaW50ZXJmYWNlIHN1cHBvcnQKICAgICAgICAgICAgICAtIEFic3RyYWN0IGJhc2UgY2xhc3Mgc3VwcG9ydAoKICAgICAgICAgICAgRm9yIGRldGFpbHMgb2YgUHl0aG9uIDMgc3VwcG9ydCBhbmQgdGhlc2UgZmVhdHVyZXMsIHBsZWFzZSBzZWUgdGhlCiAgICAgICAgICAgICJQeXRob24gMyBTdXBwb3J0IiBzZWN0aW9uIGluIHRoZSAiU1dJRyBhbmQgUHl0aG9uIiBjaGFwdGVyIG9mIHRoZSBTV0lHCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgIi1hcHBseSIgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgc3VwcG9ydCBvZiBnZW5lcmF0aW5nIGNvZGVzCiAgICAgICAgICAgIHVzaW5nIGFwcGx5KCkgaXMgcmVtb3ZlZC4gU2luY2UgdGhpcyBpcyBvbmx5IHJlcXVpcmVkIGJ5IHZlcnkgb2xkCiAgICAgICAgICAgIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgbWVyZ2UgYWxzbyBwYXRjaGVkIFNXSUcncyBwYXJzZXIgdG8gc29sdmUgYSBidWcuIEJ5IHRoaXMgcGF0Y2gsCiAgICAgICAgICAgIFNXSUcgZmVhdHVyZXMgYWJsZSB0byBiZSBjb3JyZWN0bHkgYXBwbGllZCBvbiBDKysgY29udmVyc2lvbiBvcGVyYXRvciwKICAgICAgICAgICAgc3VjaCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpICAqOjpvcGVyYXRvciBib29sICV7IC4uLiAlfQoKMjAwOC0wOS0wMjogcmljaGFyZGIKCSAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzIwODkxNDk6IERpcmVjdG9yIGV4Y2VwdGlvbiBoYW5kbGluZyBtYW5nbGVzCgkgICAgcmV0dXJuZWQgZXhjZXB0aW9uLiAgRXhjZXB0aW9ucyByYWlzZWQgYnkgUHl0aG9uIGNvZGUgaW4gZGlyZWN0b3JzCgkgICAgYXJlIG5vdyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY2FsbGVyIHdpdGhvdXQgY2hhbmdlLiAgQWxzbywgcmVtb3ZlCgkgICAgdGhlICI6ICIgcHJlZml4IHdoaWNoIHVzZWQgdG8gYmUgYWRkZWQgdG8gb3RoZXIgZGlyZWN0b3IgZXhjZXB0aW9ucwoJICAgIChlZywgdGhvc2UgZHVlIHRvIGluY29ycmVjdCByZXR1cm4gdHlwZXMpLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMxOTg4Mjk2IEdDSXRlbSBtdWx0aXBsZSBtb2R1bGUgbGlua2luZyBpc3N1ZSB3aGVuIHVzaW5nIAogICAgICAgICAgICBkaXJlY3RvcnMuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yICd1c2luZycgYW5kICdmaXhlZCcgYmxvY2tzIGluIHRoZSAnY3NpbicgdHlwZW1hcCBpcyBub3cKICAgICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBwcmUgYXR0cmlidXRlIGFuZCB0aGUgbmV3IHRlcm1pbmF0b3IgYXR0cmlidXRlLCBlZwoKICAgICAgICAgICAgICAldHlwZW1hcChjc2luLCAKICAgICAgICAgICAgICAgICAgICAgICBwcmU9IiAgICB1c2luZyAoQ0RhdGUgdGVtcCRjc2lucHV0ID0gbmV3IENEYXRlKCRjc2lucHV0KSkgeyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYXRvcj0iICAgIH0gLy8gdGVybWluYXRlIHRlbXAkY3NpbnB1dCB1c2luZyBibG9jayIsCiAgICAgICAgICAgICAgICAgICAgICApIGNvbnN0IENEYXRlICYKICAgICAgICAgICAgICAgICAgICAgICAiJGNzY2xhc3NuYW1lLmdldENQdHIodGVtcCRjc2lucHV0KSIKCiAgICAgICAgICAgIFNlZSBDU2hhcnAuaHRtbCBmb3IgbW9yZSBpbmZvLgoKMjAwOC0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIENvbW1pdCBwYXRjaCAjMjA3OTM4MSBzdWJtaXR0ZWQgYnkgQm9yaXMgU21pbGdhIC0gY29uc3RhbnQgZXhwcnMgcHV0IGludG8gCiAgICAgICAgICAgIG5vLWV2YWwgY29udGV4dCBpbiBERUZDRU5VTQoKMjAwOC0wOC0wMjogd3V6emViCiAgICAgICAgICAgIFtDaGlja2VuLEFsbGVncm9dIENvbW1pdCBQYXRjaCAyMDE5MzE0CiAgICAgICAgICAgIEZpeGVzIGEgYnVpbGQgZXJyb3IgaW4gY2hpY2tlbiwgYW5kIHNldmVyYWwgYnVpbGQgZXJyb3JzIGFuZCBvdGhlciBlcnJvcnMKICAgICAgICAgICAgaW4gQWxsZWdybyBDTAoKMjAwOC0wNy0xOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1aWxkaW5nIG9mIFRjbCBleGFtcGxlcy90ZXN0LXN1aXRlIG9uIE1hYyBPU1ggcmVwb3J0ZWQgYnkgR2lkZW9uIFNpbXBzb24uCgoyMDA4LTA3LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzIwMTkxNTYgQ29uZmlndXJpbmcgd2l0aCAtLXdpdGhvdXQtb2N0YXZlIG9yIC0td2l0aG91dC1hbGxsYW5nCiAgICAgICAgICAgIGRpZCBub3QgZGlzYWJsZSBvY3RhdmUuCgoyMDA4LTA3LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBkaXJlY3RvciB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSBjb3JyZWN0bHkgCiAgICAgICAgICAgIG1hcnNoYWxsZWQgdG8gQyMvSmF2YSBudWxsIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gRm9yIHN0ZF92ZWN0b3IuaSBhbmQgc3RkX21hcC5pLCByZW5hbWUgZW1wdHkoKSB0byBpc19lbXB0eSgpCgkgICAgc2luY2UgImVtcHR5IiBpcyBhIFBIUCByZXNlcnZlZCB3b3JkLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXJrIEtsZWluCgkgICAgaW4gU0YjMTk0MzQxNy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItbWFrZSIgaGFzIGJlZW4gcmVtb3ZlZC4gIAoJICAgIFNlYXJjaGVzIG9uIEdvb2dsZSBjb2Rlc2VhcmNoIHN1Z2dlc3QgdGhhdCBub2JvZHkgaXMgdXNpbmcgaXQgbm93CgkgICAgYW55d2F5LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBTV0lHIGNkYXRhLmkgbGlicmFyeSBtb2R1bGUgaXMgbm93IHN1cHBvcnRlZC4KCjIwMDgtMDctMDM6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItcGhwZnVsbCIgaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgV2UgcmVjb21tZW5kIGJ1aWxkaW5nIHlvdXIgZXh0ZW5zaW9uIGFzIGEgZHluYW1pY2FsbHkKCSAgICBsb2FkYWJsZSBtb2R1bGUuCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1BIUDRdIFN1cHBvcnQgZm9yIFBIUDQgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoZSBQSFAgZGV2ZWxvcGVycyBhcmUKCSAgICBubyBsb25nZXIgbWFraW5nIG5ldyBQSFA0IHJlbGVhc2VzLCBhbmQgd29uJ3QgZXZlbiBiZSBwcm92aWRpbmcKCSAgICBwYXRjaGVzIGZvciBjcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgYWZ0ZXIgMjAwOC0wOC0wOC4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXBvcnQgdGhlIEMgZXh0ZW5zaW9uIGRpZmZlcmVudGx5IGZvciBQeXRob24gMi42IGFuZAoJICAgIGxhdGVyIHNvIHRoYXQgYW4gaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0IGRvZXNuJ3QgcHJvZHVjZSBhCgkgICAgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgMi42IGFuZCBhIGZhaWx1cmUgZm9yIDIuNyBhbmQgbGF0ZXIuCgkgICAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gU0YjMjAwODIyOSwgcGx1cyBmb2xsb3ctdXAgcGF0Y2hlcwoJICAgIGZyb20gUmljaGFyZCBhbmQgSGFveXUgQmFpLgoKVmVyc2lvbiAxLjMuMzYgKDI0IEp1bmUgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzI0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBkZXByZWNhdGVkIC1jIGNvbW1hbmRsaW5lIG9wdGlvbiAocnVudGltZSBsaWJyYXJ5IGdlbmVyYXRpb24pLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIGhhbmRsaW5nICV0eXBlbWFwKGluLG51bWlucHV0cz0wKQoJICAgICh0ZXN0Y2FzZSBpZ25vcmVfcGFyYW1ldGVyKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgd2hlbiB3cmFwcGluZyBhIG5vbi1jbGFzcyBmdW5jdGlvbiBtYXJrZWQgd2l0aAoJICAgICVuZXdvYmplY3QgKHRlc3RjYXNlIGNoYXJfc3RyaW5ncykuCgowNi8yMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGEgd2F5IHRvIHVzZSBBdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24gaW5zdGVhZCBvZiBBdHRhY2hDdXJyZW50VGhyZWFkCiAgICAgICAgICAgIGluIGRpcmVjdG9yIGNvZGUuIERlZmluZSB0aGUgU1dJR19KQVZBX0FUVEFDSF9DVVJSRU5UX1RIUkVBRF9BU19EQUVNT04gbWFjcm8sIHNlZQogICAgICAgICAgICBMaWIvamF2YS9kaXJlY3Rvci5zd2cuCgowNi8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGNyYXNoaW5nIGluIHRoZSBTVEwgd3JhcHBlcnMgKHJlamVjdCEgYW5kIGRlbGV0ZV9pZiBtZXRob2RzKQoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBDIyBhbmQgSmF2YSBrZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgaW5zdGVhZCBvZiBqdXN0IGlzc3VpbmcgYSB3YXJuaW5nCiAgICAgICAgICAgIGFuZCB0aGVuIGdlbmVyYXRpbmcgdW5jb21waWxlYWJsZSBjb2RlLiBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIAogICAgICAgICAgICBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEtleXdvcmQgaGFuZGxpbmcgYWRkZWQuIFIgS2V5d29yZHMgd2lsbCBiZSByZW5hbWVkIGFzIG5lY2Vzc2FyeS4KICAgICAgICAgICAgV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSBrZXl3b3JkIGlzIGZvdW5kLgoKMDYvMTcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBib29sJiBhbmQgYm9vbCouIEFkZGVkIHJ1bnRlc3QgZm9yIGxpX3R5cGVtYXBzIHRlc3RjYXNlLgogICAgICAgICAgICAoQnVnICMxOTM4MTQyKQoKMDYvMDcvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHRlc3QgY2FzZSBrZXl3b3JkX3JlbmFtZSwgdGhlbiBtYWRlIHRoZSBrZXl3b3JkIHJlbmFtaW5nIHdvcmtzIHByb3Blcmx5CiAgICAgICAgICAgIGJ5IGZpeGluZyBTd2lnX25hbWVfbWFrZSgpIGZvciBhIGluY29tcGxldGUgY29uZGl0aW9uIGNoZWNraW5nLgoKMDYvMDIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZW51bSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMzAvMjAwODogYmh5CiAgICAgICAgICAgIEFkZGVkIHN0ZDo6d3N0cmluZyBpbnRvIExpYi90eXBlbWFwcy9wcmltdHlwZXMuc3dnLCBzaW5jZSBpdCBpcyBhbHNvIGEgcHJpbWl0aXZlIAogICAgICAgICAgICB0eXBlIGluIFNXSUcgLSBmaXhlZCBTRiAjMTk3Njk3OC4KCjA1LzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHZhcmlhYmxlIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8yOS8yMDA4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgYSB0eXBvIG9mICUjaWZkZWYgaW4gTGliL3B5dGhvbi9weWNvbnRhaW5lci5zd2csIHdoaWNoIGlzIHJlbGF0ZWQgCiAgICAgICAgICAgIHRvIC1leHRyYW5hdGl2ZSBTV0lHIG9wdGlvbiAtIFNGICMxOTcxOTc3LgoKMDUvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgTmV3IHBhcnRpYWxjaGVjayBtYWtlZmlsZSB0YXJnZXRzIGZvciBwYXJ0aWFsIHRlc3Rpbmcgb2YgdGhlIHRlc3Qtc3VpdGUuIFRoZXNlCiAgICAgICAgICAgIGp1c3QgaW52b2tlIFNXSUcsIGllIG5vIGNvbXBpbGF0aW9uIGFuZCBubyBydW50aW1lIHRlc3RpbmcuIEl0IGNhbiBiZSBmYXN0ZXIKICAgICAgICAgICAgd2hlbiBkZXZlbG9waW5nIGJ5IGp1c3QgZG9pbmcgYSBkaXJlY3RvcnkgZGlmZiBvZiB0aGUgZmlsZXMgU1dJRyBnZW5lcmF0ZXMKICAgICAgICAgICAgYWdhaW5zdCB0aG9zZSBmcm9tIGEgcHJldmlvdXMgcnVuLiBFeGFtcGxlIHVzYWdlIGZyb20gdGhlIHRvcCBsZXZlbCBkaXJlY3Rvcnk6CgogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay1qYXZhLXRlc3Qtc3VpdGUKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5jb21wYXNzZXMgbW9yZSBmbGV4aWJpbGl0eSBpbiBydW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBlZwogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBwcmVmaXggdGhlIGNvbW1hbmQgbGluZSB3aGljaCBydW5zIGFueSB0YXJnZXQgbGFuZ3VhZ2UgdGVzdAogICAgICAgICAgICB3aXRoIGEgdG9vbC4gU2VlIHRoZSBSVU5UT09MLCBDT01QSUxFVE9PTCBhbmQgU1dJR1RPT0wgdGFyZ2V0cyBpbiB0aGUgY29tbW9uLm1rCiAgICAgICAgICAgIGZpbGUgYW5kIG1ha2VmaWxlcyBpbiB0aGUgdGVzdC1zdWl0ZSBkaXJlY3RvcnkuIEZvciBleGFtcGxlIGl0IGlzIHBvc3NpYmxlIHRvIAogICAgICAgICAgICBydW4gdGhlIHJ1bnRpbWUgdGVzdHMgdGhyb3VnaCB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBSVU5UT09MPSJ2YWxncmluZCAtLWxlYWstY2hlY2s9ZnVsbCIKCiAgICAgICAgICAgIG9yIGludm9rZSBTV0lHIHVuZGVyIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFNXSUdUT09MPSJ2YWxncmluZCAtLXRvb2w9bWVtY2hlY2siCgowNS8xOS8yMDA4OiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgZGVmaW5lIHRoYXQgd2FzIGJyZWFraW5nIHByZS0yLjcuICBDaGVja2VkIGluCiAgICAgICAgICAgIHBhdGNoIGZyb20gU29yZW4gU29ubmVuYnVyZyB0aGF0IGNyZWF0ZXMgc3RyaW5ncyBpbiAgCgkgICAgdmVyc2lvbiBpbmRlcGVuZGVudCB3YXkKCjA1LzE1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggdmFyaWFibGUgbmFtZSBjbGFzaCBpbiBkaXJlY3RvcnMgLSBTRiAjMTk2MzMxNiByZXBvcnRlZCBieSBUcmlzdGFuLgoKMDUvMTQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGFuIG9wdGltaXNhdGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYnkgdmFsdWUsIHJlZHVjaW5nCiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29waWVzIG9mIHRoZSBvYmplY3QgdGhhdCBhcmUgbWFkZS4gSW1wbGVtZW50ZWQgdXNpbmcgYW4KICAgICAgICAgICAgb3B0aW9uYWwgYXR0cmlidXRlIGluIHRoZSAib3V0IiB0eXBlbWFwIGNhbGxlZCAib3B0aW1hbCIuIERldGFpbHMgaW4gCiAgICAgICAgICAgIFR5cGVtYXBzLmh0bWwuCgowNS8xMS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gQ2hlY2sgZm9yICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIHdoZW4gZ2VuZXJhdGluZyBQSFA1IGNsYXNzCgkgICAgd3JhcHBlci4KCjA1LzExLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMTk0MzYwOCAtICRzZWxmIHN1YnN0aXR1dGlvbiBpbiAlY29udHJhY3QsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICAgICAgICBUb29uIFZlcnN0cmFlbGVuLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBjaGFyICogdHlwZW1hcHMgdG8gd29yayB3aGVuIGFwcGxpZWQgdG8gc2lnbmVkIGNoYXIgKiBhbmQKCSAgICB1bnNpZ25lZCBjaGFyICogKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcHBseV9zdHJpbmdzKS4KCjA1LzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjaGFyICogbWVtYmVyIHZhcmlhYmxlcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGJhZCBQSFAgY29kZSBnZW5lcmF0ZWQgd2hlbiB3cmFwcGluZyBhbiBlbnVtIGluIGEKCSAgICBuYW1lc3BhY2UgKHVuY292ZXJlZCBieSB0ZXN0Y2FzZSBhcnJheXNfc2NvcGUpLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIFNXSUcgbm93IHJ1bnMgdGhlIFBIUCB0ZXN0c3VpdGUgdXNpbmcgUEhQNSwgbm90IFBIUDQuICBQSFA0CgkgICAgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUgbm93LCBzbyB3ZSBjYXJlIG11Y2ggbW9yZSBhYm91dCBzb2xpZCBQSFA1CgkgICAgc3VwcG9ydC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFNUTCBmaXhlcyB3aGVuIHVzaW5nICVpbXBvcnQgcmF0aGVyIHRoYW4gJWluY2x1ZGUgYW5kIHRoZSBTb2xhcmlzIFdvcmtzaG9wCiAgICAgICAgICAgIGNvbXBpbGVyIGFuZCB0aGUgUm9ndWV3YXZlIFNUTC4KCjA1LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBvdmVybG9hZGVkIHByb3RlY3RlZCBtZXRob2RzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzAzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIENvbW1pdCBwYXRjaCAjMTk1NjYwNyB0byBhZGQgLU1UIHN1cHBvcnQgZnJvbSBSaWNoYXJkIEJvdWx0b24uCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWlycm9ycyB0aGUgZ2NjIC1NVCBvcHRpb24gd2hpY2ggYWxsb3dzIG9uZSB0byBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICAgICAgICAgTWFrZWZpbGUgdGFyZ2V0IGJlaW5nIGdlbmVyYXRlZCB3aGVuIGdlbmVyYXRpbmcgbWFrZWZpbGVzIHdpdGggdGhlIC1NIGZhbWlseQogICAgICAgICAgICBvZiBvcHRpb25zLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJCBzd2lnIC1qYXZhIC1NTSAtTVQgb3ZlcmlkZGVubmFtZSAtYysrICBleGFtcGxlLmkKICAgICAgICAgICAgICBvdmVyaWRkZW5uYW1lOiBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCjA0LzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgW0x1YV0gUmVtb3ZlZCBnZW5lcmF0aW9uIG9mIF93cmFwX2RlbGV0ZV9YWFhYWCAod3JhcHBlcmVkIGRlc3RydWN0b3IpCgkgICAgd2hpY2ggd2FzIHVudXNlZCBhbmQgY2F1c2luZyB3YXJuaW5nIHdpdGggZysrIC1XYWxsLgoJICAgIFJlbW92ZWQgb3RoZXIgdW51c2VkIHdhcm5pbmcgaW4gdHlwZW1hcHMuaSBhbmQgb3RoZXIgcGxhY2VzLgoJICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9lbWJlZDMsIGFuZCBydW4gdGVzdHMgYSBmZXcgdGVzdCBjYXNlcy4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIElCTSdzIEMrKyBjb21waWxlciBvbiBBSVggKHBhdGNoCgkgICAgZnJvbSBHb2VyYW4gVWRkZWJvcmcgaW4gU0YjMTkyODA0OCkuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgUmVuYW1lIEJTSVpFIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvYXJyYXlzX3Njb3BlLmkgdG8gQkJTSVpFIHRvCgkgICAgYXZvaWQgYSBjbGFzaCB3aXRoIEJTSVpFIGRlZmluZWQgYnkgaGVhZGVycyBvbiBBSVggd2l0aCBQZXJsCgkgICAgKHJlcG9ydGVkIGluIFNGIzE5MjgwNDgpLgoKMDQvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IHRvIHdyYXAgYWxsIHByb3RlY3RlZCBtZW1iZXJzIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgdGhlIHZpcnR1YWwgbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICBOb3cgYWxsIHByb3RlY3RlZCBtZW1iZXJzLCAoc3RhdGljIGFuZCBub24tc3RhdGljIHZhcmlhYmxlcywgbm9uLXZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICBhbmQgc3RhdGljIG1ldGhvZHMpIGFyZSB3cmFwcGVkIHdoZW4gdXNpbmcgdGhlIGFsbHByb3RlY3RlZCBtb2RlLiBUaGUgYWxscHJvdGVjdGVkCiAgICAgICAgICAgIG1vZGUgaXMgdHVybmVkIG9uIGluIHRoZSBtb2R1bGUgZGVjbGFyYXRpb246CgogICAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIiwgYWxscHJvdGVjdGVkPSIxIikgbW9kdWxlbmFtZQoKVmVyc2lvbiAxLjMuMzUgKDcgQXByaWwgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFkZCBtaXNzaW5nIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzCgowNC8wNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3RhY2sgb3ZlcmZsb3cgd2hlbiB1c2luZyB0eXBlbWFwIHdhcm5pbmcgc3VwcHJlc3Npb24sIGVnIAogICAgICAgICAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1RZUEVNQVBfQ0hBUkxFQUtfTVNHKQoKMDQvMDUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgc28gdGhhdCAlcHl0aG9ubm9uZHluYW1pYyBjYW4gYmUgdXNlZC4gQWxzbyBjb3JyZWN0cwogICAgICAgICAgICBkaXNwbGF5IG9mIHRoZSBwcm94eSBjbGFzcyB0eXBlLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDQvMDQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFkZCAlbmV3b2JqZWN0IHJlZmVyZW5jZSB0byBweXRob24gbWVtb3J5IG1hbmFnZW1lbnQgc3Vic2VjdGlvbiBvZiBtYW51YWwKCSAgICAocGF0Y2ggZnJvbSBtZGJlYWNoeSBpbiBTRiMxODk0NjEwKS4KCjAzLzI3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHdoZXJlIHRoZSBwb2ludGVyIHR5cGUgaXMgYSB0ZW1wbGF0ZWQgdHlwZSB3aXRoCiAgICAgICAgICAgIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowMy8yNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHR5cGVtYXAgRElTT1dOIGZvciBTV0lHVFlQRSogYW5kIFNXSUdUWVBFW10sIGFuZCBzdXBwb3J0IGZvciAlZGVsb2JqZWN0IGZlYXR1cmUuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9vd25lciB3aGljaCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE4NDQzMDEgZnJvbSBNb250eSBUYXlsb3IgdG8gc3VwcHJlc3MgZW51bSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB1bnVzZWQgd2FybmluZ3MuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNDUyNCBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggZW5zdXJlcyB0aGUKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHdoZW4gYXR0ZW1wdGluZyB0byBjYWxsIGEKICAgICAgICAgICAgY29uc3RydWN0b3Igb24gYSBjbGFzcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHdyYXBwZXIsIGVnIGlmCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgaXMgYWJzdHJhY3QuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNTcwMiBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggcmVtb3ZlcyB3YXJuaW5nIDUxMgogICAgICAgICAgICBmb3Igc3RkOjp2ZWN0b3Igd3JhcHBlcnMuCgowMy8yNi8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQXBwbHkgR0NDIDQuMyB3YXJuaW5ncyBwYXRjaCBmcm9tIFBoaWxpcHAgVGhvbWFzCgkgICAgKFNGIzE5MjUxMjIpLgoKMDMvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gVGhyZWFkIHNhZmV0eSBwYXRjaCBmb3IgU1RMIGl0ZXJhdG9ycyBmcm9tIEFiaGluYW5kYW4gSmFpbi4KCjAzLzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkICVsdWFjb2RlIGZlYXR1cmUgdG8gYWRkIHNvdXJjZSBjb2RlIGludG8gd3JhcHBlcnMuCiAgICAgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGlzLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvYXJyYXlzIHRvIHNob3cgaXRzIHVzZSAoYW5kIHR5cGVtYXBzKQoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBub25wb3J0YWJsZSBzZWQgdXNhZ2Ugd2hpY2ggZmFpbGVkIG9uIE1hYyBPUyBYIChhbmQgcHJvYmFibHkKCSAgICBvdGhlciBwbGF0Zm9ybXMpLiAgRml4ZXMgU0YjMTkwMzYxMi4KCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbWVtb3J5IGxlYWsgaW4gU1dJRydzIHBhcnNlciAoYmFzZWQgb24gcGF0Y2ggZnJvbSBSdXNzZWxsCgkgICAgQnJ5YW50IGluIFNGIzE5MTQwMjMpLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTg3ODI4NSAtIHVubmVjZXNzYXJ5IGNhc3QgZm9yIEMgc3RydWN0IGNyZWF0aW9uIHdyYXBwZXJzLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIGRlYnVnZ2luZyBpbmZvIHdoZW4gdXNpbmcgc2hhcmVkX3B0ciBzdXBwb3J0CgowMy8wNi8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGVkIGRvY3VtZW50YXRpb24gZm9yIEx1YSBleGNlcHRpb25zLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZXhjZXB0aW9uIGFuZCBFeGFtcGxlcy9sdWEvZW1iZWQyLgogICAgICAgICAgICBTbWFsbCB1cGRhdGVzIHRvIHRoZSB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQWRkIGNoYXIgKiYgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb2NjYXNpb25hbCBzZWcgZmF1bHQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlcG9ydCBvdmVybG9hZGVkIG1ldGhvZHMgYXMgYmVpbmcgaWdub3JlZC4KCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggIzE5MDQ1MzcgU3dpZyBjYXVzZXMgYSBQZXJsIHdhcm5pbmcgInggdXNlZCBvbmx5IG9uY2UiIGluIFBlcmwgNS4xMAogICAgICAgICAgICByZXBvcnRlZCBieSBBcmkgSm9sbWEKCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzaGFyZWRfcHRyIHZhcmluL3Zhcm91dCB0eXBlbWFwcyBmb3Igd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlcy4KCjAyLzI1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkd3JhcG5hbWUgdG8gd29yayBpbiAlZXhjZXB0aW9uIChmaXhlcyBzb21lIHdyYXA6bmFtZSBhc3NlcnRpb25zKQoKVmVyc2lvbiAxLjMuMzQgKDI3IEZlYnJ1YXJ5IDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZXMuCgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGZvciB1c2Ugd2l0aGluICVleGNlcHRpb246CiAgICAgICAgICAgICAgJHdyYXBuYW1lIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgd3JhcHBlciBuYW1lCiAgICAgICAgICAgICAgJG92ZXJuYW1lIC0gaWYgYSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIGNvbnRhaW5zIHRoZSBleHRyYSBtYW5nbGluZyB1c2VkIG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdmVybG9hZGVkIG1ldGhvZAogICAgICAgICAgICAgICRkZWNsICAgICAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICAgICAgJGZ1bGxkZWNsIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSByZXR1cm4gdHlwZQoKMDIvMTIvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIE5vdyBzZXR0aW5nIFM0IGZsYWcgaW4gU1dJRyBjcmVhdGVkIG9iamVjdHMuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIFItU1dJRyBmb3IgMi42IGFuZCB3YXJuaW5nIGZvciAyLjYgZmFpbHVyZSBoYXMgYmVlbiByZW1vdmVkLgoKMDIvMTEvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBwYXRjaCBieSBUb3JzdGVuIExhbmRzY2hvZmYgdG8gZml4IHRoZSB1bmFyeSBtaW51cyBpc3N1ZQogICAgICAgICAgICBSYW4gJ2FzdHlsZSAtLXN0eWxlPWtyIC0yJyBhY3Jvc3MgbHVhLmN4eCB0byBuZWF0ZW4gaXQgdXAKCjAyLzEwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1bXAgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gNC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIEFQSSAKICAgICAgICAgICAgY2hhbmdlIGluIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgaWUgY2hhbmdlIGluIGRlZmluaXRpb24gb2Ygc3dpZ19jb252ZXJ0ZXJfZnVuYy4KICAgICAgICAgICAgQW55b25lIGNhbGxpbmcgU1dJR19UeXBlQ2FzdCBtdXN0IHBhc3MgaW4gYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIG5ldyBhZGRpdGlvbmFsCiAgICAgICAgICAgICh0aGlyZCkgcGFyYW1ldGVyIGFuZCB0aGVuIGhhbmRsZSB0aGUgbmV3bHkgY3JlYXRlZCBtZW1vcnkgaWYgdGhlIHJldHVybmVkIHZhbHVlCiAgICAgICAgICAgIGlzIHNldCB0byBTV0lHX0NBU1RfTkVXX01FTU9SWSBlbHNlIGEgbWVtb3J5IGxlYWsgd2lsbCBlbnN1ZS4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkLiBVc2FnZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjZW50bHkKICAgICAgICAgICAgYWRkZWQgSmF2YSBhbmQgQyMgc2hhcmVkX3B0ciB0eXBlbWFwcy4gVHdvIG1hY3JvcyBhcmUgYXZhaWxhYmxlLCBhbHRob3VnaCB0aGVzZQogICAgICAgICAgICBtYXkgd2VsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKCiAgICAgICAgICAgIEZvciBiYXNlIGNsYXNzZXMgb3IgY2xhc3NlcyBub3QgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW46CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgIEZvciBkZXJpdmVkIGNsYXNzZXM6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKCiAgICAgICAgICAgIFRoZSBQUk9YWUNMQVNTIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm94eSBjbGFzcywgYnV0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIEphdmEvQyMuCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVpbmNsdWRlICJib29zdF9zaGFyZWRfcHRyLmkiCgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihLbGFzcywgU3BhY2U6OktsYXNzKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKEtsYXNzRGVyaXZlZCwgU3BhY2U6OktsYXNzLCBTcGFjZTo6S2xhc3NEZXJpdmVkKQoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3NEZXJpdmVkIDogS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGdXJ0aGVyIGRldGFpbHMgdG8gZm9sbG93IGluIGZ1dHVyZSBkb2N1bWVudGF0aW9uLCBidXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlcwogICAgICAgICAgICBzaG91bGQgYmUgbm90ZWQ6CgogICAgICAgICAgICAtIE5vdCByZXN0cmljdGVkIHRvIGJvb3N0OjpzaGFyZWRfcHRyLCBlZyBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZSB1c2VkLgogICAgICAgICAgICAtIEF2YWlsYWJsZSB0eXBlbWFwIGdyb3VwczoKICAgICAgICAgICAgICAoYSkgVHlwZW1hcHMgZm9yIHNoYXJlZF9wdHIgcGFzc2VkIGJ5IHZhbHVlLCByZWZlcmVuY2UsIHBvaW50ZXIgYW5kIHBvaW50ZXIgCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4KICAgICAgICAgICAgLSAoYikgVHlwZW1hcHMgZm9yIHBhc3NpbmcgYnkgcmF3IHZhbHVlLCByYXcgcG9pbnRlciwgcmF3IHJlZmVyZW5jZSwgcmF3IHBvaW50ZXIKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLiAKICAgICAgICAgICAgLSBUaGUgY29kZSBiZWluZyB3cmFwcGVkIGRvZXMgbm90IGV2ZW4gaGF2ZSB0byB1c2Ugc2hhcmVkX3B0ciwgU1dJRyBjYW4gdXNlCiAgICAgICAgICAgICAgc2hhcmVkX3B0ciBhcyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGEgcmF3IHBvaW50ZXIgZHVlIHRvIAogICAgICAgICAgICAgIHRoZSB0eXBlbWFwcyBpbiBncm91cCAoYikgYWJvdmUuCiAgICAgICAgICAgIC0gTm8gYXJyYXkgc3VwcG9ydCBhcyBzaGFyZWRfcHRyIGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzLgogICAgICAgICAgICAtIFRoaXMgd29ya3MgcXVpdGUgZGlmZmVyZW50bHkgdG8gdGhlIHVzdWFsIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IHdoZW4KICAgICAgICAgICAgICBvcGVyYXRvci0+IGlzIHBhcnNlZCBieSBTV0lHOgogICAgICAgICAgICAgIC0gQW4gYWRkaXRpb25hbCBzbWFydCBwb2ludGVyIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQgcmVkdWNpbmcgY29kZSBibG9hdCBpbgogICAgICAgICAgICAgICAgdGhlIHdyYXBwZXJzLgogICAgICAgICAgICAgIC0gVXNpbmcgc21hcnQgcG9pbnRlcnMgYW5kIHJhdyBwb2ludGVycyBjYW4gYmUgbWl4ZWQgc2VhbWxlc3NseS4KICAgICAgICAgICAgICAtIE1pc3NpbmcgY29uc3RydWN0b3JzIGZvciB0aGUgc21hcnQgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSBhbmQgc28KICAgICAgICAgICAgICAgIHNlcGFyYXRlIGZhY3RvcnkgdHlwZSBmdW5jdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUgd3JpdHRlbiBhbmQgd3JhcHBlZC4KICAgICAgICAgICAgICAtIFRoZSBpbXBsaWNpdCBDKysgc2hhcmVkX3B0cjwgZGVyaXZlZCBjbGFzcyA+IHRvIHNoYXJlZF9wdHI8IGJhc2UgY2xhc3MgPgogICAgICAgICAgICAgICAgY2FzdCBhbHNvIHdvcmtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgbmVnYXRlcyB0aGUgbmVjZXNzaXR5IHRvIHdyaXRlCiAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCBoZWxwZXIgY2FzdCBmdW5jdGlvbiBwcm92aWRpbmcgdGhlIHVwY2FzdCB3aGljaCB3b3VsZCBuZWVkCiAgICAgICAgICAgICAgICBjYWxsaW5nIHByaW9yIHRvIHBhc3NpbmcgYSBkZXJpdmVkIGNsYXNzIHRvIGEgbWV0aG9kIHRha2luZyBhIHNoYXJlZF9wdHIgdG8KICAgICAgICAgICAgICAgIGEgYmFzZSBjbGFzcy4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBjbGFzcyByZWdpc3RyYXRpb24gZnVuY3Rpb24gdmlhIGEgbmV3CiAgICAgICAgICAgICJzbWFydHB0ciIgZmVhdHVyZS4gVGhpcyBpcyBhIHZlcnkgbG93IGxldmVsIG9mIGN1c3RvbWlzYXRpb24gbW9zdCB1c2VycwogICAgICAgICAgICB3b3VsZCBuZXZlciBuZWVkIHRvIGtub3cuIFRoZSBmZWF0dXJlIHdpbGwgdHlwaWNhbGx5IGJlIHVzZWQgZm9yIGludHJ1c2l2ZSAKICAgICAgICAgICAgc21hcnQgcG9pbnRlcnMgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIHR5cGVtYXBzLiBFeGFtcGxlIHVzYWdlIG9mIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPTEpIEZvbyB7IGJvb3N0OjpzaGFyZWRfcHRyPCBGb28gPiB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBGb29fc3dpZ3JlZ2lzdGVyIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWdpc3RlciBib29zdDo6c2hhcmVkIDwgRm9vID4KICAgICAgICAgICAgKFNXSUdUWVBFX3BfYm9vc3RfX3NoYXJlZF9wdHJURm9vX3QgaW5zdGVhZCBvZiBTV0lHVFlQRV9wX0ZvbykgYXMgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgdHlwZSBmb3IgaW5zdGFudGlhdGlvbnMgb2YgRm9vLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRmVhdHVyZXMgbm93IHN1cHBvcnRzIHRoZSBvcHRpb25hbCAnbm9ibG9jaycgYXR0cmlidXRlIGZvciBhbGwgdXNhZ2Ugb2YgJWZlYXR1cmUuIAogICAgICAgICAgICBXaGVuIHNwZWNpZmllZCwgdGhlIHsgfSBicmFjZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZmVhdHVyZSBjb2RlLiBUaGlzIGlzIGlkZW50aWNhbAogICAgICAgICAgICBpbiBiZWhhdmlvdXIgdG8gdXNhZ2Ugb2YgJ25vYmxvY2snIGluIHR5cGVtYXBzIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByZXByb2Nlc3NvcgogICAgICAgICAgICBpcyByZXF1aXJlZCB0byBvcGVyYXRlIG9uIHRoZSBjb2RlIGluIHRoZSBmZWF0dXJlIGFuZCB0aGUgZW5jbG9zaW5nIHsgfSBicmFjZXMKICAgICAgICAgICAgYXJlIG5vdCByZXF1aXJlZC4gRXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBGT08gZm9vCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0iMSIpIHsgRk9POjpiYXIgfQoKICAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciB0aGVuIHJlZHVjZXMgdGhpcyBhcyBpZiB0aGlzIGhhZCBiZWVuIHVzZWQgaW5zdGVhZDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIikgImZvbzo6YmFyIgoKMDIvMDEvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBmb3JtYXQgc3RyaW5nIGJ1ZyAoU0YjMTg4MjIyMCkuCgowMS8zMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbnMgdG8gdGhlICV0eXBlcyBkaXJlY3RpdmUuIE5vdyB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBjYW4gYmUKICAgICAgICAgICAgb3ZlcnJpZGRlbiB0byBzb21lIGN1c3RvbSBjb2RlIGluIHRoZSAldHlwZXMgZGlyZWN0aXZlLCBsaWtlIHNvOgoKICAgICAgICAgICAgICAldHlwZXMoZnJvbXR5cGUgPSB0b3R5cGUpICV7CiAgICAgICAgICAgICAgICAuLi4gY29kZSB0byBjb252ZXJ0IGZyb210eXBlIHRvIHRvdHlwZSBhbmQgcmV0dXJuIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgc3BlY2lhbCB2YXJpYWJsZSAkZnJvbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgICAgIHR5cGUgYmVpbmcgY29udmVydGVkIGZyb20uIFRoZSBjb2RlIG11c3QgcmV0dXJuIHRoZSB0b3R5cGUgY2FzdCB0byB2b2lkICouIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFRpbWU7CiAgICAgICAgICAgICAgY2xhc3MgRGF0ZTsKICAgICAgICAgICAgICBEYXRlICZUaW1lOjpkYXRlRnJvbVRpbWUoKTsKCiAgICAgICAgICAgICAgJXR5cGVzKFRpbWUgPSBEYXRlKSAlewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopJGZyb207CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBsb29raW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICBzdGF0aWMgdm9pZCAqX3BfVGltZVRvX3BfRGF0ZSh2b2lkICp4KSB7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKil4OwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIHBsZWFzZSB1c2Ugb25seSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4KCjAxLzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgU21hbGwgdXBkYXRlIHRvIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbCwgdG8gd2FybiBhYm91dCB1c2Ugb2YgbG9jYWwgCgkgICAgdmFyaWFibGVzIGluIHR5cGVtYXBzIGZvciBtdWx0aXBsZSB0eXBlcy4KCjAxLzI1LzIwMDg6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCBidWcgcmVwb3J0ZWQgYnkgS2V2aW4gTWlsbHMgaW4gQVJSQVlTT0ZDTEFTU0VTIHR5cGVtYXBzIHdoZXJlIGFueQogICAgICAgICAgICBjaGFuZ2VzIG1hZGUgdG8gYW4gYXJyYXkgZWxlbWVudCBwYXNzZWQgZnJvbSBKYXZhIHRvIEMgYXJlIG5vdCByZWZsZWN0ZWQgYmFjawogICAgICAgICAgICBpbnRvIEphdmEuCgowMS8yNC8yMDA4OiBtZ29zc2FnZQoJICAgIE1vcmUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICBBbHNvIGxvb2tzIGluIC91c3IvaW5jbHVkZS9sdWEqCgkgICAgQWxzbyBjaGFuZ2VkIHR5cGVtYXBzLmkgbm90IHRvIGNoZWNrIGZvciBOVUxMIGJlZm9yZSBmcmVlaW5nIGEgcG9pbnRlcgoKMDEvMjEvMjAwODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGb3IgU1RMIGNvbnRhaW5lcnMsIFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIGNvbnZlcnQgZnJvbSBvbmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lciB0byBhbm90aGVyLCBlZyBmcm9tIHN0ZDo6dmVjdG9yPGludD4gdG8gc3RkOjp2ZWN0b3I8ZG91YmxlPgogICAgICAgICAgICBvciBzdGQ6Omxpc3Q8aW50PiB0byBzdGQ6OnZlY3RvcjxpbnQ+IG9yIGV2ZW4gc3RkOjp2ZWN0b3I8Rm9vPiB0bwogICAgICAgICAgICBzdGQ6OnZlY3RvcjxCYXI+IGFzIGl0IHByZXZpb3VzbHkgZGlkLiBJbiBmYWN0IFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvCiAgICAgICAgICAgIGNvbnZlcnQgYW55IFNXSUcgd3JhcHBlZCBDKysgcHJveHkgY2xhc3MgdGhhdCBpcyBhbHNvIGEgUHl0aG9uIHNlcXVlbmNlLAogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQuIEFueSBub24tU1dJRyBQeXRob24gc2VxdWVuY2Ugd2lsbCBzdGlsbCBiZQogICAgICAgICAgICBhY2NlcHRlZCB3aGVyZXZlciBhbiBTVEwgY29udGFpbmVyIGlzIGFjY2VwdGVkLiBPdmVybG9hZGVkIG1ldGhvZHMgdXNpbmcKICAgICAgICAgICAgY29udGFpbmVycyBzaG91bGQgYmUgZmFzdGVyLgoKMDEvMTgvMjAwODogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAnZGlyZWN0b3JpbmF0dHJpYnV0ZXMnIGFuZCAnZGlyZWN0b3JvdXRhdHRyaWJ1dGVzJyB0eXBlbWFwIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRoZSBpbXR5cGUgdHlwZW1hcC4gVGhlc2Ugc2hvdWxkIGNvbnRhaW4gQyMgYXR0cmlidXRlcyB3aGljaCB3aWxsCiAgICAgICAgICAgIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBDIyBkaXJlY3RvciBkZWxlZ2F0ZSBtZXRob2RzLgoKMDEvMTgvMjAwODogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBieXRlIHZhbHVlIDI1NSBpbiBpbnB1dCBmaWxlcyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBjaGFyIGlzIHNpZ25lZCAoaXQgd2FzIGdldHRpbmcgbWFwcGVkIHRvIEVPRikuICBGaXhlcyBTRiMxNTE4MjE5LgoKMDEvMTYvMjAwODogd3NmdWx0b24KCSAgICBGaXggdGVtcGxhdGUgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVkIGJ5IGEgc21hcnQgcG9pbnRlci4gQnVnIHJlcG9ydGVkIAogICAgICAgICAgICBieSBSb2JlcnQgTHVwdG9uLgoKMDEvMTQvMjAwODogbWdvc3NhZ2UKCSAgICBTdWJzdGFudGlhbCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgICBDb2RlIGNhbiBub3cgbGluayB0byBsaWJsdWEuYSwgbGlibHVhNTAuYSBvciBsaWJsdWE1MS5hCgkgICAgICBJdCdzIGFsc28gYSBsb3QgbmVhdGVyIG5vdy4KCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEJhY2tlZCBvdXQgIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICoKCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODMyNjEzIC0gVGVtcGxhdGVzIGFuZCBzb21lIHR5cGVkZWZzIGludm9sdmluZyBwb2ludGVycyBvciBmdW5jdGlvbiBwb2ludGVycwoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMxNjMyNjI1IC0gQ29tcGlsYXRpb24gZXJyb3JzIG9uIFZpc3VhbCBDKysgNiB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKi4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODE5ODQ3ICV0ZW1wbGF0ZSB3aXRoIGp1c3Qgb25lIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVyIAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gaW50PiBjbGFzcyBGb28gey4uLn07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0RlZmF1bHQpIEZvbzw+OwoKMTIvMTIvMjAwNzogbWdvc3NhZ2UKCSAgICBbTHVhXSBTbWFsbCBjb3JyZWN0aW9uIG9uIEx1YS5odG1sCgoxMi8wOS8yMDA3OiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMxODM4MjQ4IGZyb20gTW9udHkgVGF5bG9yIGZvciB2cGF0aCBidWlsZHMgb2YgU1dJRy4KCjEyLzA4LzIwMDc6IHdzZnVsdG9uCgkgICAgW0x1YV0gRml4ZXMgdG8gcmVtb3ZlIGdjYy00LjIgd2FybmluZ3MKCjEyLzA2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxNzM0NDE1IC0gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIHRfaXRlbSwgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIHRfYWxsb2MgPSBwZmM6OmFsbG9jX2Zhc3QgPgogICAgICAgICAgICAgICAgY2xhc3MgbGlzdF90IDogcHVibGljIGxpc3RfaW1wbF90PHRfaXRlbSxwZmM6OmFycmF5X3Q8dF9pdGVtLHRfYWxsb2M+ID4geyAuLi4gfTsKCjEyLzA0LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gRml4IGEgYnVnIGluIHRoZSBjbGFzcyBoaWVyYWNoeSBjb2RlLCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG5vdCBwcm9wYWdhdGVkLCAKCSAgICBpZiB0aGUgbmFtZSBvcmRlcmluZyB3YXMgaW4gYSBjZXJ0YWluIG9yZGVyLgoJICAgIEFkZGVkIG5ldyBleGFtcGxlIHByb2dyYW1zIChkdWFsLCBlbWJlZCkgYW5kIHJ1bnRpbWUgdGVzdHMgZm9yIHRlc3Qtc3VpdGUuCgoxMS8zMC8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCB1c2luZyBzdGF0ZW1lbnRzIHVzaW5nIGEgYmFzZSBjbGFzcyBtZXRob2Qgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBvdmVybG9hZGVkLgogICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZSB1c2luZyBzdGF0ZW1lbnRzIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zLCB0aGVzZQogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgZ2VuZXJhdGluZyB1bmNvbXBpbGVhYmxlIHdyYXBwZXJzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmdW5rKCk7CiAgICAgICAgICAgICAgICB1c2luZyBCYXNlOjpmdW5rOwogICAgICAgICAgICAgIH07CgpWZXJzaW9uIDEuMy4zMyAoTm92ZW1iZXIgMjMsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIxLzIwMDc6IG1pa2VsCgkgICAgW2FsbGVncm9jbF0gb21pdCBwcml2YXRlIHNsb3QgdHlwZSBpbmZvIGluIHRoZSBjbGFzc2VzL3R5cGVzCgkgICAgZGVmaW5lZCBvbiB0aGUgbGlzcCBzaWRlLiBGaXggYnVnIGluIG1hcHBpbmcgb2YgQy8rKyB0eXBlcwoJICAgIHRvIGxpc3AgdHlwZXMuIEZpeCB0eXBvIGluIG1vZHVsZXMgZ2VuZXJhdGVkIGRlZnBhY2thZ2UgZm9ybS4KCSAgICBIYXZlIHN0ZDo6c3RyaW5nIConcyBhdXRvbWF0aWNhbGx5IG1hcnNoYWxsZWQgYmV0d2VlbiBmb3JlaWduCgkgICAgYW5kIGxpc3Agc3RyaW5ncy4KCQoxMS8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRmlsbCBpbiBQeXRob24gRGljdGlvbmFyeSBmdW5jdGlvbnMgbGlzdCAocGF0Y2ggZnJvbQoJICAgIEplbG1lciBWZXJub29paiBwb3N0ZWQgdG8gc3dpZy1kZXZlbCkuCgoxMS8yMC8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBDIHNjYW5uZXIgcmVsYXRlZCB0byBiYWNrc2xhc2ggY2hhcmFjdGVycy4KCjExLzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBicm9rZW4gY29tcGlsYXRpb24gb2YgQysrIHdyYXBwZXJzIG9uIHNvbWUgY29tcGlsZXJzLgoKMTEvMTYvMjAwNzogb2xseQoJICAgIFtQeXRob25dIERvbid0IHBhc3MgUHlfc3NpemVfdCBmb3IgYSAlZCBwcmludGYtbGlrZSBmb3JtYXQgYXMKCSAgICB0aGF0J3MgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIHNpemVvZihQeV9zc2l6ZV90KSAhPSBzaXplb2YoaW50KS4KClZlcnNpb24gMS4zLjMyIChOb3ZlbWJlciAxNSwgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFBhY2thZ2UgbmFtZSBhbmQgZGxsIG5hbWUgaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICBuYW1lLiBJdCB1c2VkIHRvIGJlIHRoZSBtb2R1bGUgbmFtZSB3aXRoIF93cmFwIGFzIGEgc3VmZml4LiBUaGUgcGFja2FnZQogICAgICAgICAgICBhbmQgZGxsIG5hbWVzIGNhbiBiZSBtb2RpZmllZCB1c2luZyB0aGUgLXBhY2thZ2UgYW5kIC1kbGwgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMTEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFkZCBzdXBwb3J0IGZvciBXaW5kb3dzIChWaXN1YWwgQysrIDggdGVzdGVkKQoKMTEvMTAvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBtYWtlZmlsZSBnZW5lcmF0ZWQgYnkgLW1ha2UgKFNGIzE2MzM2NzkpLiAgVXBkYXRlCgkgICAgZG9jdW1lbnRhdGlvbiB0byBtYXJrICItbWFrZSIgYXMgZGVwcmVjYXRlZCAobm9uZSBvZiB0aGUgb3RoZXIKCSAgICBTV0lHIGJhY2tlbmRzIHNlZW0gdG8gb2ZmZXIgc3VjaCBhIGZlYXR1cmUsIGl0IGNhbid0IHJlYWxpc3RpY2FsbHkKCSAgICBnZW5lcmF0ZSBhIGZ1bGx5IHBvcnRhYmxlIG1ha2VmaWxlLCBhbmQgdGhlIGNvbW1hbmRzIHRvIGJ1aWxkIGFuCgkgICAgZXh0ZW5zaW9uIGFyZSBlYXN5IGVub3VnaCB0byB3cml0ZSBmb3IgdGhlIHVzZXIncyBwcmVmZXJyZWQgYnVpbGQKCSAgICB0b29sKS4gIEFsc28gcmVjb21tZW5kIGFnYWluc3QgdGhlIHVzZSBvZiAiLXBocGZ1bGwiIChpdCdzIG9ubHkKCSAgICByZWFsbHkgdXNlZnVsIHdoZW4gc3RhdGljIGxpbmtpbmcsIGFuZCBhIGR5bmFtaWNhbGx5IGxvYWRhYmxlCgkgICAgbW9kdWxlIGlzIHZpcnR1YWxseSBhbHdheXMgdGhlIGJldHRlciBhcHByb2FjaCkuCgoxMS8wOS8yMDA3OiBvbGx5CgkgICAgRml4IC0taGVscCBvdXRwdXQgdG8gbm90ZSB0aGF0IGBleHBvcnQgU1dJR19GRUFUVVJFUycgaXMgcmVxdWlyZWQuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHNlZyBmYXVsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIFtSXSBFeGFtcGxlcyBSIHNjcmlwdHMgYXJlIG5vdyBwbGF0Zm9ybSBpbmRlcGVuZGVudAoKMTAvMzAvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBmaXhlZCBidWcgaW4gdGVtcGxhdGUgY2xhc3NlcyB3aGljaCBjYXNlcyB0ZW1wbGF0ZV9kZWZhdWx0MgoJICAgIGFuZCB0ZW1wbGF0ZV9zcGVjaWFsaXphdGlvbl9kZWZhcmcgdG8gZmFpbC4KCSAgICBBZGRlZCBzZXZlcmFsIHdhcm5pbmcgZmlsdGVycyBpbnRvIHRoZSBvdmVybG9hZCdzIHRlc3QgY2FzZXMuCgkgICAgQWRkZWQgcnVudGltZSB0ZXN0cyBmb3Igc2V2ZXJhbCBjb2Rlcy4KCSAgICBZb3UgY2FuIG5vdyBtYWtlIGNoZWNrLWx1YS10ZXN0LXN1aXRlIHdpdGggbm8gZXJyb3JzIGFuZCBvbmx5IGEgZmV3IHdhcm5pbmdzLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBjb25maWd1cmUgdGVzdCB0byBwdXQgR1VJTEVMSU5LIGluIExJQlMgbm90IExERkxBR1MKCSAgICAoU0YjMTgyMjQzMCkuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGd1aWxlIGV4YW1wbGVzIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggc3dpZ19sdWFfY2xhc3MgaW5zdGFuY2VzIHRvIGJlIHN0YXRpYyB0byBhbGxvdyBtdWx0aXBsZQoJICAgIFNXSUcgd3JhcHBlcnMgdG8gYmUgY29tcGlsZWQgaW50byB0aGUgc2FtZSBleGVjdXRhYmxlIHN0YXRpY2FsbHkuCgkgICAgUGF0Y2ggZnJvbSBBbmRyZWFzIEZyZWRyaWtzc29uIChwb3N0ZWQgdG8gdGhlIHN3aWcgbWFpbGluZyBsaXN0KS4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggRXhhbXBsZXMvbHVhIHRvIHBhc3MgU1JDUyBmb3IgQyB0ZXN0cyByYXRoZXIgdGhhbiBDWFhTUkNTLgoJICAgIFRoZSBjb2RlIGFzIGl0IHdhcyBoYXBwZW5lZCB0byB3b3JrIG9uIHg4NiwgYnV0IGJyb2tlIG9uIHg4Nl82NCAoYW5kCgkgICAgcHJvYmFibHkgYW55IG90aGVyIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlIC1mUElDKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IGFwcHJvYWNoIGZvciBmaXhpbmcgdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvcgogICAgICAgICAgICBtZXRob2RzIHVzaW5nIHRoZSBuZXcgdGVtcGxhdGVkIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIFN3aWdWYWx1ZUluaXQoKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBVc2UgbW9yZSBlZmZpY2llbnQgU3ZQVl9ub2xlbih4KSBpbnN0ZWFkIG9mIFN2UFYoeCxQTF9uYSkgaWYgU3ZQVl9ub2xlbiBpcwogICAgICAgICAgICBzdXBwb3J0ZWQuCgoxMC8yNi8yMDA3OiB3dXp6ZWIKCSAgICBbQ2hpY2tlbl0gRml4IGdsb2JhbCB2YXJpYWJsZXMgb2YgY2xhc3MgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoJICAgIE90aGVyIG1pbm9yIGZpeGVzLCBzbyBhbGwgdGVzdHMgaW4gdGhlIGNoaWNrZW4gdGVzdCBzdWl0ZSBub3cgcGFzcwoKMTAvMjUvMjAwNzogb2xseQoJICAgIEZpeCBVVEwgdHlwZWNoZWNrIG1hY3JvIGZvciBhIGZ1bmN0aW9uIHRha2luZyBjaGFyW10gb3IgY29uc3QKCSAgICBjaGFyW10gKFNGIzE4MjAxMzIpLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZV0gRmlsdGVyIG91dCAtYW5zaSAtcGVkYW50aWMgZnJvbSBDRkxBR1Mgd2hpbGUgY29tcGlsaW5nIHRlc3QgcHJvZ3JhbXMgZm9yIEd1aWxlCgkgICAgaW4gY29uZmlndXJlLiAgVGhpcyBlbmFibGVzIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIEd1aWxlIGlmIGl0IGlzIGluc3RhbGxlZCBhbmQKCSAgICB1c2FibGUuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIEZpeCB0ZXN0Y2FzZXMgYXBwbHlfc2lnbmVkX2NoYXIgYW5kIGFwcGx5X3N0cmluZ3MKCSAgICBieSBhZGRpbmcgZXhwbGljaXQgY2FzdHMgdG8gdGhlIGFwcHJvcHJpYXRlICRsdHlwZS4KCjEwLzIyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQnVnICMxNzk0MjQ3IC0gZml4IGdlbmVyYXRlZCBjb2RlIGZvciBkZXJpdmVkIGNsYXNzZXMgd2hlbiBjc2Jhc2Ugb3IgamF2YWJhc2UKICAgICAgICAgICAgdHlwZW1hcHMgYXJlIHVzZWQgd2l0aCB0aGUgcmVwbGFjZT0iMSIgYXR0cmlidXRlLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRG9jcyB1cGRhdGVkIHRvIHN1Z2dlc3QgdXNpbmcgZGlzdHV0aWxzLiBQYXRjaCAjMTc5NjY4MSBmcm9tIENocmlzdG9waGVyIEJhcmtlci4KCjEwLzE5LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIENsZWFyIGVycm5vIGJlZm9yZSBjYWxscyB0byBzdHJ0b2woKSwgc3RydG91bCgpLCBzdHJ0b2xsKCkKCSAgICBhbmQgc3RydG91bGwoKSB3aGljaCB3ZSBjaGVjayBlcnJubyBhZnRlciB0byBhdm9pZCBzZWVpbmcgYSBqdW5rCgkgICAgdmFsdWUgb2YgZXJybm8gaWYgdGhlcmUgaXNuJ3QgYW4gZXJyb3IgaW4gdGhlIGNhbGwuCgoxMC8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgJWF0dHJpYnV0ZV9yZWYgYW5kIHJlcGxhY2Ugd2l0aCAlYXR0cmlidXRlcmVmLiBUaGVyZSBpcyBqdXN0IGFuIGFyZ3VtZW50CiAgICAgICAgICAgIG9yZGVyIGNoYW5nZSBpbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoICVhdHRyaWJ1dGUsIGZyb206CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBY2Nlc3Nvck1ldGhvZCwgQXR0cmlidXRlTmFtZSkKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICAlYXR0cmlidXRlcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBdHRyaWJ1dGVOYW1lLCBBY2Nlc3Nvck1ldGhvZCkKCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBGaXggc2V2ZXJhbCBvY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24KCSAgICBmcm9tIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrCgkgICAgY29kZS4KCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggbWFueSBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20KCSAgICBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKyBjb2RlCgkgICAgd2hlbiBjb21waWxpbmcgd2l0aCBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiBQSFAgNSAodGVzdGVkIHdpdGgKCSAgICBQSFAgNS4yLjMsIGJ1dCBQSFAgNS4yLjEgaXMgcHJvYmFibHkgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQpLgoKMTAvMTUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzE3OTcxMzMgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MgZml4ZXMgJWF0dHJpYnV0ZSB3aGVuIHRoZSBnZXR0ZXIgaGFzIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgYXMgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCBubyBsb25nZXIgZ2VuZXJhdGUgbm9uLWZ1bmN0aW9uYWwgc2V0dGVyIGZvciByZWFkLW9ubHkgYXR0cmlidXRlcy4KCjEwLzE1LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBQcmV2ZW50IFNXSUdfVGNsX0NvbnZlcnRQdHIgZnJvbSBjYWxsaW5nIHRoZSB1bmtub3duIHByb2MuCgkgICAgQWRkIEV4YW1wbGVzL3RjbC9zdGRfdmVjdG9yLyB3aGljaCB0aGlzIGNoYW5nZSBmaXhlcy4gIFBhdGNoCgkgICAgaXMgZnJvbSAiQ2xpZmYgQyIgaW4gU0YjMTgwOTgxOS4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgRGV0YWNoQ3VycmVudFRocmVhZCBiYWNrIGluIGZvciBkaXJlY3RvcnMuIFNlZSBlbnRyeSBkYXRlZCAwOC8xMS8yMDA2IGFuZAogICAgICAgICAgICBzZWFyY2ggZm9yIERldGFjaEN1cnJlbnRUaHJlYWQgb24gdGhlIG1haWxpbmcgbGlzdHMgZm9yIGRldGFpbHMuIFRoZSBjcmFzaGVzIG9uIFNvbGFyaXMKICAgICAgICAgICAgc2VlbSB0byBiZSBvbmx5IHByZXNlbnQgaW4gamRrLTEuNC4yIGFuZCBsb3dlciAoamRrLTEuNS4wIGFuZCBqZGstMS42LjAgYXJlIG9rYXkpLCBzbwogICAgICAgICAgICBhbnlvbmUgdXNpbmcgZGlyZWN0b3JzIHNob3VsZCB1c2UgYSByZWNlbnQgamRrIG9uIFNvbGFyaXMsIG9yIGRlZmluZSAoc2VlIGRpcmVjdG9yLnN3ZykKICAgICAgICAgICAgU1dJR19KQVZBX05PX0RFVEFDSF9DVVJSRU5UX1RIUkVBRCB0byB0aGUgQysrIGNvbXBpbGVyIHRvIGdldCBvbGQgYmVoYXZpb3VyLgoKMTAvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIEMgY29tbWVudHMgaW4gdGhlIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMuCgoxMC8xMi8yMDA3OiB3dXp6ZWIKCSAgICBBZGRlZCBhIHRlc3RzdWl0ZSBlbnRyeSBmb3IgQnVnICMxNzM1OTMxCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQXV0b21hdGljYWxseSByZXJ1biBhdXRvZ2VuLnNoIGlmIGNvbmZpZ3VyZS5pbiBpcyBtb2RpZmllZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBFbmhhbmNlIGNoZWNrLSUtdGVzdC1zdWl0ZSBydWxlIGFuZCBmcmllbmRzIHRvIGdpdmUgYSBtb3JlIGhlbHBmdWwKCSAgICBlcnJvciBtZXNzYWdlIGlmIHlvdSB0cnkgdGhlbSBmb3IgYSBsYW5ndWFnZSB3aGljaCBkb2Vzbid0IGV4aXN0CgkgICAgKGUuZy4gIm1ha2UgY2hlY2stcGhwLXRlc3Qtc3VpdGUiIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CgkgICAgIm1ha2UgY2hlY2stcGhwNC10ZXN0LXN1aXRlIikuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQWRkIG1ha2UgcnVsZSB0byByZWdlbmVyYXRlIE1ha2VmaWxlIGZyb20gTWFrZWZpbGUuaW4gaWYgaXQgaGFzCgkgICAgY2hhbmdlZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbG9uZy1zdGFuZGluZyBtZW1vcnkgbGVhayBpbiB3cmFwcGVkIGNvbnN0cnVjdG9ycyBhbmQKCSAgICB3cmFwcGVkIGZ1bmN0aW9ucy9tZXRob2RzIHdoaWNoIHJldHVybiBhbiBvYmplY3QuCgoxMC8wOC8yMDA3OiBvbGx5CgkgICAgRml4IE1ha2VmaWxlLmluIHRvIHJlYWQgY2hlY2subGlzdCBmaWxlcyBjb3JyZWN0bHkgaW4gYSBWUEFUSAoJICAgIGJ1aWxkLgoKMTAvMDcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZAoKMDkvMjcvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBhZGRlZCBtb3JlIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCB0eXBlY2hlY2tzLgoJICAgIEFkZGVkIGEgcm91dGluZSB3aGljaCBjaGVja3MgdGhlIGV4YWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBhIGZ1bmN0aW9uCgkgICAgKGJyZWFrcyBvcGVyYXRvcl9vdmVybG9hZGluZyBmb3IgdW5hcnkgbWludXMgb3BlcmF0b3IsIGN1cnJlbnRseSBkaXNhYmxlZCkuCgkgICAgUmVvcmdhbmlzZWQgdGhlIGx1YXR5cGVtYXBzLnN3ZyB0byB0aWR5IGl0IHVwLgoJICAgIEFkZGVkIGEgbG90IG9mICVpZ25vcmVzIG9uIHRoZSBvcGVyYXRvcnMgbm90IHN1cHBvcnRlZCBieSBsdWEuCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgY29uc3RhbnQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzICYgcnVudGVzdCBmb3IgbWVtYmVyX3BvaW50ZXIuaQoJICAgIEFkZGVkIGZpcnN0IHZlcnNpb24gb2Ygd2NoYXIuaQoKMDkvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSB0aHJvd3MgdHlwZW1hcHMgZm9yIHN0ZDo6d3N0cmluZyB1c2luZyBDIyBwYXRjaCAjMTc5OTA2NCBmcm9tIERhdmlkIFBpZXBncmFzcwoKMDkvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgIzE3NzEzMTMgdG8gZml4IGJ1ZyAjMTY1MDIyOSAtIGZpeGVzIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nCiAgICAgICAgICAgIGhhbmRsaW5nLgoKMDkvMjAvMjAwNzogb2xseQoJICAgIFtKYXZhXSBFbGltaW5hdGUgc29tZSB1bm5lY2Vzc2FyeSB1c2VzIG9mIGEgdGVtcG9yYXJ5IGJ1ZmZlcgoJICAgIGFsbG9jYXRlZCB1c2luZyBuZXdbXS4gIFNGIzE3OTY2MDkuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIGNhbiBiZSB1c2VkIGluIHRoZSBjc3ZhcmluIHR5cGVtYXAgd2hlcmUgaXQgaXMgYWx3YXlzCiAgICAgICAgICAgIGV4cGFuZGVkIHRvICd2YWx1ZScuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBidWcgcmVwb3J0ZWQgYnkgR2xlbm4gQSBXYXRzb24gYW5kICMxNzk1MjYwIHdoZXJlIHRoZSBjc3R5cGUgdHlwZW1hcCB1c2VkIHRoZSAncmVmJwogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSB0eXBlbWFwIGJvZHksIGl0IHByb2R1Y2VkIHVuY29tcGlsYWJsZSBDIyBwcm9wZXJ0aWVzICh2YXJpYWJsZSB3cmFwcGVycykuCiAgICAgICAgICAgIFRoZSB0eXBlIGZvciB0aGUgcHJvcGVydHkgbm93IGNvcnJlY3RseSBjb21lcyBmcm9tIHRoZSAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGNzdHlwZSB0eXBlbWFwLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBjb25zdCBzdGQ6OndzdHJpbmcmIHR5cGVtYXBzCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgcmVmZXJlbmNlLCBlZyBpbiB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZSBwZ2NwcAogICAgICAgICAgICBpcyBhbHNvIGdlbmVyYXRlZCBub3cgd2hlbiB1c2VyJ3MgY3VzdG9tIHR5cGVtYXBzIHVzZSBhIHByb3h5IGNsYXNzIGluIHRoZSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhbmQgYSAnbG9uZycgaW4gdGhlIGp0eXBlIHR5cGVtYXAuCgowOS8xOC8yMDA3OiBvbGx5CgkgICAgW3BocF0gQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBwYXJhbWV0ZXJzIG9mIHR5cGUgc3RkOjpzdHJpbmcgJgoJICAgIHdoaWNoIGFyZSBtb2RpZmllZCBieSB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTcGxpdCBwb3RlbnRpYWxseSBsb25nIHN0cmluZyBsaXRlcmFscyB0byBhdm9pZCBoaXR0aW5nCgkgICAgTVNWQydzIGxvdyBmaXhlZCBsaW1pdCBvbiBzdHJpbmcgbGl0ZXJhbCBsZW5ndGggLSBwYXRjaCBmcm9tCgkgICAgU0YjMTcyMzc3MCwgYWxzbyByZXBvcnRlZCBhcyBTRiMxNjMwODU1LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtvY2FtbF0gRml4IHJlbmFtaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcyBpbiB0aGUgbWV0aG9kX3RhYmxlIC0KCSAgICBteSBwYXRjaCBmcm9tIFNGIzk0MDM5OS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTaW1wbGVyIGNvZGUgZm9yIFNXSUdfQXNWYWxfYm9vbCgpIHdoaWNoIGZpeGVzIGEgInN0cmljdAoJICAgIGFsaWFzaW5nIiB3YXJuaW5nIGZyb20gR0NDIC0gcGF0Y2ggZnJvbSBTRiMxNzI0NTgxIGJ5IEFuZHJldwoJICAgIEJhdW1hbm4uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBVc2Ugc3Zfc2V0cHZuKCkgdG8gc2V0IGEgc2NhbGFyIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGgKCSAgICAtIHBhdGNoIGZyb20gU0YjMTc0NDYwIGJ5ICJtYXRzdWJhcmF5Ii4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBXaGVuIHdyYXBwaW5nIEMrKyBjb2RlLCBnZW5lcmF0ZSBjb2RlIHdoaWNoIHVzZXMKCSAgICBzdGQ6OnN0cmluZzo6YXNzaWduKFBUUiwgTEVOKSByYXRoZXIgdGhhbiBhc3NpZ25pbmcKCSAgICBzdGQ6OnN0cmluZyhQVFIsIExFTikuICBVc2luZyBhc3NpZ24gZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUKCSAgICAodGVzdGVkIHdpdGggR0NDIDQuMS4yKS4KCjA5LzA3LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICVpZ25vcmUgb24gY29uc3RydWN0b3JzIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBkZWNsYXJlZCBbU0YgIzE3Nzc3MTJdCgowOS8wNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICAtIENoYW5nZSByX2x0eXBlIGluIHR5cGVzeXMuYyB0byBzdG9yZSBhIGhhc2h0YWJsZSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHZhbHVlLgoJICAgICAgc2V2ZXJhbCB2ZXJ5IHN1YnRsZSBidWdzIHdlcmUgYmVpbmcgY2F1c2VkIGJ5IG11bHRpcGxlIGx0eXBlcyBiZWluZyBtYXBwZWQKCSAgICAgIHRvIGEgc2luZ2xlIG1hbmdsZWQgdHlwZSwgbW9zdGx5IHdoZW4gdXNpbmcgdHlwZWRlZmVkIHRlbXBsYXRlIHBhcmFtZXRlcnMuCgkgICAgICBOb3csIHJfbHR5cGUgc3RvcmVzIGEgaGFzaHRhYmxlIG9mIHBvc3NpYmxlIGx0eXBlcywgYW5kIHdoZW4gZ2VuZXJhdGluZyB0aGUKCSAgICAgIHR5cGUgdGFibGUsIGFsbCB0aGUgbHR5cGVzIGFyZSBhZGRlZCBpbnRvIHRoZSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUuCgowOC8zMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTc1NDk2NyBmcm9tIEphbWVzIEJpZ2xlci4KICAgICAgICAgICAgLSBGaXggYnVnIGluIHR1cm5pbmcgb24gd2FybmluZ3MgdGhhdCB3ZXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gRWcgJ3N3aWcgLXcrMzA5JyB3aWxsIG5vdwogICAgICAgICAgICAgIHR1cm4gb24gdGhlIG5vcm1hbGx5IHN1cHByZXNzZWQgd2FybmluZyAzMDkuCgogICAgICAgICAgICAtIE5ldyAtV2V4dHJhIGNvbW1hbmRsaW5lIG9wdGlvbiB3aGljaCBlbmFibGVzIHRoZSBleHRyYSB3YXJuaW5nIG51bWJlcnM6CiAgICAgICAgICAgICAgMjAyLDMwOSw0MDMsNTEyLDMyMSwzMjIgKHRoaXMgaXMgdGhlIGxpc3Qgb2Ygd2FybmluZ3MgdGhhdCBoYXZlIGFsd2F5cyBiZWVuIHN1cHByZXNzZWQgYnkKICAgICAgICAgICAgICBkZWZhdWx0KS4gQnkgc3BlY2lmeWluZyAtV2V4dHJhLCBhbGwgd2FybmluZ3Mgd2lsbCBiZSB0dXJuZWQgb24sIGJ1dCB1bmxpa2UgLVdhbGwsCiAgICAgICAgICAgICAgd2FybmluZ3MgY2FuIHN0aWxsIGJlIHNlbGVjdGl2ZWx5IHR1cm5lZCBvbi9vZmYgdXNpbmcgJXdhcm5maWx0ZXIsCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2FybiBvciBmdXJ0aGVyIC13IGNvbW1hbmRsaW5lIG9wdGlvbnMsIGVnOgogICAgICAgICAgICAgICAgc3dpZyAtV2V4dHJhIC13MzA5CiAgICAgICAgICAgICAgd2lsbCB0dXJuIG9uIGFsbCB3YXJuaW5ncyBleGNlcHQgMzA5LgoKMDgvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgLSBOZXcgZGVidWdnaW5nIG9wdGlvbnMsIC1kZWJ1Zy1tb2R1bGUgPG4+IGFuZCAtZGVidWctdG9wIDxuPiB0byBkaXNwbGF5IHRoZSBwYXJzZSB0cmVlIGF0CiAgICAgICAgICAgICAgdmFyaW91cyBzdGFnZXMsIHdoZXJlIDxuPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN0YWdlcyAxLTQuRm9yIGV4YW1wbGUsIHRvCiAgICAgICAgICAgICAgZGlzcGxheSB0b3Agb2YgcGFyc2UgdHJlZSBhdCBzdGFnZXMgMSBhbmQgMzoKICAgICAgICAgICAgICAgIHN3aWcgLWRlYnVnLXRvcCAxLDMKCiAgICAgICAgICAgIC0gRGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3aGljaCBoYXZlIGVxdWl2YWxlbnRzIGJlbG93OgogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX21vZHVsZSAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgMQogICAgICAgICAgICAgIC1kdW1wX21vZHVsZSAgICAgICAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgNAogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX3RvcCAgICAgICA9PiAgIC1kZWJ1Zy10b3AgMQogICAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAgICAgICA9PiAgIC1kZWJ1Zy10b3AgNAoKICAgICAgICAgICAgLSBSZW5hbWVkIHNvbWUgY29tbWFuZGxpbmUgb3B0aW9ucyBmb3IgbmFtaW5nIGNvbnNpc3RlbmN5IGFjcm9zcyBhbGwgb3B0aW9uczoKICAgICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgID0+ICAgLWRlYnVnLXRlbXBsYXRlCiAgICAgICAgICAgICAgLWRlYnVnX3R5cGVtYXAgICA9PiAgIC1kZWJ1Zy10eXBlbWFwCiAgICAgICAgICAgICAgLWR1bXBfY2xhc3NlcyAgICA9PiAgIC1kZWJ1Zy1jbGFzc2VzCiAgICAgICAgICAgICAgLWR1bXBfdGFncyAgICAgICA9PiAgIC1kZWJ1Zy10YWdzCiAgICAgICAgICAgICAgLWR1bXBfdHlwZWRlZiAgICA9PiAgIC1kZWJ1Zy10eXBlZGVmCiAgICAgICAgICAgICAgLWR1bXBfbWVtb3J5ICAgICA9PiAgIC1kZWJ1Zy1tZW1vcnkKCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhhbmRsaW5nIG9mIGRvdWJsZSBvciBmbG9hdCBwYXJhbWV0ZXJzIHdpdGggYW4gaW50ZWdlcgoJICAgIGRlZmF1bHQgdmFsdWUuCgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEdlbmVyYXRlIF9faXNzZXQoKSBtZXRob2RzIGZvciBzZXR0ZXJzIGZvciBQSFAgNS4xIGFuZCBsYXRlci4KCjA4LzIwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggZGlyZWN0b3IgYnVnICMxNzc2NjUxIHJlcG9ydGVkIGJ5IFN0ZXBoYW5lIFJvdXRlbG91cyB3aGljaCBvY2N1cnJlZCB3aGVuCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBvZiBzb21lIG90aGVyIHN5bWJvbHMgdXNlZCB3aXRoaW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzLgoKMDgvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgQ29ycmVjdCBiZWhhdmlvdXIgZm9yIHRlbXBsYXRlZCBtZXRob2RzIHVzZWQgd2l0aCAlcmVuYW1lIG9yICVpZ25vcmUgYW5kIHRoZSBlbXB0eQogICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiAtICV0ZW1wbGF0ZSgpLiBBIHdhcm5pbmcgaXMgaXNzdWVkIGlmIHRoZSBtZXRob2QgaGFzIG5vdCBiZWVuCiAgICAgICAgICAgIHJlbmFtZWQuCgowOC8xNi8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTmFtZSBnZW5lcmF0ZWQgY2wgZmlsZSBiYXNlZCBvbiBpbnB1dCBmaWxlIHJhdGhlciB0aGFuIGJ5CgkgICAgbW9kdWxlIG5hbWUuIEl0IHdhcyBwb3NzaWJsZSB0byBlbmQgdXAgd2l0aCBhIG15cGFja2FnZS5jbCBhbmQgYSB0ZXN0X3dyYXAuYwoJICAgIHdoZW4gcGFyc2luZyBhIHRlc3QuaSBpbnB1dCBmaWxlLiBDb25mdXNpbmcuIEFsc28sIGluY2x1ZGUgZXh0ZXJuYWwtZm9ybWF0CgkgICAgdGVtcGxhdGVzIGZvciA6ZmF0IGFuZCA6ZmF0LWxlIGF1dG9tYXRpY2FsbHkgdG8gYXZvaWQgdGhlc2UgYmVpbmcgY29tcGlsZWQKCSAgICBhdCBydW50aW1lLgoKMDgvMTUvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBBcHBseSBwYXRjaCAjMTc2NjA3NiBmcm9tIExlaWdoIFNtaXRoIGFkZGluZyBzdXBwb3J0IGZvciBuZXdseSBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIGNmZmkgOmxvbmctbG9uZyBhbmQgOnVuc2lnbmVkLWxvbmctbG9uZy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgZG9jdW1lbnRhdGlvbiBwYXRjaCAjMTc0MzU3MyBmcm9tIEplZmZyZXkgU29yZW5zZW4uIEl0IGNvbnRhaW5zIGEgbmVhdAogICAgICAgICAgICBpZGVhIHdpdGggcmVzcGVjdCB0byBiZXR0ZXIgbWVtb3J5IG1hbmFnZW1lbnQgYnkgdGhlIEpWTSBvZiBDKysgYWxsb2NhdGVkIG1lbW9yeS4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBseSBwYXRjaCAjMTc3MTQxMCBmcm9tIFdhZGUgQnJhaW5lcmQgdG8gZml4IHR5cGVkZWYgWFMoU3dpZ1BlcmxXcmFwcGVyKSBpbgogICAgICAgICAgICBwZXJscnVuLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybCBidWlsZCA4MjIgYW5kIFBlcmwgNS44LjkgYW5kIDUuMTAgYnJhbmNoZXMuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBjb25zdCBlbnVtIHJlZmVyZW5jZSB0eXBlbWFwcyBmaXhlZC4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBDKysgY2xhc3MgbWVtYmVyIHBvaW50ZXJzLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgc3VwcG9ydCBmb3IgJG93bmVyIGluIHRoZSAib3V0IiB0eXBlbWFwcyBsaWtlIGluIHRoZSB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuIE5vdGUgdGhhdCAkb3duZXIgaGFzIGFsd2F5cyBiZWVuIHN1cHBvcnRlZCBpbiB0aGUgImphdmFvdXQiIC8gImNzb3V0IgogICAgICAgICAgICB0eXBlbWFwcy4KCjA4LzAxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzbWFydCBwb2ludGVyIGhhbmRsaW5nIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSB0ZW1wbGF0ZWQgbWV0aG9kcyB3aXRoaW4gdGhlIHNtYXJ0CiAgICAgICAgICAgIHBvaW50ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBjcmFpZ2RvIGF0IGVlLndhc2hpbmd0b24uZWR1LgoKMDcvMzEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBmaXhlZCBtZW1vcnkgYWNjZXNzIGFmdGVyIGJlaW5nIGZyZWVkIGJ1Zy4gdGhhbmtzIHRvIE1hcnRpbiBQZXJjb3NzaS4KICAgICAgICAgICAgcGFja2FnZSBuYW1lIGNsb3MgY2hhbmdlZCB0byBjbC4gdGhhbmtzIHRvIFJhbGYgTWF0dGVzCgowNy8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXJhbGxlbCBtYWtlIHN1cHBvcnQgYWRkZWQgZm9yIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSBmb3IgZGV2ZWxvcGVycyB3aG8gaGF2ZQogICAgICAgICAgICBtb3JlIHRoYW4gb25lIENQVS4gTm93IHBhcmFsbGVsIG1ha2UgY2FuIGJlIHVzZWQgZm9yIGNoZWNraW5nIGluIGFkZGl0aW9uIHRvIGJ1aWxkaW5nCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUuIFNvbWUgdHlwaWNhbCBjaGVja2luZyBleGFtcGxlczoKCiAgICAgICAgICAgICAgbWFrZSAtajggLWsgY2hlY2sKICAgICAgICAgICAgICBtYWtlIC1qNCBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIC1qMiBjaGVjay1qYXZhLWV4YW1wbGVzCgowNy8xOS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBGaXhlZCBidWcgdGhhdCBzdG9wcGVkIGNvbmZpZ3VyZSB3b3JraW5nIG9uIG1pbmd3IChhcHBsaWVkIGRvczJ1bml4IHRvIGNvbmZpZ3VyZS5pbikKCjA3LzEwLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEV4dHJhIGNvbXBhdGliaWxpdHkgd2l0aCBMdWEgNS4xICh1cGRhdGVkIFNXSUdfaW5pdCwgZG9jcywgZXhhbXBsZXMsIHRlc3Qgc3VpdGUpCgkgICAgUmVtb3ZlZCBuYW1lIGNsYXNoIGZvciBzdGF0aWMgbGluayBvZiBtdWx0aXBsZSBtb2R1bGVzCgowNy8wNS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBGaXggYSBidWcgaW4gU1dJR19BTExPQ19BUlJBWSgpCiAgICAgICAgICAgIGltcHJvdmVkIHRoZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IGFyZ3VtZW50cy4KICAgICAgICAgICAgQ2hhbmdlZCB0aGUgb3V0cHV0IG9mIHN3aWdfdHlwZSgpIHRvIHVzZSB0aGUgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGUgdHlwZSwKCSAgICByYXRoZXIgdGhhbiB0aGUgcmF3IHN3aWcgdHlwZS4KCjA3LzAzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9ycyBmb3Igc29tZSBvdmVybG9hZGVkIG1ldGhvZHMgd2hlcmUgdGhlIGltdHlwZSByZXN1bHRlZCBpbiBpZGVudGljYWwKICAgICAgICAgICAgbWV0aG9kcyBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIEMjIGRpcmVjdG9yIGNsYXNzLCBlZyB2b2lkIGZvbyhpbnQgKikgYW5kIHZvaWQgZm9vKGRvdWJsZSAqKQogICAgICAgICAgICB1c2VkIHRvIGdlbmVyYXRlZCB0d28gb2YgdGhlc2U6CgogICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBTd2lnRGlyZWN0b3Jmb28oSW50UHRyIHApIHsgLi4uIH0KCjA2LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBwYXJhbWV0ZXIgbmFtZSBjaGFuZ2VzIGluIHN0ZF92ZWN0b3IuaSBhbGxvd2luZyBiZXR0ZXIgdGFyZ2V0aW5nCiAgICAgICAgICAgIG9mIHR5cGVtYXBzIGZvciBtZXRob2QgcGFyYW1ldGVycyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50IG9mIGNvbnRhaW5lcnMgb2YgcG9pbnRlcnMpLgoKMDYvMDcvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IGZvcmVpZ24tdHlwZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBsb29rIGZvciBmZml0eXBlIHR5cGVtYXAKCSAgICBiaW5kaW5ncy4gZml4IGlub3V0X3R5cGVtYXBzLmkgZm9yIHN0cmluZ3MuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1J1YnldCgkgICAgVXNlIHdoaWNoZXZlciBvZiAibG9uZyIgb3IgImxvbmcgbG9uZyIgaXMgdGhlIHNhbWUgc2l6ZSBhcyAidm9pZCoiCgkgICAgdG8gaG9sZCBwb2ludGVycyBhcyBpbnRlZ2VycywgcmF0aGVyIHRoYW4gd2hpY2hldmVyIG1hdGNoZXMgb2ZmX3QuCgkgICAgRml4ZXMgY29tcGlsYXRpb24gb24gT1MgWCBhbmQgR0NDIHdhcm5pbmdzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIHNpemVvZih2b2lkKikgPCBzaXplb2Yob2ZmX3QpIChTRiBwYXRjaCAjMTczMTk3OSkuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IGhhbmRsaW5nIG9mIGEgcGFydGljdWxhciBjYXNlIGludm9sdmluZyBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLgoKMDYvMDUvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGNhc2Ugd2hlcmUgd2UnZCBwYXNzIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVycwoJICAgIChpLmUuIE5TMTo6TlMyOjpGT08pIHRvIHN3aWctaW5zZXJ0LWlkLiBBbGwgbmFtZXNwYWNlcwoJICAgIHNob3VsZCBiZSBzdHJpcHBlZC4KCgkgICAgRml4IGJ1ZyBpbiBUeXBlZGVmSGFuZGxlciBpbnRyb2R1Y2VkIGJ5IGxhc3QgZml4LgoKMDYvMDUvMjAwNzogb2xseQoJICAgIEZpeCByZXBvcnRpbmcgb2YgZmlsZW5hbWVzIGluIGVycm9ycyBhZnRlciAlaW5jbHVkZSAocGF0Y2ggZnJvbQoJICAgIExlaWdoIFNtaXRoIGluICMxNzMxMDQwOyBhbHNvIHJlcG9ydGVkIGFzICMxNjk5OTQwKS4KCjA1LzMxLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCAibWlzc2luZyBpbml0aWFsaXNlciIgd2FybmluZyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGNvZGUgd2l0aCBQeXRob24gMi41IHdpdGggd2FybmluZ3MgZW5hYmxlZCAocGF0Y2ggZnJvbQoJICAgIGJ1ZyMxNzI3NjY4IGZyb20gTHVrZSBNb29yZSkuCgowNS8yOS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBTcGxpdCBkb2NzdHJpbmdzIGludG8gc2VwYXJhdGUgc3RyaW5nIGxpdGVyYWxzIGF0IGVhY2ggbmV3bGluZSB3aGVuCgkgICAgZ2VuZXJhdGluZyBDL0MrKyB3cmFwcGVyIGNvZGUgKHRoZSBDL0MrKyBjb21waWxlciB3aWxsIGp1c3QgY29tYmluZQoJICAgIHRoZW0gYmFjayBpbnRvIGEgc2luZ2xlIHN0cmluZyBsaXRlcmFsKS4gIFRoaXMgYXZvaWRzIE1TVkMKCSAgICBjb21wbGFpbmluZyB0aGF0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyAocHJvYmxlbSByZXBvcnRlZCBieQoJICAgIEJvIFBlbmcgb24gdGhlIG1haWxpbmcgbGlzdCkuCgowNS8yOC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBFc2NhcGUgYmFja3NsYXNoZXMgaW4gZG9jc3RyaW5ncy4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCBhdXRvZG9jIGdlbmVyYXRpb24gb2YgZW51bXMgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggaG93IHRoZQoJICAgIGVudW1zIGFyZSB3cmFwcGVkIC0gcGF0Y2ggIzE2OTcyMjYgZnJvbSBKb3NoIENoZXJyeS4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggd3JhcHBpbmcgb2YgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBhIHBvaW50ZXIgdG8gYQoJICAgIGNsYXNzIChidWcjMTcwMDc4OCkgYW5kIHRob3NlIHdoaWNoIGhhdmUgb3ZlcmxvYWRlZCBmb3JtcyByZXR1cm5pbmcKCSAgICBib3RoIGNsYXNzZXMgYW5kIG5vbi1jbGFzc2VzIChidWcjMTcxMjcxNywgdGhhbmtzIHRvIFNpbW9uCgkgICAgQmVydGhpYXVtZSBmb3IgdGhlIHBhdGNoKS4KCjA1LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICVyZW5hbWUgaW5jb25zaXN0ZW5jeSBpbiBjb252ZXJzaW9uIG9wZXJhdG9ycyBhcyByZXBvcnRlZCBieSBaaG9uZyBSZW4uIFRoZSBtYXRjaGluZwogICAgICAgICAgICBpcyBub3cgZG9uZSBvbiB0aGUgb3BlcmF0b3IgbmFtZSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgaXMgZG9uZSBmb3IgcGFyYW1ldGVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIEFCQygpIGNvbnN0OwogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoQUJDIGEpIGNvbnN0OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBBQkMgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoQUJDIGEpIGNvbnN0IHt9CiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgQUJDKCkgY29uc3QgeyBBQkMgYTsgcmV0dXJuIGE7IH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZSB0aGF0IHF1YWxpZnlpbmcgdGhlIGNvbnZlcnNpb24gb3BlcmF0b3IgcHJldmlvdXNseSBtYXkgb3IgbWF5IG5vdCBoYXZlIG1hdGNoZWQuCiAgICAgICAgICAgIE5vdyBpdCBkZWZpbml0ZWx5IHdvbid0LCBzbyB0aGlzIHdpbGwgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBTcGFjZTo6QUJDKCkgY29uc3Q7CgogICAgICAgICAgICBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGlzIGRvZXMgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKFNwYWNlOjpBQkMgYSkgY29uc3Q7CgogICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCB3aXRoIHJlc3BlY3QgdG8gJXJlbmFtZSwgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzLgogICAgICAgICAgICBDb252ZXJzaW9uIG9wZXJhdG9ycyBkb2N1bWVudGF0aW9uIHRvby4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDUvMTYvMjAwNzogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBiYWQgZ2VuZXJhdGlvbiBvZiBsb2NhbCB2YXIgbHR5cGUncyBpbiBmdW5jdGlvbldyYXBwZXIoKS4KCSAgICBUcnkgdG8gd29yayBiZXR0ZXIgd2l0aCB0aGUgYmFja3dhcmQgb3JkZXIgaW4gd2hpY2ggc3dpZwoJICAgIHVucm9sbHMgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zLgoJICAgIGNsZWFuZWQgdXAgYSBsaXR0bGUgdW5uZWNlc3NhcnkgY29kZS9kZWJ1ZyBwcmludGYncy4KCSAgICBSZW1vdmUgd2FybmluZyB3aGVuIHJlcGxhY2luZyAkbGRlc3RydWN0b3IgZm9yIGZmOmZvcmVpZ24tcG9pbnRlcgoKMDUvMTIvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgc3dpZyAtcHl0aG9uIC10aHJlYWRzIG5vdyBnZW5lcmF0ZXMgQy9DKysgY29kZSB3aGljaCB1c2VzIFB5dGhvbidzCgkgICAgb3duIHRocmVhZGluZyBhYnN0cmFjdGlvbiAoZnJvbSBweXRocmVhZC5oKSByYXRoZXIgdGhhbiBPUyBzcGVjaWZpYwoJICAgIGNvZGUuICBUaGUgb2xkIGNvZGUgZmFpbGVkIHRvIGNvbXBpbGUgb24gTVMgV2luZG93cy4gIChTZWUgU0YgcGF0Y2gKCSAgICB0cmFja2VyICMxNzEwMzQxKS4KCjA1LzA0LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgU1RMIHJlbmFtZXMgdG8gYmUgZ2xvYmFsIHJlbmFtZXMuICBUaGlzIGZpeGVzCgkgICAgU1RMIGZ1bmN0aW9ucyBub3QgYmVpbmcgcmVuYW1lZCB3aGVuIGF1dG9yZW5hbWUgaXMgb24uCiAgICAgICAgICAgIFRoaXMgaXMgYSBub3QgYSB0b3RhbGx5IHBlcmZlY3Qgd29yay1hcm91bmQsIGJ1dCBiZXR0ZXIuCgkgICAgU29tZW9uZSByZWFsbHkgbmVlZHMgdG8gZml4IHRoZSB0ZW1wbGF0ZSByZW5hbWluZyBjb2RlLgoJICAgIChTZWUgYnVnICMxNTQ1NjM0KQoKMDUvMDQvMjAwNyAgZ2dhCgkgICAgW0FsbF0KICAgICAgICAgICAgQ2hhbmdlZCAlcmVuYW1lKCIlKHVuZGVyY2FzZSlzIikgYSBsaXR0bGUgc28gdGhhdCBzaW5nbGUKCSAgICBudW1iZXJzIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgbm90IHVuZGVyY2FzZWQuICBUaGF0IGlzOgoJCWdldFNvbWV0aGluZyAtPiBnZXRfc29tZXRoaW5nCgkJZ2V0MkQJICAgICAtPiBnZXRfMmQKCQlnZXQyMzQJICAgICAtPiBnZXRfMjM0CgkgICAgQlVUOgoJCWFzRmxvYXQyICAgICAtPiBhc19mbG9hdDIKCSAgICAoQnVnICMxNjk5NzE0KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBfX3N3aWd0eXBlX18gPT4gQF9fc3dpZ3R5cGVfXyBzbyBpdCBjYW4gYmUgYWNjZXNzZWQKCSAgICBmcm9tIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGFuZCBmb2xsb3dzIFJ1YnkncyBvZmZpY2lhbAogICAgICAgICAgICBkb2N1bWVudGF0aW9uLCBqdXN0IGluIGNhc2UpLgoJICAgIE1hZGUgdHJhY2tpbmcgPT4gQF9fdHJhY2tpbmdzX18gZm9yIHNhbWUgcmVhc29uLgoJICAgIEN1cnJlbnRseSBzdG9yaW5nIGl2YXJzIHdpdGhvdXQgdGhlIEAgc2VlbXMgdmFsaWQsIGJ1dAoJICAgIHRoZSBQaWNrQXhlIHNheXMgdGhpcyBpcyBub3QgY29ycmVjdCwgc28ganVzdCBpbiBjYXNlLi4uCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBcHBsaWVkIHBhdGNoIGZvciAtbWluaGVyaXQgYnVnIGFuZCBleGNlcHRpb24gY2xhc3Nlcy4KCSAgICBUaGlzIGlzc3VlIHNob3VsZCBiZSByZXZpc2l0ZWQgbW9yZSBjbG9zZWx5LCBhcyBNdWx0aXBsZQoJICAgIEluaGVyaXRhbmNlIGluIFJ1YnkgaXMgc3RpbGwgcHJvYmxlbWF0aWMuCgkgICAgKHBhdGNoL2J1ZyAjMTYwNDg3OCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zIGluIHJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRvIHRoZSB1c2VyCiAgICAgICAgICAgIHRoZSBwb3NzaWJsZSBwcm90b3R5cGVzIHdoZW4gdGhlIHVzZXIgbWlzdHlwZXMgdGhlIG51bWJlciBvcgogICAgICAgICAgICB0eXBlIG9mIGEgcGFyYW1ldGVyLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRm9yZ290IHRvIGRvY3VtZW50IHRoZSBidWcgZml4aW5nIG9mIGFuIG9sZCBidWcgcmVnYXJkaW5nCgkgICAgZXhjZXB0aW9ucy4KCSAgICAoYnVnICMxNDU4MjQ3KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgUnVieSBkb2N1bWVudGF0aW9uIHRvIHVzZSB0aGUgcHJvcGVyIGNzcyBzdHlsZXMgZm9yCgkgICAgZWFjaCBzZWN0aW9uLiBBZGRlZCBhdXRvZG9jIHNlY3Rpb24gdG8gUnVieSdzIGRvY3MgdG8KCSAgICBkb2N1bWVudCB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IFJ1YnkgaW4gZG9jdW1lbnRpbmcgaXRzIG1vZHVsZXMuCgkgICAgTWFkZSByZG9jIGRvY3VtZW50YXRpb24gc3BpdCBvdXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKwoJICAgIG1ldGhvZCBuYW1lLiAgQWxiZWl0IHRoaXMgd2lsbCBtYWtlIHRoZSBjdXJyZW50IHJkb2Mgbm90IHJlY29nbml6ZQogICAgICAgICAgICB0aGUgbWV0aG9kLCB0aGlzIGlzIHN0aWxsIG5lZWRlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBkaWZmZXJlbnQKICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHNpbWlsYXIgbWV0aG9kcyAocmRvYyB3YXMgY3JlYXRlZCB0byBkb2N1bWVudCB0aGUKCSAgICBydWJ5IHNvdXJjZSB3aGljaCBvbmx5IGNvbnRhaW5zIG9uZSBjbGFzcyBwZXIgYyBmaWxlLCB1bmxpa2Ugc3dpZykKICAgICAgICAgICAgSSBoYXZlIHBhdGNoZWQgcmRvYyB0byBtYWtlIGl0IG1vcmUgZnJpZW5kbHkgdG8gc3dpZy4gIFRoaXMKICAgICAgICAgICAgcGF0Y2ggbmVlZHMgdG8gYmUgbWVyZ2VkIGluIHRoZSBydWJ5IHN0ZCBsaWJyYXJ5IG5vdy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgZmxhZyAtZmVhdHVyZSB0byBiZSAtaW5pdF9uYW1lIHRvIGJldHRlciByZWZsZWN0IGl0cwoJICAgIHB1cnBvc2UgYW5kIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIC1mZWF0dXJlcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIGF1dG9kb2MgZ2VuZXJhdGlvbi4KCSAgICBBZGRlZCBhdXRvZG9jIC5zd2cgZmlsZXMgdG8gUnVieSBsaWJyYXJ5IGZvciBlYXNpbHkgYWRkaW5nCgkgICAgZG9jdW1lbnRhdGlvbiB0byBjb21tb24gUnVieSBtZXRob2RzIGFuZCBTVEwgbWV0aG9kcy4KCSAgICBGaXhlZCBhdXRvZG9jIGRvY3VtZW50aW5nIG9mIGdldHRlcnMgYW5kIHNldHRlcnMgYW5kIG1vZHVsZS4KCSAgICBNYWRlIHRlc3Qgc3VpdGUgYWx3YXlzIGdlbmVyYXRlIGF1dG9kb2NzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCBzb21lIHdhcm5pbmdzIGZyb20gU1RMIGFuZCB0ZXN0IHN1aXRlLgoKMDUvMDIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgaXNzdWVzIHdpdGggQysrIGNsYXNzZXMgYW5kIGhpZXJhY2hpZXMgYWNyb3NzIG11bHRpcGxlCgkgICAgc291cmNlIGZpbGVzLiBGaXhlZCBpbXBvcnRzIHRlc3QgY2FzZSAmIGFkZGVkIHJ1biB0ZXN0LgoJICAgIEFkZGVkIEV4YW1wbGVzL2ltcG9ydHMuCgkgICAgQWRkZWQgdHlwZW5hbWUgZm9yIHJhdyBsdWFfU3RhdGUqCgkgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBvbiBuYXRpdmUgZnVuY3Rpb25zLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRG9jc3RyaW5ncyBhcmUgbm93IHN1cHBvcnRlZC4KCSAgICAlZmVhdHVyZSgiYXV0b2RvYyIpIGFuZCAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdwoJICAgIHByb3Blcmx5IHN1cHBvcnRlZCBpbiBSdWJ5LiAgVGhlc2UgZmVhdHVyZXMgd2lsbCBnZW5lcmF0ZQoJICAgIGEgX3dyYXAuY3h4IGZpbGUgd2l0aCByZG9jIGNvbW1lbnRzIGluIHRoZW0uCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBTVEwgZmlsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIGZvbGxvdyB0aGUgbmV3IHN3aWcvcHl0aG9uCgkgICAgTGliL3N0ZCBjb252ZW50aW9ucy4KCSAgICBUaGlzIG1lYW5zIHN0ZDo6dmVjdG9yLCBzdGQ6OnNldCwgc3RkOjptYXAsIHNldDo6bXVsdGltYXAsCgkgICAgc3RkOjptdWx0aXNldCwgc3RkOjpkZXF1ZSBhbmQgc3RkOjpzdHJpbmcgYXJlIG5vdyBwcm9wZXJseQoJICAgIHN1cHBvcnRlZCwgaW5jbHVkaW5nIHRoZWlyIGl0ZXJhdG9ycywgc3VwcG9ydCBmb3IgY29udGFpbmluZwoJICAgIHJ1Ynkgb2JqZWN0cyAoc3dpZzo6R0NfVkFMVUUpIGFuZCBzZXZlcmFsIG90aGVyIHJ1YnkKCSAgICBlbmhhbmNlbWVudHMuCgkgICAgc3RkOjpjb21wbGV4LCBzdGQ6Omlvcywgc3RkOjppb3N0cmVhbSwgc3RkOjppb3N0cmVhbWJ1ZiBhbmQKCSAgICBzdGQ6OnNzdHJlYW0gYXJlIG5vdyBhbHNvIHN1cHBvcnRlZC4KCSAgICBzdGQ6OndzdHJpbmcsIHN0ZDo6d2lvcywgc3RkOjp3aW9zdHJlYW0sIHN0ZDo6d2lvc3RyZWFtYnVmCgkgICAgYW5kIHN0ZDo6d3NzdHJlYW0gYXJlIHN1cHBvcnRlZCB2ZXJiYXRpbSB3aXRoIG5vIHVuaWNvZGUKCSAgICBjb252ZXJzaW9uLgoKCSAgICBzdGRfdmVjdG9yLmkgbm93IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgUnVieSBBcnJheXMgbXVjaCBtb3JlCgkgICAgY2xvc2VseSwgc3VwcG9ydGluZyBzbGljaW5nLCBzaGlmdGluZywgdW5zaGlmdGluZywKICAgICAgICAgICAgbXVsdGlwbGUgaW5kZXhpbmcgYW5kIHByb3BlciByZXR1cm4gdmFsdWVzIG9uIGFzc2lnbm1lbnQuCgoJICAgIENPTVBBVEFCSUxJVFkgTk9URTogdGhpcyBjaGFuZ2VzIHRoZSBvbGRlciBhcGkgYSBsaXR0bGUgYml0IGluCgkgICAgdGhhdCBpbXByb3BlciBpbmRleGluZyB3b3VsZCBwcmV2aW91c2x5IChpbmNvcnJlY3RseSkgcmFpc2UKCSAgICBleGNlcHRpb25zLiAgTm93LCBuaWwgaXMgcmV0dXJuZWQgaW5zdGVhZCwgZm9sbG93aW5nIHJ1YnkncwoJICAgIHN0YW5kYXJkIEFycmF5IGJlaGF2aW9yLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCB0aGUgdmFsdWUgb2YgU1dJR19UWVBFQ0hFQ0tfQk9PTCB0byBiZSAxMDAwMCAoaWUuIGhpZ2hlcgoJICAgIHRoYW4gdGhhdCBvZiBhbGwgaW50ZWdlcnMpLgoJICAgIFRoaXMgaXMgYmVjYXVzZSBSdWJ5IGFsbG93cyB0eXBlY2FzdGluZwoJICAgIGludGVnZXJzIGRvd24gdG8gYm9vbGVhbnMgd2hpY2ggY2FuIG1ha2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgb24KCSAgICBib29scyBhbmQgaW50ZWdlcnMgdG8gZmFpbC4KCSAgICAoYnVnIyAxNDg4MTQyKQoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgYSBzdWJ0bGUgYnVnIGluIG11bHRpcGxlIGFyZ291dHMgdGhhdCBjb3VsZCBnZXQgdHJpZ2dlcmVkIGlmCgkgICAgdGhlIHVzZXIgcmV0dXJuZWQgdHdvIG9yIG1vcmUgYXJndW1lbnRzIGFuZCB0aGUgZmlyc3Qgb25lIHdhcyBhbgoJICAgIGFycmF5LgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhlIG5ldyBmZWF0dXJlcwogICAgICAgICAgICBhZGRlZCwgYWRkIGRpcmVjdG9yaW4vb3V0L2FyZ291dCB0eXBlbWFwcywgZXRjLgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQWRkZWQgJWluaXRzdGFjayBhbmQgJWlnbm9yZXN0YWNrIGRpcmVjdGl2ZXMgZm9yIGRpcmVjdG9yCgkgICAgZnVuY3Rpb25zLiAgVGhlc2UgYWxsb3cgeW91IHRvIGNvbnRyb2wgd2hldGhlciBhIGRpcmVjdG9yCgkgICAgZnVuY3Rpb24gc2hvdWxkIHJlLWluaXQgdGhlIFJ1Ynkgc3RhY2suCgkgICAgVGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGZvciBhbiBlbWJlZGRlZCBSdWJ5IHdoZXJlIHRoZQoJICAgIGRpcmVjdG9yIG1ldGhvZCBpcyB1c2VkIGFzIGEgQysrIGNhbGxiYWNrIGFuZCBub3QgY2FsbGVkCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyIGZyb20gcnVieSBjb2RlLgoJICAgIEV4cGxhbmF0aW9uOgoJICAgIFJ1YnkncyBHQyBuZWVkcyB0byBiZSBhd2FyZSBvZiB0aGUgcnVubmluZyBPUyBzdGFjayBpbiBvcmRlciB0bwoJICAgIG1hcmsgYW55IFZBTFVFIChSdWJ5IG9iamVjdHMpIGl0IGZpbmRzIHRoZXJlIHRvIGF2b2lkIGNvbGxlY3Rpb24KCSAgICBvZiB0aGVtLiAgVGhpcyBhbGxvd3MgdGhlIHJ1YnkgQVBJIHRvIGJlIHZlcnkgc2ltcGxlIGFuZCBhbGxvd3MKCSAgICB5b3UgdG8gd3JpdGUgY29kZSBsaWtlICJWQUxVRSBhID0gc3RoIiBhbnl3aGVyZSB3aXRob3V0IG5lZWRpbmcKCSAgICB0byBkbyB0aGluZ3MgbGlrZSByZWZjb3VudGluZyBsaWtlIHB5dGhvbi4KCSAgICBCeSBkZWZhdWx0LCB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrIGlzIHNldCB3aGVuIHJ1YnlfaW5pdCgpIGlzCgkgICAgY2FsbGVkLiAgIElmIHJ1YnkgaXMgaW5pdGVkIHdpdGhpbiBtYWluKCksIGFzIGl0IHVzdWFsbHkgaXMgdGhlCgkgICAgY2FzZSB3aXRoIHRoZSBtYWluIHJ1YnkgZXhlY3V0YWJsZSwgcnVieSB3aWxsIGJlIGFibGUgdG8gY2FsY3VsYXRlCgkgICAgaXRzIHN0YWNrIHByb3Blcmx5LiAgSG93ZXZlciwgd2hlbiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYXMgd2hlbgoJICAgIHJ1YnkgaXMgZW1iZWRkZWQgYXMgYSBwbHVnaW4gdG8gYW4gYXBwbGljYXRpb24gd2hlcmUgbWFpbiBpcyBub3QKCSAgICBhdmFpbGFibGUsIHJ1YnlfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZSwgYW5kCgkgICAgcnVieSB3aWxsIGJlIGluY29ycmVjdGx5IHRyYWNraW5nIHRoZSBzdGFjayBmcm9tIHRoZSBmdW5jdGlvbgoJICAgIHRoYXQgY2FsbGVkIHJ1YnlfaW5pdCgpIGZvcndhcmRzIG9ubHksIHdoaWNoIGNhbiBsZWFkIHRvCgkgICAgYWxsIHNvcnRzIG9mIHdlaXJkIGNyYXNoZXMgb3IgdG8gcnVieSB0aGlua2luZyBpdCBoYXMgcnVuIG91dCBvZgoJICAgIHN0YWNrIHNwYWNlIGluY29ycmVjdGx5LgoJICAgIFRvIGF2b2lkIHRoaXMsIGRpcmVjdG9yIChjYWxsYmFjaykgZnVuY3Rpb25zIGNhbiBub3cgYmUgdGFnZ2VkCgkgICAgdG8gdHJ5IHRvIHJlc2V0IHRoZSBydWJ5IHN0YWNrLCB3aGljaCB3aWxsIHNvbHZlIHRoZSBpc3N1ZXMuCgkgICAgTk9URTogcnVieTEuOC42IHN0aWxsIGNvbnRhaW5zIGEgYnVnIGluIGl0IGluIHRoYXQgaXRzIGZ1bmN0aW9uCgkgICAgdG8gcmVzZXQgdGhlIHN0YWNrIHdpbGwgbm90IGFsd2F5cyBkbyBzby4gIFRoaXMgYnVnIGlzIHRyaWdnZXJlZAoJICAgIHZlcnkgcmFyZWx5LCB3aGVuIHJ1YnkgaXMgY2FsbGVkIGZyb20gdHdvIHZlcnkgZGlzdGluY3QgcGxhY2VzCgkgICAgaW4gbWVtb3J5LCBsaWtlIGEgYnJhbmNoIG9mIG1haW4oKSBhbmQgYW5vdGhlciBkc28uICBUaGlzIGJ1ZwoJICAgIGhhcyBub3cgYmVlbiByZXBvcnRlZCB0byBydWJ5LWNvcmUgYW5kIGlzIHBlbmRpbmcgZnVydGhlcgoJICAgIGludmVzdGlnYXRpb24uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8zMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE3MDc1ODIgLSBSZXN0b3JlIGJ1aWxkaW5nIGZyb20gcmVhZC1vbmx5IHNvdXJjZSBkaXJlY3Rvcmllcy4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRoZSBwYXJhbWV0ZXIgaW5kZXggcHJvcGVybHkgb24gdHlwZQoJICAgIGVycm9ycyBhcyB3ZWxsIGFzIHRoZSBjbGFzcyBhbmQgdmFsdWUgb2YgdGhlIGluY29ycmVjdAoJICAgIGFyZ3VtZW50IHBhc3NlZC4KCSAgICAoZmVhdHVyZSByZXF1ZXN0ICMxNjk5NjcwKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSBubyBsb25nZXIgY3JlYXRlcyB0aGUgZnJlZV9DbGFzcyBmdW5jdGlvbiBpZiB0aGUgY2xhc3MKCSAgICBjb250YWlucyBpdHMgb3duIHVzZXIgZGVmaW5lZCBmcmVlIGZ1bmN0aW9uICglZnJlZWZ1bmMpLgoJICAgIChidWcgIzE3MDI4ODIpCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIGRpcmVjdG9ycyByYWlzZSBhIHJ1YnkgZXhjZXB0aW9uIGZvciBpbmNvcnJlY3QgYXJnb3V0CgkgICAgcmV0dXJuZWQgdmFsdWVzIGlmIFJVQllfRU1CRURERUQgaXMgc2V0LCBpbnN0ZWFkIG9mIHRocm93aW5nCgkgICAgYW4gYWN0dWFsIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgkgICAgVGhpcyB3aWxsIHByZXZlbnQgY3Jhc2hlcyB3aGVuIHJ1YnkgaXMgZW1iZWRkZWQgYW5kIHVuYXdhcmUKCSAgICBvZiB0aGUgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgdGhlIG5lZWQgZm9yIC1EU1dJR0VYVEVSTi4KCSAgICBDaGFuZ2VkIHN3aWdfcnVieV90cmFja2luZ3MgdG8gYmUgYSBzdGF0aWMgdmFyaWFibGUsIGJ1dCBhbHNvCgkgICAgYmUga2VwdCB3aXRoaW4gYSBoaWRkZW4gaW5zdGFuY2UgdmFyaWFibGUgaW4gdGhlIFNXSUcgbW9kdWxlLgoJICAgIFRoaXMgYWxsb3dzIHByb3Blcmx5IGRlYWxpbmcgd2l0aCB0cmFja2luZ3MgYWNyb3NzIG11bHRpcGxlCgkgICAgRFNPcywgd2hpY2ggd2FzIHByZXZpb3VzbHkgYnJva2VuLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIGltcHJvdmVtZW50IHRvIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldIEZpeGVkIEdDIG1lbW9yeSBpc3N1ZXMgd2l0aCB0cmFja2luZ3MgdGhhdCBjb3VsZCBsZWFkCgkgICAgdG8gc2VnZmF1bHRzIHdoZW4gZGVhbGluZywgbWFpbmx5LCB3aXRoIHN0YXRpYyB2YXJpYWJsZXMuCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBTdHJpbmcgY29udmVyc2lvbiB1c2luZyBvbGQgcnVieTEuNiBtYWNyb3MuICBOb3cKCSAgICBTdHJpbmdWYWx1ZVB0cigpIGlzIHVzZWQgaWYgYXZhaWxhYmxlLiAgVGhpcyByZW1vdmVzIHdhcm5pbmdzCgkgICAgd2hlbiBjb252ZXJ0aW5nIHN0cmluZ3Mgd2l0aCBcMCBpbiB0aGVtLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgdGhlIGFyZ291dCBjb3VudCBpbiBkaXJlY3RvcnMgZm9yIFJ1YnkuICBQcmV2aW91c2x5LAoJICAgIGlnbm9yZWQgb3IgIm51bWlucHV0cz0wIiB0eXBlbWFwcyB3b3VsZCBpbmNvcnJlY3RseSBub3QgZ2V0CgkgICAgY291bnRlZCB0b3dhcmRzIHRoZSBhcmdvdXQgY291bnQuCgkgICAgKGJ1Zy9wYXRjaCAjMTU0NTU4NSkKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFVwZ3JhZGVkIFJ1YnkgY29udmVydGVyIHRvIHJlY29nbml6ZSAibnVtaW5wdXRzPTAiLiAgUHJldmlvdXNseSwKCSAgICBvbmx5IHRoZSBvbGQgImlnbm9yZSIgZmxhZyB3YXMgY2hlY2tlZCAod2hpY2ggd291bGQgY3VycmVudGx5CgkgICAgc3RpbGwgd29yayBwcm9wZXJseSwgYnV0IGlzIGRlcHJlY2F0ZWQpLgoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnkgLSBidXQgc2hvdWxkIGJlIG1hZGUgZ2VuZXJpY10KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgYWRkZWQuCgoJICAgIFRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGlnbm9yZSB0aGUgb3V0cHV0IG9mIGEgZnVuY3Rpb24gc28KCSAgICB0aGF0IGl0IGlzIG5vdCBhZGRlZCB0byBhIGxpc3Qgb2Ygb3V0cHV0IHZhbHVlcwoJICAgICggaWUuIGFyZ291dHMgKS4KCSAgICBUaGlzIHNob3VsZCBhbHNvIGJlY29tZSBhIGZlYXR1cmUgb2YgJXR5cGVtYXAoZGlyZWN0b3JvdXQpCgkgICAgYXMgIm51bW91dHB1dHMiPTAsIGp1c3QgbGlrZSAibnVtaW5wdXRzIj0wIGV4aXN0cy4KCgkgICAgJWZlYXR1cmUoImRpcmVjdG9ycyI9MSkKCgkgICAgJWluY2x1ZGUgPHR5cGVtYXBzLmk+CgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIHsgQ2xhc3M6Om1lbWJlcl9mdW5jdGlvbjEgfTsKCSAgICAldHlwZW1hcChvdXQpIE1TdGF0dXMgeyAvLyBzb21lIGNvZGUsIGxpa2UgY2hlY2sgbXN0YXR1cwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByYWlzZSBleGNlcHRpb24gaWYgd3JvbmcgfTsKCgkgICAgJWlubGluZSAlewoJICAgICAgdHlwZWRlZiBpbnQgTVN0YXR1czsKCSAgICAgIGNsYXNzIENsYXNzIHsKCgkgICAgICAvLyBvbmUgYXJndW1lbnQgcmV0dXJuZWQsIGJ1dCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBkaXNjYXJkZWQgYXMgYSByZXR1cm4gKG91dCkgcGFyYW1ldGVyLgoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjEoIGludCYgT1VUUFVUICk7CgoJICAgICAgLy8gdHdvIGFyZ3VtZW50cyByZXR1cm5lZCwgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgbm90IGRpc2NhcmRlZAoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjIoIGludCYgT1VUUFVUICk7CgkgICAgICB9OwogICAgICAgICAgICAlfQoKCjA0LzIxLzIwMDc6IG9sbHkKCSAgICBGaXggcGFyc2luZyBvZiBmbG9hdCBjb25zdGFudHMgd2l0aCBhbiBleHBvbmVudCAoZS5nLiAxZS0wMmYpCgkgICAgKGJ1ZyAjMTY5OTY0NikuCgowNC8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGxhY2sgb2YgZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIHdoZW4gLU8gaXMgdXNlZC4KCSAgICBBbHNvLCBmaXggZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIGNvbnRhaW5pbmcgYSBkb3VibGUgcXVvdGUKCSAgICBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBidWcjMTcwMDE0Ni4KCjA0LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU3VwcG9ydCBmb3IgYWRkaW5nIGluIEphdmEvQyMgY29kZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnRlcm1lZGlhcnkgY2FsbCwKICAgICAgICAgICAgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdGhlIG1hcnNoYWxsaW5nIG9mIHRoZSBwcm94eSB0eXBlIHRvIHRoZSBpbnRlcm1lZGlhcnkgdHlwZS4KICAgICAgICAgICAgVGhlIGphdmFpbi9jc2luIHR5cGVtYXAgbm93IHN1cHBvcnRzIHRoZSAncHJlJyBhbmQgJ3Bvc3QnIGF0dHJpYnV0ZXMgdG8gYWNoaWV2ZSB0aGlzLgogICAgICAgICAgICBUaGUgamF2YWluIHR5cGVtYXAgYWxzbyBzdXBwb3J0cyBhbiBvcHRpb25hbCAncGdjcHBuYW1lJyBhdHRyaWJ1dGUgZm9yIHByZW1hdHVyZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgbmFtaW5nIGFuZCB0aGUgY3NpbiB0eXBlbWFwIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdjc2hpbicKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGhlbHBlciBnZW5lcmF0ZWQgd2hlbiB0aGUgdHlwZSBpcyB1c2VkCiAgICAgICAgICAgIGluIGEgY29uc3RydWN0b3IuIERldGFpbHMgaW4gdGhlIEphdmEuaHRtbCBhbmQgQ1NoYXJwLmh0bWwgZG9jdW1lbnRhdGlvbi4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBEb24ndCB0cmVhdCBgcmVzdHJpY3QnIGFzIGEgcmVzZXJ2ZWQgaWRlbnRpZmllciBpbiBDKysgbW9kZQoJICAgIChidWcjMTY4NTUzNCkuCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBob3cgemVuZF90aHJvd19leGNlcHRpb24oKSBpcyBjYWxsZWQgKGJ1ZyAjMTcwMDc4NSkuCgowNC8xMC8yMDA3OiBvbGx5CgkgICAgRGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdG8gdGVtcGxhdGUgZm9yIGFDQyAocmVwb3J0ZWQgb24KCSAgICBzd2lnLXVzZXIgdGhhdCB0aGlzIGlzIG5lZWRlZCkuCgowNC8wNC8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIElmIFpUUyBpcyBlbmFibGVkLCByZWxlYXNlIDxtb2R1bGU+X2dsb2JhbHNfaWQgaW4gTVNIVVRET1dOCgkgICAgdG8gYXZvaWQgUEhQIGludGVycHJldGVyIGNyYXNoIG9uIHNodXRkb3duLiAgVGhpcyBzb2x1dGlvbiB3YXMKCSAgICBzdWdnZXN0ZWQgaGVyZTogaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQwOTg1CgowNC8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDRdIEFkZCBtaXNzaW5nIFpUUyBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgQysrIHdyYXBwZXIgY29kZQoJICAgIHRvIGZpeCBjb21waWxhdGlvbiBmYWlsdXJlcyB3aGVuIHVzaW5nIFpUUyBlbmFibGVkIFNXSUcgKExpbnV4CgkgICAgZGlzdHJpYnV0aW9ucyB0ZW5kIHRvIGRpc2FibGUgWlRTLCBidXQgbm90YWJseSB0aGUgV2luZG93cyBidWlsZAoJICAgIHVzZXMgaXQgYnkgZGVmYXVsdCkuCgowNC8wMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjg0MjYxOiBmaXhlcyBoYW5kbGluZyBvZiB1bnNpZ25lZCBpbnQgbGl0ZXJhbHMsIHRoYW5rcyBMZWlnaCBTbWl0aC4KICAgICAgICAgICAgQWxzbywgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbi4KCjAzLzMwLzIwMDc6IG9sbHkKCSAgICBBdm9pZCBnZW5lcmF0aW5nICc8OicgdG9rZW4gd2hlbiB1c2luZyBTd2lnVmFsdWVXcmFwcGVyPD4gb24gYSB0eXBlCgkgICAgd2hpY2ggc3RhcnRzIHdpdGggJzo6JyAocGF0Y2ggIzE2OTA5NDgpLgoKMDMvMjUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgW3Blcmw1XSBBZGQgU1dJR19mYWlsIHRvIHRoZSBTV0lHX2V4Y2VwdGlvbiBtYWNyby4gIEZpeGVzIGEgZmV3IHByb2JsZW1zIHJlcG9ydGVkCgkgICAgb24gdGhlIG1haWxpbmcgbGlzdC4KCjAzLzIzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFN0cmluZyBjb3B5aW5nIHBhdGNoIGZyb20gSm9zaCBDaGVycnkgcmVkdWNpbmcgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IGFib3V0IDI1JS4KCjAzLzIxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTYzMTk4NyBmcm9tIFVscmlrIFBldGVyc29uIC0gYm9vbCBJTk9VVCB0eXBlbWFwcwogICAgICAgICAgICBmYWlsIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMuCgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IGdpdmVuIGRvZGd5IEMrKyBjb2RlOiBuYW1lc3BhY2UgYWJjOjpkZWYgeyB9CgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgc28gdGhhdCBBUlJBWVNPRkNMQVNTRVMgYW5kIEFSUkFZU09GRU5VTVMgaW4gYXJyYXlzX2phdmEuaSBjYW4gYmUgYXBwbGllZAogICAgICAgICAgICB0byBwb2ludGVyIHR5cGVzLgoKMDMvMDMvMjAwNzogb2xseQoJICAgIFtQSFA1XSBXaGVuIHdlIGtub3cgdGhlIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZSBmb3IgYSBjb25zdGFudCwgdXNlCgkgICAgdGhhdCB0byBpbml0aWFsaXNlIHRoZSBjb25zdCBtZW1iZXIgaW4gdGhlIFBIUCB3cmFwcGVyIGNsYXNzLgoKMDMvMDIvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggUEhQIHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgZm9yIGNlcnRhaW4gY2FzZXMgb2YKCSAgICBvdmVybG9hZGVkIGZvcm1zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuCgowMi8yNi8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjU2Mzk1OiBmaXhlZCBoZXggYW5kIG9jdGFsIHZhbHVlcyBidWcsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLgoKMDIvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgYnVnIGluIHR5cGVtYXBzIHdoaWNoIGNhdXNlZCBkZXJpdmVkX2J5dmFsdWUgYW5kIHJuYW1lIHRlc3QgY2FzZXMgdG8gZmFpbC4KCSAgICBVcGRhdGVkIGRlcml2ZWRfYnl2YWx1ZS5pIHRvIGV4cGxhaW4gaG93IHRvIGZpbmQgYW5kIGZpeCB0aGUgcHJvYmxlbQoKMDEvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTM4NTIyIGFuZCAjMTMzODUyNywgZm9yd2FyZCB0ZW1wbGF0ZWQgY2xhc3MgZGVjbGFyYXRpb25zIHdpdGhvdXQgYQogICAgICAgICAgICBuYW1lIGZvciB0aGUgdGVtcGxhdGVkIGNsYXNzIHBhcmFtZXRlcnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgY2xhc3M+IGNsYXNzIFg7CgowMS8yMy8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXRjaCAjMTY0MDg2MjogPG1hbGxvYy5oPiByZXBsYWNlZCBieSA8c3RkbGliLmg+CgkgICAgUGF0Y2ggIzE1OTgwNjMgVHlwbyBpbiB0eXBlbWFwcy5pCgowMS8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIGx1YSBzcGVjaWZpYyBjYXJyYXlzLmkgd2hpY2ggYWRkcyB0aGUgb3BlcmF0b3JbXSBzdXBwb3J0LgoJICAgIG1vZGlmaWVkIHRoZSBtYWluIGNvZGUgdG8gbWFrZSBpdCBub3QgZW1pdCBhbGwgdGhlIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMgJiBhY2Nlc3NvcnMKCSAgICBOb3RlOiBDIHN0cnVjdHMgYXJlIGNyZWF0ZWQgdXNpbmcgbmV3X1hYWCgpIHdoaWxlIEMrKyBjbGFzc2VzIHVzZSBYWFgoKSAoc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCkKCSAgICBVcGRhdGVkIHRlc3QgY2FzZTogbGlfY2FycmF5cwoJICAgIFVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24uCgowMS8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGQgc3VwcG9ydCBmb3IgbmV3ZnJlZSB0eXBlbWFwcyAoc29tZXRpbWVzIHVzZWQgYnkgJW5ld29iamVjdCkKCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW1hY3JvZXJyb3JzLiAgIFdoZW4gc3VwcGxpZWQsIHRoaXMgd2lsbCBmb3JjZQogICAgICAgICAgICB0aGUgQyBzY2FubmVyL3BhcnNlciB0byByZXBvcnQgcHJvcGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBjb2RlIGNvbnRhaW5lZAogICAgICAgICAgICBpbnNpZGUgU1dJRyBtYWNyb3MgKGRlZmluZWQgd2l0aCAlZGVmaW5lKS4gIEJ5IGRlZmF1bHQsIFNXSUcgbWVyZWx5IHJlcG9ydHMKICAgICAgICAgICAgZXJyb3JzIG9uIHRoZSBsaW5lIGF0IHdoaWNoIGEgbWFjcm8gaXMgdXNlZC4gIFdpdGggdGhpcyBvcHRpb24sIHlvdQogICAgICAgICAgICBjYW4gZXhwYW5kIHRoZSBlcnJvciBiYWNrIHRvIGl0cyBzb3VyY2UtLS1zb21ldGhpbmcgd2hpY2ggbWF5IHNpbXBsaWZ5CiAgICAgICAgICAgIGRlYnVnZ2luZy4KCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10gTWFqb3Igb3ZlcmhhdWwgb2YgQy9DKysgc2Nhbm5pbmcgaW1wbGVtZW50YXRpb24uICBGb3IgcXVpdGUKICAgICAgICAgICAgc29tZSB0aW1lLCBTV0lHIGNvbnRhaW5lZCB0d28gY29tcGxldGVseSBpbmRlcGVuZGVudCBDL0MrKyB0b2tlbml6ZXJzLS0KICAgICAgICAgICAgdGhlIGxlZ2FjeSBzY2FubmVyIGluIENQYXJzZS9jc2Nhbm5lci5jIGFuZCBhIGdlbmVyYWwgcHVycG9zZSBzY2FubmVyCiAgICAgICAgICAgIGluIFN3aWcvc2Nhbm5lci5jLiBTV0lHIHN0aWxsIGhhcyB0d28gc2Nhbm5pbmcgbW9kdWxlcywgYnV0IHRoZSBDIHBhcnNlcgogICAgICAgICAgICBzY2FubmVyIChDUGFyc2UvY3NjYW5uZXIuYykgbm93IHJlbGllcyB1cG9uIHRoZSBnZW5lcmFsIHB1cnBvc2UKICAgICAgICAgICAgc2Nhbm5lciBmb3VuZCBpbiBTd2lnL3NjYW5uZXIuYy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBtdWNoIHNtYWxsZXIgYW5kCiAgICAgICAgICAgIGxlc3MgY29tcGxpY2F0ZWQuICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1haW50YWluIGFsbAogICAgICAgICAgICBvZiB0aGUgbG93LWxldmVsIEMgdG9rZW5pemluZyBpbiBvbmUgY2VudHJhbCBsb2NhdGlvbiBpbnN0ZWFkIG9mIHR3bwogICAgICAgICAgICBwbGFjZXMgYXMgYmVmb3JlLgoKICAgICAgICAgICAgKioqUE9URU5USUFMIEZMQUtJTkVTUyoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBhY2N1cmF0ZSBsaW5lIG51bWJlciByZXBvcnRpbmcKICAgICAgICAgICAgYXMgd2VsbCBhcyBlcnJvciByZXBvcnRpbmcgbW9yZSBnZW5lcmFsbHkuIEkgaGF2ZSB0cmllZCB0byByZXNvbHZlIHRoaXMKICAgICAgICAgICAgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29ybmVyIGNhc2VzLgoKMDEvMTIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgdHlwZW1hcCB0aHJvd3MgZm9yIHN0ZDo6c3RyaW5nKiwgdHlwZW1hcCBmb3IgU1dJR1RZUEUgRFlOQU1JQywKCSAgICBjaGFuZ2VkIHRoZSBleGlzdGluZyB0aHJvd3MgdHlwZW1hcCB0byB0aHJvdyBhIHN0cmluZyBpbnN0ZWFkIG9mIG1ha2luZyBhIGNvcHkgb2YKCSAgICB0aGUgb2JqZWN0ICh1cGRhdGluZyBhIGZldyB0ZXN0IGNhc2VzIHRvIGRlYWwgd2l0aCB0aGUgY2hhbmdlKS4KCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGR5bmFtaWNfY2FzdHMsIGV4Y2VwdGlvbl9wYXJ0aWFsX2luZm8sIGxpX3N0ZF9zdHJpbmcsIHNpemVfdAoKMDEvMDMvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXS4gIFVzZSBvZiBzd2lna2V5cy5jLy5oIHZhcmlhYmxlcyBpcyByZXZva2VkLiAgUGxlYXNlIHVzZQogICAgICAgICAgICBzaW1wbGUgc3RyaW5ncyBmb3IgYXR0cmlidXRlIG5hbWVzLgoKMTIvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBBUEkgZnVuY3Rpb25zIEhhc2hHZXRBdHRyKCkgYW5kIEhhc2hDaGVja0F0dHIoKSBoYXZlIGJlZW4gcmV2b2tlZC4KICAgICAgICAgICAgUGxlYXNlIHVzZSBHZXRhdHRyKCkgdG8gcmV0cmlldmUgYXR0cmlidXRlcy4gIFRoZSBmdW5jdGlvbiBDaGVja2F0dHIoKSBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBjaGVjayBhdHRyaWJ1dGVzLiAgTm90ZTogIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmV2b2tlZAogICAgICAgICAgICBiZWNhdXNlIHRoZXkgb25seSBhZGRlZCBhIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGF0IHRoZSBleHBlbnNlCiAgICAgICAgICAgIGNvZGUgY2xhcml0eS4KCjEyLzI2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1vcmUgU1RMIChtb3JlIGV4Y2VwdGlvbnMsIG1hcCwgc2l6ZV90KSwKCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGNvbnZlcnNpb25fbnNfdGVtcGxhdGUuCgoxMi8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGUgdG8gdGhyb3cgZXJyb3JzIHdoZW4gc2V0dGluZyBpbW11dGFibGVzLAoJICAgIGFuZCBhbGxvd2luZyB1c2VyIGFkZGl0aW9uIG9mIG1vZHVsZSB2YXJpYWJsZXMuCgoxMi8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZWRlZidkIHZhcmlhYmxlIHdyYXBwZXJzIHRoYXQgdXNlICVuYXR1cmFsdmFyLCBlZywgc3RkOjpzdHJpbmcuCgoxMi8xNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QgdHlwZW1hcHMKCjEyLzE0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggYnVnICMxNjEzNjczIChiYWQgUEhQNSBjb2RlIGdlbmVyYXRlZCBmb3IgZ2V0dGVycyBhbmQKCSAgICBzZXR0ZXJzKS4KCjEyLzAyLzIwMDY6IHdzZnVsdG9uLCBKb2huIExlbnosIERhdmUgQmVhemxleQogICAgICAgICAgICBNb3ZlIGZyb20gY3ZzIHRvIFN1YnZlcnNpb24gZm9yIHNvdXJjZSBjb250cm9sCgoxMS8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIENsZWFuZWQgdXAgc3dpZ3dhcm5pbmdzLnN3ZyBmaWxlIG5vdCB0byB1c2UgbmVzdGVkIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb25zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZm9yICVleHRlbmQgdG8gd29yayBmb3Igc3RhdGljIG1lbWJlciB2YXJpYWJsZXMuCgpWZXJzaW9uIDEuMy4zMSAoTm92ZW1iZXIgMjAsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IEx1aWdpIEJhbGxhYmlvCiAgICAgICAgICAgIFtQeXRob25dIEFsdGVybmF0ZSBmaXggZm9yIFB5dGhvbiBleGNlcHRpb25zIGJ1ZyAjMTU3ODM0NiAodGhlIHByZXZpb3VzIG9uZSBicm9rZSBQeXRob24KICAgICAgICAgICAgcHJvcGVydGllcyBpbiBtb2Rlcm4gY2xhc3NlcykKCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIC1mYWtldmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gbm93IGdlbmVyYXRlcyB0aGUgZmFrZSB2ZXJzaW9uIGludG8gdGhlIGdlbmVyYXRlZCB3cmFwcGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIGRpc3BsYXlpbmcgaXQgd2hlbiB0aGUgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIGlzIHVzZWQuCgoxNC8xMS8yMDA2OiBtZ29zc2FnZQoJICAgIFtsdWFdIHVwZGF0ZSB0byB0eXBlbWFwIGZvciBvYmplY3QgYnkgdmFsdWUsIHRvIG1ha2UgaXQgYzg5IGNvbXBsaWFudAoKVmVyc2lvbiAxLjMuMzAgKE5vdmVtYmVyIDEzLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbamF2YV0gUmVtb3ZlIERldGFjaEN1cnJlbnRUaHJlYWQgcGF0Y2ggZnJvbSAgMDgvMTEvMjAwNiAtIGl0IGNhdXNlcyBzZWdmYXVsdHMKICAgICAgICAgICAgb24gc29tZSBzeXN0ZW1zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW3B5dGhvbl0gRml4ICMxNTc4MzQ2IC0gUHl0aG9uIGV4Y2VwdGlvbnMgd2l0aCAtbW9kZXJuCgoxMS8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1OTMyOTEgLSBTbWFydCBwb2ludGVycyBhbmQgaW5oZXJpdGluZyBmcm9tIHRlbXBsYXRlcyAKCjExLzA5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXJlY3RvciBvcGVyYXRvciBwb2ludGVyL3JlZmVyZW5jZSBjYXN0cyAtICMxNTkyMTczLgoKMTEvMDcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgQWRkICRzZWxmIHNwZWNpYWwgdmFyaWFibGUgZm9yICVleHRlbmQgbWV0aG9kcy4gUGxlYXNlIHVzZSB0aGlzIGluc3RlYWQgb2YganVzdCAnc2VsZicKICAgICAgICAgICAgYXMgdGhlIEMrKyAndGhpcycgcG9pbnRlci4KCjExLzA3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0gCgkgICAgYWxsZWdyb2NsLnN3Zzogc3dpZy1kZWZ2YXIgdXBkYXRlZCB0byBhbGxvdyBzcGVjaWZ5aW5nIG9mCgkgICAgCQkgICBub24tZGVmYXVsdCBmb3JlaWduIHR5cGUgKHZpYSA6ZnR5cGUga2V5d29yZCBhcmcpLgoJICAgIGFsbGVncm9jbC5jeHg6IFNwZWNpZnkgcHJvcGVyIGFjY2VzcyB0eXBlIGZvciBlbnVtIHZhbHVlcy4KCjExLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhL0MjXSBGaXggY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybiB0eXBlcyBmb3IgZGlyZWN0b3JzIGFzIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE1hcmsgRG9uc2Vsem1hbm4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgRGVsZXRlTG9jYWxSZWYgZnJvbSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyBmb3Igbm93IGFzIGl0IGlzIGNhdXNpbmcgYQogICAgICAgICAgICBzZWcgZmF1bHQgd2hlbiBydW4gb24gU29sYXJpcyA4LgoKMTAvMjkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBQYXRjaCBmcm9tIENocmlzIFNob2VtYWtlciB0byBjbGVhbiB1cCBzb21lIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBJbXBvcnRhbnQgZml4IHRvIHByZXZlbnQgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHRoZSBKYXZhIHByb3h5IGNsYXNzCiAgICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgaW4gYSBuYXRpdmUgbWV0aG9kLiBUaGUgZmluYWxpemVyIGNvdWxkIGRlc3Ryb3kgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgQysrIG9iamVjdCB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZC4gVGhlIHByb2JsZW0gb2NjdXJzIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBzdHJvbmdseSByZWFjaGFibGUgYWZ0ZXIgYSBuYXRpdmUgY2FsbC4gIFRoZSBwcm9ibGVtIHNlZW1zIHRvIG9jY3VyIGluCiAgICAgICAgICAgIG1lbW9yeSBzdHJlc3Mgc2l0dWF0aW9ucyBvbiBzb21lIEpWTXMuIEl0IGRvZXMgbm90IHNlZW0gdG8gb2NjdXIgb24gdGhlCiAgICAgICAgICAgIFN1biBjbGllbnQgSlZNIHVwIHRvIGpkayAxLjUuIEhvd2V2ZXIgdGhlIDEuNiBjbGllbnQgamRrIGhhcyBhIG1vcmUgYWdncmVzc2l2ZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3RvciBhbmQgc28gdGhlIHByb2JsZW0gZG9lcyBvY2N1ci4gSXQgZG9lcyBvY2N1ciBvbiB0aGUgU3VuIHNlcnZlcgogICAgICAgICAgICBKVk1zIChjZXJ0YWlubHkgMS40IG9ud2FyZHMpLiBUaGUgZml4IGVudGFpbHMgcGFzc2luZyB0aGUgcHJveHkgY2xhc3MgaW50byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiBhZGRpdGlvbiB0byB0aGUgQysrIHBvaW50ZXIgaW4gdGhlIGxvbmcgcGFyYW1ldGVyLCBhcyBKYXZhIGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgICBjb2xsZWN0ZWQgd2hlbiB0aGV5IGFyZSBwYXNzZWQgaW50byBKTkkgbWV0aG9kcy4gVGhlIGV4dHJhIHBhcmFtZXRlciBjYW4gYmUgc3VwcHJlc3NlZAogICAgICAgICAgICBieSBzZXR0aW5nIHRoZSBub3BnY3BwIGF0dHJpYnV0ZSBpbiB0aGUganR5cGUgdHlwZW1hcCB0byAiMSIgb3IgdXNpbmcgdGhlIG5ldyAtbm9wZ2NwcAogICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICBTZWUgSmF2YS5odG1sI2phdmFfcGdjcHAgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiB0aGlzIHRvcGljLgoKMTAvMjQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggc21hcnQgcG9pbnRlciB3cmFwcGVycy4gVGhlIHZpcnR1YWwvb3ZlcnJpZGUvbmV3IGtleXdvcmQgaXMgbm90IGdlbmVyYXRlZAogICAgICAgICAgICBmb3IgZWFjaCBtZXRob2QgYXMgdGhlIHNtYXJ0IHBvaW50ZXIgY2xhc3MgZG9lcyBub3QgbWlycm9yIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIKICAgICAgICAgICAgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBTRiAjMTQ5NjUzNQoKMTAvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgbmF0aXZlIG1ldGhvZHMgJiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCiAgICAgICAgICAgIGZpeGVkIHRlc3QgY2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MgJiBjcHBfYmFzaWMuIEFkZGVkIG5ldyBleGFtcGxlIChmdW5jdG9yKS4KICAgICAgICAgICAgdGlkaWVkIHVwIGEgbGl0dGxlIG9mIHRoZSBjb2RlIChhcm91bmQgY2xhc3NIYW5kbGVyKS4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gZGlyZWN0b3JvdXQgdHlwZW1hcCBjaGFuZ2VzIHRvIGZhbGwgaW4gbGluZSB3aXRoIHRoZSBvdGhlciBkaXJlY3RvcgogICAgICAgICAgICBsYW5ndWFnZXMuICRyZXN1bHQgaXMgbm93IHVzZWQgd2hlcmUgJDEgdXNlZCB0byBiZSB1c2VkLiBQbGVhc2UgY2hhbmdlIHlvdXIgdHlwZW1hcHMKICAgICAgICAgICAgaWYgeW91IGhhdmUgYSBjdXN0b20gZGlyZWN0b3JvdXQgdHlwZW1hcC4KCjEwLzE4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNvbWUgZml4ZXMgZm9yIGFwcGx5aW5nIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzIHRvIHVuc2lnbmVkIGNoYXIgYXJyYXlzLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgaW4gY29uc3Qgc2l6ZV90JiBhbmQgY29uc3Qgc3RkOjpzaXplX3QmIHR5cGVtYXBzLgoKMTAvMTUvMjAwNjogZWZ1enp5b25lIAogICAgICAgICAgICBbQ0ZGSV0gU3VwcHJlc3MgZ2VuZXJhdGluZyBkZWZjdHlwZSBmb3IgZW51bXMsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLiBQYXRjaCAxNTYwOTgzLiAKCjEwLzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gTWlub3IgZml4IHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggdGhlIChhcyB5ZXQgdW5yZWxlYXNlZCkgY2hpY2tlbiAyLjUKCiAgICAgICAgICAgIFtHdWlsZSxDaGlja2VuXSBGaXggU0YgQnVnIDE1NzM4OTIuICBBZGRlZCBhbiBleHRfdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSB0byB0ZXN0CiAgICAgICAgICAgIHRoaXMgYnVnLCBidXQgdGhpcyB0ZXN0IGNhbiBub3QgcmVhbGx5IGJlIG1hZGUgZ2VuZXJpYyBiZWNhdXNlIHRoZSBleHRlcm5hbCBjb2RlIG11c3QKICAgICAgICAgICAgcGx1ZyBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIgZGlyZWN0bHkuCiAgICAgICAgICAgIFNlZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2NoaWNrZW4vZXh0X3Rlc3QuaSBhbmQgZXh0X3Rlc3RfZXh0ZXJuYWwuY3h4CgogICAgICAgICAgICBBZGRlZCBhICUuZXh0ZXJuYWx0ZXN0IHRvIGNvbW1vbi5taywgYW5kIGFueSBpbnRlcmVzdGVkIGxhbmd1YWdlIG1vZHVsZXMgY2FuCiAgICAgICAgICAgIGNvcHkgYW5kIHNsaWdodGx5IG1vZGlmeSBlaXRoZXIgdGhlIGNoaWNrZW4gb3IgdGhlIGd1aWxlIGV4dF90ZXN0LmkKCjEwLzE0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIE9VVFBVVCYgZm9yIGFsbCBudW1iZXIgdHlwZXMsIGFkZGVkIGEgbG9uZyBsb25nIHR5cGUKICAgICAgICAgICAgZml4ZWQgc2V2ZXJhbCB0ZXN0IGNhc2VzLgogICAgICAgICAgICB1cGRhdGU6IGNoYW5nZWQgdHlwZW1hcHMgdG8gdXNlIFNXSUdfQ29udmVydFB0ciByYXRoZXIgdGhhbiBTV0lHX011c3RHZXRQb2ludGVyCiAgICAgICAgICAgIHN0YXJ0ZWQgc3BsaXRpbmcgbHVhLnN3ZyBpbnRvIHNtYWxsZXIgcGFydHMgdG8gbWFrZSBpdCBuZWF0ZXIKCjEwLzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gTWFyZ2luYWxseSBiZXR0ZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugb25seSBpbiB0aGF0IHlvdSBjYW4KICAgICAgICAgICAgY29udHJvbCB3aGF0IHRoZSBiYXNlIGNsYXNzIGlzLiBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIG5ldyAncmVwbGFjZScgYXR0cmlidXRlIGluIHRoZSAKICAgICAgICAgICAgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXAsIGVnIGluIHRoZSBmb2xsb3dpbmcsICdNZScgd2lsbCBiZSB0aGUgYmFzZSBjbGFzcywKICAgICAgICAgICAgbm8gbWF0dGVyIHdoYXQgRm9vIGlzIHJlYWxseSBkZXJpdmVkIGZyb20gaW4gdGhlIEMrKyBsYXllci4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwcyB0byBvdmVycmlkZSB0aGUgQysrIGJhc2UuCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIGRlbGV0ZSgpIG1ldGhvZCAKICAgICAgICAgICAgKGl0IGlzIG5vdyBhIHN5bmNocm9uaXplZCBtZXRob2QsIGJ1dCBpcyBub3cgY3VzdG9taXNhYmxlIGJ5IGNoYW5naW5nIHRoZSAKICAgICAgICAgICAgbWV0aG9kbW9kaWZpZXJzIGF0dHJpYnV0ZSBpbiB0aGUgdGhlIGphdmFkZXN0cnVjdCBvciBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwKQoKICAgICAgICAgICAgW0MjXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgRGlzcG9zZSgpIG1ldGhvZCwgCiAgICAgICAgICAgIHNpbWlsYXIgdG8gSmF2YSdzIGRlbGV0ZSgpIGFib3ZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBSZW1vdmUgcmVkdW5kYW50IGRpcmVjdG9yIGNvZGUgaW4gJWV4dGVuZCBtZXRob2RzICglZXh0ZW5kCiAgICAgICAgICAgIG1ldGhvZHMgY2Fubm90IGJlIGRpcmVjdG9yIG1ldGhvZHMpCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBGaXggIzE1MDU1OTQgLSBkaXJlY3RvciBvYmplY3RzIG5vdCByZXR1cm5lZCBhcyBkaXJlY3RvciBvYmplY3RzCiAgICAgICAgICAgIGluICVleHRlbmQgbWV0aG9kcy4KCjEwLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzEyMzg3OTggLSBEaXJlY3RvcnMgdXNpbmcgdW5zaWduZWQgbG9uZyBsb25nIG9yIGFueSBvdGhlciB0eXBlCiAgICAgICAgICAgIG1hcnNoYWxsZWQgYWNyb3NzIHRoZSBKTkkgYm91bmRhcnkgdXNpbmcgYSBKYXZhIGNsYXNzICh3aGVyZSB0aGUgam5pIHR5cGVtYXAgCiAgICAgICAgICAgIGNvbnRhaW5zIGpvYmplY3QpLgoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMTYyMTk0IC0gI2luY2x1ZGUvJWluY2x1ZGUgd2l0aGluIGEgc3RydWN0dXJlCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE0NTA2NjEsIHN0cmluZyB0cnVuY2F0aW9uIGluIFN0cmluZ19zZWVrIHRydW5jYXRpbmcgSmF2YS9DIyBlbnVtcy4KCjEwLzA2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMTU2OTU4Ny4gVGhlIG5hbWUgaXMgbm93IGNvcnJlY3QuCgoxMC8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXJlY3RvciBmaXhlcyBmb3IgdmlydHVhbCBjb252ZXJzaW9uIG9wZXJhdG9ycwoKMTAvMDQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCAjMTU2OTU4NyBmb3IgUEhQLiAgRG9uJ3QgdXNlIHNpemVvZigpIGV4Y2VwdCB3aXRoIHN0cmluZwoJICAgIGxpdGVyYWxzLiAgQ2hhbmdlIHNvbWUgIi8vIiBjb21tZW50cyB0byAiLyogKi8iIGZvciBwb3J0YWJpbGl0eS4KCjEwLzA0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhcnRpYWwgRml4ICMxNTY5NTg3LiBUaGUgdHlwZSBpcyBub3cgY29ycmVjdCwgYnV0IHRoZSBuYW1lIGlzIHN0aWxsIG5vdCBjb3JyZWN0LgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCAjMTUyNzg4NSAtIE92ZXJsb2FkZWQgZGlyZWN0b3IgdmlydHVhbCBtZXRob2RzIHNvbWV0aW1lcyBwcm9kdWNlZAogICAgICAgICAgICB1bmNvbXBpbGVhYmxlIGNvZGUgd2hlbiB1c2VkIHdpdGggdGhlIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlLgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3JzOiBEaXJlY3RvcnMgYXJlIG91dHB1dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgcmF0aGVyIHRoYW4gaW4gc29tZSBwc2V1ZG8tcmFuZG9tIG9yZGVyLgoKMTAvMDMvMjAwNjogbW1hdHVzCiAgICAgICAgICAgIEZpeCAjMTQ4NjI4MSBhbmQgIzE0NzEwMzkuCgoxMC8wMy8yMDA2OiBvbGx5CgkgICAgW1BlcmxdIEZpeCBmb3IgaGFuZGxpbmcgc3RyaW5ncyB3aXRoIHplcm8gYnl0ZXMgZnJvbSBTdGVwaGVuIEh1dHNhbC4KCjA5LzMwLzIwMDY6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gQml0ZmllbGQgc3VwcG9ydCBhbmQgdmFyYXJnIHN1cHBvcnQgZHVlIHRvIEFydGh1ciBTbXlsZXMuCiAgICAgICAgICAgIEMgZXhwcmVzc2lvbiB0byBMaXNwIGNvbnZlcnNpb24sIHRoYW5rcyB0byBBcnRodXIgU215bGVzIGZvciB0aGUgaW5pdGlhbAogICAgICAgICAgICBpZGVhLCBpdCBub3cgc3VwcG9ydHMgY29udmVyc2lvbiBmb3IgYSB3aG9sZSByYW5nZSBvZiBDIGV4cHJlc3Npb25zLiAKCjA5LzI4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUwODMyNyAtIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgaGlkZGVuIHdoZW4gdXNpbmcgLWZ2aXJ0dWFsIG9wdGltaXNhdGlvbi4KICAgICAgICAgICAgT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgY2FuZGlkYXRlcyBmb3IgZWxpbWluYXRpb24gLSB0aGlzIG1pbWljcwogICAgICAgICAgICBDKysgYmVoYXZpb3VyIHdoZXJlIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZAogICAgICAgICAgICBpbiBhIGRlcml2ZWQgY2xhc3MgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUgYXZhaWxhYmxlLgoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbiwgT2NhbWxdIEZpeCAjMTUwNTU5MSBUaHJvd2luZyBleGNlcHRpb25zIGluIGV4dGVuZGVkIGRpcmVjdG9ycwoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDU2MTAwIC0gdmlydHVhbCBvcGVyYXRvcnMuIAoKMDkvMjQvMjAwNjogb2xseQoJICAgIERvbid0IGFjY2lkZW50YWxseSBjcmVhdGUgYSAiPDoiIHRva2VuICh3aGljaCBpcyB0aGUgc2FtZSBhcyAiWyIgaW4gQysrKS4KCSAgICBGaXhlcyBidWcgIyAxNTIxNzg4LgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFtSdWJ5XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIHRoZSBSdWJ5IDEuOQoJICAgIGRldmVsb3BtZW50IGJyYW5jaC4gIEZpeGVzIGJ1ZyAjMTU2MDA5Mi4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBUZW1wbGF0ZXMgY2FuIG5vdyBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycyBhbmQKCSAgICBjb25zdGFudCBleHByZXNzaW9ucywgZS5nLjoKCgkgICAgdGVtcGxhdGU8aW50IHE+IGNsYXNzIHgge307CgkgICAgJXRlbXBsYXRlKHhfbWludXMxKSB4PC0xPjsKCSAgICAldGVtcGxhdGUoeF8xcGx1czIpIHg8MSsyPjsKCgkgICAgQWxzbywgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2FuIG5vdyBpbmNsdWRlIGNvbXBhcmlzb25zICg+LCA8LCA+PSwKCSAgICA8PSwgIT0sID09KSwgbW9kdWx1cyAoJSksIGFuZCB0ZXJuYXJ5IGNvbmRpdGlvbmFscyAoYSA/IGIgOiBjKS4KCgkgICAgRml4ZXMgYnVncyAjNjQ2Mjc1LCAjOTI1NTU1LCAjOTU2MjgyLCAjOTk0MzAxLgoKMDkvMjIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgbWV0aG9kcyAtIEJ1Z3MgIzE1NDYyNTQsICMxNTQzNTMzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHRzIGFuZCBhc3NlcnRzIHdoZW4gZGlyZWN0b3IgbWV0aG9kcyBhcmUgaWdub3JlZCAoIzE1NDM1MzMpCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3V0IG9mIHNvdXJjZSBidWlsZHMgLSBidWcgIzE1NDQ3MTgKCjA5LzIwLzIwMDY6IG9sbHkKCSAgICBUcmVhdCBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiByYXRoZXIKCSAgICB0aGFuIGlnbm9yaW5nIGl0IGNvbXBsZXRlbHksIHNvIHRoYXQgd2UgZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvcgoJICAgIHBhc3Npbmcgb3BhcXVlIHBvaW50ZXJzIHRvIHRoZSBuZXN0ZWQgY2xhc3MgKGZpeGVzIFNGIGJ1ZyAjOTA5Mzg3KS4KCjA5LzIwLzIwMDY6IG9sbHkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgW3BocF0gT3ZlcmxvYWQgcmVzb2x1dGlvbiBub3cgd29ya3MuICBIb3dldmVyIHRvIGFsbG93IHRoaXMsIFNXSUcKCSAgICBnZW5lcmF0ZWQgd3JhcHBlcnMgbm8gbG9uZ2VyIGNvZXJjZSBQSFAgdHlwZXMgKHdoaWNoIHJldmVydHMgYSBjaGFuZ2UKCSAgICBtYWRlIGluIDEuMy4yNikuICBTbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXRob2QgdGFrZXMgYSBzdHJpbmcsIHlvdQoJICAgIGNhbiBubyBsb25nZXIgcGFzcyBhIG51bWJlciB3aXRob3V0IGV4cGxpY2l0bHkgY29udmVydGluZyBpdCB0byBhCgkgICAgc3RyaW5nIGluIFBIUCB1c2luZzogKHN0cmluZyl4CgowOS8xOC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSBmaXggb24gc3dpZ2luaXQuc3dnLCBoYXMgYmVlbiByZXBvcnRlZCB0byBjcmFzaCBvbiBzZXZlcmFsIHRlc3QgY2FzZXMKCSAgICBmb3VuZCBhbmQgZml4ZWQgcHJvYmxlbSBpbiBpbXBvcnRzIHVuZGVyIHB5dGhvbiAobWluZ3cpCgowOS8xNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCBmcm9tIE1pY2hhbCBNYXJlayBmb3IgUHl0aG9uIDIuNSB0byBmaXggNjQgYml0IGFycmF5IGluZGV4ZXMgb24KICAgICAgICAgICAgNjQgYml0IG1hY2hpbmVzLgoKMDkvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGhhcyBiZWVuIHNjcmFwcGVkLiBUaGlzIGZlYXR1cmUgd2FzIGludHJvZHVjZWQgcHJpbWFyaWx5CiAgICAgICAgICAgIHRvIHNvbHZlIHJlY3Vyc2l2ZSBkaXJlY3RvciBtZXRob2QgY2FsbHMuIERpcmVjdG9yIHVwY2FsbCBpbXByb3ZlbWVudHMgbWFkZSBpbnN0ZWFkOgoKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIFRoZSBzd2lnX3VwIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIFRoZSByZXF1aXJlZCBtdXRleGVzCiAgICAgICAgICAgIHdyYXBwaW5nIHRoaXMgZmxhZyBhcmUgYWxzbyBubyBsb25nZXIgbmVlZGVkLiBUaGUgcmVjdXJzaXZlIGNhbGxzIGdvaW5nIGZyb20gQysrCiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGJhY2sgYWdhaW4gZXRjIGFyZSBub3cgYXZvaWRlZCBieSBhIHN1YnRsZWx5IGRpZmZlcmVudAogICAgICAgICAgICBhcHByb2FjaC4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3dpZ191cCBmbGFnIGluIGVhY2ggZGlyZWN0b3IgbWV0aG9kIHRvIGluZGljYXRlCiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGV4cGxpY2l0IEMrKyBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIG1ldGhvZCBvciBhIG5vcm1hbAogICAgICAgICAgICBwb2x5bW9ycGhpYyBDKysgY2FsbCBzaG91bGQgYmUgbWFkZSwgdGhlIG5ldyBhcHByb2FjaCBtYWtlcyBvbmUgb2YgdGhlc2UgY2FsbHMKICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgd3JhcHBlciBtZXRob2QuCgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSByZWN1cnNpdmUgY2FsbCBwcm9ibGVtIHdoZW4gY2FsbGluZyBhIEMrKyBiYXNlIGNsYXNzIG1ldGhvZCBmcm9tCiAgICAgICAgICAgIEphdmEvQyMgaXMgbm93IGZpeGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgYXMgdGhlIGRldGVjdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBleHBsaWNpdCBjYWxsIG9yIGEgbm9ybWFsIHBvbHltb3JwaGljIGNhbGwgaXMgbWFkZQogICAgICAgICAgICBpbiB0aGUgSmF2YS9DIyBsYXllciByYXRoZXIgdGhhbiBpbiB0aGUgQysrIGxheWVyLgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gdXBkYXRlZCBzd2lnaW5pdC5zd2cgdG8gYWxsb3cgbXVsdGlwbGUgaW50ZXJwcmV0ZXJzIHRvIHVzZSBtdWx0aXBsZQoJICAgIHN3aWcgbW9kdWxlcyBhdCBvbmNlLiBUaGlzIGhhcyBiZWVuIHRlc3RlZCBpbiBMdWEgKG1pbmd3ICYgbGludXgpLAoJICAgIHBlcmw1ICYgcHl0aG9uIChsaW51eCkgb25seS4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXMgd2VsbCBhcyBuYXRpdmUgbHVhIG9iamVjdAogICAgICAgICAgICBpbnRvIHdyYXBwZXJlZCBmdW5jdGlvbi4KICAgICAgICAgICAgQWRkZWQgZXhhbXBsZSBmdW5jcHRyMyB0byBkZW1vbnN0cmF0ZSB0aGlzIGZlYXR1cmUKCjA5LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW5hbWUgRXJyb3JDb2RlIGFuZCBFcnJvck1zZyAjZGVmaW5lLXMgdG8gU1dJR19FcnJvckNvZGUKCSAgICBhbmQgU1dJR19FcnJvck1zZyB0byBhdm9pZCBjbGFzaGVzIHdpdGggY29kZSB0aGUgdXNlciBtaWdodCBiZQoJICAgIHdyYXBwaW5nIChwYXRjaCBmcm9tIERhcnJlbiBXYXJuZXIgaW4gU0YgYnVnICMxNDY2MDg2KS4gIEFueQoJICAgIHVzZXIgdHlwZW1hcHMgd2hpY2ggdXNlIEVycm9yQ29kZSBhbmQvb3IgRXJyb3JNc2cgZGlyZWN0bHkgd2lsbAoJICAgIG5lZWQgYWRqdXN0aW5nIC0geW91IGNhbiBlYXNpbHkgZml4IHRoZW0gdG8gd29yayB3aXRoIGJvdGggb2xkCgkgICAgYW5kIG5ldyBTV0lHIGJ5IGNoYW5naW5nIHRvIHVzZSBTV0lHX0Vycm9yTXNnIGFuZCBhZGRpbmc6CgoJCSNpZm5kZWYgU1dJR19FcnJvck1zZwoJCSNkZWZpbmUgU1dJR19FcnJvck1zZygpIEVycm9yTXNnKCkKCQkjZW5kaWYKCjA4LzI5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBNb3ZlIGNvbnN0YW50IGluaXRpYWxpc2F0aW9uIGZyb20gUklOSVQgdG8gTUlOSVQgdG8gZml4IGEKCSAgICB3YXJuaW5nIHdoZW4gdXNpbmcgQXBhY2hlIGFuZCBtb2RfcGhwLiAgV2Ugb25seSBuZWVkIHRvIGNyZWF0ZQoJICAgIFBIUCBjb25zdGFudHMgb25jZSB3aGVuIHdlJ3JlIGZpcnN0IGluaXRpYWxpc2VkLCBub3QgZm9yIGV2ZXJ5IEhUVFAKCSAgICByZXF1ZXN0LgoKMDgvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1NDI0NjYgYWRkZWQgY29kZSB0byBhbGxvdyBtYXBwaW5nIEx1YSBuaWwncyA8LT4gQy9DKysgTlVMTCdzCgkgICAgdXBkYXRlZCB2YXJpb3VzIHR5cGVtYXBzIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIGNoYW5nZXMKCSAgICBhZGRlZCB2b2lkdGVzdF9ydW5tZS5sdWEgdG8gc2hvdyB0aGUgZmVhdHVyZXMgd29ya2luZwoKMDgvMTkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBBZGQgZmVhdHVyZTpjb25zdGFzdmFyIHRvIGV4cG9ydCBjb25zdGFudHMgYXMgdmFyaWFibGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZS4KCjA4LzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEZXRhY2hDdXJyZW50VGhyZWFkIGNhbGxzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IG5hdGl2ZWx5IGNyZWF0ZWQgdGhyZWFkcwogICAgICAgICAgICBubyBsb25nZXIgcHJldmVudCB0aGUgSlZNIGZyb20gZXhpdGluZy4gQnVnIHJlcG9ydGVkIGJ5IFRob21hcyBEdWR6aWFrIGFuZAogICAgICAgICAgICBQYXVsIE5vbGwuCgowOC8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBzbyB0aGV5IHdvcmsKCjA3LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtb3JlIGFkZGl0aW9ucyB0byBzdGQ6OnN0cmluZywgc29tZSB0d2Vha3MgYW5kIHNtYWxsIGJ1ZyBmaXhlcwoJICAgIC1ub2N3cmFwIG1vZGUuCgowNy8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTUyNjAyMiBwZGF0ZWQgc3RkOjpzdHJpbmcgdG8gc3VwcG9ydCBzdHJpbmdzIHdpdGggJ1wwJyBpbnNpZGUgdGhlbQoJICAgIHVwZGF0ZWQgdHlwZW1hcHMuaSB0byBhZGQgc3VwcG9ydCBmb3IgcG9pbnRlciB0byBwb2ludGVycwoKMDcvMTkvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gQWRkIHN0ZF9zdHJpbmcuaSBzdXBwb3J0LgoJICAgIC0gQWRkIG5ld29iamVjdCBwYXRjaCBzdWJtaXR0ZWQgYnkgbWtvZXBwZSAodGhhbmtzISkKCSAgICAtIEZpeCB0eXBlIG5hbWUgbWlzbWF0Y2ggaXNzdWUgZm9yIG5lc3RlZCB0eXBlIGRlZmluaXRpb25zLgoJICAgICAgc3BlY2lmaWNhbGx5IHR5cGVkZWZzIGluIHRlbXBsYXRlZCBjbGFzcyBkZWZucy4KCjA3LzE4LzIwMDY6IG1nb3NzYWdlCgkgICAgQnVnZml4ICMxNTIyODU4CgkgICAgdXBkYXRlZCBsdWEuY3h4IHRvIHN1cHBvcnQgLWV4dGVybmFsLXJ1bnRpbWUgY29tbWFuZAoKMDcvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgSW5jcmVtZW50IHRoZSBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byAzLCBiZWNhdXNlIG9mIHRoZQoJICAgIGFkZGl0aW9uIG9mIHRoZSBvd25kYXRhIG1lbWJlciBpbiBzd2lnX3R5cGVfaW5mby4KCSAgICBSZXBvcnRlZCBieTogUHJhYmh1IFJhbWFjaGFuZHJhbgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU2VhcmNoIHBhdGggZml4ZXM6CiAgICAgICAgICAgIC0gRml4IHNlYXJjaCBwYXRoIGZvciBsaWJyYXJ5IGZpbGVzIHRvIGJlaGF2ZSBhcyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbC4KICAgICAgICAgICAgLSBGaXggbWluZ3cvbXN5cyBidWlsZHMgd2hpY2ggZGlkIG5vdCBmaW5kIHRoZSBTV0lHIGxpYnJhcnkgd2hlbiBpbnN0YWxsZWQuCiAgICAgICAgICAgIC0gV2luZG93cyBidWlsZHMgYWxzbyBvdXRwdXQgdGhlIG1pbmd3L21zeXMgaW5zdGFsbCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcKICAgICAgICAgICAgICBzd2lnIC1zd2lnbGliLgogICAgICAgICAgICAtIFRoZSBub24tZXhpc3RlbnQgYW5kIHVuZG9jdW1lbnRlZCBjb25maWcgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBoYXMKICAgICAgICAgICAgICBiZWVuIHJlbW92ZWQuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHN5bW5hbWUgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24uCgowNy8wNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBBZGQgJWZlYXR1cmUoImNvbnN0YXN2YXIiKSwgd2hpY2ggaW5zdGVhZCBvZiBleHBvcnRpbmcgYSBjb25zdGFudCBhcyBhCgkgICAgc2NoZW1lIGZ1bmN0aW9uLCBleHBvcnRzIHRoZSBjb25zdGFudCBhcyBhIHNjaGVtZSB2YXJpYWJsZS4gIFVwZGF0ZSB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGFzIHdlbGwuCgowNy8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbU2VlIGVudHJ5IG9mIDA5LzEzLzIwMDYgLSBleHBsaWNpdGNhbGwgZmVhdHVyZSBhbmQgZG9jdW1lbnRhdGlvbiB0byBpdCByZW1vdmVkXQogICAgICAgICAgICBOZXcgZXhwbGljaXRjYWxsIGZlYXR1cmUgd2hpY2ggZ2VuZXJhdGVzIGFkZGl0aW9uYWwgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICB0aGF0IGNhbGwgdGhlIG1ldGhvZCBleHBsaWNpdGx5LCBub3QgcmVseWluZyBvbiBwb2x5bW9ycGhpc20gdG8gbWFrZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGNhbGwuIFRoZSBmZWF0dXJlIGlzIGEgZmVhdHVyZSBmbGFnIGFuZCBpcyBlbmFibGVkIGxpa2UgYW55IG90aGVyIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgSXQgYWxzbyByZWNvZ25pc2VzIGFuIGF0dHJpYnV0ZSwgInN1ZmZpeCIgZm9yIG1hbmdsaW5nIHRoZSBmZWF0dXJlIG5hbWUsIHNlZQogICAgICAgICAgICBTV0lHUGx1cy5odG1sI1NXSUdQbHVzX2V4cGxpY2l0Y2FsbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBpcyBhbHNvIGEgd29ya2Fyb3VuZCBmb3Igc29sdmluZyB0aGUgcmVjdXJzaXZlIGNhbGxzCiAgICAgICAgICAgIHByb2JsZW0gd2hlbiBhIGRpcmVjdG9yIG1ldGhvZCBtYWtlcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIG1ldGhvZC4gU2VlCiAgICAgICAgICAgIEphdmEuaHRtbCNqYXZhX2RpcmVjdG9yc19leHBsaWNpdGNhbGwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KCjA2LzI4LzIwMDY6IGpvZSAoSm9zZXBoIFdhbmcpCgkgICAgW3JdIEluaXRpYWwgc3VwcG9ydCBmb3IgUgoKMDYvMjAvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCiAgICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIGdldCBhcHBseV9zdHJpbmdzLmkgdGVzdHN1aXRlIHRvIHBhc3MKCSAgICBSZW1vdmUgaW50ZWdlcnNfcnVubWUuc2NtIGZyb20gdGhlIHRlc3RzdWl0ZSwgYmVjYXVzZSBTV0lHIGFuZCBDaGlja2VuIGRvZXMKICAgICAgICAgICAgaGFuZGxlIG92ZXJmbG93cy4KCjA2LzE5LzIwMDU6IG9sbHkKCSAgICBbcGhwXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBQSFA1IGNsYXNzIHdyYXBwZXJzIGZvciBDKysKCSAgICBjbGFzc2VzICh1c2UgInN3aWcgLXBocDUiKS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBBZGRlZCBzb21lIG1pc3Npbmcga2V5d29yZHMgdG8gdGhlIFBIUDQga2V5d29yZCBsaXN0LCBhbmQKCSAgICBmaXhlZCBfX0xJTkVfXyBhbmQgX19GSUxFX18gd2hpY2ggd2VyZSBpbiB0aGUgd3JvbmcgY2F0ZWdvcnkuCgkgICAgQWxzbyBhZGRlZCBhbGwgdGhlIGtleXdvcmRzIG5ldyBpbiBQSFA1LCBhbmQgYWRkZWQgY29tbWVudHMKCSAgICBub3RpbmcgdGhlIFBIUDQga2V5d29yZHMgd2hpY2ggYXJlbid0IGtleXdvcmRzIGluIFBIUDUuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIGFzIHRoaXMgcG9pbnRlciAoZS5nLgoJICAgIENsYXNzX21ldGhvZChOdWxsKSkgLSBnaXZlIGEgUEhQIEVycm9yIGluc3RlYWQuCgowNi8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lciBjbGFzcy4KCSAgICBGaXggYSBmZXcgYnVncyBpbiBoZWxwZXIgZnVuY3Rpb25zLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlcGxhY2UgSk5JRVhQT1JUIHdpdGggU1dJR0VYUE9SVCwgdGhlcmVieSBlbmFibGluZyB0aGUgcG9zc2liaWxpdHkKICAgICAgICAgICAgb2YgdXNpbmcgZ2NjIC1mdmlzaWJpbGl0eT1oaWRkZW4gZm9yIHBvdGVudGlhbGx5IHNtYWxsZXIgZmFzdGVyIGxvYWRpbmcgd3JhcHBlcnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIE1ha2VmaWxlcyBmb3IgYXV0b2NvbmYtMi42MCBiZXRhCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBWbGFkaW1pciBNZW5zaGFrb3YgcGF0Y2ggZm9yIGNvbXBpbGluZyB3cmFwcGVycyB3aXRoIHB5dGhvbi0yLjUgYWxwaGEuCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVmZmVyIG92ZXJmbG93IGVycm9yIHdoZW4gdXNpbmcgbGFyZ2UgJWZlYXR1cmUoZG9jc3RyaW5nKSByZXBvcnRlZAogICAgICAgICAgICBieSBKb3NlcGggV2luc3Rvbi4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBPcGVyYXRvciBvdmVybG9hZCBmaXggZnJvbSBEYW5pZWwgTW9vcmUuCgowNS8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBnZW5lcmF0aW9uIG9mIENMT1MgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHVuaW9ucwoJICAgIGFuZCBlcXVpdmFsZW50IHR5cGVzLgoKMDUvMjQvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIERvbid0IHJlcXVpcmUgYSBmdWxsIGNsYXNzIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgYSBDTE9TIHdyYXBwZXIuCgowNS8yMC8yMDA2OiBvbGx5CgkgICAgW3BocF0gR0NDIFZpc2liaWxpdHkgc3VwcG9ydCBub3cgd29ya3Mgd2l0aCBQSFAuCgowNS8xOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVtb3ZlZCBzdXBwb3J0IGZvciAtZGxuYW1lICh1c2UgLW1vZHVsZSBpbnN0ZWFkKS4gIEZpeGVkCgkgICAgbmFtaW5nIG9mIFBIUCBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQSFAKCSAgICBjb252ZW50aW9ucyAobm8gInBocF8iIHByZWZpeCBvbiBVbml4OyBvbiBQSFAgPj0gNC4zLjAsIGhhbmRsZSBVbml4CgkgICAgcGxhdGZvcm1zIHdoaWNoIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiLnNvIiBhcyB0aGUgZXh0ZW5zaW9uLikKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZAoKMDUvMDcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCB3aGVyZSBhIEMrKyByZWZlcmVuY2UKCSAgICBpcyB3YW50ZWQuCgowNS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IHdyYXBwZXJzIGdlbmVyYXRlZCBmb3IgZ2xvYmFsICdjaGFyJyB2YXJpYWJsZXMgdG8gbm90CgkgICAgaW5jbHVkZSBhIHRlcm1pbmF0aW5nIHplcm8gYnl0ZSBpbiB0aGUgUEhQIHN0cmluZy4KCjA1LzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSB0eXBlbWFwcyBzbyB0aGF0IGNoYXIgKiBjYW4gYmUgYXBwbGllZCB0byB1bnNpZ25lZCBjaGFyICogb3Igc2lnbmVkIGNoYXIgKgogICAgICAgICAgICB0eXBlcyBhbmQgdmlzYSB2ZXJzYS4KCjA1LzAzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXVRoYW5rcyB0byBMdWtlIEogQ3Jvb2sgZm9yIHRoaXMgaWRlYS4KICAgICAgICAgICAgIC0gYSBzdHJ1Y3QvZW51bS91bmlvbiBpcyByZXBsYWNlZCB3aXRoIDpwb2ludGVyIG9ubHkgaWYKICAgICAgICAgICAgICAgdGhhdCBzbG90IGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0byB0aGF0IHR5cGUuIFNvLDogCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFfc3RydWN0IHsgaW50IHg7IH0gYW5kCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJfc3RydWN0IHsgYV9zdHJ1Y3Qgc3RydWN0XzE7IH07IAogICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBhczoKICAgICAgICAgICAgICAgICAgIChjZmZpOmRlZmNzdHJ1Y3QgYl9zdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdF8xIGFfc3RydWN0KSkKICAgICAgICAgICAgIC0gT3RoZXIgbWlub3IgZml4ZXMgaW4gbGlzcGlmeWluZyBuYW1lcy4KCjA1LzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwb3NzaWJsZSByZWRlZmluaXRpb24gb2YgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIGZvciBWQysrLgoKMDQvMTQvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCiAgICAgICAgICAgIFRoYW5rcyB0byBUaG9tYXMgV2VpZG5lciBmb3IgdGhlIHBhdGNoLgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBleHBvcnQgaXMgc2V0IChleHBvcnQgJ2ZvbykgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBldmVyeSBzeW1ib2wKICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW5saW5lIGlzIHNldCAoZGVjbGFpbSAoaW5saW5lIGZvbykpIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbnRlcm5fZnVuY3Rpb24gaXMgc2V0IAogICAgICAgICAgICAgICMuKHZhbHVlLW9mLWludGVybi1mdW5jdGlvbiAibmFtZSIgIm5vZGVUeXBlIiBwYWNrYWdlKQogICAgICAgICAgICAgIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGUgcGxhaW4gc3ltYm9sLiBBIHNhbXBsZSBzd2lnLWxpc3BpZnkgCiAgICAgICAgICAgICAgaXMgcHJvdmlkZWQuCiAgICAgICAgICAgIC0gZXZlcnkgc3ltYm9sIGlzIHByZWZpeGVkIGJ5IGl0J3MgcGFja2FnZS4KCjA0LzEzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQoJICAgIEZpeGVkIHRoZSBnZW5lcmF0aW9uIG9mIHdyYXBwZXJzIGZvciBnbG9iYWwgdmFyaWFibGVzLiAKICAgICAgICAgICAgQWRkZWQgdGhlIG9wdGlvbiBbbm9dc3dpZy1saXNwIHdoaWNoIHR1cm5zIG9uL29mZiBnZW5lcmF0aW9uIAogICAgICAgICAgICBvZiBjb2RlIGZvciBzd2lnIGhlbHBlciBsaXNwIG1hY3JvLCBmdW5jdGlvbnMsIGV0Yy4KClZlcnNpb24gMS4zLjI5IChNYXJjaCAyMSwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBvdXRwdXQgdHlwZW1hcCBvZiBjaGFyIHNvIGl0IHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluc3RlYWQKCSAgICBvZiBhbiBpbnRlZ2VyLiBBbHNvIGFkZHMgaW5wdXQvb3V0cHV0IHR5cGVtYXBzIGZvciAnY2hhciAqJy4KCgkgICAgYWRkIGNvbW1hbmQtbGluZSBhcmd1bWVudCAtaXNvbGF0ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKCSAgICBmaWxlIHRoYXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgU1dJRyBnZW5lcmF0ZWQgZmlsZXMgdGhhdAoJICAgIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgoKMDMvMjAvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIE1vcmUgdHdlYWtzIHRvIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCgkgICAgRml4IGNvbnN0YW50V3JhcHBlciBmb3IgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLgoKCSAgICBmaW5kLWRlZmluaXRpb24ga2V5YmluZGluZ3Mgc2hvdWxkIHdvcmsgaW4gRUxJL1NMSU1FLgoJICAgIE91dHB1dCAoaW4tcGFja2FnZSA8bW9kdWxlLW5hbWU+KSB0byBsaXNwIHdyYXBwZXIKCSAgICBpbnN0ZWFkIG9mIChpbi1wYWNrYWdlICMuKnN3aWctbW9kdWxlLW5hbWUqKS4KCgkgICAgc2xpZ2h0IHJld29yayBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgoKCSAgICBkb2MgdXBkYXRlcy4KCjAzLzE3LzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtYW5nbGUgbmFtZXMgb2YgY29uc3RhbnRzIGdlbmVyYXRlZCB2aWEgY29uc3RhbnRXcmFwcGVyLgoJICAgIAoJICAgIFdoZW4gdXNpbmcgT1VUUFVUIHR5cGVtYXBzIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgbm9uLXZvaWQKCSAgICByZXR1cm4gdmFsdWUsIGl0IHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgdmFsdWVzLWxpc3QsIGZvbGxvd2VkCgkgICAgYnkgdGhlIE9VVFBVVCBtYXBwZWQgdmFsdWVzLgoKCSAgICBGaXggYnVnIHdpdGggYm9vbGVhbiBwYXJhbWV0ZXJzLCB3aGljaCBuZWVkZWQgdG8gYmUKCSAgICBwYXNzZWQgaW4gYXMgaW50IHZhbHVlcywgcmF0aGVyIHRoYW4gVCBvciBOSUwuCgowMy8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgR2VuZXJhdGUgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyB3aGVuIGluIEMrKyBvciAtY3dyYXAgbW9kZS4KCSAgICBNYWtlIC1jd3JhcCB0aGUgZGVmYXVsdCwgc2luY2UgaXQgaXMgbW9zdCBjb3JyZWN0LiBVc2VycwoJICAgIGNhbiB1c2UgdGhlIC1ub2N3cmFwIG9wdGlvbiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSAuY3h4CgkgICAgZmlsZSB3aGVuIGludGVyZmFjaW5nIHRvIEMgY29kZS4KCgkgICAgV2hlbiBpbiAtbm9jd3JhcCBtb2RlLCBpbXByb3ZlIHRoZSBoYW5kbGluZyBvZiBjb252ZXJ0aW5nCiAJICAgIGluZml4IGxpdGVyYWxzIHRvIHByZWZpeCBub3RhdGlvbiBmb3IgbGlzcC4gVGhpcyBpcyB2ZXJ5CgkgICAgYmFzaWMgYW5kIG5vdCBsaWtlbHkgdG8gYmUgaW1wcm92ZWQgdXBvbiBzaW5jZSB0aGlzIG9ubHkKCSAgICBhcHBsaWVzIHRvIHRoZSAtbm9jd3JhcCBjYXNlLiBMaXRlcmFscyB3ZSBjYW4ndCBmaWd1cmUgb3V0CgkgICAgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGFuZCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgY29kZS4KCgkgICAgdmFsaWRJZGVudGlmaWVyIG5vdyBtb3JlIGNsb3NlbHkgYXBwcm94aW1hdGVzIHdoYXQgbWF5IGJlCgkgICAgYSBsZWdhbCBjb21tb24gbGlzcCBzeW1ib2wuCgoJICAgIEZpeCB0eXBlbWFwIGVycm9yIGluIGFsbGVncm9jbC5zd2cKCSAgICAKMDMvMTIvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCB1cCBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgkgICAgR2VuZXJhdGUgYysrIHN0eWxlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzdHJ1Y3QvdW5pb24gbWVtYmVycwoJICAgIHdoZW4gLWN3cmFwIG9wdGlvbiBzcGVjaWZpZWQuCgowMy8xMC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBDIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGxhc3QgYWxsZWdyb2NsCgkgICAgY29tbWl0LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIENvbW1pdCAjMTQ0NzMzNyAtIERlbGV0ZSBMb2NhbFJlZnMgYXQgdGhlIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIHRvIGZpeCBwb3RlbnRpYWwgbGVhawoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDQ0OTQ5IC0gY29uZmlndXJlIGRvZXMgbm90IGhvbm9yIC0tcHJvZ3JhbS1wcmVmaXguCiAgICAgICAgICAgIFJlbW92ZWQgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4LiBGaXggdGhlIGF1dG9jb25mIHN0YW5kYXJkCiAgICAgICAgICAgIG9wdGlvbnMgLS1wcm9ncmFtLXByZWZpeCBhbmQgLS1wcm9ncmFtLXN1ZmZpeCB3aGljaCB3ZXJlIGJlaW5nIHNob3duIGluIHRoZSBoZWxwLAogICAgICAgICAgICBidXQgd2VyZSBiZWluZyBpZ25vcmVkLiBVc2UgLS1wcm9ncmFtLXN1ZmZpeCBpbnN0ZWFkIG9mIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBub3cuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgRml4ICMxNDQ2MzE5IHdpdGggcGF0Y2ggZnJvbSBhbmRyZWFzdGggLSBtb3JlIHRoYW4gb25lIHdzdHJpbmcgcGFyYW1ldGVyIGluIGRpcmVjdG9yIG1ldGhvZHMKCjAzLzA3LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIAoJICAgIEZpeCBmb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgYSAiLSIgaW4gbm9uLSJzaGFkb3ciIG1vZGUuCgkgICAgUGF0Y2ggZnJvbSBBYXJvbiBWYW5EZXZlbmRlciAoIzE0NDE0NzQpLgoKMDMvMDQvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgLU8gdG8gdGhlIG1haW4gcHJvZ3JhbSwgd2hpY2ggbm93IGVuYWJsZXMgLWZhc3RkaXNwYXRjaAoJICAgIAoJICAgIFtQeXRob25dCgoJICAgIC0gQWRkIHRoZSAtZmFzdGluaXQgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgX19pbml0X18KICAgICAgICAgICAgICBtZXRob2RzLiBTZXR0aW5nICd0aGlzJyBhcyAnc2VsZi50aGlzLmFwcGVuZCh0aGlzKScgaW4gdGhlIHB5dGhvbgoJICAgICAgY29kZSBjb25mdXNlcyBQeUx1Y2VuZS4gTm93IHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQoJICAgICAgdGhlIEMrKyBzaWRlLCBhcyByZXBvcnRlZCBieSBBbmRpIGFuZCBSb2Jpbi4KCgkgICAgLSBBZGQgdGhlIC1mYXN0cXVlcnkgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgU1dJR19UeXBlUXVlcnkgdmlhIGEKICAgICAgICAgICAgICBweXRob24gZGljdCBjYWNoZSwgYXMgcHJvcG9zZWQgYnkgQW5kaSBWYWpkYQoKCSAgICAtIEF2b2lkIHRvIGNhbGwgUHlPYmplY3RfR2V0QXR0ciBpbnNpZGUgU1dJR19QeXRob25fR2V0U3dpZ1RoaXMsCgkgICAgICBzaW5jZSB0aGlzIGNvbmZ1c2VzIFB5THVjZW5lLCBhcyByZXBvcnRlZCBieSBBbmRpIFZhamRhLgoJICAgIAowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgUmVtb3ZlZCBleHRyYSAodm9pZCAqKSBjYXN0IHdoZW4gY2FzdGluZyBwb2ludGVycyB0byBhbmQgZnJvbSBqbG9uZyBhcyB0aGlzCiAgICAgICAgICAgIHdhcyBzdXBwcmVzc2luZyBnY2MncyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5nLiBUaGlzIHdhcm5pbmcgY291bGQgYmUgaWdub3JlZCBpbiB2ZXJzaW9ucyBvZiBnY2MgcHJpb3IgdG8gNC4wLCBidXQgbm93IHRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIHVzZWZ1bCBhcyBnY2MgLU8yIGFuZCBoaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBpbmNsdWRlcyAtZnN0cmljdC1hbGlhc2luZyB3aGljaAogICAgICAgICAgICBnZW5lcmF0ZXMgY29kZSB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlIGNhc3RzLiBUaGUgYXNzaWdubWVudCBpcyBzaW1wbHkgbmV2ZXIgbWFkZS4KICAgICAgICAgICAgUGxlYXNlIHVzZSAtZm5vLXN0cmljdC1hbGlhc2luZyB0byBib3RoIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCBmaXggdGhlIGJhZCBhc3NlbWJseQogICAgICAgICAgICBjb2RlIGdlbmVyYXRlZC4gTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IHRoZSBDIGNvbXBpbGVyLCBidXQgbm90CiAgICAgICAgICAgIHRoZSBDKysgY29tcGlsZXIsIHlldCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgYWxzbyBnZW5lcmF0ZSBicm9rZW4gY29kZS4gQWx0ZXJuYXRpdmVseSB1c2UgCiAgICAgICAgICAgIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIGZvciBnY2MtMy54LiBUaGUgdHlwZW1hcHMgYWZmZWN0ZWQKICAgICAgICAgICAgYXJlIHRoZSAiaW4iIGFuZCAib3V0IiB0eXBlbWFwcyBpbiBqYXZhLnN3ZyBhbmQgYXJyYXlzX2phdmEuc3dnLiBVc2VycyBvdWdodCB0byBmaXgKICAgICAgICAgICAgdGhlaXIgb3duIHR5cGVtYXBzIHRvIGRvIHRoZSBzYW1lLiBOb3RlIHRoYXQgcmVtb3ZhbCBvZiB0aGUgdm9pZCAqIGNhc3Qgc2ltcGx5IHByZXZlbnRzCiAgICAgICAgICAgIHN1cHByZXNzaW9uIG9mIHRoZSB3YXJuaW5nIGZvciB0aGUgQyBjb21waWxlciBhbmQgbm90aGluZyBlbHNlLiBUeXBpY2FsIGNoYW5nZToKCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkodm9pZCAqKSYkaW5wdXQ7ICV9CiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpJiRpbnB1dDsgJX0KCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSh2b2lkICopJiRyZXN1bHQgPSAkMTsgJX0gCiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkmJHJlc3VsdCA9ICQxOyAlfSAKCjAzLzAyLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0KCSAgICBBZGQgdHlwZW1hcHMgZm9yICJsb25nIGxvbmciOyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgaG93ZXZlciwgZGVwZW5kcwoJICAgIG9uIHRoZSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIEd1aWxlLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgaW5uZXIgZXhjZXB0aW9ucy4gSWYgYW55IG9mIHRoZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aGljaCBjb25zdHJ1Y3QKICAgICAgICAgICAgYSBwZW5kaW5nIGV4Y2VwdGlvbiBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZXhjZXB0aW9uLCBpdCB3aWxsIGNyZWF0ZSB0aGUgbmV3CiAgICAgICAgICAgIGV4Y2VwdGlvbiB3aXRoIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBhcyBhbiBpbm5lciBleGNlcHRpb24uCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBQaHA1IGV4Y2VwdGlvbnMgaWYgY29tcGlsaW5nIGFnYWluc3QgUGhwNSAocGF0Y2ggZnJvbSBPbGx5IEJldHRzKS4KCjAzLzAxLzIwMDY6IG1tYXR1cwoJICAgIFVzZSB0aGUgR0NDIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIFNXSUdFWFBPUlQuCgoJICAgIE5vdyB5b3UgY2FuIGNvbXBpbGUgKHdpdGggZ2NjIDMuNCBvciBsYXRlcikgdXNpbmcKCSAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iLgoJICAgIAoJICAgIENoZWNrIHRoZSBkaWZmZXJlbmNlIGZvciB0aGUgJ3N0ZF9jb250YWluZXJzLmknIHB5dGhvbiAKCSAgICB0ZXN0IGNhc2U6CiAKICAgICAgICAgICAgU2l6ZXM6CgoJICAgICAgMzMwNTQzMiBfc3RkX2NvbnRhaW5lcnMuc28KCSAgICAgIDIzODM5OTIgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBFeHBvcnRlZCBzeW1ib2xzIChubSAtRCA8ZmlsZT4uc28gfCB3YyAtbCk6CgogICAgICAgICAgICAgIDYxNDYgX3N0ZF9jb250YWluZXJzLnNvIAogICAgICAgICAgICAgIDE3NCAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbiAKCgkgICAgRXhjZWN1dGlvbiB0aW1lczoKCgkgICAgICByZWFsIDBtMC4wNTBzIHVzZXIgMG0wLjAzOXMgc3lzIDBtMC4wMDVzICAgX3N0ZF9jb250YWluZXJzLnNvCiAgICAgICAgICAgICAgcmVhbCAwbTAuMDM5cyB1c2VyIDBtMC4wMjZzIHN5cyAwbTAuMDA3cyAgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgUmVhZCBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuCgoKMDIvMjcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBzdXBwb3J0IGZvciBJTlBVVCwgT1VUUFVULCBhbmQgSU5PVVQgdHlwZW1hcHMuCgkgICAgRm9yIE9VVFBVVCB2YXJpYWJsZXMsIHRoZSBsaXNwIHdyYXBwZXIgcmV0dXJucyBtdWx0aXBsZQoJICAgIHZhbHVlcy4KCjAyLzI2LzIwMDY6IG1tYXR1cwoKCSAgICBbUnVieV0gYWRkIGFyZ2Nhcmd2LmkgbGlicmFyeSBmaWxlLgoJICAgIAoJICAgIFVzZSBpdCBhcyBmb2xsb3c6CgoJCSVpbmNsdWRlIGFyZ2Nhcmd2LmkKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWFwcGx5IChpbnQgQVJHQywgY2hhciAqKkFSR1YpIHsgKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgfSAKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWlubGluZSB7CQkJCQogICAJICAgICAgICAgIGludCBtYWluQXBwKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgCQogICAJICAgICAgICAgIHsJCQkJCQkKICAgCSAgICAgICAgICAgIHJldHVybiBhcmdjOwkJCQkJCiAgIAkgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQkJCQkJCQkKCSAgICAgIAkJCQkJCQkKICAgCSAgICB0aGVuIGluIHRoZSBydWJ5IHNpZGU6CQkJCQkKCSAgICAgIAkJCQkJCQkJCiAgIAkgICAgICAgIGFyZ3MgPSBbImFzZGYiLCAiYXNkZjIiXQkJCQkKICAgCSAgICAgICAgbiA9IG1haW5BcHAoYXJncyk7CgkKCgkgICAgVGhpcyBpcyB0aGUgc2ltaWxhciB0byB0aGUgcHl0aG9uIHZlcnNpb24gTGliL3B5dGhvbi9hcmdjYXJndi5pCgowMi8yNC8yMDA2OiBtZ29zc2FnZQoKCSAgICBTbWFsbCB1cGRhdGUgTHVhIGRvY3VtZW50cyBvbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMKCSAgICAKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBGaXggYWxsIHRoZSBlcnJvcnMgcmVwb3J0ZWQgZm9yIDEuMy4yOC4KCSAgICAtIGZpeCBidWcgIzExNTgxNzgKCSAgICAtIGZpeCBidWcgIzEwNjA3ODkKCSAgICAtIGZpeCBidWcgIzEyNjM0NTcKCSAgICAtIGZpeCAnY29uc3QgIGNoYXIqJicgdHlwZW1hcCBpbiB0aGUgVVRMLCByZXBvcnRlZCBieSBHZW9mZiBIdXRjaGlzb24KCSAgICAtIGZpeGVzIGZvciBweXRob24gMi4xIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5CgkgICAgLSBmaXggY29weWN0b3IgKyB0ZW1wbGF0ZSBidWcgIzE0MzIxMjUKCSAgICAtIGZpeCBbIDE0MzIxNTIgXSAlcmVuYW1lIGZyaWVuZCBvcGVyYXRvcnMgaW4gbmFtZXNwYWNlCgkgICAgLSBmaXggZ2NjIHdhcm5pbmcgcmVwb3J0ZWQgYnkgUi4gQmVybnN0ZWluCgkgICAgLSBhdm9pZCBhc3NlcnQgd2hlbiBmaW5kaW5nIGEgcmVjdXJzaXZlIHNjb3BlIGluaGVyaXRhbmNlLAoJICAgICAgZW1pdCBhIHdhcm5pbmcgaW4gdGhlIHdvcnN0IGNhc2UsIHJlcG9ydGVkIGJ5IE5pdHJvIAoJICAgIC0gZml4IHByZW1hdHVyZSBvYmplY3QgZGVsZXRpb24gcmVwb3J0ZWQgYnkgUGF1bCBpbiB0Y2wzZAoJICAgIC0gZml4IHdhcm5pbmcgcmVwb3J0ZWQgYnkgTml0cm8gaW4gVkM3CgkgICAgLSBtb3JlIGZpeGVzIGZvciBvbGQgU29sYXJpcyBjb21waWxlcgoJICAgIC0gZml4IGZvciBweXRob24gMi4zIGFuZCBnY19yZWZzIGlzc3VlIHJlcG9ydGVkIGJ5IEx1aWdpCgkgICAgLSBmaXggZmFzdHByb3h5IGZvciBtZXRob2RzIHVzaW5nIGt3YXJncwoJICAgIC0gZml4IG92ZXJsb2FkICsgcHJvdGVjdGVkIG1lbWJlciBpc3N1ZSByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IHNldGVycm9ybXNnIGFzIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggZGlyZWN0b3JzLCBub3cgdGhlIHRlc3Qtc3VpdGUgcnVucyBhZ2FpbiB1c2luZyAtZGlyZWN0b3JzCgkgICAgLSBmaXggZm9yIGZyaWVuZCBvcGVyYXRvciBhbmQgVmlzdWFsIHN0dWRpbyBhbmQgYnVnIDE0MzIxNTIKCSAgICAtIGZpeCBidWcgIzE0MzUwOTAKCSAgICAtIGZpeCB1c2luZyArICVleHRlbmQgYXMgcmVwb3J0ZWQgYnkgV2lsbGlhbQoJICAgIC0gZml4IGJ1ZyAjMTA5NDk2NAoJICAgIC0gZml4IGZvciBQeV9Ob3RJbXBsZW1lbnRlZCBhcyByZXBvcnRlZCBieSBPbGx5IGFuZCBBbWF1cnkKCSAgICAtIGZpeCBuZXN0ZWQgbmFtZXNwYWNlIGlzc3VlIHJlcG9ydGVkIGJ5IENoYXJsaWUKCgkgICAgYW5kIGFsc286CgkgICAgCgkgICAgLSBhbGxvdyBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycyBieSBkZWZhdWx0CgkgICAgLSBkZWxldGUgZXh0cmEgbmV3IGxpbmVzIGluIHN3aWdtYWNyb3NbVVRMXQoJICAgIC0gY29zbWV0aWMgZm9yIGdlbmVyYXRlZCBweXRob24gY29kZQoJICAgIC0gYWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgVVRMCgkgICAgLSBhZGQgc3dpZ3JlZ2lzdGVyIHByb3h5IG1ldGhvZCBhbmQgbW92ZSBfX3JlcHJfXyB0byBhCgkgICAgICBzaW5nbGUgZ2xvYmFsIG1vZHVsZSAgW3B5dGhvbl0KCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgV2hlbiB1c2luZyBkaXJlY3RvcnMsIG5vdyBzd2lnIHdpbGwgZW1pdCBhbGwgdGhlIHZpcnR1YWwKCSAgICBwcm90ZWN0ZWQgbWV0aG9kcyBieSBkZWZhdWx0LiAKCgkgICAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSBuZWVkZWQgdG8gdXNlIHRoZSAnZGlycHJvdCcKCSAgICBvcHRpb24gdG8gYWNoZWl2ZSB0aGUgc2FtZS4KCgkgICAgSWYgeW91IHdhbnQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgbmV3IGRlZmF1bHQgYmVoYXZpb3VyLAoJICAgIHVzZSB0aGUgJ25vZGlycHJvdCcgb3B0aW9uOiAKCgkgICAgICAgc3dpZyAtbm9kaXJwcm90IC4uLgoKCSAgICBhbmQvb3IgdGhlICVub2RpcmVjdG9yIGZlYXR1cmUgZm9yIHNwZWNpZmljIG1ldGhvZHMsIGkuZS46CgoJICAgICAgICVub2RpcmVjdG9yIEZvbzo6YmFyOwoKCSAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICAgIHZpcnR1YWwgfkZvbygpOwoKCSAgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKCk7CgkgICAgICAgfTsKCSAgICAKCgkgICAgQXMgYmVmb3JlLCBwdXJlIGFic3RyYWN0IHByb3RlY3RlZCBtZW1iZXJzIGFyZSBhbGx3YXlzCgkgICAgZW1pdHRlZCwgaW5kZXBlbmRlbnQgb2YgdGhlICdkaXJwcm90L25vZGlycHJvdCcgb3B0aW9ucy4KCgowMi8yMi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBsYW5ndWFnZXMgdXNpbmcgdGhlIFVUTCAocHl0aG9uLHRjbCxydWJ5LHBlcmwpLgoJICAgIAogICAgICAgICAgICBmYWN0b3J5LmkgaW1wbGVtZW50cyBhIG1vcmUgbmF0dXJhbCB3cmFwIGZvciBmYWN0b3J5IG1ldGhvZHMuIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmU6CQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKICAJICAgICAgICAgc3RydWN0IEdlb21ldHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICAgIGVudW0gR2VvbVR5cGV7CQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgICAgICBQT0lOVCwJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAgIENJUkNMRQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIH5HZW9tZXRyeSgpIHt9ICAgIAkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIGludCBkcmF3KCkgPSAwOwkJCQkgICAgCiAgCSAgICAJIAkJCQkJCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgIAkgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgICAgc3RhdGljIEdlb21ldHJ5ICpjcmVhdGUoR2VvbVR5cGUgaSk7ICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBQb2ludCA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMTsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgd2lkdGgoKSB7IHJldHVybiAxLjA7IH0gICAgCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgQ2lyY2xlIDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAyOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSByYWRpdXMoKSB7IHJldHVybiAxLjU7IH0gICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgIH07IAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlKEdlb21UeXBlIHR5cGUpIHsJCSAgICAKICAJICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgUE9JTlQ6IHJldHVybiBuZXcgUG9pbnQoKTsJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIENJUkNMRTogcmV0dXJuIG5ldyBDaXJjbGUoKTsgCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICB9CQkJCQkgICAgCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgWW91IGNhbiB1c2UgdGhlICVmYWN0b3J5IHdpdGggdGhlIEdlb21ldHJ5OjpjcmVhdGUgbWV0aG9kIGFzIGZvbGxvd3M6CgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICVuZXdvYmplY3QgR2VvbWV0cnk6OmNyZWF0ZTsJCQkJICAgIAogIAkgICAgICAlZmFjdG9yeShHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZSwgUG9pbnQsIENpcmNsZSk7CSAgICAKICAJICAgICAgJWluY2x1ZGUgImdlb21ldHJ5LmgiCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICBhbmQgR2VvbWV0cnk6OmNyZWF0ZSB3aWxsIHJldHVybiBhICdQb2ludCcgb3IgJ0NpcmNsZScgaW5zdGFuY2UgICAKICAJICAgIGluc3RlYWQgb2YgdGhlIHBsYWluICdHZW9tZXRyeScgdHlwZS4gRm9yIGV4YW1wbGUsIGluIHB5dGhvbjoJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICBjaXJjbGUgPSBHZW9tZXRyeS5jcmVhdGUoR2VvbWV0cnkuQ0lSQ0xFKQkJCSAgICAKICAJICAgICAgciA9IGNpcmNsZS5yYWRpdXMoKQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIHdoZXJlICdjaXJjbGUnIG5vdyBpcyBhIENpcmNsZSBwcm94eSBpbnN0YW5jZS4JICAgIAkJICAgIAoKCjAyLzE3LzIwMDY6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IGFjY2VwdCB0aGUgZnVsbCByYW5nZSBvZiBpbnRlZ3JhbAoJICAgIHZhbHVlcywgYW5kIHRoZXkgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgkgICAgW0d1aWxlXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUKCSAgICB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoKMDIvMTMvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0RvY3VtZW50c10gdXBkYXRlZCB0aGUgZXh0ZW5kaW5nIGRvY3VtZW50cyB0byBnaXZlIGEgc2tlbGV0b24gc3dpZ2dpbmcgY29kZQogICAgICAgICAgICB3aXRoIGEgZmV3IHR5cGVtYXBzLgogICAgICAgICAgICBbTHVhXSBhZGRlZCBhbiBleHRyYSB0eXBlbWFwIGZvciB2b2lkKiBbaW5dLCBzbyBhIGZ1bmN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgdm9pZCoKICAgICAgICAgICAgY2FuIHRha2UgYW55IGtpbmQgb2YgcG9pbnRlcgoKVmVyc2lvbiAxLjMuMjggKEZlYnJ1YXJ5IDEyLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBGaXggbWFueSBpc3N1ZXMgd2l0aCBsaW5lIGNvdW50aW5nIGFuZCBlcnJvciByZXBvcnRzLgoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQmV0dGVyIHN0YXRpYyBkYXRhIG1lbWJlciBzdXBwb3J0LCBpZiB5b3UgaGF2ZQoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4gbm93IGlzIHZhbGlkIHRvIGFjY2VzcyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyLCBpZToKCiAgICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICAgIGYuYmFyID0gMwoKCSAgICBqdXN0IGFzIGluIEMrKy4KCgowMi8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0KICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHRvIHdvcmsgYWdhaW4gd2l0aCBvbGQgdmVyc2lvbnMgb2YgUGVybAogICAgICAgICAgICAoNS4wMDQgYW5kIGxhdGVyIHRlc3RlZCkKCjAyLzA0LzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyKCkgZGlyZWN0aXZlIHRvIGV4dGVuZAoJICAgIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IGluIHB5dGhvbi4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHNtYXJ0IHBvaW50ZXIgYXM6CgkgICAgCgkgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgUkNQdHIgewoJICAgICAgcHVibGljOgoJICAgICAgICAuLi4KCSAgICAgICAgUkNQdHIoVHlwZSAqcCk7CgkJVHlwZSAqIG9wZXJhdG9yLT4oKSBjb25zdDsKCQkuLi4KCSAgICAgIH07CgkgICAgICAKCSAgICB5b3UgdXNlIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgZGlyZWN0aXZlIGFzOgoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSAgUkNQdHI8QT47CgkgICAgCgkgICAgdGhlbiwgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgUkNQdHI8QT4gbWFrZV9wdHIoKTsKCSAgICAgIGludCBmb28oQSAqKTsKCgkgICAgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgoKCSAgICAgIGEgPSBtYWtlX3B0cigpOwoJICAgICAgYiA9IGZvbyhhKTsKCiAgICAgICAgICAgIGllLCBzd2lnIHdpbGwgYWNjZXB0IGEgUkNQdHI8QT4gb2JqZWN0IHdoZXJlIGEgJ0EgKicgaXMKICAgICAgICAgICAgZXhwZWN0ZWQuCgoJICAgIEFsc28sIHdoZW4gdXNpbmcgdmVjdG9ycwoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSBSQ1B0cjxBPjsKCSAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfQSkgc3RkOjp2ZWN0b3I8UkNQdHI8QT4gPjsKCQkKCSAgICB5b3UgY2FuIHR5cGUKCgkgICAgICBhID0gQSgpOwoJICAgICAgdiA9IHZlY3Rvcl9BKDIpCgkgICAgICB2WzBdID0gYQoKICAgICAgICAgICAgaWUsIGFuICdBIConIG9iamVjdCBpcyBhY2NlcHRlZCwgdmlhIGltcGxpY2l0IGNvbnZlcnNpb24sIAoJICAgIHdoZXJlIGEgUkNQdHI8QT4gb2JqZWN0IGlzIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHkKCgkgICAgICB4ID0gdlswXQoKCSAgICByZXR1cm5zIChhbmQgc2V0cyAneCcgYXMpIGEgY29weSBvZiB2WzBdLCBtYWtpbmcgcmVmZXJlbmNlCgkgICAgY291bnRpbmcgcG9zc2libGUgYW5kIGNvbnNpc3RlbnQuCgoJICAgICVleHRlbmRfc21hcnRfcG9pbnRlciBpcyBqdXN0IGEgY29sbGVjdGlvbnMgb2YgbmV3L29sZAoJICAgIHRyaWNrcywgaW5jbHVkaW5nICV0eXBlbWFwcyBhbmQgdGhlIG5ldyAlaW1wbGljaXRjb252CgkgICAgZGlyZWN0aXZlLgoKMDIvMDIvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgYnVnZml4ICMxMzU2NTc3LCBjaGFuZ2VkIGRvdWJsZT0+bHVhX251bWJlciBpbiBhIGZldyBwbGFjZXMuCiAgICAgICAgICAgIGFkZGVkIHRoZSBzdGQ6OnBhaXIgd3JhcHBpbmcKCjAxLzMwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFuZCBzdGQ6OndzdHJpbmcgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBub3cgdXNlCiAgICAgICAgICAgICVuYXR1cmFsdmFyIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhleSB3aWxsIG5vdyBiZSB3cmFwcGVkIGFzIGV4cGVjdGVkIGluIGFsbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlc2Ugd2VyZSB3cmFwcGVkIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIHRhcmdldCBsYW5ndWFnZSBzdHJpbmcuCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB0byB3cmFwIHRoZXNlIGFzIHN0cmluZ3M6CgoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjAxLzI4LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gCgkgICAgQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgowMS8yNC8yMDA2OiBtbWF0dXMKCSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB0aGUgJW5hdHVyYWx2YXIgZGlyZWN0aXZlLCBub3cgaXQKCSAgICAgIHdvcmtzIHdpdGggdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXMgd2VsbCBhcwoJICAgICAgSmF2YS9DIy4KCSAgICAgIAoJICAgICAgTm93LCBpdCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGNsYXNzIHR5cGVzOgoKCSAgICAgICAgJW5hdHVyYWx2YXIgc3RkOjpzdHJpbmc7CgkgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CgkgICAgICAKICAgICAgICAgICAgICB0aGF0IHdpbGwgdGVsbCBzd2lnIHRvIHVzZSB0aGUgdGhlICduYXR1cmFsJyB3cmFwcGluZwogICAgICAgICAgICAgIG1lY2hhbmlzbSB0byBhbGwgc3RkOjpzdHJpbmcgZ2xvYmFsIGFuZCBtZW1iZXIKICAgICAgICAgICAgICB2YXJpYWJsZXMuCgoJICAgIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSAlYWxsb3dleGNlcHQgZmVhdHVyZSBhbG9uZyB0aGUKICAgICAgICAgICAgICBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCB3aGljaCBhbGxvd3MgdGhlICVleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHZhcmlhYmxlIGFjY2VzcyBtZXRob2RzLiBBbHNvLCBhZGQKICAgICAgICAgICAgICB0aGUgJWV4Y2VwdGlvbnZhciBkaXJlY3RpdmUgdG8gc3BlY2lmeSBhIGRpc3RpbnRpYwogICAgICAgICAgICAgIGV4Y2VwdGlvbiBtZWNoYW5pc20gb25seSBmb3IgdmFyaWFibGVzLgoJICAgICAgCgkgICAgCgkgICAgLSBBZGQgbW9yZSBkb2NzIGZvciB0aGUgJWRlbG9iamVjdCBkaXJlY3RpdmUgdG8gbWFyayBhIG1ldGhvZCBhcyBhCgkgICAgICBkZXN0cnVjdG9yLCAnZGlzb3duaW5nJyB0aGUgZmlyc3QgYXJndW1lbnQuIEZvciBleGFtcGxlOgoKCSAgICAgICAgJW5ld29iamVjdCBjcmVhdGVfZm9vOwoJICAgICAgICAlZGVsb2JqZWN0IGRlc3Ryb3lfZm9vOwoKCSAgICAgICAgRm9vICpjcmVhdGVfZm9vKCkgeyByZXR1cm4gbmV3IEZvbygpOyB9CgkgICAgICAgIHZvaWQgZGVzdHJveV9mb28oRm9vICpmb28pIHsgZGVsZXRlIGZvbzsgfQoKCSAgICAgIG9yIGluIGEgbWVtYmVyIG1ldGhvZCBhczoKCgkgICAgICAgICVkZWxvYmplY3QgRm9vOjpkZXN0cm95OwoKCSAgICAgICAgY2xhc3MgRm9vIHsKCSAgICAgICAgcHVibGljOgoJICAgICAgICAgIHZvaWQgZGVzdHJveSgpIHsgZGVsZXRlIHRoaXM7fQoKCSAgICAgICAgcHJpdmF0ZToKCSAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgIH07CgoKMDEvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICAtIFJlbW92ZWQgdGhlIHR5cGUgc3dpZ19sdWFfY29tbWFuZF9pbmZvICYgcmVwbGFjZSB3aXRoIGx1YUxfcmVnCgkgICAgICAod2hpY2ggdGhlbiBicm9rZSB0aGUgY29kZSksIGZpeGVkIHRoaXMKCSAgICAtIGFkZGVkIGFuIGFkZGl0aW9uYWwgY2FzdCBpbiB0aGUgdHlwZW1hcHMgZm9yIGVudW0ncwoJICAgICAgZHVlIHRvIHRoZSBpc3N1ZSB0aGF0IFZDLk5ldCB3aWxsIG5vdCBhbGxvdyBjYXN0aW5nIG9mCgkgICAgICBhIGRvdWJsZSB0byBhbiBlbnVtIGRpcmVjdGx5LiBUaGVyZWZvcmUgY2FzdCB0byBpbnQgdGhlbiB0byBlbnVtCgkgICAgICAodGhhbmtzIHRvIEphc29uIFJlZ28gZm9yIHRoaXMgb2JzZXJ2YXRpb24pCgowMS8xNi8yMDA2OiBtbWF0dXMgKENoYW5nZSBkaXNhYmxlZC4uLiB3aWxsIGJlIGJhY2sgaW4gQ1ZTIHNvb24pCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgcmVnZXhwIHZpYSB0aGUgZXh0ZXJuYWwgbGlicmFyeQoJICAgIFJ4U3BlbmNlci4gU1dJRyBkb2Vzbid0IHJlcXVpcmUgdGhpcyBsaWJyYXJ5IHRvIGNvbXBpbGUKCSAgICBhbmQvb3IgcnVuLiBCdXQgaWYgeW91IHNwZWNpZnkgLS13aXRoLXJ4c3BlbmNlciwgYW5kIHRoZQoJICAgIGxpYnJhcnkgaXMgZm91bmQgZHVyaW5nIGluc3RhbGxhdGlvbiwgdGhlbiBzd2lnIHdpbGwgdXNlCgkgICAgaXQgaW4gdGhyZWUgcGxhY2VzOgoKCSAgICAtIEluICVyZW5hbWVzIHJ1bGVzLCB2aWEgdGhlIG5ldyByeHNtYXRjaCBydWxlcywgZm9yIGV4YW1wbGU6CgkgICAgCSAgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRuYW1lPSJHU0xfLioiKSAiIjsKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5vZGVUeXBlPSJlbnVtIEdTTF8uKiIpICIiOwoJICAgIAkgCiAgICAgICAgICAgICAgcnhzbWF0Y2ggaXMgc2ltaWxhciB0byB0aGUgbWF0Y2ggcnVsZSwgaXQganVzdCB1c2VzCiAgICAgICAgICAgICAgdGhlIFJ4U3BlbmNlciByZWdleHAgbGlicmFyeSB0byBkZWNpZGUgaWYgdGhlcmUgaXMgYQogICAgICAgICAgICAgIG1hdGNoIHdpdGggdGhlIHByb3ZpZGVkIHJlZ2V4cC4gQXMgd2l0aCB0aGUgbWF0Y2gKICAgICAgICAgICAgICBydWxlLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBuZWdhdGUgcnVsZSBub3RyeHNtYXRjaC4KCgkgICAgLSBJbiB0aGUgJXJlbmFtZSB0YXJnZXQgbmFtZSB2aWEgdGhlIHJ4c3RhcmdldCBvcHRpb24sIGZvciBleGFtcGxlOgoJICAgIAkJIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzdGFyZ2V0PTEpICJHU0xfLioiOwoKCSAgICAJd2hlcmUgdGhlIHRhcmdldCBuYW1lICJHU0wuKiIgaXMgbm93IHVuZGVyc3Rvb2QgYXMgYQoJICAgIAlyZWdleHAgdG8gYmUgbWF0Y2hlZC4gIAoJICAgIAkgCiAgICAgICAgICAgIC0gSW4gdGhlIG5ldyBlbmNvZGVyICJyeHNwZW5jZXIiLCB3aGljaCBsb29rcyBsaWtlOgoKCSAgICAJICAlKHJ4c3BlbmNlcjpbcmVnZXhwXVtyZXBsYWNlXSlzCgoJICAgIAl3aGVyZSAicmVnZXhwIiBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCAicmVwbGFjZSIKCSAgICAJaXMgYSBzdHJpbmcgdXNlZCBhcyBhIHJlcGxhY2VtZW50LCB3aGVyZSB0aGUgQDAsQDEsLi4uLEA5CgkgICAgCXBzZXVkbyBhcmd1bWVudHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZQoJICAgIAljb3JyZXNwb25kaW5nIG1hdGNoaW5nIGl0ZW1zIGluIHRoZSByZWcgZXhwcmVzc2lvbi4KCgkgICAgCUZvciBleGFtcGxlOgoJICAgIAkJICAgICAgCgkgICAgICAgICUocnhzcGVuY2VyOltHU0wuKl1bQDBdKXMgICAgICAgPC0gSGVsbG8gICAgLT4gCgkgICAgICAgICUocnhzcGVuY2VyOltHU0wuKl1bQDBdKXMgICAgICAgPC0gR1NMSGVsbG8gLT4gR1NMSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW0AxXSlzICAgICA8LSBHU0xIZWxsbyAtPiBIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bZ3NsQDFdKXMgIDwtIEdTTEhlbGxvIC0+IGdzbEhlbGxvCgoJICAgIAlBbm90aGVyIGV4YW1wbGUgY291bGQgYmU6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJShsb3dlcmNhc2UpcyIsc291cmNlZm10PSIlKHJ4c3BlbmNlcjpbR1NMXyguKildW0AxXSlzIiwlJGlzZnVuY3Rpb24pICIiOwoKCSAgICAJd2hpY2ggdGFrZSBvdXQgdGhlIHByZWZpeCAiR1NMXyIgYW5kIHJldHVybnMgYWxsIHRoZQoJICAgIAlmdW5jdGlvbiBuYW1lcyBpbiBsb3dlciBjYXNlcywgYXMgZm9sbG93aW5nOgoKCSAgICAJICAgIHZvaWQgR1NMX0hlbGxvKCk7ICAgLT4gICBoZWxsbygpOwoJICAgIAkgICAgdm9pZCBHU0xfSGkoKTsgICAgICAtPiAgIGhpKCk7CgkgICAgCSAgICBjb25zdCBpbnQgR1NMX01BWDsgIC0+ICAgR1NMX01BWDsgIC8vIG5vIGNoYW5nZSwgaXMgbm90IGEgZnVuY3Rpb24KCQoJICAgIFdlIHVzZSB0aGUgUnhTcGVuY2VyIGFzIGFuIGluaXRpYWwgdGVzdCBiZWQgdG8KICAgICAgICAgICAgaW1wbGVtZW50aW9uIHdoaWxlIHdlIGRlY2lkZSB3aGljaCBsaWJyYXJ5IHdpbGwgYmUKICAgICAgICAgICAgZmluYWxseSBhZGRlZCB0byBzd2lnLgoKICAgICAgICAgICAgWW91IGNhbiBvYnRhaW4gdGhlIFJ4U3BlbmNlciBsaWJyYXJ5IGZyb20gCgkgICAgCgkgICAgICBodHRwOi8vYXJnbGlzdC5jb20vcmVnZXggKFVuaXgpCgoJICAgIG9yCgkgICAgIAoJICAgICAgaHR0cDovL2dudXdpbjMyLnNvdXJjZWZvcmdlLm5ldC9wYWNrYWdlcy5odG1sIChXaW5kb3dzKQoKCSAgICBPbmNlIGluc3RhbGxlZCwgdXNlICJtYW4gcnhzcGVuY2VyIiB0byBnZXQgbW9yZSBpbmZvCgkgICAgYWJvdXQgdGhlIHJlZ2V4cCBmb3JtYXQsIG9yIGp1c3QgZ29vZ2xlIHJ4c3BlbmNlci4KCgkgICAgU2luY2Ugbm93IHlvdSBjYW4gZW5hYmxlIHRoZSByeHNtYXRjaCBydWxlcyAoc2VlIGFib3ZlKSwKICAgICAgICAgICAgdGhlIHNpbXBsZSBvciAnfCcgc3VwcG9ydCBmb3IgdGhlIG1hdGNoIHJ1bGVzCiAgICAgICAgICAgICgwMS8xMi8yMDA2OiBtbWF0dXMpIGlzIGRpc2FibGVkLiBTdGlsbCwgaWYgeW91IGhhdmUKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCB0aGUgcnhzcGVuY2VyIGxpYnJhcnksIHlvdSBjYW4gcmUtZW5hYmxlCiAgICAgICAgICAgIHRoZSBzaW1wbGUgJ21hdGNoIG9yJyBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgIC1EU1dJR19VU0VfU0lNUExFX01BVENIT1IuCgkgIAoKMDEvMTYvMjAwNjogbW1hdHVzCgkgICAgQ2hhbmdlIHRoZSAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gdXNlIHRoZSBwcmVmaXggJyUkJywgYXMgaW46CgkgICAgCgkgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIiwlJGlzZnVuY3Rpb24sJSRpc21lbWJlcikgIiI7IAoJICAgCQogICAgICAgICAgICB0byBhdm9pZCBjbGFzaGluZ3Mgd2l0aCBvdGhlciBzd2lnIG1hY3Jvcy9kaXJlY3RpdmVzLgoKMDEvMTQvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIFJ1YnkgYmFuZyEgbWV0aG9kcyB2aWEgYSBuZXcgJWJhbmcgZmVhdHVyZS4KCSAgICBCYW5nIG1ldGhvZHMgZW5kIGluIGV4Y2xhbWF0aW9uIHBvaW50cyBhbmQgaW5kaWNhdGUgdGhhdCB0aGUKCSAgICBvYmplY3QgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgYmUgbW9kaWZpZWQgaW4tcGxhY2UgYXMgCgkgICAgb3Bwb3NlZCB0byBiZWluZyBjb3BpZWQuCgowMS8xMi8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgVXBkYXRlZCB0aGUgUnVieSBtb2R1bGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0CgkgICAgbWV0aG9kIG5hbWVzIHRvIGxvd2VyX2Nhc2Vfd2l0aF91bmRlcnNjb3JlcyB1c2luZyB0aGUKCSAgICBuZXcgJXJlbmFtZSBmdW5jdGlvbmFsaXR5LgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgYWxpYXNlcyBmb3IgJ2Nhc2UnIGVuY29kZXJzIHVzZWQgd2l0aCAlcmVuYW1lLyVuYW1ld2FybgoKCSAgICAgICUodXBwZXJjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIRUxMT19XT1JMRAoJICAgICAgJShsb3dlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvd29ybGQKCSAgICAgICUoY2FtZWxjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIZWxsb1dvcmxkCgkgICAgICAlKHVuZGVyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG9fd29ybGQKCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgLWR1bXBfcGFyc2VfbW9kdWxlIGFuZCAtZHVtcF9wYXJzZV90b3Agb3B0aW9ucywKCSAgICB3aGljaCBhcmUgc2ltaWxhciB0byAtZHVtcF9tb2R1bGUgYW5kIC1kdW1wX3RvcCwgYnV0IHRoZXkKCSAgICBkdW1wIHRoZSBub2RlIHRyZWVzIGp1c3QgYWZ0ZXIgcGFyc2luZywgc2hvd2luZyBvbmx5IHRoZSAKCSAgICBhdHRyaWJ1dGVzIHZpc2libGUgYXQgdGhlIHBhcnNpbmcgc3RhZ2UsIGFuZCBub3QgdGhlIGFkZGVkCgkgICAgbGF0ZXIgaW4gdHlwZW1hcC5jeHgsIGFsbG9jYXRlLmN4eCwgbGFuZy5jeHggb3IgZWxzZXdoZXJlLgoJICAgIAoJICAgIEJlc2lkZXMgZGVidWdnaW5nIHBvcnB1c2VzLCB0aGVzZSBvcHRpb25zIGFyZSB2ZXJ5IHVzZWZ1bAoJICAgIGlmIHlvdSBwbGFuIHRvIHVzZSAlcmVuYW1lIGluIGFuICJhZHZhbmNlIHdheSIsIHNpbmNlIGl0CgkgICAgc2hvd3Mgb25seSBhbmQgYWxsIHRoZSBub2RlJ3MgYXR0cmlidXRlcyB5b3UgY2FuIHVzZQoJICAgIGluc2lkZSB0aGUgbWF0Y2ggcnVsZXMuCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgcHJlZGljYXRlcyB0byAlcmVuYW1lLCBzbywgeW91IGRvbid0IG5lZWQgdG8KCSAgICAgIHJlbWVtYmVyLCBmb3IgZXhhbXBsZSwgaG93IHRvIG1hdGNoIGEgbWVtYmVyIGZ1bmN0aW9uLgoKCSAgICAgIE5vdyBpdCBpcyBlYXN5LCBmb3IgZXhhbXBsZSB0byB1c2UgdGhlICd1dGl0bGUnIGVuY29kZXIgCgkgICAgICBpbiBhbGwgdGhlIG1lbWJlciBtZXRob2RzLCB5b3UgdHlwZToKCgkgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCVpc2Z1bmN0aW9uLCVpc21lbWJlcikgIiI7CgoJICAgICAgb3IgdG8gaWdub3JlIGFsbCB0aGUgZW51bWl0ZW1zIGluIGEgZ2l2ZW4gY2xhc3M6CgoJICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgJWlzZW51bWl0ZW0sICVjbGFzc25hbWU9Ik15Q2xhc3MiKSAiIjsgIAoKCSAgICAgIEF2YWlsYWJsZSBwcmVkaWNhdGVzIGFyZSAoc2VlIHN3aWcuc3dnKToKCiAgICAgICAgICAgICAgICAlaXNlbnVtICAgICAgICAgCgkJJWlzZW51bWl0ZW0gICAgIAoJCSVpc2FjY2VzcyAgICAgICAKCQklaXNjbGFzcyAgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNjb25zdHJ1Y3RvciAgCgkJJWlzZGVzdHJ1Y3RvciAgIAoJCSVpc25hbWVzcGFjZSAgICAKCQklaXN0ZW1wbGF0ZSAgICAgCgkJJWlzY29uc3RhbnQgICAgIAoJCQkJCQoJCSVpc3VuaW9uICAgICAgICAKCQklaXNmdW5jdGlvbiAgICAgCgkJJWlzdmFyaWFibGUgICAgIAoJCSVpc2ltbXV0YWJsZSAgICAKCQkJCQkKCQklaXNzdGF0aWMgICAgICAgCgkJJWlzZnJpZW5kICAgICAgIAoJCSVpc3R5cGVkZWYgICAgICAKCQklaXN2aXJ0dWFsICAgICAgCgkJJWlzZXhwbGljaXQgICAgIAoJCSVpc2V4dGVybiAgICAgICAKCQkJCQkKCQklaXNtZW1iZXIgICAgICAgCgkJJWlzZ2xvYmFsIAoJCSVpbm5hbWVzcGFjZQoKCQklaXNwdWJsaWMgICAgCgkJJWlzcHJvdGVjdGVkIAoJCSVpc3ByaXZhdGUgICAKCQkJCSAgICAgCgkJJWNsYXNzbmFtZSAgIAoKICAgICAgICAgICAgICBUaGVzZSBwcmVkaWNhdGVzIGNvcnJlc3BvbmQgdG8gc3BlY2lmaWMgJ21hdGNoJwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywgd2hpY2ggc29tZXRpbWVzIGFyZSBub3QgYXMgZXZpZGVudCBhcyB0aGUKICAgICAgICAgICAgICBwcmVkaWNhdGVzIG5hbWVzLgoKCiAgICAgICAgICAgIC0gQWRkIHRoZSBvciAnfCcgb3BlcmF0aW9uIGluICVyZW5hbWUgbWF0Y2gsIGZvcgogICAgICAgICAgICAgIGV4YW1wbGUgdG8gY2FwaXRhbGl6ZSBhbGwgdGhlIGNvbnN0YW50cyAoJWNvbnN0YW50IG9yCiAgICAgICAgICAgICAgY29uc3QgY2RlY2wpOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiLG1hdGNoPSJjZGVjbHxjb25zdGFudCIsJWlzaW1tdXRhYmxlKSAiIjsKICAgICAgICAgICAgICAgIAoKCjAxLzEyLzIwMDY6IG1nb3NzYWdlCgkgICAgLQlQYXJ0aWFsIGZpeGVkIG9mIGVycm9ycyB1bmRlciBDODksIGJ1ZyAjMTM1NjU3NAoJICAgIAkoY29udmVydGVkIEMrKyBzdHlsZSBjb21tZW50cyB0byBDIHN0eWxlKQoJICAgIC0JQWRkZWQgcGF0Y2hlcyBmcm9tIG5lb21hbnRyYUB1c2Vycy5zZi5uZXQgIzEzNzk5ODggYW5kICMxMzg4MzQzCgkgICAgCW1pc3NpbmcgYSAncmV0dXJuJyBzdGF0ZW1lbnQgZm9yIGVycm9yIGNvbmRpdGlvbnMKCSAgICAJYWxzbyB1cGRhdGVkIHRoZSAlaW5pdCBibG9jayBidWcgIzEzNTY1ODYKCQkgCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAndXRpdGxlJyBlbmNvZGVyLCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBhZGQKCSAgICAgIHlvdXIgb3duIGVuY29kZXIuIEkgYWRkZWQgdGhlIGVuY29kZXIgbWV0aG9kIGluIG1pc2MuYyAKCSAgICAgIGJ1dCBkZXZlbG9wZXJzIGNhbiBhZGQgb3RoZXJzLCB0aGUgc2FtZSB3YXksIGluc2lkZSBhbnkKCSAgICAgIHRhcmdldCBsYW5ndWFnZS4KCSAgICAgIAoJICAgICAgV2VsbCwgJ3V0aXRsZScgaXMgdGhlIHJldmVyc2Ugb2YgJ2N0aXRsZScsIGllOgoKCSAgICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAgLT4gQ2FtZWxDYXNlOwoJICAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIpIENhbWVsQ2FzZTsgICAtPiBjYW1lbF9jYXNlOwoJCSAKCjAxLzEwLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KICAgICAgICAgICAgVXBkYXRlZCBSdWJ5IEV4Y2VwdGlvbiBoYW5kbGluZy4gIENsYXNzZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRocm93cyBjbGF1c2VzLCAKICAgICAgICAgICAgb3IgYXJlIG1hcmtlZCBhcyAlZXhjZXB0aW9uY2xhc3MsIGFyZSBub3cgaW5oZXJpdGVkIGZyb20gcmJfZVJ1bnRpbWVFcnJvci4gCiAgICAgICAgICAgIFRoaXMgYWxsb3dzIGluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIHRvIGJlIHJldHVybmVkIHRvIFJ1YnkgYXMgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIFRodXMgaWYgYSBDKysgbWV0aG9kIHRocm93cyBhbiBpbnN0YW5jZSBvZiBNeUV4Y2VwdGlvbiwgdGhlIGNhbGxpbmcgUnVieSAKICAgICAgICAgICAgbWV0aG9kIHdpbGwgZ2V0IGJhY2sgYSBNeUV4Y2VwdGlvbiBvYmplY3QuICBUbyBzZWUgYW4gZXhhbXBsZSwgCiAgICAgICAgICAgIGxvb2sgYXQgcnVieS9leGFtcGxlcy9leGNlcHRpb25fY2xhc3MuCgowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAKICAgICAgICAgICAgLSBBZGQgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSwgd2hpY2ggY29tcGxlbWVudHMgdGhlICVleGNlcHRpb24KCSAgICBkaXJlY3RpdmUgaW4gYSBtb3JlIGF1dG9tYXRpYyB3YXkuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhFMSk7CgogICAgICAgICAgICBzd2lnIGdlbmVyYXRlcyB0aGUgcHJvcGVyIHRyeS9jYXRjaCBjb2RlIHRvIGRpc3BhdGNoIEUxLgoJICAgIAoJICAgIEJ1dCBpZiB5b3UgaGF2ZToKCgoJICAgICAgICAgIGludCBiYXJmb28oaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CgkgICAgICAgICAgICAgICB0aHJvdyBFMSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgIHRocm93IEUyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZSwgd2hlcmUgdGhlcmUgaXMgbm8gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW4gdGhlIGRlY2wsIHlvdSAKCSAgICBlbmQgdXAgZG9pbmc6CgkJICAKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBiYXJmb28gewkJCQoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRTEpIHsJLi4uIH0JCQkJICAKCSAgICAgICAgIH0gY2F0Y2goRTIpIHsJLi4uIH0JCQkJICAKCSAgICAgICB9CQkJCQoJICAgIAoJICAgIHdoaWNoIGlzIHZlcnkgdGVkaW91cy4gV2VsbCwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSBkZWZpbmVzCgkgICAgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0byBjYXRjaCwgYW5kIGZyb20gc3dpZzoKIAkKCSAgICAgICAlY2F0Y2hlcyhFMSxFMikgYmFyZm9vKGludCBpKTsKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKTsKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gCgoJICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCgkgICAgTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgJWNhdGNoZXMgbGlzdCBkb2Vzbid0IGhhdmUgdG8KCSAgICBjb3JyZXNwb25kIHRvIHRoZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UKCSAgICBoYXZlOgoKCQlzdHJ1Y3QgRSB7fTsKCQlzdHJ1Y3QgRTEgOiBFIHt9OwoJCXN0cnVjdCBFMiA6IEUge307CgogIAkgICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCiAgICAgICAgICAgIHlvdSBjYW4gZGVmaW5lCgkgICAgICAgIAoJCSVjYXRjaGVzKEUpIGJhcmZvbyhpbnQgaSk7CgkKCSAgICBhbmQgc3dpZyB3aWxsIGdlbmVyYXRlIGFuIGFjdGlvbiBjb2RlIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFICZfZSkgeyAKCQkgICA8cmFpc2UgX2U+OwoJCSB9CQoKICAgICAgICAgICAgT2YgY291cnNlLCB5b3Ugc3RpbGwgaGF2ZSB0byBzYXRpc2Z5IHRoZSBDKysgcmVzdHJpY3Rpb25zLAoJICAgIGFuZCB0aGUgY2F0Y2hlcyBsaXN0IG11c3QgYmUgY29tcGF0aWJsZSAobm90IHRoZSBzYW1lKQoJICAgIGFzIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHR5cGVzIGluIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KCgkgICAgQWxzbywgeW91IGNhbiBub3cgc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGNhdGNoIHRoZQoJICAgIHVua25vd24gZXhjZXB0aW9uICcuLi4nLCBmb3IgZXhhbXBsZToKCgkgICAgICAgJWNhdGNoZXMoRTEsRTIsLi4uKSBiYXJmb28oaW50KTsKCgkgICAgSW4gYW55IGNhc2UsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgd2lsbCBlbWl0IHRoZQoJICAgIGNvZGUgdG8gY29udmVydCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZXJyb3IvZXhjZXB0aW9uCiAgICAgICAgICAgIHVzaW5nIHRoZSAndGhyb3dzJyB0eXBlbWFwLgoKCSAgICBGb3IgdGhlICcuLi4nIGNhc2UgdG8gd29yaywgeW91IG5lZWQgdG8KCSAgICB3cml0ZSB0aGUgcHJvcGVyIHR5cGVtYXAgaW4geW91ciB0YXJnZXQgbGFuZ3VhZ2UuIEluIHRoZQoJICAgIFVUTCwgdGhpcyBsb29rcyBsaWtlOgoKCSAgICAgICV0eXBlbWFwKHRocm93cykgKC4uLikgewoJICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1J1bnRpbWVFcnJvciwidW5rbm93biBleGNlcHRpb24iKTsKICAgICAgICAgICAgICB9CgowMS8wOS8yMDA2OiBtdXRhbmRpegoJICAgIFtBbGxlZ3JvY2xdCgogICAgICAgICAgICBGaXhlcyBhIG51bWJlciBvZiBTRUdWcyBwcmltYXJpbHkgaW4gdGhlIGhhbmRsaW5nIG9mCiAgICAgICAgICAgIHZhcmlvdXMgYW5vbnltb3VzIHR5cGVzLiBGb3VuZCBpbiBhIHBhc3MgdGhyb3VnaCB0aGUKICAgICAgICAgICAgc3dpZyB0ZXN0LXN1aXRlLiBTdGlsbCBtb3JlIHRvIGRvIGhlcmUsIGJ1dCB0aGlzIGlzIGEKICAgICAgICAgICAgZ29vZCBjaGVja3BvaW50LgoKICAgICAgICAgICAgQWRkcyAtY3dyYXAgYW5kIC1ub2N3cmFwIGFzIGFuIGFsbGVncm9jbCBzcGVjaWZpYwogICAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQuIENvbnRyb2xzIGdlbmVyYXRpbmcgb2YgYSBDCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZSB3aGVuIHdyYXBwaW5nIEMgY29kZS4gQnkgZGVmYXVsdCBvbmx5IGEKICAgICAgICAgICAgbGlzcCBmaWxlIGlzIGNyZWF0ZWQgZm9yIEMgY29kZSB3cmFwcGluZy4KCiAgICAgICAgICAgIERvYyB1cGRhdGVzIGZvciB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgZml4ZXMgYXMKICAgICAgICAgICAgcG9pbnRlZCBvdXQgb24gc3dpZy1kZXZlbAoKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB1bnNpZ25lZCBsb25nIGxvbmcgYW5kIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmIHR5cGVtYXBzCiAgICAgICAgICAgIC0gQnVnICMxMzk4Mzk0ICB3aXRoIHBhdGNoIGZyb20gRHJpZXMgRGVjb2NrCgowMS8wNi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgJ25hbWVkJyB3YXJuaW5nIGNvZGVzLCBub3cgaW4gYWRkaXRpb24gdG86CgkgICAgCgkgICAgICAld2FybmZpbHRlcig4MTMpOwoJICAgCgkgICAgeW91IGNhbiB1c2UKCgkgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9KQVZBX01VTFRJUExFX0lOSEVSSVRBTkNFKTsKCgkgICAganVzdCB1c2UgdGhlIHNhbWUgY29kZSBuYW1lIGZvdW5kIGluICBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oIAoJICAgIHBsdXMgdGhlICdTV0lHJyBwcmVmaXguCgoJICAgIElmIGEgZGV2ZWxvcGVyIGFkZHMgYSBuZXcgd2FybmluZyBjb2RlLCB0aGUgTGliL3N3aWd3YXJuLnN3ZyBmaWxlCiAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcnVubmluZyB0aGUgdG9wIGxldmVsIG1ha2UuCgowMS8wNS8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgUmVpbXBsZW1lbnRlZCBvYmplY3QgdHJhY2tpbmcgZm9yIFJ1YnkuICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHdvcmtzCgkgICAgYnkgZXhwYW5kaW5nIHRoZSBzd2lnX2NsYXNzIHN0cnVjdHVyZSBmb3IgUnVieSBieSBhZGRpbmcgYSB0cmFja09iamVjdHMKCSAgICBmaWVsZC4gIFRoaXMgZmllbGQgY2FuIGJlIHNldC91bnNldCB2aWEgJXRyYWNrb2JqZWN0cyBhcyBleHBsYWluZWQKCSAgICBpbiB0aGUgUnVieSBkb2N1bWVudGF0aW9uLiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIHJvYnVzdAoJICAgIGFuZCB0YWtlcyBsZXNzIGNvZGUgdG8gaW1wbGVtZW50LgoJCQowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVleHRlbmQgYW5kIHN0YXRpYyBjb25zdCBpbnRlZ3JhbCB0eXBlcywgZWc6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJhciA9IDQyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07IAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbmZvIGZvciBvbGQgYW5kIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIAogICAgICAgICAgICAtZHVtcF90b3AgICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgZW50aXJlIG5vZGUgdHJlZSwgaW5jbHVkaW5nIHN5c3RlbSBub2RlcyAgICAKICAgICAJICAgIC1kdW1wX21vZHVsZSAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBtb2R1bGUgbm9kZSB0cmVlLCBhdm9pZGluZyBzeXN0ZW0gbm9kZXMgICAgIAogICAgIAkgICAgLWR1bXBfY2xhc3NlcyAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZHVtcF90eXBlZGVmICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgYW5kIHR5cGVkZWZzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UKICAgICAJICAgIC1kdW1wX3RhZ3MgICAgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWRlYnVnX3R5cGVtYXAgIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0eXBlbWFwcwkJCSAgICAgICAKICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0ZW1wbGF0ZXMJCQkgICAgICAgIAoKCSAgLSBBZGQgdGhlIGZha2V2ZXJzaW9uLiBJZiB5b3UgaGF2ZSBhIHByb2plY3QgdGhhdCB1c2VzCiAgICAgICAgICAgIGNvbmZpZ3VyZS9zZXR1cC5weSwgb3IgYW5vdGhlciBhdXRvbWF0aWMgYnVpbGRpbmcgc3lzdGVtCiAgICAgICAgICAgIGFuZCByZXF1aXJlcyBhIHNwZWNpZmljIHN3aWcgdmVyc2lvbiwgbGV0IHNheSAxLjMuMjIgCgkgICAgeW91IGNhbiB1c2U6CgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiCgoJICAgICBvcgogCiAgICAgICAgICAgICAgIHN3aWcgLWZha2V2ZXJzaW9uIDEuMy4yMgoKICAgICAgICAgICAgIGFuZCB0aGVuIHN3aWcgLXZlcnNpb24gd2lsbCByZXBvcnQgMS4zLjIyIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICBjdXJyZW50IHZlcnNpb24uCgoJICAgICBUeXBpY2FsIHVzZSB3b3VsZCBiZQoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIiAuL2NvbmZpZ3VyZSAJICAgICAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgb3B0aW9uL2Zvcm1hdCBzdXBwb3J0IHRvICVyZW5hbWUgYW5kICVuYW1ld2Fybi4JCgkgICAgTm93ICVuYW1ld2FybiBjYW4gZm9yY2UgcmVuYW1pbmcsIGZvciBleGFtcGxlOgoKCSAgICAgICVuYW1ld2FybigiMzE0OiBpbXBvcnQgaXMgYSBrZXl3b3JkIixyZW5hbWU9Il8lcyIpICJpbXBvcnQiOwoJICAgIAoJICAgIGFuZCByZW5hbWUgY2FuIGFsc28gc3VwcG9ydCBmb3JtYXQgZm9ybXM6CgoJICAgICAgICVyZW5hbWUoInN3aWdfJXMiKSBpbXBvcnQ7CgoJICAgIE5vdywgc2luY2UgdGhlIGZvcm1hdCBpcyBwcm9jZXNzZWQgdmlhIHN3aWcgUHJpbnRmLCB5b3UKCSAgICBjYW4gdXNlIGVuY29kZXJzIGFzIGZvbGxvd3M6CgoJICAgICAgICVyZW5hbWUoIiUodGl0bGUpcyIpICBpbXBvcnQ7ICAgICAtPiBJbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiKSAgaW1wb3J0OyAgICAgLT4gSU1QT1JUCgkgICAgICAgJXJlbmFtZSgiJShsb3dlcilzIikgIEltcG9ydDsgICAgIC0+IGltcG9ydAoJICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAtPiBDYW1lbENhc2UKCSAgICAgICAKCSAgICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gYWRkIG1vcmUgZW5jb2RlcnMsIGFzIHRoZSAKCSAgICBleHBlY3RlZCBvbmUgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIAoKCSAgLSBBZGQgdGhlIGFib3ZlICdjdGl0bGUnIGVuY29kZXIsIHdoaWNoIGRvZXMgdGhlIGNhbWVsIGNhc2U6CgoJICAgICAgICBjYW1lbF9jYXNlIC0+IENhbWVsQ2FzZQogIAoJICAtIEFsc28sIHdoaWxlIHdlIGdldCB0aGUgcmVnZXhwIHN1cHBvcnQsIGFkZCB0aGUgJ2NvbW1hbmQnIGVuY29kZXIsCiAgICAgICAgICAgIHlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDpzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IClzIikgaW1wb3J0OyAKCgkgICAgdGhlbiBzd2lnIHdpbGwgcG9wZW4gdGhlIGNvbW1hbmQKCSAgICAKCQkic2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCBpbXBvcnQiCgkJCiAgICAgICAgICAgIHNlZSBiZWxvdyBmb3IgYW5vbnltb3VzIHJlbmFtZXMgZm9yIGJldHRlciBleGFtcGxlcy4JCQoKICAgICAgICAgIC0gVGhlIHJlbmFtZSBkaXJlY3RpdmUgbm93IGFsc28gYWxsb3dzOgoKCSAgICAtIHNpbXBsZSBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIGEgdHlwZSBtYXRjaAoJICAgICAgaGFwcGVuLCBmb3IgZXhhbXBsZQoKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2g9ImVudW1pdGVtIikgaGVsbG87CgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoJCSBpbnQgaGVsbG8oKSAgLT4gIGhlbGxvOyAKCgkgICAgLSBleHRlbmRlZCBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIHRoZSAnZXh0ZW5kZWQgYXR0cmlidXRlJyBtYXRjaAoJICAgICAgb2NjdXJyZWQsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyBzYW1lIGFzIHNpbXBsZSBtYXRjaCAJCQoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHN5bWJvbCAnJCcgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGluCgkgICAgICAgYSAncmVjdXJzaXZlJyB3YXksIGZvciBleGFtcGxlOgoKCQkgLy8gbWF0Y2ggb25seSBoZWxsbyBpbiAnZW51bSBIZWxsbycKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgIC8vIG1hdGNoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCiAgICAgICAgICAgICAgIGhlcmUsIGZvciBIZWxsbzo6aGksIHRoZSAicGFyZW50Tm9kZSIgaXMgIkhlbGxvIiwgYW5kIGl0cyAidHlwZSIKICAgICAgICAgICAgICAgaXMgImVudW0gSGVsbG8iLgoJICAgICAgIAoJICAgICAgIAogICAgICAgICAgICAtIEFub255bW91cyByZW5hbWVzOiB5b3UgY2FuIHVzZSAnYW5vbnltb3VzJyByZW5hbWUgZGlyZWN0aXZlcywgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgaW4gSGVsbG8KCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgIiI7IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIEhpLCBIZWxsbyAgIC8vIG1hdGNoIGJvdGgKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoJCSAKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpICIiOyAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBpdGVtcyBpbiBnaXZlbiBjb21tYW5kIChzbG9vb293LCBidXQuLi4pCgkJICVyZW5hbWUoJShjb21tYW5kOjxteSBleHRlcm5hbCBjbWQ+KXMpICIiOyAKCgkKCSAgICAgIEFub255bW91cyByZW5hbWVzIHdpdGggY29tbWFuZHMgY2FuIGJlIHZlcnkgcG93ZXJmdWwsIHNpbmNlIHlvdQoJICAgICAgY2FuICdvdXRzb3VyY2UnIGFsbCB0aGUgcmVuYW1pbmcgbWVjaGFuaXNtIChvciBwYXJ0IG9mIGl0KSB0byBhbgoJICAgICAgZXh0ZXJuYWwgcHJvZ3JhbToKCSAgICAgIAoJICAgICAgICAvLyBVcHBlcmNhc2UgYWxsIChhbmQgb25seSkgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCAnaScKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnL15pL3twcmludCB0b3VwcGVyKCQxKX0nIDw8PClzIikgIiI7ICAgCgkgICAgICAgCgkgICAgICAgIGludCBpbXBvcnRlZCgpIC0+IElNUE9SVEVEOwoJICAgICAgICBpbnQgaGVsbG8oKSAgICAtPiBoZWxsbwoKCSAgICAgIE5vdGUgdGhhdCBpZiB0aGUgJ2NvbW1hbmQnIGVuY29kZXIgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHN3aWcKCSAgICAgIHVuZGVyc3RhbmRzIHRoYXQgbm8gcmVuYW1lIGlzIG5lY2Vzc2FyeS4KCgkgICAgICBBbHNvIG5vdGUgdGhhdCAlcmVuYW1lICdwYXNzZXMnIHRoZSBtYXRjaGVkIG5hbWUuIEZvciBleGFtcGxlLCBpbgoJICAgICAgdGhpcyBjYXNlCgoJICAgICAgICBuYW1lc3BhY2UgbnMxIHsKCQkgIGludCBmb28oKTsKCQl9CgoJICAgICAgICBuYW1lc3BhY2UgbnMyIHsKCQkgIGludCBiYXIoKTsKCQl9CgoJICAgICAgdGhlIGV4dGVybmFsIHByb2dyYW0gb25seSByZWNlaXZlcyAiZm9vIiBhbmQgImJhciIuIElmIG5lZWRlZCwKCSAgICAgIGhvd2V2ZXIsIHlvdSBjYW4gcmVxdWVzdCB0aGUgJ2Z1bGxuYW1lJyAKCSAgICAgICAJCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJ2F3ayAnL25zMTo6L3tsPXNwbGl0KCQxLGEsIjo6Iik7IHByaW50IHRvdXBwZXIoYVtsXSl9JycgPDw8KXMiLGZ1bGxuYW1lPTEpICIiOyAgIAogICAgICAgICAgICAgICAgCgkJbnMxOjpmb28gLT4gRk9PCgkJbnMyOjpiYXIgLT4gYmFyCQoJCgkgICAgLSBNaXhpbmcgZW5jb2RlcnMgYW5kIG1hdGNoaW5nOiBvZiBjb3Vyc2UsIHlvdSBjYW4gZG8gbWl4IGNvbW1hbmRzCgkgICAgICBhbmQgbWF0Y2ggZmllbGRzLCBmb3IgZXhhbXBsZToKCgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGZuY3M+KSIsbWF0Y2g9ImNkZWNsIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zPikiLG1hdGNoPSJlbnVtaXRlbSIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcyBpbnNpZGUgYSBjbGFzcz4pIixtYXRjaD0iZW51bWl0ZW0iLAoJCSAgICAgICAgbWF0Y2gkcGFyZW50Tm9kZSRwYXJlbnROb2RlJG5vZGVUeXBlPSJjbGFzcyIpICIiOwoJCQoJICAgICAgVXNlICJzd2lnIC1kdW1wX3BhcnNlX21vZHVsZSIgdG8gc2VlIHRoZSBhdHRyaWJ1dGUgbmFtZXMgeW91IGNhbiB1c2UgdG8KCSAgICAgIG1hdGNoIGEgc3BlY2lmaWMgY2FzZS4KCQogICAgICAgICAgICAtICdzb3VyY2VmbXQnIGFuZCAndGFyZ2V0Zm10Jzogc29tZXRpbWVzIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgJ3NvdXJjZScgbmFtZSBiZWZvcmUgY29tcGFyaW5nLCBmb3IgZXhhbXBsZQoKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiKSAiZW1wdHkiOwoKCSAgICAgIHRoZW4gaWYgeW91IGhhdmUKCgkgICAgICAgIGludCBFbXB0eSgpOyAgLy8gIkVtcHR5IiBpcyB0aGUgc291cmNlIAoJCQoJICAgICAgeW91IHdpbGwgZ2V0IHRoZSBrZXl3b3JkIHdhcm5pbmcgc2luY2UgJ0VtcHR5JyB3aWxsIGJlCgkgICAgICBsb3dlciBjYXNlZCwgdmlhIHRoZSBzb3VyY2VmbXQ9IiUobG93ZXIpcyIgb3B0aW9uLAoJICAgICAgYmVmb3JlIGJlZW4gY29tcGFyZWQgdG8gdGhlICd0YXJnZXQnICJlbXB0eSIuCgoJICAgICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCAndGFyZ2V0Zm10JyBvcHRpb24gdG8gcHJvY2VzcyB0aGUKCSAgICAgICd0YXJnZXQnIGJlZm9yZSBjb21wYXJpbmcuCgoJICAgIC0gY29tcGxlbWVudGluZyAnbWF0Y2gnOiB5b3UgY2FuIHVzZSAnbm90bWF0Y2gnLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIixub3RtYXRjaD0ibmFtZXNwYWNlIikgImVtcHR5IjsKCgkgICAgICBoZXJlLCB0aGUgbmFtZSB3YXJuaW5nIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIHN5bWJvbHMgZXhjZXB0IG5hbWVzcGFjZXMuCgkgICAgCiAgICAgIAkKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIGdjaiBhbmQgSmF2YSAtPiA8dGFyZ2V0IGxhbmd1YWdlPiBtZWNoYW5pc20uCgoJICAgIFNlZQlleGFtcGxlcyBpbjogIAoJICAKCQlFeGFtcGxlcy9weXRob24vamF2YQoJCUV4YW1wbGVzL3J1YnkvamF2YQoJCUV4YW1wbGVzL3RjbC9qYXZhCgogICAgICAgICAgICB0byBzZWUgaG93IHRvIHVzZSBnY2orc3dpZyB0byBleHBvcnQgamF2YSBjbGFzc2VzIGludG8KICAgICAgICAgICAgcHl0aG9uL3J1YnkvdGNsLgoJICAgIAoJICAgIFRoZSBpZGVhIGlzIHRvIHB1dCBhbGwgdGhlIGNvbW1vbiBjb2RlIGZvciBnY2ogaW5zaWRlCgoJICAgICAgICAgIExpYi9nY2oKCiAgICAgICAgICAgIGFuZCBsb2NhbGl6ZSBzcGVjaWZpYyB0eXBlcyBzdWNoIGFzIGpzdHJpbmcsIGFzIGNhbiBiZSBmb3VuZAogICAgICAgICAgICBpbgoKCSAgICAgICAgIExpYi9weXRob24vanN0cmluZy5pCgkgICAgICAgICBMaWIvcnVieS9qc3RyaW5nLmkKCSAgICAgICAgIExpYi90Y2wvanN0cmluZy5pCgogICAgICAgICAgICBVc2luZyB0aGUgVVRMLCB0aGlzIGlzIHZlcnkgZWFzeSwgYW5kIHRoZSBwZXJsIHZlcnNpb24gZm9yCiAgICAgICAgICAgIGpzdHJpbmcuaSB3aWxsIGJlIG5leHQuCgkJIAkgICAgCgoxMi8yOS8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlIGNvcHljdG9yIGZlYXR1cmUvZGlyZWN0aXZlL29wdGlvbiB0byBlbmFibGUgdGhlIGF1dG9tYXRpYwoJICAgIGdlbmVyYXRpb24gb2YgY29weSBjb25zdHJ1Y3RvcnMuIFVzZSBhcyBpbjoKCgkgICAgICAlY29weWN0b3IgQTsKCgkgICAgICBzdHJ1Y3QgQSB7CgogICAgICAgICAgICAgIH07CgoJICAgIHRoZW4gdGhpcyB3aWxsIHdvcmsKCgkgICAgICBhMSA9IEEoKTsKCSAgICAgIGEyID0gQShhMSk7CgoJICAgIEFsc28sIHNpbmNlIGl0IGlzIGEgZmVhdHVyZSwgaWYgeW91IGp1c3QgdHlwZQoKCSAgICAgICVjb3B5Y3RvcjsKCgkgICAgdGhhdCB3aWxsICBlbmFibGUgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIGZvciBhbGwgdGhlCgkgICAgY2xhc3Nlcy4gSXQgaXMgYWxzbyBlcXVpdmFsZW50IHRvCgoJICAgICAgIHN3aWcgLWNvcHljdG9yIC1jKysgLi4uCgoJICAgIE5vdGVzOiAKCgkgICAgMS4tIFRoZSBmZWF0dXJlIG9ubHkgd29ya3MgaW4gQysrIG1vZGUuCgoJICAgIDIuLSBUaGUgYXV0b21hdGljIGNyZWF0aW9uIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwKCSAgICAgICAgdXN1YWxseSBwcm9kdWNlIG92ZXJsb2FkaW5nLiBIZW5jZSwgaWYgdGhlIHRhcmdldAoJICAgICAgICBsYW5ndWFnZSBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRpbmcsIGEgc3BlY2lhbCBuYW1lCgkgICAgICAgIHdpbGwgYmUgdXNlZCAoQV9jb3B5KS4KCSAgICAKCSAgICAzLi0gRm9yIHRoZSBvdmVybG9hZGluZyByZWFzb25zIGFib3ZlLCBpdCBpcyBwcm9iYWJseSBub3QKICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgZmxhZyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IGFyZQoJCXVzaW5nIGtleXdvcmRzIGluIFB5dGhvbi4KCiAgICAgICAgICAgIDQuLSBUaGUgY29weWN0b3IgYXV0b21hdGljIG1lY2hhbmlzbSBmb2xsb3dzIG1vcmUgb3IgbGVzcwoJICAgICAgICB0aGUgc2FtZSBydWxlcyBhcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBtZWNoYW5pc20sCgkgICAgICAgIGkuZS4sIGEgY29weSBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGUKCSAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3Qgb3IgaWYgdGhlcmUgaXMgYSBwZXJ0aW5lbnQgbm9uLXB1YmxpYyAKCQljb3B5IGN0b3IgaW4gdGhlIGNsYXNzIG9yIGl0cyBoaWVyYXJjaHkuCgoJCUhlbmNlLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHlvdSB0byBjb21wbGV0ZSB0aGUKCQljbGFzcyBkZWNsYXJhdGlvbiB3aXRoIHRoZSBwcm9wZXIgbm9uLXB1YmxpYyBjb3B5IGN0b3IKCQl0byBhdm9pZCBhIHdyb25nIGNvbnN0cnVjdG9yIGFkZGl0aW9uLgoJCQogICAgICAgICAgLSBGaXggZmVhdHVyZXMvcmVuYW1lIGZvciB0ZW1wbGF0ZXMgY3Rvci9kdG9yIGFuZCBvdGhlcgogICAgICAgICAgICB0aGluZ3MgYXJvdW5kIHdoaWxlIGFkZGluZyB0aGUgY29weWN0b3IgbWVjaGFuaXNtLgoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbWF0Y2gnIG9wdGlvbiB0byB0eXBlbWFwcy4gQXNzdW1lIHlvdSBoYXZlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCgkgICAgdGhlbiBpZiB5b3UgZG8KIAoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQoKCSAgICBzd2lnIHdpbGwgJ292ZXJsb2FkIHRoZSAnaW4nIHR5cGVtYXAsIGJ1dCB0aGUgJ2ZyZWVhcmcnIAoJICAgIHR5cGVtYXAgd2lsbCBiZSBhbHNvIGFwcGxpZWQsIGV2ZW4gd2hlbiB0aGlzIGlzIHdyb25nLiBUaGUgb2xkCgkgICAgc29sdXRpb25zIGlzIHRvIHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KICAJICAgICAgJXR5cGVtYXAoZnJlZWFnKSBBICogIiI7CgoJICAgIG92ZXJsb2FkICdmcmVlYXJnJyB3aXRoIGFuIGVtcHR5IGRlZmluaXRpb24uCgoJICAgIFRoZSBwcm9ibGVtIGlzLCBob3dldmVyLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB5b3UgbmVlZAoJICAgIHRvIGRvIHRoYXQgdW50aWwgeW91IHN0YXJ0IGdldHRpbmcgYnJva2VuIEMrKyBjb2RlLCBvcgoJICAgIHdvcnNlLCBicm9rZW4gcnVudGltZSBjb2RlLgoKCSAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBpbmZhbW91cyAndHlwZWNoZWNrJyB0eXBlbWFwLAoJICAgIHdoaWNoIGFsd2F5cyBjb25mdXNlcyBwZW9wbGUsIHNpbmNlIHRoZSBmaXJzdCB0aGluZyB5b3UgZG8KCSAgICBpcyB0byBqdXN0IHdyaXRlIHRoZSAnaW4nIHR5cGVtYXAuCgoJICAgIFRoZSAnbWF0Y2gnIG9wdGlvbiBzb2x2ZXMgdGhlIHByb2JsZW0sIGFuZCBpZiBpbnN0ZWFkIHlvdSB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZyxtYXRjaD0iaW4iKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCSAgICAgICV0eXBlbWFwKHR5cGVjaGVjayxtYXRjaD0iaW4iLHByZWNlZGVuY2UuLi4pIFNXSUdUWVBFICogey4uLn0KCSAgICAKCSAgICBpdCB3aWxsIHRlbGwgc3dpZyB0byBhcHBseSB0aGUgJ2ZyZWVhcmcvdHlwZWNoZWNrJwoJICAgIHR5cGVtYXBzIG9ubHkgaWYgdGhleSAnbWF0Y2gnIHRoZSB0eXBlIG9mIHRoZSAnaW4nCgkgICAgdHlwZW1hcC4gVGhlIHNhbWUgY2FuIGJlIGRvbmUgd2l0aCBvdGhlciB0eXBlbWFwcyBhczoKCgkgICAgICAldHlwZW1hcChkaXJlY3Rvcm91dCkgU1dJR1RZUEUgKiB7Li4ufQoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JmcmVlLG1hdGNoPSJkaXJlY3Rvcm91dCIpIFNXSUdUWVBFICogey4uLn0KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi9tb2RlL2ZlYXR1cmUgdG8gdHJlYXQgbWVtYmVyCgkgICAgdmFyaWFibGVzIGluIGEgbW9yZSBuYXR1cmFsIHdheSwgaWUsIHNpbWlsYXIgdG8gdGhlIGdsb2JhbAoJICAgIHZhcmlhYmxlIGJlaGF2aW9yLgoKCSAgICBZb3UgY2FuIHVzZSBpdCBpbiBhIGdsb2JhbCB3YXkgdmlhIHRoZSBjb21tYW5kIGxpbmUKCgkgICAgICBzd2lnIC1uYXR1cmFsdmFyIC4uLgoKCSAgICBvciB0aGUgbW9kdWxlIG1vZGUgb3B0aW9uCiAKCSAgICAgICVtb2R1bGUobmF0dXJhbHZhcj0xKQoKCSAgICBib3RoIGZvcm1zIG1ha2Ugc3dpZyB0cmVhdCBhbGwgdGhlIG1lbWJlciB2YXJpYWJsZXMgaW4gdGhlCgkgICAgc2FtZSB3YXkgaXQgdHJlYXRzIGdsb2JhbCB2YXJpYWJsZXMuIAoKCSAgICBBbHNvLCB5b3UgY2FuIHVzZSBpdCBpbiBhIGNhc2UgYnkgY2FzZSBhcHByb2FjaCBmb3IKCSAgICBzcGVjaWZpYyBtZW1iZXIgdmFyaWFibGVzIHVzaW5nIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAlbmF0dXJhbHZhciBCYXI6OnM7CgkgICAgCgkgICAgVGhlbiwgaW4gdGhlIGZvbGxvd2luZyBjYXNlIGZvciBleGFtcGxlOgoKCSAgICAgICBzdGQ6OnN0cmluZyBzOwoJICAgICAgIHN0cnVjdCBCYXIgewoJCSBzdGQ6OnN0cmluZyBzOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgeW91IGNhbiBkbzogIAoKCSAgICAgICBiID0gQmFyKCkKCSAgICAgICBiLnMgPSJoZWxsbyIKCSAgICAgICBjdmFyLnMgPSAiaGVsbG8iCgkgICAgICAgCgkgICAgICAgaWYgKGIucyAhPSBjdmFyLnMpOgoJICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgoKCQkgIAogICAgICAgICAgICBUaGlzIGlzIHZhbGlkIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIHRoZQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBmb3JjaW5nIHRoZSB1c2Ugb2YgdGhlIAogICAgICAgICAgICBjb25zdCBTV0lHVFlQRSYgKEMrKykvU1dJR1RZUEUgKEMpIHR5cGVtYXBzIGZvciB0aGUKICAgICAgICAgICAgZ2V0L3NldCBtZXRob2RzIGluc3RlYWQgb2YgdGhlIFNXSUdUWVBFICogdHlwZW1hcHMuCgkgICAgSGVuY2UsIGZvciAnbmF0dXJhbHZhcicgdG8gd29yaywgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UKCSAgICBtdXN0IGltcGxlbWVudCAndHlwZW1hcChpbi9vdXQpIGNvbnN0IFR5cGUmJyBwcm9wZXJseS4KCgkgICAgVGhlICduYXR1cmFsdmFyJyBvcHRpb24gcmVwbGFjZXMgb3IgbWFrZXMgd29ya2Fyb3VuZHMgc3VjaCAgYXM6CgkgICAgCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgdW5uZWNlc3NhcnkuCgoJICAgIE5vdGUxOiBJZiB5b3VyIGludGVyZmFjZSBoYXMgb3RoZXIga2luZHMgb2Ygd29ya2Fyb3VuZHMgdG8KCSAgICBkZWFsIHdpdGggdGhlIG9sZCAndW5uYXR1cmFsJyB3YXkgdG8gZGVhbCB3aXRoIG1lbWJlcgoJICAgIHZhcmlhYmxlcyAocmV0dXJuaW5nL2V4cGVjdGluZyBwb2ludGVycyksIHRoZQoJICAgICduYXR1cmFsdmFyJyBvcHRpb24gY291bGQgYnJlYWsgdGhlbS4KCSAgICAKCSAgICBOb3RlMjogdGhlIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHVubmFtZWQgdHlwZXMsIHN1Y2gKCSAgICBhcyB1bm5hbWVkIG5lc3RlZCB1bmlvbnMuCgkgICAgCgkgIAoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgbW9yZSAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcyBmb3IgdGhlIHR5cGVtYXAKICAgICAgICAgICAgbGlicmFyaWVzLgoKCSAgICBJbiB0aGUgcGFzdCwgZm9yIHNjcmlwdGluZyBsYW5ndWFnZXMsIHlvdSB3b3VsZCBkbyBjaGVja2luZyBzb21ldGhpbmcgbGlrZToKCgkgICAgICBpZiAoQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpICE9IC0xKSB7CgkgICAgICAgIC8vIHN1Y2Nlc3MKICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAvLyBlcnJvcgoJICAgICAgfQoKCSAgICBOb3cgdGhlIHJlc3VsdCBzdGF0ZSBjYW4gY2FycnkgbW9yZSBpbmZvcm1hdGlvbiwKCSAgICBpbmNsdWRpbmc6CgoJICAgICAgLSBFcnJvciBzdGF0ZTogbGlrZSB0aGUgb2xkIC0xLzAsIGJ1dCB3aXRoIGVycm9yIGNvZGVzIGZyb20gc3dpZ2Vycm9ycy5zd2cuCgoJICAgICAgICAgaW50IHJlcyA9IENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKTsKCQkgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CgkJICAgLy8gc3VjY2VzcyBjb2RlCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCQkgICBTV0lHX0Vycm9yKHJlcyk7IC8vIHJlcyBjYXJyaWVzIHRoZSBlcnJvciBjb2RlCiAgICAgICAgICAgICAgICAgfQoKCSAgICAgIC0gQ2FzdCByYW5rOiB3aGVuIHJldHVybmluZyBhIHNpbXBsZSBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICBjb252ZXJzaW9uLCB5b3UganVzdCByZXR1cm4gU1dJR19PSywgYnV0IGlmIHlvdSBuZWVkCiAgICAgICAgICAgICAgICB0byBkbyBhICdjYXN0JywgeW91IGNhbiBhZGQgdGhlIGNhc3RpbmcgcmFuaywgaWU6CgkJCgkJICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwoJCSAgICByZXR1cm4gU1dJR19PSzsKCQkgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IChkb3VibGUpIFB5SW50X0FzTG9uZyhvYmopOwoJCSAgICByZXR1cm4gU1dJR19BZGRDYXN0KFNXSUdfT0spOwkJICAgIAogICAgICAgICAgICAgICAgICB9CgkJCgkJbGF0ZXIsIHRoZSBjYXN0aW5nIHJhbmsgaXMgdXNlZCB0byBwcm9wZXJseSBkaXNwYXRjaAoJCXRoZSBvdmVybG9hZGVkIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZS4gVGhpcyBvZiBjb3Vyc2UKCQlyZXF1aXJlcyB5b3VyIGxhbmd1YWdlIHRvIHN1cHBvcnQgYW5kIHVzZSB0aGUgbmV3CgkJZGlzcGF0Y2ggY2FzdC9yYW5rIG1lY2hhbmlzbSAoTm93IG1haW5seSBzdXBwb3J0ZWQgaW4KCQlwZXJsIGFuZCBweXRob24sIGFuZCBlYXNpbHkgZXhwYW5kYWJsZSB0byBydWJ5IGFuZCB0Y2wpLgoJICAgICAgCgkgIC0gW1VUTF0gQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMuCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9uIG1lY2hhbmlzbSwgd2hpY2gKICAgICAgICAgICAgcmVxdWlyZWQgc29tZSBtb2RpZmljYXRpb25zIGluIHBhcnNlci55ICh0byByZWNvZ25pemUKICAgICAgICAgICAgJ2V4cGxpY2l0JykgYW5kIG92ZXJsb2FkLmN4eCAodG8gcmVwbGFjZSAkaW1wbGljaXRjb252IGFzCiAgICAgICAgICAgIG5lZWRlZCkuCgkgICAgCgkgICAgU3RpbGwsIHJlYWwgc3VwcG9ydCBpbiBlYWNoIHRhcmdldCBsYW5ndWFnZSByZXF1aXJlcyBlYWNoCgkgICAgdGFyZ2V0IGxhbmd1YWdlIHRvIGJlIG1vZGlmaWVkLiBQeXRob24gcHJvdmlkZXMgYW4gZXhhbXBsZSwKICAgICAgICAgICAgc2VlIGJlbG93LgoKCgkgIC0gQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBDKysgaW1wbGljaXQgY29udmVyc2lvbnMsIGllLCBpZiB5b3UKICAgICAgICAgICAgaGF2ZQoKCSAgICAgICAgJWltcGxpY2l0Y29udiBBOwoKCSAgICAgICAgc3RydWN0IEEgewoJCSAgIGludCBpaTsKCQkgICBBKCkge2lpID0gMTt9CgkJICAgQShpbnQpIHtpaSA9IDI7fQoJCSAgIEEoZG91YmxlKSB7aWkgPSAzO30KCQkgICBleHBsaWNpdCBBKGNoYXIgKnMpIHtpaSA9IDQ7fQoJCX07CgkJCgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoKICAgICAgICAgICAgeW91IGNhbiBjYWxsOgoKCSAgICAgICAgYSA9IEEoKQoJICAgICAgICBhaSA9IEEoMSkKCSAgICAgICAgYWQgPSBBKDEuMCkKCSAgICAgICAgYXMgPSBBKCJoZWxsbyIpCgkJCgkJIyBvbGQgZm9ybXMKCSAgICAgICAgZ2V0KGEpICAtPiAxCgkgICAgICAgIGdldChhaSkgLT4gMgoJICAgICAgICBnZXQoYWQpIC0+IDMKCSAgICAgICAgZ2V0KGFzKSAtPiA0CgkJCgkJI2ltcGxpY2l0IGNvbnZlcnNpb25zCgkgICAgICAgIGdldCgxKSAgICAgICAtPiAyCgkgICAgICAgIGdldCgxLjApICAgICAtPiAzCgkgICAgICAgIGdldCgiaGVsbG8iKSAtPiBFcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCiAgICAgICAgICAgIEFsc28sIGFzIGluIEMrKywgbm93IGltcGxpY2l0IGNvbnZlcnNpb25zIGFyZSBzdXBwb3J0ZWQgaW4KICAgICAgICAgICAgdmFyaWFibGUgYXNzaWdtZW50cywgYW5kIGlmIHlvdSBoYXZlOgoKCSAgICAgIEEgZ2E7CgkgICAgICBzdHJ1Y3QgQmFyIHsKCSAgICAgICAgQSBhOwogICAgICAgICAgICAgIH07CgoJICAgIHlvdSBjYW4gZG86CgoJICAgICAgY3Zhci5nYSA9IEEoMSkKCSAgICAgIGN2YXIuZ2EgPSAxCgkgICAgICBjdmFyLmdhID0gMS4wCgkgICAgICBjdmFyLmdhID0gQSgiaGVsbG8iKSAKCSAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICAgIGIgPSBCYXIoKQoJICAgICAgYi5hID0gQSgiaGVsbG8iKQoJICAgICAgYi5hID0gMQoJICAgICAgYi5hID0gMS4wCgkgICAgICBiLmEgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICBOb3RlIHRoYXQgdGhlIGxhc3QgY2FzZSwgYXNzaWduaW5nIGEgbWVtYmVyIHZhciBkaXJlY3RseSwgCgkgICAgYWxzbyByZXF1aXJlcyB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi4KCgkgICAgVGhpcyBzdXBwb3J0IG5vdyBtYWtlcyB0aGUgb2xkICclaW1wbGljaXQnIG1hY3JvLCB3aGljaAoJICAgIHdhcyBmb3VuZCBpbiAnaW1wbGljaXQuaScgYW5kIGl0IHdhcyBmcmFnaWxlIGluIG1hbnkgd2F5cywKCSAgICBvYnNvbGV0ZSwgYW5kIHlvdSBzaG91bGQgdXNlIHRoZSBuZXcgJyVpbXBsaWNpdGNvbnYnCgkgICAgZGlyZWN0aXZlIGluc3RlYWQuCgoJICAgIE5vdGUgdGhhdCB3ZSBmb2xsb3cgdGhlIEMrKyBjb252ZW50aW9ucywgaWUsIGluIHRoZQoJICAgIGZvbGxvd2luZyB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBhbGxvd2VkOgoKCQlpbnQgZ2V0KEEgYSkge3JldHVybiBhLmlpO30KCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgkgICAgCgkgICAgYnV0IG5vdCBpbiB0aGVzZSBjYXNlczoKCgkJaW50IGdldChBICphKSB7cmV0dXJuIGEtPmlpO30KCQlpbnQgZ2V0KEEmIGEpIHtyZXR1cm4gYS5paTt9CgkJCgkgICAgQWxzbywgaXQgd29ya3MgZm9yIGRpcmVjdG9yIG1ldGhvZHMgdGhhdCByZXR1cm4gYSBieSB2YWx1ZQoJICAgIHJlc3VsdCwgaWUsIHRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSBnZXRfYSgpID0gMDsKCgkJZGVmIGdldF9hKHNlbGYpOgoJCSAgIHJldHVybiAxCgogICAgICAgICAgICBidXQgbm90IGluIHRoaXMgY2FzZToKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSogZ2V0X2EoKSA9IDA7CgkgICAgCgkgIE5vdGVzOgoKCSAgLSB0aGUgaW1wbGljaXRjb252IG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCBieSBkaXJlY3RseQoJICAgIGNhbGxpbmcvZGlzcGF0Y2hpbmcgdGhlIHB5dGhvbiBjb25zdHJ1Y3RvciwgdHJpZ2dlcmluZyBhCgkgICAgY2FsbCB0byB0aGUgX19pbml0X19tZXRob2QuIEhlbmNlLCBpZiB5b3UgZXhwYW5kZWQgdGhlCgkgICAgX19pbml0X18gbWV0aG9kLCBsaWtlIGluOgoKCSAgICAgICAgY2xhc3MgQToKCQkgICBkZWYgX19pbml0X18oc2VsZixhcmdzKToKCQkgICAgICA8c3dpZyBjb2RlPgoJCSAgICAgIDxteSBjb2RlIGhlcmU+CgogICAgICAgICAgICB0aGVuICdteSBjb2RlJyB3aWxsIGFsc28gYmUgZXhlY3V0ZWQuCgkgICAgCgkgIC0gU2luY2UgdGhlICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIGlzIGEgU1dJRyBmZWF0dXJlLCBpZiB5b3UgdHlwZToKCSAgICAKICAJICAgICAgICVpbXBsaWNpdGNvbnY7ICAKCgkgICAgdGhhdCB3aWxsIGVuYWJsZSBpbXBsaWNpdCBjb252ZXJzaW9uIGZvciBhbGwgdGhlIGNsYXNzZXMgaW4KCSAgICB5b3VyIG1vZHVsZS4KCgkgICAgQnV0IGlmIHlvdSBhcmUgd29ycmllZCBhYm91dCBwZXJmb3JtYW5jZSwgbWF5YmUgdGhhdCB3aWxsIGJlCgkgICAgdG9vIG11Y2gsIGVzcGVjaWFsbHkgaWYgeW91IGhhdmUgb3ZlcmxvYWRlZCBtZXRob2RzLCBzaW5jZQoJICAgIHRvIHJlc29sdmUgdGhlIGRpc3BhdGNoaW5nIHByb2JsZW0sIHB5dGhvbiB3aWxsIGVmZWN0aXZlbHkKCSAgICB0cnkgdG8gY2FsbCBhbGwgdGhlIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhcyBuZWVkZWQuCgoJICAtIEZvciB0aGUgc2FtZSByZWFzb24sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UKICAgICAgICAgICAgdGhlIG5ldyAnY2FzdG1vZGUnIHdoZW4gbWl4aW5nIGltcGxpY2l0IGNvbnZlcnNpb24gYW5kCiAgICAgICAgICAgIG92ZXJsb2FkaW5nLgoKCSAtIFtweXRob25dIFRoZSAlaW1wbGljaXQgZGlyZWN0aXZlIGlzIGRlY2xhcmVkIG9ic29sZXRlLCBhbmQKICAgICAgICAgICB5b3Ugc2hvdWxkIHVzZSAlaW1wbGljaXRjb252IGluc3RlYWQuIElmIHlvdSBpbmNsdWRlCgkgICB0aGUgaW1wbGljaXQuaSBmaWxlLCBhIHdhcm5pbmcgd2lsbCByZW1pbmQgeW91IG9mIHRoaXMuCgoJICAgTm90ZTogU2luY2UgJWltcGxpY2l0IGlzIGZyYWdpbGUsIGp1c3QgcmVwbGFjaW5nIGl0IGJ5CgkgICAlaW1wbGljaXRjb252IGNvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGJlaGF2aW9yLiBIZW5jZSwgd2UKCSAgIGRvbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGZyb20gdG8gdGhlIG90aGVyLCBhbmQgdGhlIHVzZXIKCSAgIG11c3QgbWlncmF0ZSB0byB0aGUgbmV3ICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIG1hbnVhbGx5LgoKCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgTW9kaWZ5IHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHRvIHVzZSBzdGQ6OnZlY3Rvcjo6dmFsdWVfdHlwZSBhcyB0aGlzIGlzCiAgICAgICAgICAgIGNsb3NlciB0byB0aGUgcmVhbCBTVEwgZGVjbGFyYXRpb25zIGZvciBzb21lIG1ldGhvZHMsIGVnIGZvciBwdXNoX2JhY2soKS4KICAgICAgICAgICAgRml4ZXMgc29tZSBjb21waWxhdGlvbiBlcnJvcnMgZm9yIHNvbWUgY29tcGlsZXJzIGVnIHdoZW4gdGhlIHRlbXBsYXRlZAogICAgICAgICAgICB0eXBlIGlzIGEgcG9pbnRlci4KCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBzdGQ6OnZlY3RvciBpbXByb3ZlbWVudHMgLSBhIGZldyBtb3JlIG1ldGhvZHMgYXJlIHdyYXBwZWQgYW5kIHNwZWNpYWxpemF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGUgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yIG1hY3JvIGlzIG5vIGxvbmdlciBuZWVkZWQgKGEKICAgICAgICAgICAgd2FybmluZyBpcyBpc3N1ZWQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSBpdCkuCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEFkZCBpbiBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcy4gVGhpcyBhbHNvIGVuYWJsZXMgb25lIHRvIGVhc2lseSB3cmFwCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHdoZXJlIFQgaXMgYSBwb2ludGVyLgoKMTIvMjQvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBUaGUgY2ZmaSBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBGdWxseSBzdXBwb3J0cyBDLCBidXQgcHJvdmlkZXMgbGltaXRlZCBzdXBwb3J0cyBmb3IgQysrLCBpbgogICAgICAgICAgICAgICBwYXJ0aWN1bGFyIEMrKyBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgYW5kIG92ZXJsb2FkaW5nIG5lZWRzIHRvCiAgICAgICAgICAgICAgIGJlIHdvcmtlZCB1cG9uLiAKCjEyLzIzLzIwMDU6IG1tYXR1cwoJICAgIFtweXRob25dIEFkZCB0aGUgY2FzdG1vZGUgdGhhdCBhbGxvd3MgdGhlIHB5dGhvbgoJICAgIHR5cGUgY2FzdGluZyB0byBvY2N1ci4KCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlICdpbnQgZm9vKGludCknLCBub3cKCSAgICAKCSAgICAgIGNsYXNzIEFpKCk6CgkgICAgICAgICBkZWYgX19pbml0X18oc2VsZix4KTogCgkJICAgIHNlbGYueCA9IHgKCSAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOiAKCQkgICAgcmV0dXJuIHNlbGYueAoKCSAgICAgIGZvbygxKSAgIC8vIE9rCgkgICAgICBmb28oMS4wKSAvLyBPawoJICAgICAgZm9vKDEuMykgLy8gRXJyb3IKCSAgICAgIGEgPSBBaSg0KQogICAgICAgICAgICAgIGZvbyhhaSkgIC8vIE9rCgogICAgICAgICAgICBUaGUgY2FzdG1vZGUsIHdoaWNoIGNhbiBiZSBlbmFibGVkIGVpdGhlciB3aXRoIHRoZQogICAgICAgICAgICAnLWNhc3Rtb2RlJyBvcHRpb24gb3IgdGhlICVtb2R1bGUoImNhc3Rtb2RlIikgb3B0aW9uLCB1c2VzCiAgICAgICAgICAgIHRoZSBuZXcgY2FzdC9yYW5rIGRpc3BhdGNoIG1lY2hhbmlzbS4gSGVuY2UsIG5vdyBpZiB5b3UKICAgICAgICAgICAgaGF2ZSAnaW50IGZvbyhpbnQpOyBpbnQgZm9vKGRvdWJsZSk7JywgdGhlIGZvbGxvd2luZyB3b3JrcwogICAgICAgICAgICBhcyBleHBlY3RlZDoKCgkgICAgICBmb28oMSkgICAtPiBmb28oaW50KQoJICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKCSAgICAgIGFpID0gQWkoNCkKCSAgICAgIGZvbyhhaSkgIC0+IGZvbyhpbnQpCgoJICAgIE5vdGUxOiB0aGUgJ2Nhc3Rtb2RlJyBjb3VsZCBkaXNydXB0IHNvbWUgc3BlY2lhbGl6ZWQKCSAgICB0eXBlbWFwcy4gSW4gcGFydGljdWxhciwgdGhlICJpbXBsaWNpdC5pIiBsaWJyYXJ5IHNlZW1zIHRvCgkgICAgaGF2ZSBwcm9ibGVtIHdpdGggdGhlIGNhc3Rtb2RlLiBCdXQgYmVzaWRlcyB0aGF0IG9uZSwgdGhlCgkgICAgZW50aXJlIHRlc3Qtc3VpdGUgY29tcGlsZXMgZmluZSB3aXRoIGFuZCB3aXRob3V0IHRoZQoJICAgIGNhc3Rtb2RlLgoKIAkgICAgTm90ZTI6IHRoZSBjYXN0IG1vZGUgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCB0aGUgZmFzdAoJICAgIGRpc3BhdGNoIG1vZGUsIGllLCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gaGFzIG5vIGVmZmVjdAoJICAgIHdoZW4gdGhlIGNhc3QgbW9kZSBpcyBzZWxlY3RlZC4gVGhlIHBlbmFsdGllcywgaG93ZXZlciwKCSAgICBhcmUgbWluaW11bSBzaW5jZSB0aGUgY2FzdCBkaXNwYXRjaCBjb2RlIGlzIGFscmVhZHkgYmFzZWQKCSAgICBvbiB0aGUgc2FtZSBmYXN0IGRpc3BhdGNoIG1lY2hhbmlzbS4KCgkgICAgU2VlIHRoZSBmaWxlIG92ZXJsb2FkX2Rpc3BhdGNoX2Nhc3RfcnVubWUucHkgZmlsZSBmb3IKCSAgICBuZXcgY2FzZXMgYW5kIGV4YW1wbGVzLgoKMTIvMjIvMjAwNTogbW1hdHVzCgkgICAgQWRkIHRoZSBjYXN0IGFuZCByYW5rIG1lY2hhbmlzbSB0byBkaXNwYXRjaCBvdmVybG9hZGluZwoJICAgIGZ1bmN0aW9ucy4gVGhlIFVURiBzdXBwb3J0cyBpdCBub3csIGJ1dCBmb3IgZWFjaCBsYW5ndWFnZQoJICAgIGl0IG11c3QgYmUgZGVjaWRlZCBob3cgdG8gaW1wbGVtZW50IGFuZC9vciB3aGVuIHRvIHVzZSBpdC4KCgkgICAgW3BlcmxdIE5vdyBwZXJsIHVzZXMgdGhlIG5ldyBjYXN0IGFuZCByYW5rIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCB3aGljaCBzb2x2ZXMgYWxsIHRoZSBwYXN0IHByb2JsZW1zIGtub3duIAoJICAgIGluIHBlcmwsIHN1Y2ggYXMgdGhlIG9sZCAnKyAxJyBwcm9ibGVtOgoKCSAgICAgICAgaW50IGZvbyhpbnQpOwoJICAgIAoJCSRuID0gMQogICAgICAgICAgICAgICAgJG4gPSAkbiArIDEKICAgICAgICAgICAgICAgICRyID0gZm9vKG4pCgogICAgICAgICAgICBhbHNvIHdvcmtzOgoKICAgICAgICAgICAgICAgICBmb28oMSk7CiAgICAgICAgICAgICAgICAgZm9vKCIxIik7CiAgICAgICAgICAgICAgICAgZm9vKDEuMCk7CiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKTsKCiAgICAgICAgICAgICBidXQgZmFpbHMKCiAgICAgICAgICAgICAgICAgZm9vKCJsIik7CgogICAgICAgICAgICAgYW5kIHdoZW4gb3ZlcmxvYWRpbmcgIGZvbyhpbnQpIGFuZCBmb28oZG91YmxlKTsKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBlcnJvcgoJCSBmb28oJG4pIC0+IGZvbyhpbnQpICBmb3IgZ29vZCBwZXJsIHZlcnNpb25zCgkJIGZvbygkbikgLT4gZm9vKGRvdWJsZSkgIGZvciBvbGQgYmFkIHBlcmwgdmVyc2lvbnMKCgkgICAgIHdoZW4gb3ZlcmxvYWRpbmcgZm9vKGludCksIGZvbyhjaGFyKikgYW5kIGZvbyhkb3VibGUpOgoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBmb28oY2hhciopCgogICAgICAgICAgICAgTm90ZTogSW4gcGVybCB0aGUgb2xkIGRpc3BhdGNoIG1lY2hhbmlzbSB3YXMgYnJva2VuLAogICAgICAgICAgICAgc28sIHdlIGRvbid0IHByb3ZpZGUgYW4gb3B0aW9uIHRvIGVuYWJsZSB0aGUgb2xkIG9uZQoJICAgICBzaW5jZSwgYWdhaW4sIGl0IHdhcyByZWFsbHkgcmVhbGx5IGJyb2tlbi4KCgkgICAgIFNlZSAnb3ZlcmxvYWRfc2ltcGxlX3J1bm1lLnBsJyBmb3IgbW9yZSBjYXNlcyBhbmQgdGVzdHMuCgoJICAgICBQUzogYWxsIHRoZSBvbGQga25vd24gaXNzdWVzIGFyZSBkZWNsYXJlZCByZXNvbHZlZCwgYW55CgkgICAgIG5ldyAicHJvYmxlbSIgdGhhdCBjb3VsZCBiZSBkaXNjb3ZlcmVkIGlzIGRlY2xhcmVkLCAKCSAgICAgYSBwcmlvcmksIGFzICJmZWF0dXJlcyIgb2YgdGhlIG5ldyBkaXNwYXRjaCBtZWNoYW5pc20KCSAgICAgKHVudGlsIHdlIGZpbmQgYW5vdGhlciBzb2x1dGlvbiBhdCBsZWFzdCkuCgkgICAgIAoJICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKCSAgICBBcyB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIFVURiwgc29tZSB0aGluZ3MgY291bGQKCSAgICBub3cgc3RhcnQgdG8gd29yayBhcyBleHBlY3RlZCwgYW5kIHBlb3BsZSB1c2VkIHRvIGRlYWwgb3IKCSAgICB3b3JrYXJvdW5kIHByZXZpb3VzIGJ1Z3MgcmVsYXRlZCB0byB0aGUgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIGNvdWxkIHNlZSBub3cgYSBkaWZmZXJlbmNlIGluIHBlcmwgYmVoYXZpb3IuCgoxMi8yMS8yMDA1OiBtbWF0dXMKCSAgLSBUaGUgJy1ub2RlZmF1bHQnIGZsYWcgKHByYWdtYSBhbmQgZmVhdHVyZSkgbm93IGdlbmVyYXRlcwoJICAgIGEgd2FybmluZywgYW5kIHJlY29tbWVuZHMgdG8gdXNlIHRoZSBleHBsaWNpdAoJICAgIC1ub2RlZmF1bHRjdG9yIGFuZCAgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKCSAgICBUaGUgcmVhc29uIHRvIHNwbGl0IHRoZSAnbm9kZWZhdWx0JyBiZWhhdmlvciBpcyB0aGF0LCBpbgoJICAgIGdlbmVyYWwsIGlnbm9yaW5nIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IgZ2VuZXJhdGVzIG1lbW9yeQoJICAgIGxlYWtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIEhlbmNlLCBpcyB0b28gcmlza3kganVzdCB0bwoJICAgIGRpc2FibGUgYm90aCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgoJICAgIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIElmIHlvdSBuZWVkIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciwgaXQgaXMKCSAgICBhbHNvIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICAlbm9kZWZhdWx0ZHRvciAgTXlWZXJ5U3BlY2lhbENsYXNzOwoKICAgICAgICAgICAgZm9yIHNwZWNpZmljIGNsYXNzZXMsIGFuZCBhbHdheXMgYXZvaWQgdXNpbmcgdGhlIGdsb2JhbAogICAgICAgICAgICAtbm9kZWZhdWx0IGFuZCAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoxMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgY29kZSBnZW5lcmF0aW9uIHdoZW4gdGhlIGludGVybWVkaWFyeSBjbGFzc25hbWUgaXMgY2hhbmdlZAogICAgICAgICAgICBpbiB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBmcm9tIGl0cyBkZWZhdWx0LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW1vZHVsZShqbmljbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEphdmEKICAgICAgICAgICAgICAlbW9kdWxlKGltY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBDIwoKICAgICAgICAgICAgQWRkIGluIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZS4gU2VlIGRvY3MuCgoxMi8xNy8yMDA1OiBtbWF0dXMKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1hbGlhc29iajAvLW5vYWxpYXNvYmowIG9wdGlvbnMgdG8gdXNlIHdpdGgKCSAgICAtZmFzdHVucGFjayBhbmQvb3IgLU8gYW5kIG9sZCB0eXBlbWFwcyB0aGF0IHVzZSAnb2JqMCcKCSAgICBkaXJlY3RseS4KCgkgICAgU28sIGlmIHlvdSBjb21waWxlIHlvdXIgY29kZSB1c2luZyAtTyBhbmQgZ2V0IGVycm9ycyBhYm91dAoJICAgIHRoZSB1bmRlY2xhcmVkICdvYmowJyB2YXJpYWJsZSwgcnVuIGFnYWluIHVzaW5nIAoKCQlzd2lnIC1PIC1hbGlhc29iajAgLXB5dGhvbiAuLi4uCgkgICAgCgkgICAgRm9yIG5ldyB0eXBlbWFwcywgbmV2ZXIgdXNlICdvYmowJyBkaXJlY3RseSwgaWYgbmVlZGVkLAoJICAgIHVzZSB0aGUgJyRzZWxmJyBuYW1lIHRoYXQgd2lsbCBiZSBwcm9wZXJseSAgZXhwYW5kZWQgdG8KCSAgICAnb2JqMCcgKG5vZmFzdHVucGFjaykgb3IgJ3N3aWdfb2JqWzBdJyAoZmFzdHVucGFjaykuIAogIAoJICAgIElmIHlvdSBoYXZlIG5vIGlkZWEgd2hhdCBJIGFtIHRhbGtpbmcgYWJvdXQsIGJldHRlciwgdGhhdAoJICAgIG1lYW5zIHlvdSBoYXZlIG5vIHR5cGVtYXAgd2l0aCB0aGlzIHByb2JsZW0uCgoKMTIvMTQvMjAwNTogbW1hdHVzIAkgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtZmFzdHVucGFjay8tbm9mYXN0dW5wYWNrIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgdXNlIG9mIHRoZSBpbnRlcm5hbCBVbnBhY2tUdXBsZSBtZXRob2QsIGluc3RlYWQgb2YKCSAgICBjYWxsaW5nIHRoZSBvbmUgZnJvbSB0aGUgcHl0aG9uIEMgQVBJLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLWZhc3R1bnBhY2suCgkgICAgCgoxMi8xMS8yMDA1OiBtbWF0dXMgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtcHJveHlkZWwvLW5vcHJveHlkZWwgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSBnZW5lcmF0aW9uIG9mIHByb3h5L3NoYWRvdyBfX2RlbF9fIG1ldGhvZHMsIGV2ZW4KCSAgICB3aGVuIG5vdyB0aGV5IGFyZSByZWR1bmRhbnQsIHNpbmNlIHRoZXkgYXJlIGVtcHR5LgoJICAgIEhvd2V2ZXIsIG9sZCBpbnRlcmZhY2VzIGNvdWxkIHJlbHkgb24gY2FsbGluZyB0aGVtLgoKCSAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBnZW5lcmF0ZSB0aGUgX19kZWxfXyBtZXRob2RzCgkgICAgYXMgaW4gMS4zLjI3IG9yIG9sZGVyIHN3aWcgdmVyc2lvbnMuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtbm9wcm94eWRlbC4KCjEyLzEwLzIwMDU6IG1tYXR1cyAKCSAgW1VURl0KICAgICAgICAgIC0gRml4IHVubmVjY2Vzc2FyeSBjYWxscyB0byBTV0lHX1R5cGVRdWVyeSBmb3IgJ2NoYXIgKicKCSAgICBhbmQgJ3djaGFyX3QgKicsIHByb2JsZW0gZm91bmQgYnkgQ2xheSBDdWx2ZXIgd2hpbGUKCSAgICBwcm9maWxpbmcgdGhlIFB5T2dyZSBwcm9qZWN0LgoKCSAgCgkgIFtQeXRob25dIAoJICAtIEFkZCB0aGUgLWRpcnZ0YWJsZS8tbm9kaXJ2dGFibGUgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICBhIHBzZXVkbyB2aXJ0dWFsIHRhYmxlIHVzZWQgZm9yIGRpcmVjdG9ycywgYXZvaWRpbmcKCSAgICB0aGUgbmVlZCB0byByZXNvbHZlIHRoZSBweXRob24gbWV0aG9kIGF0IGVhY2ggY2FsbC4KCSAgICAKCSAgLSBBZGQgdGhlIC1zYWZlY3N0cmluZ3MvLW5vc2FmZWNzdHJpbmdzIG9wdGlvbnMgdG8KCSAgICBlbmFibGUvZGlzYWJsZSB0aGUgdXNlIG9mIHNhZmUgY29udmVyc2lvbnMgZnJvbSBQeVN0cmluZwoJICAgIHRvIGNoYXIgKi4gUHl0aG9uIHJlcXVpcmVzIHlvdSB0byBuZXZlciBjaGFuZ2UgdGhlIGludGVybmFsCgkgICAgYnVmZmVyIGRpcmVjdGx5LCBhbmQgaGVuY2UgJ3NhZmVjdHJpbmdzJyB3YXJyYW50aWVzIHRoYXQKCSAgICBidXQgcmV0dXJuaW5nIGEgY29weSBvZiB0aGUgaW50ZXJuYWwgcHl0aG9uIHN0cmluZyBidWZmZXIuCgoJICAgIFRoZSBkZWZhdWx0LCBhcyBpbiBwcmV2aW91cyByZWxlYXNlcywgaXMgdG8gcmV0dXJuIGEKCSAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgKG5vc2FmZWNzdHJpbmdzKSwgc28sIGl0IGlzIHRoZSB1c2VyJ3MKCSAgICByZXNwb25zaWJpbGl0eSB0byBhdm9pZCBpdHMgbW9kaWZpY2F0aW9uLgoJICAgIAoJICAtIEFkZCB0aGUgLU8gb3B0aW9uIHRvIGVuYWJsZSBhbGwgdGhlIG9wdGltaXphdGlvbiBvcHRpb25zCgkgICAgYXQgb25jZSwgaW5pdGlhbGx5IGVxdWl2YWxlbnQgdG8KCgkgICAgLW1vZGVybiAtZmFzdGRpc3BhdGNoIC1kaXJ2dGFibGUgLW5vc2FmZWNzdHJpbmdzIC1mdmlydHVhbAoKMTIvMDgvMjAwNTogbW1hdHVzIAoKCSAgLSBBZGQgdGhlIC1mYXN0ZGlzcGF0Y2ggb3B0aW9uIChmYXN0ZGlzcGF0Y2ggZmVhdHVyZSkuIFRoaXMKCSAgICBlbmFibGVzIHRoZSAiZmFzdCBkaXNwYXRjaCIgbWVjaGFuaXNtIGZvciBvdmVybG9hZGVkCgkgICAgbWV0aG9kcyBwcm92aWRlZCBieSBTYWx2YWRvciBGYW5kaX5ubyBHYXJjJ2lhICgjOTMwNTg2KS4KCgkgICAgVGhlIHJlc3VsdGluZyBjb2RlIGlzIHNtYWxsZXIgYW5kIGZhc3RlciBzaW5jZSBsZXNzIHR5cGUKCSAgICBjaGVja2luZyBpcyBwZXJmb3JtZWQuIEhvd2V2ZXIsIHRoZSBlcnJvciBtZXNzYWdlcyB5b3UKCSAgICBnZXQgd2hlbiB0aGUgb3ZlcmxvYWRpbmcgaXMgbm90IHJlc29sdmVkIGNvdWxkIGJlCgkgICAgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgdHJhZGl0aW9uYWwgbWV0aG9kIHJldHVybnMuCgoJICAgIFdpdGggdGhlIG9sZCBtZXRob2QgeW91IGFsd2F5cyBnZXQgYW4gZXJyb3Igc3VjaCBhcyAKCgkgICAgICAgIk5vIG1hdGNoaW5nIGZ1bmN0aW9uIGZvciBvdmVybG9hZGVkIC4uLiIKCiAgICAgICAgICAgIHdpdGggdGhlIG5ldyBtZXRob2QgeW91IGNhbiBhbHNvIGdldCBlcnJvcnMgc3VjaCBhcwoKCSAgICAgICAiVHlwZSBlcnJvciBpbiBhcmd1bWVudCAxIG9mIHR5cGUgLi4uIgoKCSAgICBTZWUgYnVnIHJlcG9ydCAjOTMwNTg2IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICAgIAogIAkgICAgU28sIHRoaXMgb3B0aW1pemF0aW9uIG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkIGJ5IHVzZXJzLgoKCSAgICBUaGUgbmV3IG1lY2hhbmlzbSBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgc3dpZyAtZmFzdGRpc3BhdGNoCgogICAgICAgICAgICBvciB1c2luZyB0aGUgZmVhdHVyZSBmb3JtCgoJICAgICAgJWZlYXR1cmUoImZhc3RkaXNwYXRjaCIpIG1ldGhvZDsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAlZmFzdGRpc3BhdGNoIG1ldGhvZDsKCSAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cyAKCiAgICAgICAgICAtIFNldmVyYWwgbWVtb3J5IGFuZCBzcGVlZCBpbXByb3ZlbWVudHMsIHNwZWNpYWxseSBmb3IKCSAgICB0ZW1wbGF0ZXMuIE5vdyBzd2lnIGlzIHVwIHRvIDIwIGZhc3RlciB0aGFuIGJlZm9yZSBmb3IKCSAgICBsYXJnZSB0ZW1wbGF0ZSBpbnRlcmZhY2VzLCBzdWNoIGFzIHRoZSBzdGRfY29udGFpbmVycy5pCgkgICAgYW5kIHRlbXBsYXRlX21hdHJpeC5pIGZpbGVzIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZS4KCgkgICAgTWVtb3J5IGZvb3RwcmludCBpcyBhbHNvIHJlZHVjZWQgaW4gY29uc2lkZXJhdGlvbiBvZiBzbWFsbAoJICAgIHBjcy9hcmNoaXRlY3R1cmVzLgoKCSAgLSBhZGQgY29tbWFuZGxpbmUgb3B0aW9ucyAtY3BwZXJyYXN3YXJuIGFuZCAtbm9jcHBlcnJhc3dhcm4iIHRvIGZvcmNlCiAgICAgICAgICAgIHRoZSBzd2lnIHByZXByb2Nlc3NvciB0byB0cmVhdCB0aGUgI2Vycm9yIGRpcmVjdGl2ZSBhcyBhICN3YXJuaW5nLgoJICAgIAoJICAgIHRoZSBwcmFnbWFzCgogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTEKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0wCgkgICAgICAgCgkgICAgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLCByZXNwZWN0aXZlbHkuCiAgICAgICAgICAgICAKCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIFRoZSBnZW5lcmF0ZWQgY29kZSBpcyBub3cgbW9yZSBwb3J0YWJsZSwgZXNwZWNpYWxseQoJICAgIGZvciBXaW5kb3dzLiBGb2xsb3dpbmcgCgogICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvZmFxL3dpbmRvd3MuaHRtbAoKICAgICAgICAgICAgUHlfTm9uZSBpcyBuZXZlciBhY2Nlc3NlZCBhcyBhIHN0cnVjdHVyZSwgcGx1cyBvdGhlcgogICAgICAgICAgICB0cmlja3MgbWVudGlvbmVkIHRoZXJlLgoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB0aHJlYWRzIGJhc2VkIGluIHRoZQoJICAgIHByb3Bvc2FsIGJ5IEpvc2VwaCBXaW5zdG9uLgoKCSAgICBUaGUgdXNlciBpbnRlcmZhY2UgaXMgYXMgZm9sbG93czoKCgkgICAgMS4tIHRoZSBtb2R1bGUgdGhyZWFkIHN1cHBvcnQgaXMgZW5hYmxlIHZpYSB0aGUgInRocmVhZHMiIG1vZHVsZQogICAgICAgICAgICAgICAgb3B0aW9uLCBpLmUuCgogICAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0aHJlYWRzIj0xKQoKICAgICAgICAgICAgMi4tIEVxdWl2YWxlbnQgdG8gdGhhdCwgaXMgdGhlIG5ldyAnLXRocmVhZHMnIHN3aWcgb3B0aW9uCgogICAgICAgICAgICAgICAgICBzd2lnIC10aHJlYWRzIC1weXRob24gLi4uCgogICAgICAgICAgICAzLi0gWW91IGNhbiBwYXJ0aWFsbHkgZGlzYWJsZSB0aHJlYWQgc3VwcG9ydCBmb3IgYSBnaXZlbgogICAgICAgICAgICAgICAgbWV0aG9kIHVzaW5nOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZCBtZXRob2Q7CgogICAgICAgICAgICAgICAgYWxzbywgeW91IGNhbiBkaXNhYmxlIHNlY3Rpb25zIG9mIHRoZSB0aHJlYWQgc3VwcG9ydCwgCiAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYmxvY2siKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYmxvY2sgbWV0aG9kOwoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdGhyZWFkYWxsb3ciKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkYWxsb3cgbWV0aG9kOwoKICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBkaXNhYmxlcyB0aGUgQysrL3B5dGhvbiB0aHJlYWQgcHJvdGVjdGlvbiwgYW5kIHRoZQogICAgICAgICAgICAgICAgc2Vjb25kIGRpc2FibGVzIHRoZSBweXRob24vQysrIHRocmVhZCBwcm90ZWN0aW9uLiAKCiAgICAgICAgICAgIDQuLSBUaGUgY3VycmVudCB0aHJlYWQgc3VwcG9ydCBpcyBiYXNlZCBpbiB0aGUgUHlHSUwKICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBwcmVzZW50IGluIHB5dGhvbiB2ZXJzaW9uIDIuMyBvciBsYXRlciwgYnV0CiAgICAgICAgICAgICAgICB5b3UgY2FuIHByb3ZpZGUgdGhlIHRocmVhZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucyBieQogICAgICAgICAgICAgICAgZGVmaW5pbmcgdGhlIG1hY3JvcyBpbiBweXRocmVhZHMuc3dnLgoKCQlJZiB5b3UgZ2V0IGEgd29ya2luZyBpbXBsZW1lbnRhdGlvbiBmb3Igb2xkZXIgdmVyc2lvbnMsCgkJcGxlYXNlIHNlbmQgdXMgYSBwYXRjaC4KCiAgICAgICAgICAgIEZvciB0aGUgY3VyaW91cyBhYm91dCBwZXJmb3JtYW5jZSwgaGVyZSBhcmUgc29tZSBudW1iZXJzCiAgICAgICAgICAgIGZvciB0aGUgcHJvZmlsZXRlc3QuaSB0ZXN0LCB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBzcGVlZAoJICAgIG9mIHRoZSB3cmFwcGVkIGNvZGU6CgoJICAgICAgICBub3RocmVhZCAgICAgICAgICAgOS42cyAgKG5vIHRocmVhZCBjb2RlKQoJCW5vdGhyZWFkYmxvY2sgICAgIDEyLjJzICAob25seSAnYWxsb3cnIGNvZGUpCgkJbm90aHJlYWRhbGxvdyAgICAgMTMuNnMgIChvbmx5ICdibG9jaycgY29kZSkKICAgICAgICAgICAgICAgIGZ1bGwgdGhyZWFkICAgICAgIDE1LjVzICAoJ2FsbG93JyArICdibG9jaycgY29kZSkKCSAgICAKCSAgICBpLmUuLCBmdWxsIHRocmVhZCBjb2RlIGRlY3JlYXNlcyB0aGUgd3JhcHBpbmcgcGVyZm9ybWFuY2UgYnkKCSAgICBhcm91bmQgNjAlLiBJZiB0aGF0IGlzIGltcG9ydGFudCB0byB5b3VyIGFwcGxpY2F0aW9uLCB5b3UKCSAgICBjYW4gdHVuZSBlYWNoIG1ldGhvZCB1c2luZyB0aGUgZGlmZmVyZW50ICdub3RocmVhZCcsCgkgICAgJ25vdGhyZWFkYmxvY2snIG9yICdub3RocmVhZGFsbG93JyBmZWF0dXJlcyBhcwoJICAgIG5lZWRlZC4gTm90ZSB0aGF0IGZvciBzb21lIG1ldGhvZHMgZGVhY3RpdmF0aW5nIHRoZQoJICAgICd0aHJlYWQgYmxvY2snIG9yICd0aHJlYWQgYWxsb3cnIGNvZGUgaXMgbm90IGFuIG9wdGlvbiwKCSAgICBzbywgYmUgY2FyZWZ1bC4KCSAgICAKCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNXSUcgbGlicmFyeSBmaWxlcyB1c2Ugc3lzdGVtIGFuZ2xlIGJyYWNrZXRzIGV2ZXJ5d2hlcmUgZm9yICVpbmNsdWRlLCBlZwogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfY29tbW9uLmkiCiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX2NvbW1vbi5pPgoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUeXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zIGhhdmUgYW4gZXh0cmEgY29uc3RydWN0b3Igc28gdGhhdCBlbnVtIGl0ZW0gdmFsdWVzIHRoYXQKICAgICAgICAgICAgYXJlIGluaXRpYWxpc2VkIGJ5IGFub3RoZXIgZW51bSBpdGVtIHZhbHVlIGNhbiBiZSB3cmFwcGVkIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSAlamF2YWNvbnN0dmFsdWUvCiAgICAgICAgICAgICVjc2NvbnN0dmFsdWUgZm9yIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKS4gU3VnZ2VzdGlvbiBieQogICAgICAgICAgICBCb2IgTWFyaW5pZXIvRG91Z2xhcyBQZWFyc29uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHh5eiwKICAgICAgICAgICAgICAgICBsYXN0ID0geHl6CiAgICAgICAgICAgICAgfSByZXBlYXQ7CgoxMS8yMS8yMDA1OiBtbWF0dXMKCSAgICBbcnVieSArIHB5dGhvbl0KCgkgICAgRml4ZXMgZm9yIGRpcmVjdG9ycyArIHBvaW50ZXJzLiBUaGlzIGlzIGFuIHVnbHkgcHJvYmxlbSB3aXRob3V0IGFuIGVhc3kKCSAgICBzb2x1dGlvbi4gQmVmb3JlIHdlIGlkZW50aWZpZWQgdGhpcyBjYXNlIGFzIHByb2JsZW1hdGljOgoKCSAgICAgICAgICB2aXJ0dWFsIGNvbnN0IE15Q2xhc3MmIG15X21ldGhvZCgpOwoKICAgICAgICAgICAgYnV0IGl0IHR1cm5zIG91dCB0aGF0IGFsbCB0aGUgY2FzZXMgd2hlcmUgYSBwb2ludGVyLCBhcnJheSBvcgogICAgICAgICAgICByZWZlcmVuY2UgaXMgcmV0dXJuZWQsIGFyZSBwcm9ibGVtYXRpYywgZXZlbiBmb3IgCgkgICAgcHJpbWl0aXZlIHR5cGVzIChhcyBpbnQsIGRvdWJsZSwgY2hhciosIGV0YykuCgoJICAgIFRvIHRyeSB0byBmaXggdGhlIGlzc3VlLCBhIG5ldyB0eXBlbWFwIHdhcyBhZGRlZCwKCSAgICAnZGlyZWN0b3JmcmVlJywgd2hpY2ggaXMgdXNlZCB0byAnZnJlZScgdGhlIHJlc291cmNlcwoJICAgIGFsbG9jYXRlZCBkdXJpbmcgdGhlICdkaXJlY3Rvcm91dCcgcGhhc2UuIEF0IHRoZSBzYW1lCgkgICAgdGltZSwgYSBwcmltaXRpdmUgZ2FyYmFnZSBjb2xsZWN0b3IgZW5naW5lIHdhcyBhZGRlZCB0bwoJICAgIGRlYWwgd2l0aCBvcnBoYW5lZCBhZGRyZXNzZXMsIHdoZW4gbmVlZGVkLgoJICAgIAoJICAgIFRoZSBzaXR1YXRpb24gaXMgbXVjaCBiZXR0ZXIgbm93LCBidXQgc3RpbGwgaXQgaXMgcG9zc2libGUgdG8gaGF2ZQoJICAgIG1lbW9yeSBleGhhdXN0YXRpb24gaWYgcmVjdXJzaW9uIGlzIHVzZWQuCgoJICAgIFNvLCBzdGlsbCB5b3UgbmVlZCB0byBhdm9pZCByZXR1cm5pbmcgcG9pbnRlcnMsIGFycmF5cyBvcgoJICAgIHJlZmVyZW5jZXMgd2hlbiB1c2luZyBkaXJlY3RvciBtZXRob2RzLgoKCSAgICAtIEFkZGVkIHN0ZGludC5pIC0gdHlwZW1hcHMgZm9yIGxhdGVzdCBDOTkgaW50ZWdyYWwgdHlwZXMgZm91bmQgaW4gc3RkaW50LmguCgkgICAgCjExLzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgdHlwZXMgYWRkZWQgdG8gd2luZG93cy5pLCBlZyBVSU5UOCwgV09SRCwgQllURSBldGMuIAogICAgICAgICAgICBJbmNsdWRpbmcgd2luZG93cy5pIHdpbGwgYWxzbyBlbmFibGUgU1dJRyB0byBwYXJzZSB0aGUgX19kZWNsc3BlYyBNaWNyb3NvZnQKICAgICAgICAgICAgZXh0ZW5zaW9uLCBlZyBfX2RlY2xzcGVjKGRsbGltcG9ydCkuIEFsc28gb3RoZXIgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zCiAgICAgICAgICAgIHN1Y2ggYXMgX19zdGRjYWxsLgoKMTEvMTAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBmb3IgV2luZG93cyAtIHdpbmRvd3MuaS4gVGhpcyBmaWxlIHdpbGwgY29udGFpbiB1c2VmdWwgdHlwZQogICAgICAgICAgICBpbmZvcm1hdGlvbiBmb3IgdXNlcnMgd2hvIGluY2x1ZGUgd2luZG93cy5oLiBJbml0aWFsIHN1cHBvcnQgaXMgZm9yIHRoZQogICAgICAgICAgICBub24gSVNPIGludGVncmFsIHR5cGVzOiBfX2ludDgsIF9faW50MTYsIF9faW50MzIsIF9faW50NjQgYW5kIHVuc2lnbmVkIHZlcnNpb25zLgogICAgICAgICAgICBUaGUgdW5zaWduZWQgdmVyc2lvbnMgcHJldmlvdXNseSBjb3VsZCBub3QgYmUgcGFyc2VkIGJ5IFNXSUcuICBTRiAjODcyMDEzLgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBQb3J0YWJpbGl0eSB3YXJuaW5nIGZvciBmaWxlcyB3aGljaCB3aWxsIG92ZXJ3cml0ZSBlYWNoIG90aGVyIG9uIGNhc2UKICAgICAgICAgICAgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zIHN1Y2ggYXMgRkFUMzIvTlRGUy4gVGhpcyB3aWxsIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0d28KICAgICAgICAgICAgY2xhc3MgbmFtZXMgYXJlIHRoZSBzYW1lIGJhcnJpbmcgY2FzZS4gVGhlIHdhcm5pbmcgaXMgaXNzdWVkIG9uIGFsbCBwbGF0Zm9ybXMgYW5kCiAgICAgICAgICAgIGNhbiBiZSBzdXBwcmVzc2VkIHdpdGggdGhlIHVzdWFsIHdhcm5pbmcgc3VwcHJlc3Npb24gdGVjaG5pcXVlcy4gU0YgYnVnICMxMDg0NTA3LgoKMTEvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXB5dGhvbiAtLXdpdGgtcnVieSAtLXdpdGgtcGVybDUgZXRjIGVuYWJsZSB0aGVzZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGllIHRoZSAtLXdpdGgteHh4eCBvcHRpb25zLCB3aGVyZSBubyBwYXRoIGlzIHNwZWNpZmllZCwgd29yayB0aGUgc2FtZSBhcyBpZiAKICAgICAgICAgICAgdGhlIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZCBhdCBhbGwuIEJhc2VkIG9uIHBhdGNoZXMgIzEzMzUwNDIgIzEzMjkwNDggIzEzMjkwNDcuCgoxMS8wOS8yMDA1OiBkYW5jeQoKCSAgICBbQWxsZWdyb2NsXQoJICAgIEFkZCBDKysgc3VwcG9ydCB0byB0aGUgQWxsZWdyb2NsIG1vZHVsZS4gRnVydGhlcgoJICAgIGVuaGFuY2VzIHRoZSBDIHN1cHBvcnQgYXMgd2VsbC4gU29tZSBvZiB0aGUKCSAgICBmZWF0dXJlczoKCgkgICAgLSBNVUNIIGJldHRlciBnZW5lcmF0aW9uIG9mIGZvcmVpZ24gdHlwZXMgYmFzZWQgb24KCSAgICB0aGUgQy9DKysgdHlwZXMgZm9yIHVzZSBpbiBkZWZpbmluZyB0aGUgRkZJIG9uCgkgICAgdGhlIGxpc3Agc2lkZS4gV2UgZG9uJ3QgcGFzcyBldmVyeXRoaW5nIGFzIGEgKCogOnZvaWQpCgkgICAgYW55IGxvbmdlci4KCgkgICAgLSBVc2VzIHR5cGVtYXBzIGZvciBiZXR0ZXIgY29udHJvbCBvZiB0eXBlIGNvbnZlcnNpb25zCgkgICAgYW5kIGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIGxpc3AgYW5kIGMrKyB3cmFwcGVyCgkgICAgY29kZS4KCgkgICAgLSBDTE9TIHdyYXBwaW5nIG9mIHBvaW50ZXJzIHJldHVybmVkIGZyb20gZm9yZWlnbiBzcGFjZQoJICAgIG1ha2VzIGl0IGVhc2llciB0byBkaWZmZXJlbnRpYXRlIHBvaW50ZXJzIGluIHVzZXIgY29kZS4KCSAgICBUaGUgd3JhcHBpbmcgb2JqZWN0cyBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEZGIGNhbGxzLgoKCSAgICAtIERlZnVuIHdyYXBwaW5nIG9mIEZGIGNhbGxzLCBhbGxvd2luZyBmb3IgbW9yZSBsaXNweQoJICAgIGludGVyZmFjZS4gQ29udmVyc2lvbiwgR0NpbmcsIG9mIGxpc3Agb2JqZWN0cyB0byAKCSAgICBmb3JlaWduIG9iamVjdHMgY2FuIGJlIGRvbmUgaW4gdGhlIHdyYXBwaW5nIGRlZnVuIHZpYQoJICAgIHRoZSB1c2Ugb2YgdHlwZW1hcHMuCgkgICAgCgkgICAgLSBvdmVybG9hZCBkaXNwYXRjaGluZyBpbXBsZW1lbnRlZCBvbiB0aGUgbGlzcCBzaWRlCgkgICAgdXNpbmcgZ2VuZXJpYyBmdW5jdGlvbnMuCgoJICAgIC0gVGVtcGxhdGVzIGFuZCBzeW5vbnltb3VzIHR5cGVzIHN1cHBvcnRlZC4KCjExLzA3LzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgcHJvcGVyIHN1cHBvcnQgZm9yIG11bHRpLWluaGVyaXRhbmNlIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLCBpZSwgaWYgeW91IGhhdmUgdHdvIEMrKyB3cmFwcGVkIGNsYXNzLCBGb28KCSAgICBhbmQgQmFyLCBub3c6CgoJICAgICAgIGNsYXNzIE15UHl0aG9uQ2xhc3MoRm9vLEJhcik6CgkgICAgICAgICAgLi4uLgoKICAgICAgICAgICAgd2lsbCBwcm9wZXJseSB3b3JrLCBldmVuIHdpdGggZGlyZWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIGRlYWxsb2NhdGlvbiBvZiBGb28udGhpcyBhbmQgQmFyLnRoaXMgd2lsbCBmb2xsb3cKICAgICAgICAgICAgY29ycmVjdGx5LiBCZWZvcmUsIGEgY2xhc3MgY291bGQgb25seSBoYXZlIG9uZSAndGhpcycKICAgICAgICAgICAgaW5zdGFuY2UgKHVubGlrZSBDKyspLCBvbmx5IHRoZSBsYXN0IGJhc2UgY2xhc3Mgd2FzCiAgICAgICAgICAgIHByb3Blcmx5IGRlbGV0ZWQsIG9yIGRldGVjdGVkIHdpdGggZGlyZWN0b3JzLgoKCSAgICBOb3cgJ3NlbGYudGhpcycgY2FuIGJlIGEgbGlzdCwgd2hpY2ggd2lsbCBjb250YWluIHRoZSBDKysKCSAgICBpbnN0YW5jZSBwb2ludGVycyBmb3IgYWxsIHRoZSBiYXNlIGNsYXNzZXMuCgkgICAgCgkgICAgQWxzbywgc3dpZy50aGlzIGlzIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhlIEMrKwoJICAgIGluc3RhbmNlKHMpLCBhbmQgdGhlIF9fZGVsX18gbWV0aG9kIGlzIG5vdCBlbWl0dGVkIHVubGVzcwoJICAgIHRoZSB1c2VyIHByZXBwZW5kL2FwcGVuZCBzb21lIGNvZGUgdG8gaXQuCgoJICAtIFN3aWcgY2FuIG5vdyBkZXRlY3QgbWVtb3J5IGxlYWtzLCBpZSwgaWYgeW91IHN0aWxsCgkgICAgZG9uJ3QgdXNlIHByb3h5L3NoYWRvdyBjbGFzc2VzLCBhbmQgdHlwZSBzb21ldGhpbmcgbGlrZQoJICAgIAoJICAgICAgICAgaW1wb3J0IF9leGFtcGxlCgkgICAgICAgICBmID0gX2V4YW1wbGUubmV3X0ZvbygpCgoJICAgIGFuZCBmb3JnZXQgdG8gY2FsbCBfZXhhbXBsZS5kZWxldGVfRm9vKGYpLCB0aGVuIHN3aWcgd2lsbAoJICAgIHRlbGwgeW91IHRoYXQgdGhlcmUgaXMgYSBtZW1vcnkgbGVhay4KCgkgICAgT3RoZXJ3aXNlLCBpZiB5b3UgYWx3YXlzIHVzZSB0aGUgcHJveHkgY2xhc3NlcywgeW91IHByb2JhYmx5CgkgICAgeW91IHdpbGwgbmV2ZXIgZXZlciBzZWUgdGhpcyB3YXJuaW5nIHVubGVzcyB0aGVyZSBpcwoJICAgIHNvbWV0aGluZyB3cm9uZyBpbnNpZGUgdGhlIHN3aWcgd3JhcHBpbmcgY29kZS4KCSAgICAgICAKCQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBJZiB5b3Ugb3ZlcmxvYWRlZCB0aGUgX19kZWxfXyBtZXRob2QsIGFuZCBjYWxsIHRoZSBiYXNlCgkgICAgb25lCSB3aXRob3V0IGEgdHJ5IGJsb2NrLCBhcyBpbgoKCSAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhTd2lnQ2xhc3MpOgoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICAKICAgICAgICAgICAgcHl0aG9uIGNvdWxkIGNvbXBsYWluIHRoYXQgdGhlIG1ldGhvZCBTd2lnQ2xhc3MuX19kZWxfXyBpcwogICAgICAgICAgICB1bmRlZmluZWQuIFRyeSB0byB1c2UgaW5zdGVhZDoKCSAgICAKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCQkgICAgICAgICAgdHJ5OiBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIGV4Y2VwdDogcGFzcwoKCSAgICBvciBzaW1wbHkgCQkgIAoKCSAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CgkJICAgICAgICAgIDx5b3VyIGNvZGUgaGVyZT4KCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRpbmcgbW9yZSBmdW4gdG8gU1RML1NURCBjb250YWluZXJzLCBub3cgeW91CgkgICAgY2FuIGRvCgoJICAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8UHlPYmplY3QgKj47CQkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8UHlPYmplY3QgKixQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwoJICAgICAgIC4uLi4KCgkgICAgVGhlIHNhbWUgIGFwcGxpZXMgdG8gc3RkOjpsaXN0LCBzdGQ6OmRlcXVlLCBzdGQ6Om11bHRpc2V0LCBldGMuCgoJICAgIFRoZW4sIGF0IHRoZSBweXRob24gc2lkZSB5b3UgY2FuIGRvIG5vdzoKCgkgICAgICAgIyBDKysgc3RkOjp2ZWN0b3IgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHYgPSBweXZlY3RvcihbMSwiaGVsbG8iLCgxLDIpXSkKCSAgICAgICBwcmludCB2WzFdCgkgICAgICAgPj4gJ2hlbGxvJwoJICAgICAgIHByaW50IHZbMl0KCSAgICAgICA+PiAoMSwyKQoJICAgICAgIAkJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjpzZXQgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIHMgPSBweXNldCgpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoKDEsMikpCQkgICAKCSAgICAgICBzLmluc2VydCgxKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCJoZWxsbyIpCgkgICAgICAgc3VtPSgpCgkgICAgICAgZm9yIGkgaW4gczoKCSAgICAgICAgIHN1bSArPShpLCkKCSAgICAgICBwcmludCBzdW0KCSAgICAgICA+Pj4gKDEsICdoZWxsbycsICgxLCAyKSkKCSAgICAgICAJCQkJICAgCgkgICAgICAgIyBDKysgc3RkOjptYXAgYXMgbmF0aXZlIHB5dGhvbiBzZXF1ZW5jZQoJICAgICAgIG0gPSBweW1hcCgpCQkJICAgCgkgICAgICAgbVsiZm9vIl0gPSAiaGVsbG8iCQkgICAKCSAgICAgICBtWzFdID0gKDEsMikKCSAgICAgICBwbSA9IHt9CgkgICAgICAgZm9yIGsgaW4gbToJICAgIAkgICAKCSAgICAgICAgIHBtW2tdID0gbVtrXQoJICAgICAgIHByaW50IHBtCgkgICAgICAgPj4+IHsxOiAoMSwgMiksICdmb28nOiAnaGVsbG8nfQoKCSAgICBpZSwgdGhlIFNURC9TVEwgY29udGFpbmVycyB3b3JrIGFzIHJlYWwgbmF0aXZlIHB5dGhvbgoJICAgIGNvbnRhaW5lciwgd2l0aCBhcmJpdHJhcnkgaXRlbSB0eXBlcyBhbmQgc28uCgoJICAgIEJ1dCBzaW5jZSBub3JtYWwgQysrIGNvbnRhaW5lcnMgZG8gbm90IHByb3Blcmx5IHJlZi91bnJlZgoJICAgIHRoZWlyIGl0ZW1zLCB5b3Ugc2hvdWxkIHVzZSB0aGUgc2FmZXIgdmVyc2lvbnM6CgkgICAgCgkgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6dmVjdG9yPHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8c3dpZzo6UHlPYmplY3RfcHRyLCBzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6Om1hcDxzd2lnOjpQeU9iamVjdF9wdHIsc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgIC4uLi4KCgkgICAgd2hlcmUgc3dpZzo6UHlPYmplY3RfcHRyIGlzIGEgUHlPYmplY3QgKiBlbnZlbG9wZSBjbGFzcyBwcm92aWRlZAoJICAgIHRvIHNhZmVseSBpbmNyZWYvZGVjcmVmIHRoZSBweXRob24gb2JqZWN0LiAKCSAgICAKCSAgICBTbywgbm93IHlvdSBjYW4gdXNlIGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGFzIG5hdGl2ZQoJICAgIFB5dGhvbiBjb250YWluZXJzLiAKCgkgICAgTm90ZSAxOiBzdGQ6Om1hcCwgc3RkOjpzZXQgYW5kIHRoZSBvdGhlciAnb3JkZXJlZCcKCSAgICBjb250YWluZXJzIHdpbGwgcHJvcGVybHkgdXNlIFB5T2JqZWN0X0NvbXBhcmUgZm9yIHNvcnRpbmcsCgkgICAgd2hlbiBuZWVkZWQuCgoJICAgIE5vdGUgMjogYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgaGF2ZSBhIGxpbWl0IHNpemUgb2YKCSAgICBTSVpFX01BWCwgaWUsIHlvdSBjYW4gaGF2ZSBtYW5hZ2UgY29udGFpbmVycyBsYXJnZXIgdGhhbgoJICAgIElOVF9NQVgsIHRoZSBweXRob24gbGltaXQuCgkgICAgCgkgICAgICAKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dCgkgICAgLSBhZGQgJ2l0ZXJhdG9yKCknIG1ldGhvZCBmb3IgYWxsIHNlcXVlbmNlcyBhbmQgYWRkaXRpb25hbGx5CgkgICAgICAna2V5X2l0ZXJhdG9yKCknIGZvciBtYXBzLgoKCSAgICAgICdpdGVyYXRvcigpJyB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IuCgkgICAgICBBZGRpdGlvbmFsbHksIGluIG1hcHMsICdrZXlfaXRlcmF0b3IoKScgd2lsbCByZXR1cm4gYSBweXRob24KCSAgICAgIGl0ZXJhdG9yIHVzaW5nIG9ubHkgdGhlIG1hcCBrZXlzLgoJICAgICAgCgkgICAgICBJbiBnZW5lcmFsIHRoZSBzZXF1ZW5jZSBtZXRob2QgX19pdGVyX18gd2lsbCBjYWxsCgkgICAgICAnaXRlcmF0b3IoKScsIHJldHVybmluZyB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvciwgYnV0IGluCgkgICAgICBtYXBzIGl0IHdpbGwgY2FsbCAna2V5X2l0ZXJhdG9yKCknLCBtYWludGFpbmluZwoJICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KCgkgICAgICBIZW5jZSwgZm9yIHN0ZDo6bWFwcywgeW91IGNhbiBwbGF5IHRoZW4gd2l0aCB0aGUgbmF0aXZlCgkgICAgICBDKysgaXRlcmF0b3IsIHdoaWNoIHZhbHVlIGlzIGEgKGtleSwgdmFsdWUpIHBhaXIsIGJ5CgkgICAgICBjYWxsaW5nIG1hcC5pdGVyYXRvcigpLCBhcyB3aXRoIG1hcC5iZWdpbigpLCBtYXAuZW5kKCksIGV0Yy4KCgkgICAgICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG1hcC5pdGVyYXRvcigpIHJldHVybnMgYSBzYWZlCgkgICAgICAnY2xvc2VkJyBpdGVyYXRvciwgd2hpbGUgbWFwLmJlZ2luKCkgYW5kIG1hcC5lbmQoKSBhcmUKCSAgICAgICdvcGVuJyBpdGVyYXRvcnMuCgoJICAgICAgQSAnY2xvc2VkJyBpdGVyYXRvciBrbm93cyB0aGUgYmVnaW4gYW5kIHRoZSBlbmQgb2YgdGhlCgkgICAgICBzZXF1ZW5jZSwgYW5kIGl0IG5ldmVyIGNhbiBzZWcuIGZhdWx0LiBBbiAnb3BlbicKCSAgICAgIGl0ZXJhdG9yLCBhcyBpbiBDKyssIGNhbiBzZWcuIGZhdWx0IGF0IHRoZSBDKysgc2lkZS4KCgkgICAgICAgICAjIGEgY2xvc2VkIGl0ZXJhdG9yIGlzIHNhZmUgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgoJCSAjIHRoZSBuZXh0KCkgbWV0aG9kIHdpbGwgdGhyb3cgYSBTdG9wSXRlcmF0aW9uCgkgICAgICAgICAjIGV4Y2VwdGlvbiBhcyBuZWVkZWQKCQoJICAgICAgICAgaSA9IHNlcS5pdGVyYXRvcigpCgkJIHRyeToKICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CgkJICAgICAgICBzdW0gKz0gaS5uZXh0KCkKCQkgZXhjZXB0OiBwYXNzCgkJIAoJCSAjIGFuIG9wZW4gaXRlcmF0b3IgYWx3YXlzIG5lZWQgdG8gYmUgY2hlY2tlZCwKCQkgIyBvciBpdCB3aWxsIGNyYXNoIGF0IHRoZSBDKysgc2lkZQoKCSAgICAgICAgIGN1cnJlbnQgPSBzZXEuYmVnaW4oKQogICAgICAgICAgICAgICAgIGVuZCA9IHNlcS5lbmQoKQoJCSB3aGlsZSAoY3VycmVudCAhPSBlbmQpOgoJCSAgICBzdW0gKz0gY3VycmVudC5uZXh0KCkKCSAgICAgIAoJICAgICAgCgkgICAgW1B5dGhvbl0KCSAgICAtIEZpbmFsbHksIHdoZW4gd2UgY2FsbCAKCgkgICAgICAgIGYgPSBGb28oKQoKCSAgICAgIHRoZSBjb25zdHJ1Y3Rpb24gaXMgJ29uZS13YXknLiBCZWZvcmUgY29uc3RydWN0aW9uICB3YXMgZG9uZQoJICAgICAgc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKSAKICAgICAgICAgICAgICAgICAgbmV3X0ZvbygpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pIAogICAgICAgICAgICAgICAgICBGb29QdHIoKSAocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB3YXMgZG9uZSBsaWtlCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgRm9vUHRyKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKICAgICAgICAgICAgICAgICAgCQkgIAoKCSAgICAgIGllLCB3ZSB3aGVuIGdvaW5nIGJhY2sgYW5kIGZvcndhcmQgYmV0d2VlbiB0aGUgQysrIGFuZAoJICAgICAgcHl0aG9uIHNpZGUuCgoJICAgICAgTm93IHNpbmNlIHRoZXJlIGlzIG5vIEZvb1B0ciB0aGUgY29uc3RydWN0aW9uIHByb2Nlc3MgaXMKCgkgICAgICAgICAgRm9vKCkgKHB5dGhvbikgLT4gX25ld19Gb28oKSAoQysrKQogICAgICAgICAgICAgICAgICBfbmV3X0ZvbygpIChDKyspIC0+IE5ld1BvaW50ZXJPYmooKSAoQysrKSAobm8gc2hhZG93IGNsYXNzKQoKICAgICAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciBpcyBkb25lCgogICAgICAgICAgICAgICAgICBOZXdQb2ludGVyT2JqKCkgKEMrKykgKHdpdGggc2hhZG93IGNsYXNzKSAtPiBOZXdJbnN0YWNlT2JqKCkgKEMrKykKCgkgICAgICB3aGVyZSBOZXdJbnN0YW5jZU9iaiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIHdpdGhvdXQKCSAgICAgIGNhbGxpbmcgX19pbml0X18gYW5kIGl0IGRvZXNuJ3QgZ28gJ2JhY2snIHRvIHB5dGhvbiwgaXMKCSAgICAgICdwdXJlJyBDIEFQSS4KCgkgICAgIC0gV2l0aCB0aGlzIGNoYW5nZSwgYW5kIHRoZSBvdGhlciBvbmVzIGluIHRoZQogICAgICAgICAgICAgICBQeVN3aWdPYmplY3QgdHlwZSwgd2hpY2ggbm93IGNhcnJpZXMgdGhlIHRoaXNvd24gYW5kCiAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvIHBvaW50ZXIsIHRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgYmUgYXMKICAgICAgICAgICAgICAgZmFzdCBhcyBib29zdDo6UHl0aG9uIGFuZC9vciB0aGUgb3RoZXIgcHl0aG9uIHdyYXBwZXJzCiAgICAgICAgICAgICAgIGJhc2VkIGluIHB1cmUgUHl0aG9uL0MgQVBJIGNhbGxzLgoKCSAgICAgICBBcyBhIHJlZmVyZW5jZSwgdGhlIHByb2ZpbGV0ZXN0X3J1bm1lLnB5IGV4YW1wbGUsIHdoaWNoCgkgICAgICAgZG9lcyBhIHNpbXBsZSBjYWxsIGZ1bmN0aW9uIG1hbnkgdGltZXMsIHN1Y2ggYXMgdGhpcyBjb2RlOgoKICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcHJvZmlsZXRlc3QgICAgICAgCgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCQkgICAgYSA9IHByb2ZpbGV0ZXN0LkEoKSAgICAgIAoJCSAgICBiID0gcHJvZmlsZXRlc3QuQigpICAgICAgCgkJICAgIGZvciBpIGluIHJhbmdlKDAsMTAwMDAwMCkKCSAgICAgICAgICAgICAgYSA9IGIuZm4oYSkgICAgICAgICAgICAKCgoJICAgICAgIHdoZXJlIGZuIGlzIGRlZmluZWQgYXMgJ0EqIEI6OmZuKEEgKmEpIHtyZXR1cm4gYTt9JywKCSAgICAgICBwcm9kdWNlcyAgdGhlIGZvbGxvd2luZyB0aW1lcwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbW9kZXJuICAgIG1vZGVybgoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgMTkuNzBzICAgICAgNS45OHMKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC45OXMgICAgICAwLjk4cwoJICAgICAgIAoKCSAgICAgICBDbGVhcmx5LCB0aGVyZSBpcyBhIGxhcmdlIGltcHJvdmVtZW50IGZvciB0aGUgcHl0aG9uCgkgICAgICAgJ25vbW9kZXJuJyBtb2RlLiBTdGlsbCwgdGhlICdtb2Rlcm4nIG1vZGUgaXMgYXJvdW5kCgkgICAgICAgNiB0aW1lcyBmYXN0ZXIgdGhhbiBiZWZvcmUuIEZvciB0aGUgc2FtZSB0ZXN0LCBidXQKCSAgICAgICB1c2luZyB0aGUgbm9uLXNoYWRvdyB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUsIHdlIGdldAoKCSAgICAgICAgICAgICAgICAgICAgICAgX3Byb2ZpbGV0ZXN0IChub24tc2hhZG93KQoJICAgICAgICAgc3dpZy0xLjMuMjYgICAgIDAuODBzIAogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjYwcyAKCgkgICAgICAgSGVuY2UsIG5vdyBmb3IgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgcHJveHkgb3ZlcmhlYWQKCSAgICAgICBpcyBpbnNpZ25pZmljYW50LgoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHBlcmZvcm1hbmNlIG51bWJlcnMgd2UgYXJlIHNob3dpbmcgaXMgZm9yCgkgICAgICAgYSBzaW1wbGUgbW9kdWxlICh0d28gdHlwZXMpIGFuZCBhIHNpbXBsZSBmdW5jdGlvbiAob25lCgkgICAgICAgYXJndW1lbnQpLiBGb3IgcmVhbCBzaXR1YXRpb25zLCBmb3IgbW9kdWxlcyB3aXRoIG1hbnkKCSAgICAgICBtb3JlIHR5cGVzIGFuZC9vciBmdW5jdGlvbnMgd2l0aCBtYW55IG1vcmUgcGFyYW1ldGVycywKCSAgICAgICB5b3Ugd2lsbCBzZWUgZXZlbiBiZXR0ZXIgcmVzdWx0cy4KCSAgICAgICAKCQkgIAkgICAgICAKMTAvMzEvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0KCgkgICAgLSBGaW5hbGx5LCBubyBtb3JlIENsYXNzUHRyIHByb3h5IGNsYXNzZXMuIFlvdSB3aWxsIHNlZQoJICAgICAgb25seSBhIGNsZWFuIENsYXNzIHByb3h5IGNsYXNzIGluIHRoZSAucHkgZmlsZS4KCgkgICAgLSBObyBtb3JlICdyZWFsJyB0aGlzb3duIGF0dHJpYnV0ZSBlaXRoZXIsIHRoZSBQeVN3aWdPYmplY3Qgbm93CiAgICAgICAgICAgICAgY2FycmllcyB0aGUgb3duZXJzaGlwIGluZm8uCgoJICAgICAgWW91IGNhbiBhbHNvIGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgkJICAKCQkgIHNlbGYudGhpcy5kaXNvd24oKQoJCSAgc2VsZi50aGlzLm93bigwKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXMuYWNxdWlyZSgpCgkJICBzZWxmLnRoaXMub3duKDEpCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCgkgICAgICBTdGlsbCB0aGUgb2xkIHdheSwKCSAgICAgIAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCgkJICBzZWxmLnRoaXNvd24gPSAwCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzb3duID0gMQoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IFRydWUKCiAgICAgICAgICAgICAgaXMgc3VwcG9ydGVkLCBhbmQgcHl0aG9uIGRpc3BhdGNoZXMgdGhlIHByb3BlciBtZXRob2QKICAgICAgICAgICAgICBjYWxscyBhcyBuZWVkZWQuIAkJICAKCSAgICAgICAKCgkgICAgLSBTdXBwb3J0IGZvciBpdGVyYXRvcnMgaW4gU1RML1NURCBjb250YWluZXJzLCBmb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKCiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlPHNldF9zdHJpbmc+IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjsKCSAgICAgICAgICAKICAgICAgICAgICAgICAgeW91IGNhbiB1c2UgdGhlIEMrKyBpdGVyYXRvcnMgYXM6ICAKCiAgICAgICAgICAgICAgICAgICAgIHMgPSBzZXRfc3RyaW5nKCkKCQkgICAgICAgICAgICAgICAgICAgICAKCQkgICAgIHMuYXBwZW5kKCJjIikgICAKCQkgICAgIHMuYXBwZW5kKCJhIikgICAKCSAgICAgICAgICAgICBzLmFwcGVuZCgiYiIpCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiYWJjIiAKCgkJYWR2YW5jZSB0aGUgaXRlcmF0b3IgYXMgaW4gQysrCgogICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcy5iZWdpbigpICAgICAgCgkJICAgICBjdXJyZW50ICs9IDEKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgY3VycmVudC52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICAKCQlub3cgdXNpbmcgdGhlIHJldmVyc2Ugb3BlcmF0b3JzCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5yYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMucmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKCSAgICAgICAgb3IgdGhlICdwcmV2aW91cycgbWV0aG9kCgogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkJICAgICBlID0gcy5lbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZS5wcmV2aW91cygpCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJjYmEiIAoKICAgICAgICAgICAgICAgIG9yIGp1c3QgYXMgaW4gYSBweXRob24gZmFzaGlvbgoKICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBOb3RlIDE6IEl0ZXJhdG9ycyBpbiBDKysgYXJlIHZlcnkgcG93ZXJmdWwsIGJ1dAogICAgICAgICAgICAgICAgZGFuZ2Vyb3VzIHRvby4gQW5kIGluIHB5dGhvbiB5b3UgY2FuIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290CiAgICAgICAgICAgICAgICBqdXN0IGxpa2UgaW4gQysrLCBzbywgYmUgY2FyZWZ1bC4KCQkKCQlOb3RlIDI6IHRoZSBpdGVyYXRvcnMgYXJlICdsaWdodCcsIGllLCB0aGV5IGRvIG5vdAoJCWNvbnZlcnQgc2VxdWVuY2UgZWxlbWVudHMgdW50aWwgeW91IHJlcXVlc3QgdG8gZG8gc28sIHZpYQoJCW5leHQoKSwgdmFsdWUoKSBvciBwcmV2aW91cygpLiBJZiB5b3UganVzdCBpbmNyZW1lbnQvZGVjcmVtZW50IG9uZQoJCW5vIGNvbnZlcnNpb24gaXMgcGVyZm9ybWVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJICAgICAgICAgICAgIGIgKz0gMQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoKQogICAgICAgICAgICAgICAgICAgICBiLmluY3IoMikKCQkgICAgIGIuZGVjcigyKQogICAgICAgICAgICAgICAgICAgICBiLmRlY3IoKQogICAgICAgICAgICAgICAgICAgICBiIC09IDEKCgkJIG9ubHkgdGhlIGl0ZXJhdG9yIGlzIG1vZGlmaWVkLCBhbmQgbm90IHZhbHVlIHdyYXBwZXIKCQkgaXMgZ2VuZXJhdGVkLiBPdGhlciB0eXBpY2FsIEMrKyBvcGVyYXRpb25zIGFyZSBhbHNvIAoJCSBhdmFpbGFibGUsIHN1Y2ggYXM6CgoJCSAgICAgcHJpbnQgcy5lbmQoKSAtIHMuYmVnaW4oKQoJCSAgICAgPj4+IDMKCQkgICAgIGYgPSBzLmJlZ2luKCkgKyAxCgkJICAgICBwcmludCBmLnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIGwgPSBzLmVuZCgpIC0gMQoJCSAgICAgcHJpbnQgbC52YWx1ZSgpCgkJICAgICA+Pj4gImMiCgkJIAoJCSBldGMuICBPZiBjb3Vyc2UsIHRoZSAnZmluZCcsICdpbnNlcnQnLCAnZXJhc2UnLCBhbmQKCQkgc28gb24gbWV0aG9kcyBhbHNvIHN1cHBvcnRzIGl0ZXJhdG9ycyBub3csIGllOgoKCQkgICAgICBpID0gcy5iZWdpbigpCgkJICAgICAgaSArPSAxCgkJICAgICAgcy5lcmFzZShpKQogICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBpCgkJICAgICAgcHJpbnQgc3VtCgkJICAgICAgPj4+ICJhYyIKCQkgICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZXJlIGlzIG5vIG1vcmUgJ3RoaXNvd24nIGF0dHJpYnV0ZS4gSWYgeW91IHVzZSBpdCwgcHl0aG9uCgkgICAgd2lsbCB0cmFuc2xhdGUgdGhlIGZvbGxvd2luZyBjb2RlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKHNlbGYudGhpc293bik6ICAgPT0+ICAgaWYgKHNlbGYudGhpcy5vd24oKSk6CgkJc2VsZi50aGlzb3duID0gMSAgICAgPT0+ICAgc2VsZi50aGlzLm93bigxKQogICAgICAgICAgICAgICAgc2VsZi50aGlzb3duID0gMCAgICAgPT0+ICAgc2VsZi50aGlzLm93bigwKQoKCSAgICBTdGlsbCwgbWF5YmUgaW4gc29tZSB1bnVzdWFsIGNhc2VzIHRoZSB0cmFuc2xhdGlvbiB3aWxsIG5vdCBiZQoJICAgIDEwMCUgY29ycmVjdCwgc28gaWYgeW91IGhhdmUgYSBwcm9ibGVtLCBwbGVhc2UgcmVwb3J0IGl0CgkgICAgYW5kL29yIHVzZSB0aGUgbmV3ICdzZWxmLnRoaXMub3duKCknIGFjY2Vzc29yLgoJICAgIAoJICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCSAgICAKCSAgICBUaGVyZSBpcyBubyBtb3JlIENsYXNzUHRyIGNsYXNzZXMgaW4gdGhlIHB5dGhvbiBjb2RlLiBIZW5jZSwKCSAgICBpZiBpbiB0aGUgcGFzdCB5b3UgbmVlZGVkIHRvIHJlc29ydCB0byBzb21lIGtpbmQgb2YgdHJpY2tlcnkKCSAgICB3aXRoIHRoZW0sIG9yIG92ZXJjb21lIHRoZWlyIHByZXNlbmNlLCBpdCBpcyBubyBsb25nZXIKCSAgICByZXF1aXJlZCwgYnV0IHRoZSBleHRyYSBjb2RlIHlvdSBhZGRlZCBjb3VsZCBub3cgYnJlYWsKCSAgICB0aGluZ3MuCgoJICAgIElmIG5lZWRlZCwgeW91IGNhbiB1c2UgdGhlIG9wdGlvbiAtY2xhc3NwdHIsIGkuZS4sCgogICAgICAgICAgICAgICBzd2lnIC1jbGFzc3B0ciAtcHl0aG9uIC4uLgoKCSAgICB0byBnZW5lcmF0ZSB0aGUgb2xkIENsYXNzUHRyIGNsYXNzZXMuCgoKMTAvMzAvMjAwNTogbWtvZXBwZSAKCSAgICBbR3VpbGVdIE1ha2UgZGVjbGFyZWQgYW5kIGRlZmluZWQgbGlua2FnZSBvZiBTV0lHX2luaXQgY29uc2lzdGVudC4gIAoJICAgIFJlcG9ydGVkIGJ5IFN0ZXZlbiBHLiBKb2huc29uIChTRiBwYXRjaCAxMzE1NDk4KS4KCjEwLzI2LzIwMDU6IG1tYXR1cwoKCSAgLSBBZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgZ2xvYmFsIGxpYnJhcnkgZGlyZWN0b3IuCgkgICAgTm93IGl0IGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHVzZQoJICAgIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSBhcyB3ZWxsLgoKCSAgICBTbywgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICVpbmNsdWRlIGF0dHJpYnV0ZS5pCgogICAgICAgICAgICAgICAlYXR0cmlidXRlKEEsIGludCwgYSwgZ2V0X2EsIHNldF9hKTsKCSAgICAgICAJCQkJICAgICAgCSAgCgkgICAgICAgc3RydWN0IEEJCQkgICAgICAJICAKCSAgICAgICB7ICAgIAkJCQkgIAoJICAgICAgICAgaW50IGdldF9hKCkgY29uc3Q7IAkJICAKCSAgICAgICAgIHZvaWQgc2V0X2EoaW50IGFhKTsgCQkgIAoJICAgICAgIH07CQkJCSAgCgogICAgICAgICAgICAgICAlYXR0cmlidXRlX3JlZihCLCBpbnQsIGMpOwoJICAgICAgIAkJCQkKCSAgICAgICBzdHJ1Y3QgQgkJCQoJICAgICAgIHsgICAgCQkJCgkgICAgICAgICBpbnQmIGMoKTsgCQkKCSAgICAgICB9OyAKCgkgICAgdGhlbiBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlIHRoZSAnQS5hJyBhbmQgJ0IuYycgYXR0cmlidXRlcyB3aWxsCgkgICAgYmUgdmlzaWJsZSwgaWUsIHlvdSBjYW4gYWNjZXNzIHRoZW0gYXMgcGxhaW4gdmFyaWFibGVzOgoKICAgICAgICAgICAgICAgZiAgID0gQSgpCiAgICAgICAgICAgICAgIGYuYSA9IDMKICAgICAgICAgICAgICAgZyAgID0gQigpCiAgICAgICAgICAgICAgIGcuYyA9IDMgCiAgICAgICAgICAgCgkgICAgICAgaCAgID0gZi5hICsgZy5jCgoJICAgIGFuZCB0aGUgcHJvcGVyIGdldC9zZXQgbWV0aG9kcyB3aWxsIGJlIGRpc3BhdGNoZWQuIFNlZQoJICAgIGF0dHJpYnV0ZS5pIGZvciBtb3JlIGluZm8uCiAgIAogICAgICAgICAgLSBNb3JlIGNsZWFudXBzIGFyb3VuZCBhbmQgYWRkaW5nIG1vcmUgdGVzdC1jYXNlcy4gVGhlCiAgICAgICAgICAgIERJU09XTiB0eXBlbWFwIG5vdyBpcyB0ZXN0ZWQgYW5kIHdvcmtpbmcgaW4gYWxsIHRoZQogICAgICAgICAgICBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpZSwgdGNsLAogICAgICAgICAgICBydWJ5LCBwZXJsIGFuZCBweXRob24uCgkgICAgCgoxMC8yNS8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsLCBjb21wbGV0ZSB0aGUgRElTT1dOIHR5cGVtYXAuCgkgICAgCgkgICAgLSBhZGRlZCB0aGUgYXR0cmlidXRlLmkgZmlsZSB0byB0aGUgdW5pZmllZCB0eXBlbWFwCiAgICAgICAgICAgICAgbGlicmFyeSAoYmVmb3JlIHdhcyBvbmx5IHVzYWJsZSBmcm9tIHB5dGhvbikuCgoJICAgIC0gdW5pZnkgdGhlIG5hbWVzIGZvciB0aGUgc2V0dGVyIGFuZCBnZXR0ZXIgbWV0aG9kcyBpbgoJICAgICAgcGVybCx0Y2wscnVieSBhbmQgcHl0aG9uLCBzbywgdGhlIGF0dHJpYnV0ZS5pIGxpYnJhcnkKCSAgICAgIGNhbiB3b3JrIGFjcm9zcyB0aGVtLgoJICAgICAgCgkgICAgLSBzZWUgdGhlIGxpX2F0dHJpYnV0ZS5pIHRlc3QtY2FzZSBvciB0aGUgbGlicmFyeSBmaWxlCgogCSAgICAgICAgTGliL3R5cGVtYXBzL2F0dHJpYnV0ZS5zd2cKCiAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mbyBhYm91dCBob3cgdG8gdXNlIGl0LgoKIAoJICAgICAgCgoxMC8yNC8yMDA1OiBtbWF0dXMKCgkgICAgLSBQZXJsIG5vdyB1c2VzIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeS4KCgkgICAgLSBDaGFuZ2VzIGluIHJ1YnkgdG8gdXNlIHRoZSAkdHJhY2sgb3B0aW9uIGluIHR5cGVtYXBzLgoKCSAgICAtIENoYW5nZXMgaW4gdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IHRvIGZvbGxvdyB0aGUKCSAgICAgIGNvbnZlbnRpb24gdGhhdCBhbGwgbWFjcm9zIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZQoJICAgICAgQy9DKysgc2lkZSBzdGFydHMgd2l0aCAlLCBzdWNoIGFzCgoJICAgICAgICAgICAlZGVsZXRlCgkJICAgJW5ld19hcnJheQoKICAgICAgICAgICAgICBldGMuCgkgICAgICAKCSAgICAtIERvY3VtZW50aW5nIGZyYWdtZW50cywgc2VlIGZyYWdtZW50cy5zd2cuCgoJICAgIC0gQ2xlYW5lciB3YXkgdG8gdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaW5jbHVkZQoJICAgICAganVzdCA8dHlwZW1hcHMvc3dpZ3R5cGVzLnN3Zz4uCgoJICAgICAgQ2hlY2sgc29tZSBvZiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogcGVybCwgdGNsLCBydWJ5LAoJICAgICAgcHl0aG9uLgoKCSAgICAgIEFsd2F5cyBzdGFydCB3aXRoIHRoZSBoZWFkIGZpbGUsIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0aG9uLnN3ZwoJICAgICAgICAgdGNsL3RjbDguc3dnCgkgICAgICAgICBydWJ5L3J1Ynkuc3dnCgkgICAgICAgICBwZXJsNS9wZXJsNS5zd2cKCiAgICAgICAgICAgICAgYW5kIHRoZSBwcmluY2lwYWwgZmlsZSB0aGF0IGludm9rZXMgdGhlIHVuaWZpZWQgbGlicmFyeSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICB0Y2wvdGNsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHJ1YnkvcnVieXR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBwZXJsL3Blcmx0eXBlbWFwcy5zd2cJICAgIAoJICAgIAoJICAgICAgVGhlIGZpbGUgdGhhdCBwcm92aWRlIHRoZSBzcGVjaWFsaXphdGlvbiBmb3IgZWFjaAoJICAgICAgbGFuZ3VhZ2UgYXJlIHRoZSBvbmUgdGhhdCBwcm92aWRlcyB0aGUgYmFzaWMgdHlwZXM6CgoJICAgICAgICAgcHl0aG9uL3B5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXByaW10eXBlcy5zd2cJCgkgICAgICAgICB0Y2wvdGNscHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxwcmltdHlwZXMuc3dnCgoJICAgICAgYW5kIHRoZSBzdHJpbmcgbWFuaXB1bGF0aW9uOiAgCSAKCSAgICAKCSAgICAgICAgIHB5dGhvbi9weXN0cmluZ3Muc3dnCQoJICAgICAgICAgcnVieS9ydWJ5c3RyaW5ncy5zd2cJCgkgICAgICAgICB0Y2wvdGNsc3RyaW5ncy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJsc3RyaW5ncy5zd2cKCgkJIAoJICAgICAgVGhlIHJlc3Qgb2YgdGhlIGZpbGVzLCBzdWNoIGFzIGNhcnJheS5pLCBhcmUgbW9zdGx5IG9uZSAKCSAgICAgIGxpbmUgZmlsZXMgdGhhdCBpbmNsdWRlIHRoZSBwcm9wZXIgdHlwZW1hcCBsaWJyYXJ5CgkgICAgICB2ZXJzaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUGVybCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGV4cGVjdGVkIGJlaGF2aW9yIGluIFBlcmwuCgoxMC8yMy8yMDA1OiB3dXp6ZWIKICAgICAgICAgICAgQ2hpY2tlbjoKICAgICAgICAgICAgICArIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMgZmluYWxseSB3b3JrIHByb3Blcmx5CiAgICAgICAgICAgICAgKyBhZGQgdGVzdCBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgdG8gY3BwX2Jhc2ljLmkKCjEwLzIwLzIwMDU6IGRhbmN5CgkgICAgW2FsbGVncm9jbF0gQWRkZWQgQysrIHN1cHBvcnQuIExhcmdlIHVwZGF0ZSwgbWFueSBjaGFuZ2VzLiBTZWUKCSAgICBuZXdseSBhZGRlZCBBbGxlZ3JvIENvbW1vbiBMaXNwIHNlY3Rpb24gaW4gbGlzcC5odG1sCgoxMC8yMC8yMDA1OiBtbWF0dXMKCSAgICBSdWJ5LCBUY2wsIFB5dGhvbjoKCgkgICAgLSBVbmlmb3JtIHdheSB0byBmYWlsIChsYWJlbCBmYWlsOiksIG5vdyBmaW5hbGx5CgkgICAgICBTV0lHX2V4Y2VwdGlvbiB3b3JrcyBhY3Jvc3MgdGhlIHRocmVlIGxhbmd1YWdlcyBhbmQgYWxsCgkgICAgICB0aGUgdHlwZW1hcHMuCgoJICAgIC0gQWRkIHByb3BlciBjbGVhbnVwIGNvZGUgdG8gcnVieQoKCSAgICAtIE1vcmUgdmFsZ3JpbmQgZml4ZXMKCgkgICAgLSBTaW1wbGlmeSB0aGUgaW5saW5lIHVzZSwgaXQgc2VlbXMgYSBzbWFsbCBpbnRlcmZhY2Ugb2YKCSAgICAgIDIwLDAwMCBsaW5lcyAocGx1cyBtYW55IG1hbnkgdGVtcGxhdGVzKSBjYW4gYnJlYWsgCgkgICAgICBnY2MgLU8zIGVhc2lseS4KCgkgICAgLSBGaW5hbGl6ZSB0aGUgdHlwZW1hcHMgbGlicmFyeS4gQWxsIHRoZSBvbGQgICouaSBmaWxlcwoJICAgICAgKGNhcnJheS5pLCBjcG9pbnRlci5pLCBleGNlcHRpb24uaSkgaGFkIGJlZW4gaW1wbGVtZW50ZWQKCSAgICAgIGluIHRoZSBuZXcgdHlwZW1hcHMgbGlicmFyeS4KCSAgICAKCjEwLzE5LzIwMDU6IHd1enplYgoJICAgIFVwZGF0ZSB0aGUgUnVudGltZSBUeXBlbWFwIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbAoKMTAvMTgvMjAwNTogd3V6emViCgkgICAgQ2hpY2tlbjoKCSAgICAgIC0gQ29ycmVjdGx5IGhhbmRsZSAlaWdub3JlZCBjbGFzc2VzCiAgICAgICAgICAgICAgLSBDb3JyZWN0bHkgY29udmVydCBsb25nLCBsb25nIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGV0YwogICAgICAgICAgICAgICAgdG8gY2hpY2tlbiBwcmltaXRpdmVzLiAoVGhhbmtzIHRvIEZlbGl4IFdpbmtlbG1hbm4pCiAgICAgICAgICAgICAgLSBVc2luZyBhcmdvdXQgcGFyYW1ldGVycyB3aGVuIHRoZSByZXR1cm4gdmFsdWUgd2FzIGEKICAgICAgICAgICAgICAgIHdyYXBwZWQgcG9pbnRlciBjYXVzZWQgYSBtZW1vcnkgY29ycnVwdGlvbi4gIFRoZSBjaGlja2VuCiAgICAgICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciBtb3ZlZCBhIHBvaW50ZXIgb3V0IGZyb20gdW5kZXIgdXMuCiAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBieSBydW5uaW5nIGFsbCB0aGUgcHJveHkgY3JlYXRpb24KICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBhcyBjb250aW51YXRpb25zIGFmdGVyIHRoZSB3cmFwcGVyIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm5zLiAgQXMgcGFydCBvZiB0aGlzLCB3ZSBubyBsb25nZXIgbmVlZCB0aGUKICAgICAgICAgICAgICAgIGNoaWNrZW5mYXN0cHJveHkgZmxhZyBvbiBvdXRwdXQgdHlwZW1hcHMuCiAgICAgICAgICAgICAgLSB1c2luZyAtcHJveHkgYW5kIC1ub2NvbGxlY3Rpb24gdG9nZXRoZXIgd29ya3Mgbm93CiAgICAgICAgICAgICAgICBCZWZvcmUsIGl0IHdhcyBub3QgZXhwb3J0aW5nIHRoZSBkZXN0cnVjdG9yIGluIHRoZSBwcm94eQogICAgICAgICAgICAgICAgd3JhcHBlci4KCjEwLzE4LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEFkZGVkIHRoZSBVbmlmaWVkIFR5cGVtYXAgTGlicmFyeSAoVVRMKS4gSXQgdW5pZmllcyB0aGUgdHlwZW1hcHMgZm9yCgogCSAgICAgICAgcHl0aG9uLCBydWJ5LCB0Y2wKCgkgICAgYW5kIGluIHRoZSBwcm9jZXNzLCBmaXhlcyBzZXZlcmFsIHByb2JsZW1zIGluIGVhY2ggb2YgdGhlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRvIHdvcmsgaW4gYSAiY2Fub25pY2FsIiB3YXkgbm93IGVzdGFibGlzaGVkIGluCgkgICAgdGhlIHR5cGVtYXAgbGlicmFyeQoJICAgIAoJICAgICAgIFNXSUcvTGliL3R5cGVtcGFzCgoJICAgIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdW5pZmljYXRpb24gaXMgdGhhdCBldmVyeXRoaW5nCgkgICAgY29tcGlsZXMgYW5kIHJ1bnMgaW5zaWRlIHRoZSB0ZXN0LXN1aXRlIGFuZCBleGFtcGxlcwoJICAgIGRpcmVjdG9yaWVzLiBBbmQgZm9yIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdGhhbiBwYXNzIHRoZSBwcmltaXRpdmVfdHlwZXMuaSBjYXNlLgoKCSAgICBBbHNvLCB3ZSBoYXZlIGEgdW5pZm9ybSB3YXkgdG8gdHJlYXQgdGhlIGVycm9ycywgZm9yIGV4YW1wbGUKCSAgICBpZiB5b3UgZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICA+Pj4gZnJvbSBwcmltaXRpdmVfdHlwZXMgaW1wb3J0ICoKICAgICAgICAgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwKQogICAgICAgICAgICAgIDEwCgkgICAgICA+Pj4gcHJpbnQgdmFsX3VjaGFyKDEwMDApCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgkJICAgICAgCgkgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8JCQkgICAgCgkgICAgICBPdmVyZmxvd0Vycm9yOiBpbiBhcmd1bWVudCAxIG9mIHR5cGUgJ3Vuc2lnbmVkIGNoYXInCgoJICAgIHlvdSBnZXQgdGhlIHNhbWUgZXhjZXB0aW9uIGluIGFsbCB0aGUgdGhyZWUgbGFuZ3VhZ2VzLgoJICAgIAoJICAgIEFuZCB3ZWxsLCBtYW55IG1vcmUgZ29vZCB0aGluZ3Mgd2lsbCBjb21lIGZyb20gdGhpcwoJICAgIHVuaWZpY2F0aW9uLCBmb3IgZXhhbXBsZSwgcHJvcGVyIHN1cHBvcnQgb2YgdGhlIFNUTC9TVEQgY2xhc3NlcwoJICAgIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIGhvcGVmdWxseSwgd2UgY2FuIGtlZXAKCSAgICBhZGRpbmcgb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICBUaGUgaGFyZGVzdCBwYXJ0LCB3cml0aW5nIGEgY29tbW9uIHR5cGVtYXAgbGlicmFyeQoJICAgIHRoYXQgc3VpdGVzIHRoZSB0aHJlZSBkaWZmZXJlbnQgbGFuZ3VhZ2VzLCBpcyBkb25lLAoJICAgIGFuZCBhZGRpbmcgYW5vdGhlciBsYW5ndWFnZSBzaG91bGQgbm93IGJlIGVhc3kuIAoKCSAgICBTdGlsbCB0aGUgZ2xvYmFsIHVuaWZpY2F0aW9uIGlzIG5vdCBjb21wbGV0ZSwgdGhlIFNUTC9TVEQgCgkgICAgcGFydCBpcyBuZXh0LCBhbmQgcHJvYmFibHkgYXMgd2VsbCBhcyBhZGRpbmcgb25lIG9yIHR3byBtb3JlCgkgICAgbGFuZ3VhZ2VzLgoKCSAgICBJZiB5b3UgYXJlIGN1cmlvdXMsIGxvb2sgYXQgdGhlIHB5dGhvbiwgcnVieSBhbmQvb3IgdGNsCgkgICAgZGlyZWN0b3JpZXMgdG8gc2VlIHdoYXQgaXMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG5ldwoJICAgIGNvbW1vbiB0eXBlbWFwcyBsaWJyYXJ5LiAgU3RpbGwsIHRoZSBmaW5hbCB3YXkgdG8KCSAgICBpbnRlZ3JhdGUgYSBuZXcgbGFuZ3VhZ2UgY291bGQgY2hhbmdlIGFzIHdlIG1vdmUgdG8KCSAgICBpbnRlZ3JhdGUgdGhlIFNURC9TVEwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBSdWJ5L1RjbCAqKioKCgkgICAgU29tZSBtaXNzaW5nL3dyb25nIHR5cGVtYXBzIGNvdWxkIHN0YXJ0IHdvcmtpbmcgcHJvcGVybHksCgkgICAgYW5kIGNoYW5nZSB0aGUgb2xkIGJlaGF2aW9yLCBzcGVjaWFsbHkgaW4gcnVieSBhbmQgdGNsLgoKVmVyc2lvbiAxLjMuMjcgKE9jdG9iZXIgMTUsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdHlwZXNhZmUgZW51bSB3cmFwcGluZyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCiAgICAgICAgICAgIG92ZXJsb2FkIGEgbWV0aG9kIHdpdGggMiBkaWZmZXJlbnQgZW51bSB0eXBlcy4KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWZlYXR1cmUoImltbXV0YWJsZSIsIjAiKSBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIHNldHRlcnMKICAgICAgICAgICAgZm9yIGNvbnN0YW50cy4KCiAgICAgICAgICAgIFJlc3RvcmVkICVpbW11dGFibGUgYW5kICVtYWtlZGVmYXVsdCB0byBjbGVhciB0aGUgZmVhdHVyZSBhcyBpdAogICAgICAgICAgICBiZWhhdmVkIGluIFNXSUctMS4zLjI1IGFuZCBlYXJsaWVyLgoKMTAvMTQvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEZpeCBidWcgaW4gYW5vbnltb3VzIHR5cGVkZWYgc3RydWN0dXJlcyB3aGljaCB3YXMgbGVhZGluZyB0bwogICAgICAgICAgICBzdHJhbmdlIGJlaGF2aW91ci4KCjEwLzEzLzIwMDU6IG1tYXR1cwoJICAgIFNldmVyYWwgbWlub3IgY2hhbmdlczoKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHdjaGFyX3QgdHlwZSBzdXBwb3J0CgkgICAgLSBBZGQgYSB3YXJuaW5nIGZvciB3aGVuIHlvdSBkZWZpbmUgdGhlICdpbicgdHlwZW1hcCBidXQKCSAgICAgIHlvdSBkb24ndCBkZWZpbmUgdGhlICd0eXBlY2hlY2snIG9uZS4gVmVyeSBjb21tb24gbWlzdGFrZS4KCSAgICAtIEFkZCBwcm9wZXIgZGVmYXVsdCBydWxlIGZvciBmdW5jdGlvbiBwb2ludGVycywgbm93IHlvdQoJICAgICAgY2FuIGRlZmluZSBhIHR5cGVtYXAgc3VjaCBhczoKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKCgqKShBTlkpKSB7Li4ufQoKCSAgICAgIFRoYXQgd2lsbCBhcHBseSB0byBhbGwgdGhlIHBvaW50ZXIgdG8gZnVuY3Rpb25zLiBUaGUKCSAgICAgIHJ1bGUgaW4gQysrIGFsc28gYXBwbHkgdG8gdGhlIGZ1bmN0aW9uICdyZWZlcmVuY2UnLCBpZSwKCSAgICAgIGluIGJvdGggY2FzZXMKCgkgICAgICAgIHR5cGVkZWYgIGludCAoKmZwdHIpKGludCBhKTsKCSAgICAgICAgdHlwZWRlZiAgaW50IChmdW5jKShpbnQgYSk7CgoJICAgICAgVGhpcyB3YXMgbmVlZGVkIHNpbmNlIGl0IHNlZW1zIHRvIGJlICdpbGxlZ2FsJyBpbiBDKysgdG8KCSAgICAgIGRvIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAgIHZvaWQgKnB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oZnB0cik7CgoJICAgICAgYW5kIHByb2JhYmx5LCBhcyBmb3IgbWVtYmVyIGZ1bmN0aW9ucywgaXQgaXMgbm90CgkgICAgICB3YXJyYW50aWVkIHRoYXQgdGhlIHBvaW50ZXIgc2l6ZXMgd2lsbCBtYXRjaC4KCgkgICAgLSBBZGQgdGhlICNlcnJvci8jd2FybmluZyBkaXJlY3RpdmVzIHRvIHN3aWcncyBjcHAuCgoJICAgIC0gQWRkIHRoZSBub2Jsb2NrIG9wdGlvbiBmb3IgdHlwZW1hcHMsIHdoaWNoIGlzIHVzZWQgYXMKICAgICAgICAgICAgICBmb2xsb3dzOiBzdXBwb3NlZCB5b3UgYSB0eXBlbWFwLCBsaWtlIHRoaXMKCgkgICAgICAKCSAgICAgICV0eXBlbWFwKGluLG5vYmxvY2s9MSkgSGVsbG8gewkJCSAgIAoJICAgICAgICAgLi4uLgogICAgICAgICAgICAgIH0KCgkgICAgICB0aGVuIHRoZSB0eXBlbWFwIHdpbGwgYmUgaW5zZXJ0ZWQgd2l0aG91dCB0aGUgYmxvY2sKCSAgICAgIGltcG9zZWQgYnkgdGhlIGJyYWNrZXRzLCBzaW1pbGFyIHRvCgoJICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiLi4uIjsKCgkgICAgICBTbywgd2h5IHlvdSBkb24ndCBqdXN0IHVzZSB0aGUgcXVvdGUgc3R5bGU/LCBiZWNhdXNlOgoJICAgICAgCgkgICAgICAgICAxLi0gVGhlIHF1b3RlIHN0eWxlIGRvZXNuJ3QgZ2V0IHByZXByb2Nlc3NlZCwgZm9yIGV4YW1wbGUKCSAgICAgIAoJICAgICAgICAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxPSBTV0lHX21hY3JvKCQxKTsiOwoJICAgICAgCgkgICAgICAgICAgICAgaGVyZSwgU1dJR19tYWNybyBkb2Vzbid0IGdldCBleHBhbmRlZAoKICAgICAgICAgICAgICAgICAyLi0gSW5zaWRlIGEgcXVvdGUgdHlwZW1hcCwgeW91IGhhdmUgdG8gdXNlIAogICAgICAgICAgICAgICAgICAgICBxdW90ZXMgY2FyZWZ1bGx5CgoJCSAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDEgPSBcImhlbGxvXCIgIjsKCgkJIDMuLSBZb3UgY2FuJ3QgbWFrZSBlbWFjcyBhbmQvb3Igb3RoZXIgZWRpdG9ycwoJCSAgICAgdG8gaW5kZW50IGluc2lkZSBhIHN0cmluZyEuIAoKCgkgICAgICBTbywgd2h5IGRvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUgYmxvY2s/LCBiZWNhdXNlIGFuIGV4dHJhCgkgICAgICBibG9jayB3aGVuIG5vdCBuZWVkZWQgKG5vIGxvY2FsIHZhcmlhYmxlcyBpbiBpdCk6CgoJICAgICAgICAgIDEuLSBtYWtlcyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZAogICAgICAgICAgICAgICAgICAyLi0gbWFrZXMgdGhlIGNvZGUgbGFyZ2VyCiAgICAgICAgICAgICAgICAgIDMuLSBvciBpbiBzaG9ydCwgZm9yIHRoZSBzYW1lIHJlYXNvbiB3ZSBoYXZlIHRoZSBxdW90ZSBzdHlsZS4KClZlcnNpb24gMS4zLjI2IChPY3RvYmVyIDksIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGRlZCAndGhyb3dzJyB0eXBlbWFwcy4KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBsYW5ndWFnZXMgdGhhdCBkb24ndCBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUKICAgICAgICAgICAgZmlyc3Qgbm9uLWlnbm9yZWQgY2xhc3MgaW4gdGhlIHB1YmxpYyBiYXNlIGNsYXNzIGxpc3QgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIGJ5IHRoZSBwcm94eSBjbGFzcy4gUHJldmlvdXNseSwgaWYgdGhlIGZpcnN0IGNsYXNzIGluIHRoZSBsaXN0IHdhcyBpZ25vcmVkLCB0aGVuCiAgICAgICAgICAgIHRoZSBwcm94eSBjbGFzcyB3b3VsZG4ndCBoYXZlIGFueSBiYXNlIGNsYXNzZXMuCgoxMC8wNy8yMDA1OiBtbWF0dXMKCSAgICAgVXBkYXRlIG1vcmUgZmVhdHVyZXMgdG8gZm9sbG93IG5ldyBjb252ZW50aW9uLCBpbmNsdWRpbmc6CgoJICAgICAgIGNhbGxiYWNrCgkgICAgICAgcmVmL3VucmVmCgkgICAgICAgZXhjZXB0CgkgICAgCgkgICAgIEFsbCBvZiB0aGVtIHVzZSBub3Qgb25seSB0aGUgZmVhdHVyZSBhcyBhIGZsYWcsIGJ1dCBhbHNvCgkgICAgIGFzIGNvZGUgdmFsdWUuIFRvIGRlYWwgd2l0aCB0aG9zZSBmZWF0dXJlcywgd2UgdXNlIG5vdwoJICAgICBHZXRGbGFnQXR0ciwgd2hpY2ggaXMgc2ltaWxhciB0byBHZXRGbGFnLCBidXQgaW5zdGVhZCBvcgoJICAgICByZXR1cm5pbmcgMSBvciAwLCBpdCByZXR1cm5zIHRoZSBhdHRyIHZhbHVlLCBpZiBoYXBwZW5zCgkgICAgIHRvIGJlIGRpZmZlcmVudCBvZiAiMCIgb2YgY291cnNlLgoKCSAgICAgTm93IHRoZXJlIGFyZSBhbHNvIG1vcmUgdW5pZm9ybSBkaXJlY3RpdmUgbmFtZXMgZm9yIHRoZSAKCSAgICAgb25lcyBiYXNlZCBpbiBmZWF0dXJlcywgZm9yIGV4YW1wbGUsIGZvciB0aGUgb2xkCgkgICAgICVuZXdvYmplY3QgZGlyZWN0aXZlIG5vdyB3ZSBoYXZlIHRyZWUgZGlyZWN0aXZlcyBkZWZpbmVkOgoJICAgICAKCgkgICAgICNkZWZpbmUgJW5ld29iamVjdCAgICAgICAgJWZlYXR1cmUoIm5ldyIpCgkgICAgICNkZWZpbmUgJW5vbmV3b2JqZWN0ICAgICAgJWZlYXR1cmUoIm5ldyIsIjAiKQoJICAgICAjZGVmaW5lICVjbGVhcm5ld29iamVjdCAgICVmZWF0dXJlKCJuZXciLCIiKQoKCSAgICAgYW5kIHNvIG9uIGZvciBhbGwgdGhlIG90aGVyIGZlYXR1cmUgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMzAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzb21lIGZlYXR1cmVzLiBQcmV2aW91c2x5IGl0IHdhcyBub3QgcG9zc2libGUgdG8gZGlzYWJsZSBtYW55CiAgICAgICAgICAgIGZlYXR1cmVzIG9uY2UgdGhleSBoYWQgYmVlbiBlbmFibGVkLiBUaGlzIHdhcyBmb3IgbW9zdCBmZWF0dXJlcyB0aGF0IGJlaGF2ZSBhcwogICAgICAgICAgICBmbGFncy4gVGhlc2UgZmVhdHVyZXMgbm93IHdvcmsgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiKSAgICAgICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjEiKSAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIwIikgICAgICAgICAvLyBkaXNhYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIiIpICAgICAgICAgIC8vIGNsZWFycyB0aGUgZmVhdHVyZQoKICAgICAgICAgICAgSW4gZmFjdCBhbnkgbm9uLWVtcHR5IHZhbHVlIG90aGVyIHRoYW4gIjAiIHdpbGwgZW5hYmxlIHRoZSBmZWF0dXJlIChsaWtlIEMgYm9vbGVhbiBsb2dpYykuCiAgICAgICAgICAgIFByZXZpb3VzbHkgIjEiLCAiMCIgb3IgYW55IG90aGVyIG5vbi1lbXB0eSB2YWx1ZSB3b3VsZCBlbmFibGUgdGhlIGZlYXR1cmUgYW5kIGl0IHdvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZSBieSBjbGVhcmluZyBpdCAoYXNzdW1pbmcgdGhlcmUgd2FzIG5vIGdsb2JhbCBlbmFibGUpLgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgYWZmZWN0ZWQ6CgogICAgICAgICAgICAgIGFsbG93ZXhjZXB0CiAgICAgICAgICAgICAgY29tcGFjdGRlZmF1bHRhcmdzCiAgICAgICAgICAgICAgY2xhc3NpYyAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGNzOmNvbnN0ICAgICAgICAgICAgICAgKEMjKQogICAgICAgICAgICAgIGRpcmVjdG9yCiAgICAgICAgICAgICAgZXhjZXB0aW9uY2xhc3MgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIGlnbm9yZQogICAgICAgICAgICAgIGltbXV0YWJsZQogICAgICAgICAgICAgIGphdmE6Y29uc3QgICAgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAgamF2YTpkb3duY2FzdCAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBrd2FyZ3MKICAgICAgICAgICAgICBtb2Rlcm4gICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbmV3CiAgICAgICAgICAgICAgbm9hdXRvZG9jICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5vZGVmYXVsdAogICAgICAgICAgICAgIG5vZGlyZWN0b3IKICAgICAgICAgICAgICBub3JlZgogICAgICAgICAgICAgIG5vdGFic3RyYWN0CiAgICAgICAgICAgICAgbm91bnJlZgogICAgICAgICAgICAgIG5vdmFsdWV3cmFwcGVyCiAgICAgICAgICAgICAgcHl0aG9uOm1heWJlY2FsbCAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIHB5dGhvbjpub25keW5hbWljICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBtb2R1bGEzOm11bHRpcmV0dmFsICAgIChNb2R1bGEzKQogICAgICAgICAgICAgIHByZWRpY2F0ZSAgICAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdHJhY2tvYmplY3RzICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB2YWx1ZXdyYXBwZXIKCiAgICAgICAgICAgIEl0IGlzIG5vdyBwb3NzaWJsZSwgZm9yIGV4YW1wbGUgdG8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMgaW4gYSBoZWFkZXIgZmlsZSwgZXhjZXB0IGZvciBhCiAgICAgICAgICAgIGZldyB0YXJnZXR0ZWQgbWV0aG9kcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBzb21lX2Z1bmN0aW9uKGludCwgZG91YmxlKTsgLy8gZG8gbm90IGlnbm9yZSB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M7ICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIENsYXNzCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIsIjAiKSBTb21lQ2xhc3M6Om1ldGhvZDsgICAgICAgICAgLy8gZG8gbm90IGlnbm9yZSB0aGlzIG1ldGhvZAogICAgICAgICAgICAgICVpbmNsdWRlICJiaWdoZWFkZXIuaCIKCiAgICAgICAgICAgIFJlbW92ZWQgJXB5dGhvbmR5bmFtaWMgLSBpdCBuZXZlciB3b3JrZWQgcHJvcGVybHkuIFVzZSAlcHl0aG9ubm9uZHluYW1pYyBpbnN0ZWFkLgogICAgICAgICAgICBSZW1vdmVkICVmZWF0dXJlKCJub2t3YXJncyIpIC0gaXQgd2Fzbid0IGZ1bGx5IGltcGxlbWVudGVkICAtIHVzZSAlZmVhdHVyZSgia3dhcmdzIiwiMCIpIGluc3RlYWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzI1LzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFkZCAidGhyb3dzIiB0eXBlbWFwcy4KCjA5LzI0LzIwMDU6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0gQWRkcyBuZXcgJXRyYWNrb2JqZWN0cyBmdW5jdGlvbmFsaXR5IHRoYXQgbWFwcyBDKysgb2JqZWN0cyB0bwogICAgICAgICAgICBSdWJ5IG9iamVjdHMuICBUaGlzIGZ1bmN0aW9uYWxpdHkgbWFrZXMgaXQgbXVjaCBlYXNpZXIgdG8gaW1wbGVtZW50CiAgICAgICAgICAgIG1hcmsgZnVuY3Rpb25zIGZvciB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuICBGb3IgbW9yZSBpbmZvcm1hdGlvbgogICAgICAgICAgICByZWZlciB0byB0aGUgdXBkYXRlIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzLgogICAgICAgICAgICAKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFBhdGNoIDExMTY0MzEgZnJvbSBKb3NoIENoZXJyeS4gRml4ZXMgbm9uIG1lbWJlciBmdW5jdGlvbnMgaW5hZHZlcnRlbnRseQogICAgICAgICAgICBiZWluZyBjYWxsZWQgaW5zdGVhZCBvZiBtZW1iZXIgZnVuY3Rpb25zLgoKMDkvMjAvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggZnJvbSBNYXJrIEdvc3NhZ2UgdG8gYWRkIHN1cHBvcnQgZm9yIEx1YS01LjEsIHN0ZDo6c3RyaW5nLAogICAgICAgICAgICBzdGQ6OnZlY3Rvciwgc3RkOjpleGNlcHRpb24gYW5kIGRvY3VtZW50YXRpb24uCgowOS8xNC8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGQgLW5vY3BwY2FzdC4gTm93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvCgkgICAgYWx3YXlzIHVzZSB0aGUgY3BwY2FzdCBvcGVyYXRvcnMuIEJlZm9yZSB0aGF0IHdhcyB0aGUgY2FzZQoJICAgIG9ubHkgd2hlbiB5b3UgdXNlZCB0aGUgLWNwcGNhc3Qgb3B0aW9uLgoKICAgICAgICAgICAgSWYgdGhpcyBzZWVtcyB0byBicmVhayB5b3VyIGNvZGUuLi4geW91ciB3ZWxjb21lISwgaXQKCSAgICBtZWFucyBpdCB3YXMgYnJva2VuIGJlZm9yZSwgYW5kIHlvdSBuZXZlciBub3RpY2UuIAoKCSAgICBJZiB5b3UgdGhpbmcgdGhlIGVycm9yIGlzIGR1ZSB0byBvbmUgb2YgdGhlIFNXSUcgdHlwZW1hcHMsCgkgICAgc2VuZCB1cyBhbiBleGFtcGxlLgoKCSAgICBVc2UgLW5vY3BwY2FzdCBvbmx5IHdpdGggdmVyeSBvbGQgQysrIGNvbXBpbGVycyB0aGF0CgkgICAgZG8gbm90IHN1cHBvcnQgdGhlIGNwcGNhc3Qgb3BlcmF0aW9ucy4gCgoJICAgIFNvLCBoZXJlIGFwcGxpZXM6CgoJCVRoaXMgY2hhbmdlIGRvZXNuJ3QgYnJlYWsgY29tcGF0aWJpbGl0eSwgaXQgd2FzIGJyb2tlbiBiZWZvcmUuCgowOS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvciBtZXRob2RzIHdoZW4gYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYXMgYQogICAgICAgICAgICBwYXJhbWV0ZXIuCgowOS8xMS8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgQWRkaW5nIHRoZSBtb2R1bGUgb3B0aW9uIHRvIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gTm93IHlvdQogICAgICAgICAgICBjYW4gdXNlIGl0IGFzCgoJICAgICAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkgICAgd2hlcmUgc3ViZmlsZSBjb3VsZCAob3Igbm90KSBkZWZpbmUgdGhlIG1vZHVsZSBuYW1lIHZpYQoJICAgIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gVGhlIG1vZHVsZSBvcHRpb24gdGFrZSBwcmVjZWRlbmNlCgkgICAgYW5kIGl0IGhhcyB0aGUgc2FtZSBlZmZlY3RzIHRoYW4gaGF2aW5nIHRoZSBkaXJlY3RpdmUgCgoJICAgICAgICAlbW9kdWxlIEJpZ01vZHVsZSAgCgoJICAgIGluc2lkZSB0aGUgaW1wb3J0ZWQgZmlsZSBmb28uaS4KCgkgICAgWW91IGNhbiB1c2UgdGhlIG9wdGlvbiBpbiBtYWlubHkgdHdvIGNhc2VzOgoKCSAgICAxLi0gWW91IHVzZWQgdGhlIC1tb2R1bGUgb3B0aW9uIHdoZW4geW91IGdlbmVyYXRlZCB0aGUKICAgICAgICAgICAgICAgIG1vZHVsZSB0byBiZSBpbXBvcnRlZCwgYW5kIGhlbmNlIHRoZSBtb2R1bGUgbmFtZSBpbgogICAgICAgICAgICAgICAgdGhlIGltcG9ydGVkICVtb2R1bGUgZGlyZWN0aXZlIGlzIG5vdCByZWFsbHkgdXNlZnVsLgoKCSAgICAyLi0gVGhlIG1vZHVsZSB5b3Ugd2FudCB0byBpbXBvcnQgaXMgdmVyeSBsYXJnZSwgYW5kIGl0CiAgICAgICAgICAgICAgICBoYXMgc2V2ZXJhbCAuaS8uaCBmaWxlcy4gVGhlbiwgaWYgeW91IGp1c3Qgb25lIHRvCiAgICAgICAgICAgICAgICBpbXBvcnQgYSBjbGFzcyBvciBzbyBmcm9tIHRoZSBtb2R1bGUsIHNheXMgJ2ZvbycsIGFuZAogICAgICAgICAgICAgICAgbm90IHRoZSBlbnRpcmUgbW9kdWxlIHZpYSBpbXBvcnRpbmcgdGhlIG1haW4KICAgICAgICAgICAgICAgIEJpZ01vZHVsZS5pIGZpbGUsIHRoZW4geW91IGp1c3QgZG86CgogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5oCgogICAJICAgICAgICBvcgoJCQogCQkgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJCXdoZXJlIGZvby5pIGNvbnRhaW5zIHRoZSAnZm9vJyBkZWNsYXJhdGlvbiBhbmQgbWF5YmUgYQoJCWNvdXBsZSBvZiBleHRyYSAlaW5jbHVkZSBkaXJlY3RpdmVzLCBhcyBuZWVkZWQuCgoJICAgIAowOS8xMS8yMDA1OiBtbWF0dXMKCSAgICBGaXggYnVnICMxMjgyNjM3LCBhYm91dCB0aGUgLW1vZHVsZSBvcHRpb24gbm90IGhhdmluZyBlZmZlY3QKCSAgICBpbiBwbGFjZXMgd2hlcmUgaXQgd2FzIG5lZWRlZC4KCjA5LzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSB0eXBlbWFwcyB1c2VkIGZvciB0aGUKICAgICAgICAgICAgc2V0IHdyYXBwZXJzIGFyZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgZ2V0IHdyYXBwZXJzLiBJIGRvdWJ0IHRoaXMgd2FzIGEKICAgICAgICAgICAgcHJvYmxlbSBmb3IgYW55IGxhbmd1YWdlcyBleGNlcHQgZm9yIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIG51bGwgYXR0cmlidXRlCiAgICAgICAgICAgIGluIHRoZSBvdXQgdHlwZW1hcCAoQyMgb25seSkuCgowOS8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2VzIHdoZW4gZmlsZXMgZmFpbCB0byBvcGVuLgoKMDkvMDYvMjAwNTogbW1hdHVzIAoKCSAgICBBbGxvdyBhICVkZWZpbmUgYSBtYWNybyBpbnNpZGUgYW5vdGhlciAlZGVmaW5lIG1hY3JvLCBmb3IgZXhhbXBsZQoKCSAgICAgICVkZWZpbmUgaGVsbG8obmFtZSwgVHlwZSkKCSAgICAgICVkZWZpbmUgbmFtZSAjIyBhKFR5cGUpCgkgICAgICAldHlwZW1hcChpbikgVHlwZSAiaGVsbG87IjsKCSAgICAgICVlbmRkZWYKCSAgICAgICVlbmRkZWYKCSAgICAgIAoJICAgIFRvIGxlYXJuIGhvdyB0byB1c2UgdGhpcyBuZXcgZmVhdHVyZXMgaW4geW91ciBvd24gdHlwZW1hcHMgbGlicmFyeSwgc2VlCgkgICAgcHl0aG9uL2NzdHJpbmcuaSwgcHl0aG9uL2N3c3RyaW5nLmkgYW5kIHB5dGhvbi9jd3N0cmJhc2UuaS4JICAgIAoKICAgICAgICAgICAgW1B5dGhvbl0gTm9ybWFsaXplIHRoZSBjc3RyaW5nLmkgaW1wbGVtZW50YXRpb24gdG8gdXNlIGZyYWdtZW50cywgYW5kIGFkZAogICAgICAgICAgICBjd3N0cmluZy5pLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzYW1lIHR5cGVtYXBzIGJ1dCBmb3Igd2NoYXJfdCBzdHJpbmdzLgoKCSAgICBbUHl0aG9uXSBCdWcgZml4ZWQ6IDEyNDc0NzcsIDEyNDU1OTEsIDEyNDk4NzggYW5kIG90aGVycy4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgU1dJR1RZUEUqIERJU09XTiB0eXBlbWFwIChsaWtlIGluIFB5dGhvbikgZm9yCiAgICAgICAgICAgIGJldHRlciBjb250cm9sIG9mIG1lbW9yeSBtYW5hZ2VtZW50LCBlZyB3aGVuIGFkZGluZyBhbiBvYmplY3QgY3JlYXRlZCBpbiBSdWJ5CiAgICAgICAgICAgIHRvIGEgQysrIGNvbnRhaW5lci4gUGF0Y2ggIzEyNjE2OTIgZnJvbSBDaGFybGllIFNhdmFnZS4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIDY0IGJpdCBwbGF0Zm9ybSBmaXhlcyBmb3IgdGhlIHZhcmFyZ3MgaGFuZGxpbmcgaW4gU1dJR19HZXRBcmdzLiBUaGlzIGlzIGFuCiAgICAgICAgICAgIGltcHJvdmVkIGZpeCBmb3IgYnVnICMxMDExNjA0IGFzIHN1Z2dlc3RlZCBieSBKZXJlbXkgTGluLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQnVnICMxMjQwNDY5IC0gJW5ld29iamVjdCBzdXBwb3J0IGZvciBUY2wuIFBhdGNoIGZyb20gQm9iIE1hcmluaWVyLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEJ1ZyAjMTI1NDQ5NCAtIEZpeCBmb3IgZ2xvYmFsIG5hbWVzcGFjZSBwb2xsdXRpb24gYnkgcGVybCBoZWFkZXIgZmlsZXMKICAgICAgICAgICAgKGJvb2wgZGVmaW5lKSBwcmV2ZW50ZWQgU1RMIGhlYWRlcnMgZnJvbSBiZWluZyB1c2VkIG9uIHNvbWUgc3lzdGVtcywgZWcKICAgICAgICAgICAgV2luZG93cyB3aXRoIFZpc3VhbCBTdHVkaW8uCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMxMjQwOTM3IC0gUmVkZWZpbml0aW9uIG9mIF9faW50NjQgdHlwZWRlZiBmb3IgSW50ZWwgY29tcGlsZXJzLgoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gQnVnICMxMjUxODMyIC0gIEMrKyB0ZW1wbGF0ZSBtYXkgZ2VuZXJhdGUgaW52YWxpZCBYTUwgZmlsZQoKMDgvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU3VwcG9ydCBhZGRlZCBmb3IgTHVhLiBQYXRjaCAjMTI0Mjc3MiBmcm9tIE1hcmsgR29zc2FnZS4KICAgICAgICAgICAgSXQgc3VwcG9ydHMgbW9zdCBDL0MrKyBmZWF0dXJlcyAoZnVuY3Rpb25zLCBzdHJ1Y3QsIGNsYXNzZXMsIGFycmF5cywgcG9pbnRlcnMsCiAgICAgICAgICAgIGV4Y2VwdGlvbnMpLCBhcyB3ZWxsIGFzIGxvdHMgb2YgZG9jdW1lbnRhdGlvbiBhbmQgYSBmZXcgdGVzdCBjYXNlcyAmIGV4YW1wbGVzLgoKMDgvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1htbF0gRml4IGluY29ycmVjdCB4bWwgZXNjYXBpbmcgaW4gYmFzZSBjbGFzcyBuYW1lIHdoZW4gYmFzZSBjbGFzcyBpcyBhIHRlbXBsYXRlLgoKMDgvMTMvMjAwNTogZWZ1enp5b25lCgkgICAgW0NMSVNQXSBBZGRlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBlbnVtcy4gRG9lcyBub3QgYWRkcyB0aGUgcmV0dXJuIHR5cGUgZGVjbGFyYXRpb24KCSAgICB0byB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwgaWYgYSBmdW5jdGlvbiByZXR1cm5zIHZvaWQuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgTmV3IGxhbmd1YWdlIG1vZHVsZSwgQ29tbW9uIExpc3Agd2l0aCBVRkZJLCBmcm9tIFV0ei1Vd2UgSGF1cy4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBGaXggdGhlIExpc3Agcy1leHByZXNzaW9uIG91dHB1dCBtb2R1bGU7IGl0IG5vIGxvbmdlciBjb21wbGFpbnMgYWJvdXQgInVua25vd24gdGFyZ2V0cyIuCgowNy8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIFNUTCB3cmFwcGVycyBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIHVzZXIncyAlZXhjZXB0aW9uIGRpcmVjdGl2ZQogICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSBTVEwgd3JhcHBlciBtZXRob2RzLiBQcmV2aW91c2x5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsICVleGNlcHRpb24KICAgICAgICAgICAgZGlyZWN0aXZlIHdvdWxkIG5vdCBiZSB1c2VkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7IAogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBieSByZXBsYWNpbmcgJWV4Y2VwdGlvbiBkaXJlY3RpdmVzIGZvciBzcGVjaWZpYyBTVEwgd3JhcHBlcgogICAgICAgICAgICBtZXRob2RzIHdpdGggYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gZGVjbGFyZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kcy4gdGhyb3dzIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBub3cgc3VwcGxpZWQgZm9yIGhhbmRsaW5nIHRoZSBTVEwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIFRoZXNlIGNhbiBhbHNvIGJlIGVhc2lseQogICAgICAgICAgICBvdmVycmlkZGVuLCBmb3IgZXhhbXBsZSB0aGUgc3RkOjpvdXRfb2ZfcmFuZ2UgZXhjZXB0aW9uLCB3aGljaCBpcyB1c2VkIGEgbG90IGluIHRoZSBTVEwKICAgICAgICAgICAgd3JhcHBlcnMsIGNhbiBiZSBjdXN0b21pc2VkIGVhc2lseToKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF92ZWN0b3IuaSIKICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIHN0ZDo6b3V0X29mX3JhbmdlIHsKICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlcgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldGVtcGxhdGUoVmVjdEludCkgc3RkOjp2ZWN0b3I8aW50PjsKCjA3LzIyLzIwMDU6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0xJU1BdIFRoZSBjbGlzcCBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBJdCBjYW4gb25seSBoYW5kbGUgQywgY2xpc3AgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnRzIGZmaSBiaW5kaW5ncyB0byBDKysuCiAgICAgICAgICAgICAgLSBJdCBoYXMgdHdvIG9wdGlvbnMsIChhKSAtZXh0ZXJuLWFsbCB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgZm9yIGFsbCBmdW5jdGlvbnMKICAgICAgICAJYW5kIHZhcmlhYmxlc3Rpb25zLCAoYikgLWdlbmVyYXRlLXR5cGVkZWYgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzICJkZWYtYy10eXBlIgoJICAgICAgICB3cmFwcGVycyBmb3IgdHlwZWRlZnMKCSAgICAgIC0gQ2FuIGhhbmRsZSBwb2ludGVycyB0byBmdW5jdGlvbnMsIGNvbXBsZXggdHlwZXMgc3VjaCBhcyBuLWRpbWVuc2lvbmFsIGFycmF5cyBvZiAKCSAJcG9pbnRlcnMgb2YgZGVwdGggZAoJICAgICAgLSBHZW5lcmF0ZXMgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyBhcyB3ZWxsIGFzIHZhcmlhYmxlcwoJICAgICAgLSBDb3JyZWN0bHkgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHRoZSBkZWNsYXJhdGlvbiBvZiB2YXJpYWJsZXMgaW4gc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCgkgICAgICAtIENyZWF0ZXMgYSBkZWZwYWNrYWdlICJkZWNsYXJhdGlvbiIgd2l0aCB0aGUgbW9kdWxlIG5hbWUgYXMgdGhlIHBhY2thZ2UgbmFtZSwgdGhlIGNyZWF0ZWQgCgkgICAgCXBhY2thZ2UgZXhwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCgkgICAgICAtIHRyaWVzIHRvIGd1ZXNzIHdoZW4gc2hvdWxkIGEgcG9pbnRlciB2YXJpYWJsZSBiZSBkZWNsYXJlZCBhcyBjLXB0ciBvciBjLXBvaW50ZXIKCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQ2hhbmdlcyB0byBzdXBwb3J0IEMjIHN0cnVjdHMgcmV0dXJuZWQgYnkgdmFsdWUuIFRoZSBjaGFuZ2VzIHJlcXVpcmVkIGFyZToKICAgICAgICAgICAgICAtIFVzaW5nIGFuIG9wdGlvbmFsICdudWxsJyBhdHRyaWJ1dGUgaW4gdGhlIG91dCB0eXBlbWFwLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICB0aGVuIGl0IGlzIHVzZWQgZm9yIHRoZSAkbnVsbCBzcGVjaWFsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KICAgICAgICAgICAgICAtIFRoZSBjdHlwZSB1c2VkIGluIHRoZSBDL0MrKyB3cmFwcGVycyBpcyBubyBsb25nZXIgaW5pdGlhbGlzZWQgdG8gMCBvbiBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBjaGFuZ2VzIGZpeCB0aGUgc2l0dWF0aW9ucyB3aGVyZSBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFzc2lnbiAwIHRvIHRoZQogICAgICAgICAgICByZXR1cm5lZCBzdHJ1Y3QuIE1hcnNoYWxsaW5nIHN0cnVjdHMgYXMgdmFsdWUgdHlwZXMgc3RpbGwgcmVxdWlyZXMgdXNlciBkZWZpbmVkIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gZXhhbXBsZS4KCjA3LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4IFNXSUdfZXhjZXB0aW9uIHVzYWdlIHRvIHdvcmsgd2l0aCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGVtcHR5IG1hY3JvCiAgICAgICAgICAgIGFyZ3VtZW50cy4gVW5mb3J0dW5hdGVseSB0aGlzIGZpeCB3aWxsIHN0b3AgdXNhZ2Ugb2YgU1dJR19leGNlcHRpb24gYmVpbmcgdXNlZCB3aXRoaW4gdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCB1c2UgIiIgb3IgJXsgJX0gZGVsaW1pdGVycywgYnV0IGNvbnRpbnVlcyB0byB3b3JrIHdpdGggdHlwZW1hcHMgdXNpbmcge30gZGVsaW1pdGVycy4KICAgICAgICAgICAgUGxlYXNlIHVzZSB0aGUgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQgb3IgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gbWV0aG9kcyBpbnN0ZWFkCiAgICAgICAgICAgIGFzIFNXSUdfZXhjZXB0aW9uIGlzIHJlYWxseSBpbnRlbmRlZCBhcyBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hY3JvIGZvciB0aGUgU1dJRyBsaWJyYXJ5IHdyaXRlcnMuCgowNy8xNi8yMDA1OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSBzcGVjaWZpYyBmb3JlaWduIHR5cGVzIHJhdGhlciB0aGFuICgqIDp2b2lkKS4gCgkgICAgVXNlICpzd2lnLWlkZW50aWZpZXItY29udmVydGVyKi4KCjA2LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1bmN0aW9ucyBkZWNsYXJlZCBhcyAnZXh0ZXJuJyBubyBsb25nZXIgaGF2ZSBhbiBhZGRpdGlvbmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFkZGVkIHRvIHRoZSAKICAgICAgICAgICAgd3JhcHBlciBmaWxlcy4gVGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgU1dJRyBkb2VzIG5vdCBnZXQgdGhpcyByaWdodCwgZWcgYnVnICMxMjA1ODU5IChleHRlcm4KICAgICAgICAgICAgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgZGVjbGFyZWQgaW4gYSBuYW1lc3BhY2UpLiBBbHNvIFNXSUcgY2Fubm90IGdldCBub24tc3RhbmRhcmQKICAgICAgICAgICAgY2FsbGluZyBjb252ZW50aW9ucyBjb3JyZWN0LCBlZyBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMIF9fc3RkY2FsbAogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgI2RlZmluZSBETExJTVBPUlQKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgRExMSU1QT1JUIGV4dGVybiBTVERDQUxMIHZvaWQgZnVuY3Rpb24oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgU1dJRyBpbmNvcnJlY3RseSBnZW5lcmF0ZXM6CgogICAgICAgICAgICBleHRlcm4gdm9pZCBmdW5jdGlvbihpbnQpOwoKICAgICAgICAgICAgVG8gd2hpY2ggdGhlcmUgaXMgbm8gc29sdXRpb24gYXMgU1dJRyBkb2Vzbid0IGhhbmRsZSBub24tc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9ucy4gVGhlIGV4dHJhCiAgICAgICAgICAgICdleHRlcm4nIGZ1bmN0aW9uIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaXMgc3VwZXJmbHVvdXMgdW5sZXNzIGEgdXNlciBoYXMgZm9yZ290dGVuIHRvIGFkZCB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgZGVjbGFyYXRpb24gaW50byB0aGUgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGUgLW5vZXh0ZXJuIGNvbW1hbmRsaW5lIGFyZ3VtZW50IGlzIG5vdyByZWR1bmRhbnQgYW5kIGEgbmV3IGNvbW1hbmRsaW5lIGFyZ3VtZW50IC1hZGRleHRlcm4gY2FuCiAgICAgICAgICAgIGJlIHVzZWQgdG8gb2J0YWluIHRoZSBvcmlnaW5hbCBiZWhhdmlvdXIuIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSB1bmxlc3MgdGhlIGhlYWRlciBmaWxlCiAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIHdhcyBpbmFkdmVydGVudGx5IG5vdCBhZGRlZCB0byB0aGUgd3JhcHBlcnMuIFRvIGZpeCB0aGlzCiAgICAgICAgICAgIGFkZCB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW50byB5b3VyIHdyYXBwZXJzLCBGb3IgZXhhbXBsZSwgcmVwbGFjZToKCiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CgogICAgICAgICAgICB3aXRoOgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDYvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhLCBNb2R1bGEzLCBPY2FtbF0KICAgICAgICAgICAgVGhlIGludGVybWVkaWFyeSBmdW5jdGlvbiBuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcyB0bwogICAgICAgICAgICBtYXRjaCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBzbyB0aGF0ICVleHRlbmQgZm9yIGEgbWVtYmVyIHZhcmlhYmxlIHdvcmtzCiAgICAgICAgICAgIHVuaWZvcm1seSBhY3Jvc3MgYWxsIGxhbmd1YWdlIG1vZHVsZXMsIGVnOgoKICAgICAgICAgICAgICAlZXh0ZW5kIEV4dGVuZE1lIHsKICAgICAgICAgICAgICAgIFZhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBFeHRlbmRNZV9WYXJfc2V0KEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBFeHRlbmRNZV9WYXJfZ2V0KEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtZXRob2RzIGltcGxlbWVudGluZyB0aGUgZ2V0L3NldCB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICosIGRvdWJsZSkgey4uLn0KICAgICAgICAgICAgICAgIGRvdWJsZSBnZXRfRXh0ZW5kTWVfVmFyKEV4dGVuZE1lICopIHsuLi59CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBjaGFuZ2VzIHRoZSBuYW1lIG9mIHZhcmlhYmxlIHdyYXBwZXIgZnVuY3Rpb25zIHdoZW4gdXNpbmcgLW5vcHJveHkuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBuYW1lcyBjYW4gYmUgZ2VuZXJhdGVkIHdpdGggdGhlIC1vbGR2YXJuYW1lcyBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKClZlcnNpb24gMS4zLjI1IChKdW5lIDExLCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzExLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBoYW5kbGluZyBvZiBhbm9ueW1vdXMtZW51bSB2YXJpYWJsZXMuCgowNi8xMC8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggZm9yIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXNzZWQgYnkKCSAgICBjb3B5LW9mLXZhbHVlLiAgRml4IGZvciBnbG9iYWwgImNvbnN0IGNoYXIgKiIgdmFyaWFibGVzLgoJICAgIEZpeCB0ZXN0Y2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MsIGFycmF5c19nbG9iYWwuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIHdoZW4gYSBiYXNlIGNsYXNzIGRlZmluZXMgYSBzeW1ib2wgYXMgYSBtZW1iZXIgdmFyaWFibGUgYW5kIGEgZGVyaXZlZCBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIHRoZSBzYW1lIHN5bWJvbCBhcyBhIG1lbWJlciBtZXRob2QuCgowNi8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyAtIHdoZW4gYSBtZXRob2QgaGFzIHByb3RlY3RlZCBhY2Nlc3MgCiAgICAgICAgICAgIGluIGJhc2UgYW5kIHB1YmxpYyBhY2Nlc3MgaW4gZGVyaXZlZCBjbGFzcy4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA2NjM2MyAtIEZvbGxvdyBjb252ZW50aW9uIG9mIHJlbGVhc2UgdGFyYmFsbCBuYW1lIG1hdGNoaW5nIGRpcmVjdG9yeSBuYW1lLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggIzEyMTEzNTMgLSB0eXBlc2FmZSBlbnVtcyAoYW5kIEphdmEgcHJvcGVyIGVudW1zKSB3cmFwcGVycyB3aGVuIGVudW0gdmFsdWUKICAgICAgICAgICAgaXMgbmVnYXRpdmUuCgowNS8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2Rlcm5pc2VkIGFuZCB0aWRpZWQgdXAgV2luZG93cyBtYWNyb3MgLS0+IFNXSUdFWFBPUlQsIFNXSUdTVERDQUxMLiBUaGV5IGNhbiBiZSBvdmVycmlkZGVuCiAgICAgICAgICAgIGJ5IHVzZXJzIHZpYSAtRCBjb21waWxlciBkaXJlY3RpdmVzIGlmIG5lZWQgYmUuCgowNS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAlY3NtZXRob2Rtb2RpZmllcnMgY2FuIGJlIGFwcGxpZWQgdG8gdmFyaWFibGVzIGFzIHdlbGwgYXMgbWV0aG9kcyBub3cuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCAncHVibGljJyBtb2RpZmllciB0aGF0IFNXSUcgZ2VuZXJhdGVzLCAlY3NtZXRob2Rtb2RpZmllcnMgd2lsbCBhbHNvCiAgICAgICAgICAgIHJlcGxhY2UgdGhlIHZpcnR1YWwvbmV3L292ZXJyaWRlIG1vZGlmaWVycyB0aGF0IFNXSUcgdGhpbmtzIGlzIGFwcHJvcHJpYXRlLiBUaGlzIGZlYXR1cmUgaXMKICAgICAgICAgICAgdXNlZnVsIGZvciBzb21lIG9ic2N1cmUgY2FzZXMgd2hlcmUgU1dJRyBtaWdodCBnZXQgdGhlIG1vZGlmaWVycyBpbmNvcnJlY3QsIGZvciBleGFtcGxlCiAgICAgICAgICAgIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UgYW5kIG92ZXJyaWRpbmcgYSBtZXRob2QgaW4gdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBjb25zdHJ1Y3RvcnMgdG8gc3RkOjpwYWlyIHdyYXBwZXJzIChzdGRfcGFpci5pKSBmb3IgYWxsIGxhbmd1YWdlcy4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgc3RkOjpwYWlyIHdyYXBwZXJzIGluIHN0ZF9wYWlyLmkKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIEMjICduZXcnIGFuZCAnb3ZlcnJpZGUnIG1vZGlmaWVycyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGEgQysrIGNsYXNzIGluaGVyaXRzIG1ldGhvZHMKICAgICAgICAgICAgdmlhIGEgQysrICd1c2luZycgZGVjbGFyYXRpb24uCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBwcmV2aW91c2x5IGJlaW5nIGlnbm9yZWQgaW4gY2xhc3NlcyB0aGF0IGluaGVyaXRlZCBtZXRob2RzCiAgICAgICAgICAgIGZyb20gJ3VzaW5nJyBkZWNsYXJhdGlvbnMsIGVnIGNhbGxzIHRvIERlcml2ZWQ6OmJhciBiZWxvdyB3aWxsIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50bwogICAgICAgICAgICBhIHRhcmdldCBsYW5ndWFnZSBleGNlcHRpb24vZXJyb3IsIGxpa2UgaXQgYWx3YXlzIGhhcyBkb25lIGZvciBCYXNlOjpCYXIuCgogICAgICAgICAgICBjbGFzcyBCYXNlIHsKICAgICAgICAgICAgICB2aXJ0dWFsIGJhcigpIHRocm93IChzdGQ6OnN0cmluZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7CiAgICAgICAgICAgICAgdXNpbmcgQmFzZTo6YmFyOwogICAgICAgICAgICB9OwoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRldGVjdGluZyB2aXJ0dWFsIG1ldGhvZHMgaW4gJWV4dGVuZCBmb3IgdGhlIC1mdmlydHVhbCBvcHRpb24gYW5kIEMjIG92ZXJyaWRlIGFuZCBuZXcKICAgICAgICAgICAgbWV0aG9kIG1vZGlmaWVycy4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlICduZXcnIG1vZGlmaWVyIGlzIG5vdyBnZW5lcmF0ZWQgb24gdGhlIHByb3h5IG1ldGhvZCB3aGVuIGEgbWV0aG9kIGluIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBpcyBub3QgcG9seW1vcnBoaWMgYW5kIHRoZSBzYW1lIG1ldGhvZCBleGlzdHMgaW4gdGhlIGRlcml2ZWQgY2xhc3MgKGllIGl0IGhpZGVzCiAgICAgICAgICAgIHRoZSBiYXNlIGNsYXNzJyBub24tdmlydHVhbCBtZXRob2QpLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXhlcyB0byBkZXRlY3Rpb24gb2YgY292YXJpYW50IHJldHVybiB0eXBlcyAtIHdoZW4gdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyBtb3JlCiAgICAgICAgICAgIHRoYW4gMiBjbGFzc2VzIGRlZXAuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gc3RkOjp3c3RyaW5nIHR5cGVtYXBzIG1vdmVkIGZyb20gc3RkX3N0cmluZy5pIHRvIHN0ZF93c3RyaW5nLmkKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgY3Jhc2ggaW4gRG9oU3Ryc3RyLCBidWcgIzExOTA5MjEKCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIEZpeCBmb3IgbWV0aG9kcyB3aXRoIHNpbWlsYXIgbmFtZXMgd2hlbiBzaG93aW5nIGxpc3Qgb2YgbmFtZXMgb24gZXJyb3IgLSBidWcgIzExOTE4MjguCiAgICAgICAgICAgIFBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBsb25nIGxvbmcgb3ZlcmxvYWRpbmcgZml4IC0gYnVnICMxMTkxODM1LCBwYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTE5Njc1NSB0byByZW1vdmUgZGVidWcgZnJvbSBzd2lndGNsOC5zd2cuCgowNS8xOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIC1mdmlydHVhbCBvcHRpb25dIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIHdoZW4gYQogICAgICAgICAgICB2aXJ0dWFsIG1ldGhvZCdzIHJldHVybiB0eXBlIHdhcyBhIHR5cGVkZWYgaW4gZWl0aGVyIHRoZSBiYXNlIG9yIGRlcml2ZWQgY2xhc3MuIEFsc28gZW5zdXJlcyB0aGUKICAgICAgICAgICAgbWV0aG9kIGlzIGVsaW1pbmF0ZWQgd2hlbiB1c2luZyB0aGUgLWZ2aXJ0dWFsIG9wdGlvbi4gRm9yIGV4YW1wbGUsIERlcml2ZWQubWV0aG9kIG5vdyBoYXMgdGhlIEMjCiAgICAgICAgICAgIG92ZXJyaWRlIGtleXdvcmQgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCogSW50ZWdlclB0cjsKCiAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCBJbnRlZ2VyUHRyIG1ldGhvZCgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICBpbnQgKiBtZXRob2QoKSBjb25zdDsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgW0MjXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgYmVpbmcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIGZvciB2aXJ0dWFsIG1ldGhvZHMgd2hlbiBhIGJhc2UgY2xhc3MKICAgICAgICAgICAgaXMgaWdub3JlZCB3aXRoICVpZ25vcmUuCgowNS8xMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gcmVtb3ZlICJkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMiCiAgICAgICAgICAgIHdhcm5pbmdzIGluIEMgd3JhcHBlcnMgd2hlbiBjb21waWxpbmcgQyBjb2RlIHdpdGggJ2djYyAtV2FsbCAtZnN0cmljdC1hbGlhc2luZycuIFBhdGNoIGZyb20KICAgICAgICAgICAgTWljaGFlbCBDYWhpbGwuIFRoaXMgbW9kaWZpZXMgbWFueSBvZiB0aGUgY2FzdHMgc2xpZ2h0bHksIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSZqYXJnMTsKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopKHZvaWQgKikmamFyZzE7CgowNS8xMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIEMjIGF0dHJpYnV0ZXMuIEMjIGF0dHJpYnV0ZXMgY2FuIGJlIGdlbmVyYXRlZDoKICAgICAgICAgICAgMSkgT24gYSBDL0MrKyB0eXBlIGJhc2lzIGJ5IHNwZWNpZnlpbmcgYW4gaW5hdHRyaWJ1dGVzIGFuZC9vciBvdXRhdHRyaWJ1dGVzIHR5cGVtYXAgYXR0cmlidXRlCiAgICAgICAgICAgICAgIGluIHRoZSBpbXR5cGUgb3IgY3N0eXBlIHR5cGVtYXBzIChmb3IgQyMgcmV0dXJuIHR5cGUgb3IgQyMgcGFyYW1ldGVyIHR5cGUgYXR0cmlidXRlcykuCiAgICAgICAgICAgIDIpIE9uIGEgd3JhcHBlZCBtZXRob2Qgb3IgdmFyaWFibGUgYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyBmZWF0dXJlICglZmVhdHVyZSkuCiAgICAgICAgICAgIDMpIE9uIGEgd3JhcHBlZCBwcm94eSBjbGFzcyBvciBlbnVtIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgdHlwZW1hcC4KCiAgICAgICAgICAgIEV4YW1wbGVzIGFyZSBpbiB0aGUgQyMgZG9jdW1lbnRhdGlvbiAoQ1NoYXJwLmh0bWwpLgoKMDQvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvZmYgdGhlIGRlZmF1bHQgbWF4aW11bSBjb21waWxlciB3YXJuaW5nIGFzCiAgICAgICAgICAgIHRoZXkgY291bGRuJ3QgYmUgcmVtb3ZlZCBldmVuIHdoZW4gb3ZlcnJpZGluZyBDRkxBR1MgYW5kIENYWEZMQUdTIHdpdGggY29uZmlndXJlCiAgICAgICAgICAgICguL2NvbmZpZ3VyZSBDRkxBR1M9IENYWEZMQUdTPSkuIFRvIHR1cm4gdGhlIG1heGltdW0gd2FybmluZ3Mgb2ZmLCBydW46ICAKCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRob3V0LW1heGltdW0tY29tcGlsZS13YXJuaW5ncwoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgd2hpY2ggcmV3b3JrcyB0aGUgSmF2YSBjb25zdHJ1Y3RvciBhbmQgZmluYWxpemUvZGVzdHJ1Y3RvciB0eXBlbWFwcywKICAgICAgICAgICAgZm9yIGRpcmVjdG9ycyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBvdmVyYWxsIEphdmEgdHlwZW1hcHMuIEFkZGVkIHRoZSBkaXJlY3Rvcl90YWtlIGFuZCAKICAgICAgICAgICAgZGlyZWN0b3JfcmVsZWFzZSB0eXBlbWFwcyB0byBlbXVsYXRlIG90aGVyIG1vZHVsZXMnIF9fZGlzb3duX18gZnVuY3Rpb25hbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ZWQgcHJvYmxlbXMgZHVlIHRvIHRoZSBvdmVyIGVhZ2VyIGdhcmJhZ2UgY29sbGVjdG9yLiBPY2Nhc2lvbmFsbHkgdGhlCiAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdvdWxkIGNvbGxlY3QgYSBDIyBwcm94eSBjbGFzcyBpbnN0YW5jZSB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZAogICAgICAgICAgICBpbiB1bm1hbmFnZWQgY29kZSBpZiB0aGUgb2JqZWN0IHdhcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAgICBOZWVkbGVzcyB0byBzYXkgdGhpcyBjYXVzZWQgaGF2b2MgYXMgdGhlIEMjIHByb3h5IGNsYXNzIGNhbGxzIHRoZSBDKysgZGVzdHJ1Y3RvcgogICAgICAgICAgICB3aGVuIGl0IGlzIGNvbGxlY3RlZC4gUHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMgbm93IHVzZSBhIEhhbmRsZVJlZiwKICAgICAgICAgICAgd2hpY2ggaG9sZHMgYW4gSW50UHRyLCBpbnN0ZWFkIG9mIGEgcGxhaW4gSW50UHRyIHRvIG1hcnNoYWwgdGhlIEMrKyBwb2ludGVyIHRvIHVubWFuYWdlZAogICAgICAgICAgICBjb2RlLiBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbnkgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYXMgYSByZXN1bHQgb2YgdGhpcwogICAgICAgICAgICBtb2RpZmljYXRpb24uCgogICAgICAgICAgICBUaGUgY2hhbmdlcyBhcmUgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHN3aWdDUHRyIGlzIG5vdyBvZiB0eXBlIEhhbmRsZVJlZgogICAgICAgICAgICBpbnN0ZWFkIG9mIEludFB0ciBhbmQgY29uc2VxdWVudGx5IHRoZSBnZXRDUHRyIG1ldGhvZCByZXR1cm4gdHlwZSBoYXMgYWxzbyBjaGFuZ2VkLiBUaGUgbmV0CiAgICAgICAgICAgIGVmZmVjdCBpcyB0aGF0IGFueSBjdXN0b20gd3JpdHRlbiB0eXBlbWFwcyBtaWdodCBoYXZlIHRvIGJlIG1vZGlmaWVkIHRvIHN1aXRlLiBBZmZlY3RlZCB1c2VycwogICAgICAgICAgICBzaG91bGQgbm90ZSB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSBuZXcgJ291dCcgYXR0cmlidXRlIGluIHRoZSBpbXR5cGUgdHlwZW1hcCBhcyB0aGUKICAgICAgICAgICAgaW5wdXQgdHlwZSBpcyBub3cgYSBIYW5kbGVSZWYgYW5kIHRoZSBvdXRwdXQgdHlwZSBpcyBzdGlsbCBhbiBJbnRQdHIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBhc3ltbWV0cmljIHR5cGUgbWFyc2hhbGxpbmcgYWRkZWQuIFNvbWV0aW1lcyB0aGUgb3V0cHV0IHR5cGUgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZGlmZmVyZW50IHRvIHRoZSBpbnB1dCB0eXBlLiBTdXBwb3J0IGZvciB0aGlzIGNvbWVzIGluIHRoZSBmb3JtIG9mIGEgbmV3IG9wdGlvbmFsICdvdXQnCiAgICAgICAgICAgIGF0dHJpYnV0ZSBmb3IgdGhlIGN0eXBlLCBpbXR5cGUgYW5kIGNzdHlwZSB0eXBlbWFwcy4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBub3QKICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSB0eXBlIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBpcyB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXAsIGFzIGhhcyBhbHdheXMgcHJldmlvdXNseSBiZWVuIHRoZSBjYXNlLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgdGhlbiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBvdXRwdXQgdHlwZXMgYW5kIHRoZSB0eXBlIHNwZWNpZmllZAogICAgICAgICAgICBpbiB0aGUgdHlwZW1hcCBpdHNlbGYgaXMgdXNlZCBmb3IgdGhlIGlucHV0IHR5cGUuIEFuIG91dHB1dCB0eXBlIGlzIGEgcmV0dXJuIHZhbHVlIGZyb20KICAgICAgICAgICAgYSB3cmFwcGVkIG1ldGhvZCBvciB3cmFwcGVkIGNvbnN0YW50IGFuZCBhbiBpbnB1dCB0eXBlIGlzIGEgcGFyYW1ldGVyIGluIGEgd3JhcHBlZCBtZXRob2QuCgogICAgICAgICAgICBBbiBleGFtcGxlIHNob3dzIHRoYXQgY2hhciAqIGNvdWxkIGJlIG1hcnNoYWxsZWQgaW4gZGlmZmVyZW50IHdheXMsIAoKICAgICAgICAgICAgICAldHlwZW1hcChpbXR5cGUsIG91dD0iSW50UHRyIikgY2hhciAqICJzdHJpbmciCiAgICAgICAgICAgICAgY2hhciAqIGZ1bmN0aW9uKGNoYXIgKik7CgogICAgICAgICAgICBUaGUgb3V0cHV0IHR5cGUgaXMgdGh1cyBJbnRQdHIgYW5kIHRoZSBpbnB1dCB0eXBlIGlzIHN0cmluZy4gVGhlIHJlc3VsdGluZyBpbnRlcm1lZGlhcnkgQyMgY29kZSBpczoKCiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBleHRlcm4gSW50UHRyIGZ1bmN0aW9uKHN0cmluZyBqYXJnMSk7CgowNC8yMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGlvbiBvZiAiZGVmaW5lLW1ldGhvZCIgZm9yIG1ldGhvZHMgb2YKCSAgICBjbGFzc2VzIHdpdGggYSBjb25zdHJ1Y3Rvci4gIFJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDQvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgRm9yIHdyYXBwZWQgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIG11bHRpcGxlIHZhbHVlcyAodXNpbmcgYXJnb3V0KSwKCSAgICBTV0lHIENISUNLRU4gbm93IHJldHVybnMgdGhlbSBhcyBtdWx0aXBsZSB2YWx1ZXMgaW5zdGVhZCBvZiBhcwoJICAgIGEgbGlzdC4gIFRoZXkgY2FuIHRoZW4gYmUgYWNjZXNzZWQgdXNpbmcgKGNhbGwtd2l0aC12YWx1ZXMpLgoKMDQvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXQogICAgICAgICAgICArIEFkZGVkIGEgd2hvbGUgYnVuY2ggb2YgbmV3IF9ydW5tZSBzY3JpcHRzIGludG8gdGhlIGNoaWNrZW4gdGVzdAogICAgICAgICAgICBzdWl0ZS4gIEFsc28gZml4IHNvbWUgYnVncyB0aGVzZSBuZXcgc2NyaXB0cyB0dXJuZWQgdXAuCgogICAgICAgICAgICArIEFkZGVkIG9wdGltaXphdGlvbiB3aGVuIHJldHVybmluZyBhIHdyYXBwZWQgcHJveHkgY2xhc3MuICBCZWZvcmUsCiAgICAgICAgICAgIGEgbWlub3IgZ2FyYmFnZSBjb2xsZWN0aW9uIHdhcyBpbnZva2VkIGV2ZXJ5IHRpbWUgYSBmdW5jdGlvbiByZXR1cm5lZC4KCgkgICAgKyBBbGwgdGhlIGNoaWNrZW4gRXhhbXBsZXMgc2hvdWxkIG5vdyBydW4gY29ycmVjdGx5CgowNC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1vcmUgZml4ZXMgZm9yIHR5cGVtYXAgbWF0Y2hpbmcgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGluIHBhcnRpY3VsYXIKICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHNvIHRoYXQgc3RkOjpzdHJpbmcgdmFyaWFibGVzIGNhbiBiZSBlYXNpbHkgbWFyc2hhbGxlZCB3aXRoCiAgICAgICAgICAgIGEgQyMgc3RyaW5nIHByb3BlcnR5IHVzaW5nOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3N0cmluZy5pIgogICAgICAgICAgICAgICVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKnZhcmlhYmxlX25hbWUgfTsKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lOwoKICAgICAgICAgICAgKFJlY2FsbCB0aGF0IGFsbCBjbGFzcyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcG9pbnRlcnMpCgowNC8wNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIEFkZGVkIEV4YW1wbGVzL2NoaWNrZW4vZWdnLCBhbiBleGFtcGxlIG9uIGhvdyB0byBidWlsZCBhIGNoaWNrZW4KCSAgICAgIGV4dGVuc2lvbiBsaWJyYXJ5IGluIHRoZSBmb3JtIG9mIGFuIGVnZy4gIEFsc28gdXBkYXRlZCB0aGUKCSAgICAgIGRvY3VtZW50YXRpb24gb24gdGhlIGRpZmZlcmVudCBsaW5raW5nIG9wdGlvbnMuCgoJICAgICsgY2hpY2tlbiB0ZXN0LXN1aXRlIG5vdyBoYXMgc3VwcG9ydCB0byBjaGVjayBTV0lHIHdpdGggdGhlIC1wcm94eQoJICAgICAgYXJndW1lbnQgaWYgdGhlcmUgZXhpc3RzIGEgX3Byb3h5X3J1bm1lLnNzIGZpbGUuCgoJICAgICsgTW9yZSBmaXhlcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMgYW5kIC1wcm94eQoKMDMvMzEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgVHVybmVkIG9uIGV4dHJhIHRlbXBsYXRlIGZlYXR1cmVzIGZvciBhbGwgbGFuZ3VhZ2VzIHdoaWNoIHdlcmUKICAgICAgICAgICAgcHJldmlvdXNseSBvbmx5IGF2YWlsYWJsZSB0byBQeXRob24uCgogICAgICAgICAgICBUaGlzIGVuYWJsZXMgdHlwZW1hcHMgZGVmaW5lZCB3aXRoaW4gYSB0ZW1wbGF0ZWQgY2xhc3MgdG8gYmUgdXNlZCBhcwogICAgICAgICAgICBleHBlY3RlZC4gUmVxdWlyZXMgJXRlbXBsYXRlIG9uIHRoZSB0ZW1wbGF0ZWQgY2xhc3MsICV0ZW1wbGF0ZSgpIHdpbGwKICAgICAgICAgICAgYWxzbyBwaWNrIHVwIHRoZSB0eXBlbWFwcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgICAgb3IKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb288VD4gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vX2kpIEZvbzxpbnQ+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIEZvbzxkb3VibGU+OwogICAgICAgICAgICAgIAogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIHRoZSBwcm9wZXIgJ2luJyB0eXBlbWFwcyB3aGVyZXZlciBGb288aW50PiBhbmQgRm9vPGRvdWJsZT4KICAgICAgICAgICAgYXJlIHVzZWQuCgowMy8zMC8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBQYXRjaCBmcm9tIEhhbnMgT2VzdGVyaG9sdCBmb3Igc3VwcG9ydGluZyBNelNjaGVtZSAzMHguCgowMy8yOS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICArIFJlYWxsb3cgb2xkZXIgdmVyc2lvbnMgb2YgY2hpY2tlbiAoMS40MCB0byAxLjg5KSBieSBwYXNzaW5nIC1ub2NvbGxlY3Rpb24KCSAgICAgIGFyZ3VtZW50IHRvIFNXSUcKCSAgICArICVpbXBvcnQgbm93IHdvcmtzIGNvcnJlY3RseSB3aXRoIHRpbnljbG9zLiAgKGRlY2xhcmUgKHVzZXMgLi4uKSkgd2lsbCBiZQoJICAgICAgZXhwb3J0ZWQgY29ycmVjdGx5LgoJICAgICsgVGlueUNMT1MgcHJveHkgY2xhc3NlcyBub3cgd29yayBjb3JyZWN0bHkgd2l0aCBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgICAgYW5kIGNvbnN0cnVjdG9ycy4KCjAzLzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JvdXQgdHlwZW1hcHMuIEphdmEgZGlyZWN0b3JzCiAgICAgICAgICAgIHJlcXVpcmUgdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGxpa2UgdGhlIG90aGVyIGxhbmd1YWdlcyBub3cuIFRoZSBuZXcKICAgICAgICAgICAgdHlwZW1hcHMgcHJvdmlkZSBmaXhlcyBmb3IgbWV0aG9kcyB3aGVyZSB0aGUgcmV0dXJuIHR5cGUgaXMgcmV0dXJuZWQKICAgICAgICAgICAgYnkgcmVmZXJlbmNlICh0aGlzIGNhbm5vdCBhdXRvbWF0aWNhbGx5IGJlIG1hZGUgdGhyZWFkIHNhZmUgdGhvdWdoKS4KCjAzLzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEVudW0gY2FzdGluZyBmaXhlcy4gVmlzdWFsIEMrKyBkaWRuJ3QgbGlrZSB0aGUgQyB0eXBlIGNhc3RpbmcgU1dJRyBwcm9kdWNlZAogICAgICAgICAgICB3aGVuIHdyYXBwaW5nIEMrKyBlbnVtIHJlZmVyZW5jZXMsIGFzIHJlcG9ydGVkIGJ5IEFkbWlyZSBLYW5kYXdhc3Zpa2EuCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gU0YgIzExMjQ0OTAuIEZpeCBQZXJsIG1hY3JvIGNsYXNoZXMgd2hlbiB1c2luZyBWaXN1YWwgU3R1ZGlvJ3MgU1RMIHN0cmluZywKICAgICAgICAgICAgc28gbm93IHByb2plY3RzIGNhbiAjaW5jbHVkZSA8c3RyaW5nPi4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICV2YXJhcmdzIHdoaWNoIGdvdCBicm9rZW4gd2l0aCB0aGUgcmVjZW50IGRlZmF1bHQgYXJndW1lbnQgY2hhbmdlcy4KICAgICAgICAgICAgQWxzbyB3b3JrcyBmb3IgSmF2YSBhbmQgQyMgZm9yIHRoZSBmaXJzdCB0aW1lIG5vdy4KCjAzLzE3LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgKyBGaXggYSB3aG9sZSBidW5jaCBvZiBidWdzIGluIHRoZSBjaGlja2VuIG1vZHVsZS4gIFRoZSBlbnRpcmUKICAgICAgICAgICAgICB0ZXN0IHN1aXRlIG5vdyBjb21waWxlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSB0ZXN0cyB0aGF0IHJlcXVpcmUKCSAgICAgIHN0ZF92ZWN0b3IuaSwgc3RkX2RlcXVlLmksIGFuZCBzbyBvbiwgd2hpY2ggY2hpY2tlbiBkb2VzIG5vdCBoYXZlIHlldC4KCgkgICAgKyBBZGQgc3VwcG9ydCBmb3IgJWV4Y2VwdGlvbiBhbmQgJXR5cGVtYXAoZXhjZXB0aW9ucykuICBFeGNlcHRpb25zIGFyZQoJICAgICAgdGhyb3duIHdpdGggYSBjYWxsIHRvIChhYm9ydCkgYW5kIGNhbiBiZSBoYW5kbGVkIGJ5IChoYW5kbGUtZXhjZXB0aW9ucykKCjAzLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCBmb3IgZGlyZWN0b3JzLiBNb2RpZmljYXRpb25zIHRvIHRoZSB0eXBlbWFwcwogICAgICAgICAgICBnaXZpbmcgdXNlcnMgZmluZSBjb250cm9sIG92ZXIgbWVtb3J5IG93bmVyc2hpcCBhbmQgbGlmZXRpbWUgb2YgZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRGlyZWN0b3IgY2xhc3NlcyBubyBsb25nZXIgbGl2ZSBmb3JldmVyIGJ5IGRlZmF1bHQgYXMgdGhleSBhcmUgbm93IGNvbGxlY3RhYmxlCiAgICAgICAgICAgIGJ5IHRoZSBHQy4KCjAzLzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBBZGQgc3VwcG9ydCBmb3IgYWRkaW5nIGZpbmFsaXplcnMgZ2FyYmFnZSBjb2xsZWN0ZWQgb2JqZWN0cy4KCSAgICBGdW5jdGlvbnMgdGhhdCByZXR1cm4gbmV3IG9iamVjdHMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoICVuZXdvYmplY3QgYW5kCgkgICAgaW5wdXQgYXJndW1lbnRzIHdoaWNoIGNvbnN1bWUgKG9yIHRha2Ugb3duZXJzaGlwKSBvZiBhIHBvaW50ZXIgc2hvdWxkCgkgICAgYmUgbWFya2VkIHdpdGggdGhlIERJU09XTiB0eXBlbWFwLgoKCSAgICBBbHNvIGFkZCBzdXBwb3J0IGZvciBjb3JyZWN0bHkgY2hlY2tpbmcgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkCgkgICAgdG8gYSBmdW5jdGlvbiwgYW5kIHJhaXNpbmcgYW4gZXJyb3IgaWYgdGhlIHdyb25nIG51bWJlciBhcmUgcGFzc2VkLgoKMDMvMTQvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIEFkZCAtLXdpdGhvdXQtYWxsbGFuZyBvcHRpb24gdG8gY29uZmlndXJlLmluLCB3aGljaCBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICBwYXNzaW5nIGFsbCB0aGUgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybDUgZXRjLi4uIHRoYXQgTWF0dGhpYXMgYWRkZWQuCgowMy8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBNZW1vcnkgbGVhayBmaXggZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgY2xhc3Nlcy9zdHJ1Y3RzIGJ5IHZhbHVlLgoKMDMvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBmb3IgUGVybCBpbmNvcnJlY3RseSB0YWtpbmcgbWVtb3J5IG93bmVyc2hpcCBmb3IgcmV0dXJuIHR5cGVzIHRoYXQKICAgICAgICAgICAgYXJlIHR5cGVkZWZzIHRvIGEgc3RydWN0L2NsYXNzIHBvaW50ZXIuIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBWYXJpb3VzIGV4Y2VwdGlvbiBjaGFuZ2VzIGZvciB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZXNlIG5vdyBtb3JlCiAgICAgICAgICAgIGFjY3VyYXRlbHkgbWlycm9yIHRoZSBzYW1lIGV4Y2VwdGlvbnMgdGhhdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0IHRocm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggdW5kZWZpbmVkIGJlaGF2aW91ciBhZnRlciBhbnkgb2YgdGhlIHN0ZDo6dmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgdGhyb3cgYW4gZXhjZXB0aW9uLgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBXaGVuIG51bGwgaXMgcGFzc2VkIGZvciBhIEMrKyByZWZlcmVuY2Ugb3IgdmFsdWUgcGFyYW1ldGVyLCB0aGUgCiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24gaGFzIGJlZW4gY29ycmVjdGVkIHRvIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpbnN0ZWFkCiAgICAgICAgICAgIG9mIE51bGxSZWZlcmVuY2VFeGNlcHRpb24gYXMgcmVjb21tZW5kZWQgaW4gdGhlIC5ORVQgRnJhbWV3b3JrIGRvY3VtZW50YXRpb24uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgdHVybiBhIEMrKyBleGNlcHRpb24gaW50byBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKICAgICAgICAgICAgbm90IGEgU3lzdGVtRXhjZXB0aW9uIG5vdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTnVtZXJvdXMgY2hhbmdlcyBpbiBDIyBleGNlcHRpb24gaGFuZGxpbmcgaGF2ZSBiZWVuIG1hZGUgb3ZlciB0aGUgcGFzdAogICAgICAgICAgICBmZXcgd2Vla3MuIEEgc3VtbWFyeSBmb2xsb3dzOgoKICAgICAgICAgICAgVGhlIHdheSBpbiB3aGljaCBDKysgZXhjZXB0aW9ucyBhcmUgbWFwcGVkIHRvIEMjIGV4Y2VwdGlvbnMgaXMgcXVpdGUgZGlmZmVyZW50LgogICAgICAgICAgICBUaGUgY2hhbmdlIGlzIHRvIGZpeCBDIyBleGNlcHRpb25zIHNvIHRoYXQgdGhlIEMrKyBleGNlcHRpb24gc3RhY2sgaXMgY29ycmVjdGx5CiAgICAgICAgICAgIHVud291bmQgYXMgcHJldmlvdXNseSBDKysgZXhjZXB0aW9ucyB3ZXJlIGJlaW5nIHRocm93biBhY3Jvc3MgdGhlIEMgUEludm9rZSBsYXllcgogICAgICAgICAgICBpbnRvIHRoZSBtYW5hZ2VkIHdvcmxkLgoKICAgICAgICAgICAgTmV3IHR5cGVtYXAgYXR0cmlidXRlcyAoY2FudGhyb3cgYW5kIGV4Y29kZSkgaGF2ZSBiZWVuIGludHJvZHVjZWQgdG8gY29udHJvbCB0aGUKICAgICAgICAgICAgbWFwcGluZyBvZiBDKysgdG8gQyMgZXhjZXB0aW9ucy4gRXNzZW50aWFsbHkgYSBjYWxsYmFjayBpbnRvIHRoZSB1bm1hbmFnZWQgd29ybGQKICAgICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSBwZW5kaW5nIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiB0byB0aHJvdyBpcyBzdG9yZWQgaW4gdGhyZWFkIGxvY2FsCiAgICAgICAgICAgIHN0b3JhZ2UgKHNvIHRoZSBhcHByb2FjaCBpcyB0aHJlYWQtc2FmZSkuIFRoZSB0eXBlbWFwcyBhcmUgZXhwZWN0ZWQgdG8gcmV0dXJuCiAgICAgICAgICAgIGZyb20gdW5tYW5hZ2VkIGNvZGUgYXMgc29vbiBhcyB0aGUgcGVuZGluZyBleGNlcHRpb24gaXMgc2V0LiBBbnkgcGVuZGluZyBleGNlcHRpb25zCiAgICAgICAgICAgIGFyZSBjaGVja2VkIGZvciBhbmQgdGhyb3duIG9uY2UgbWFuYWdlZCBjb2RlIHN0YXJ0cyBleGVjdXRpbmcuIFRoZXJlIHNob3VsZAogICAgICAgICAgICBiZSBtaW5pbWFsIGltcGFjdCBvbiBleGVjdXRpb24gc3BlZWQgZHVyaW5nIG5vcm1hbCBiZWhhdmlvdXIuIEZ1bGwgZGV0YWlscyB3aWxsIGJlCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gQ1NoYXJwLmh0bWwuCgogICAgICAgICAgICBUaGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggdGhlCiAgICAgICAgICAgIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50KCkgYW5kIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbigpCiAgICAgICAgICAgIGZ1bmN0aW9ucy4gVGhlIG9yaWdpbmFsIG5hbWUgaGFzIGJlZW4gZGVsaWJlcmF0ZWx5IGNoYW5nZWQgdG8gYnJlYWsgb2xkIGNvZGUgYXMKICAgICAgICAgICAgdGhlIG9sZCBhcHByb2FjaCB3YXMgc29tZXdoYXQgZmxhd2VkLiBBbnkgdXNlciBkZWZpbmVkIGV4Y2VwdGlvbnMgdGhhdCBmb2xsb3cgdGhlCiAgICAgICAgICAgIHNhbWUgcGF0dGVybiBhcyB0aGUgb2xkIGFwcHJvYWNoIHNob3VsZCBhbHNvIGJlIGZpeGVkLgoKICAgICAgICAgICAgTnVtZXJvdXMgbmV3IC5ORVQgZnJhbWV3b3JrIGV4Y2VwdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUgZm9yIGVhc3kgdGhyb3dpbmcgZnJvbSAKICAgICAgICAgICAgdW5tYW5hZ2VkIGNvZGUuIFRoZSBjb21wbGV0ZSBsaXN0IGlzOiAKCiAgICAgICAgICAgICAgQXBwbGljYXRpb25FeGNlcHRpb24sIEFyaXRobWV0aWNFeGNlcHRpb24sIERpdmlkZUJ5WmVyb0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uLCBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiwgT3V0T2ZNZW1vcnlFeGNlcHRpb24sIE92ZXJmbG93RXhjZXB0aW9uLCAKICAgICAgICAgICAgICBTeXN0ZW1FeGNlcHRpb24sIEFyZ3VtZW50RXhjZXB0aW9uLCBBcmd1bWVudE51bGxFeGNlcHRpb24gYW5kCiAgICAgICAgICAgICAgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzA1LzIwMDU6IG1tYXR1cwoJICAgIAoJICAgIEZpeCBzZXZlcmFsIG1lbW9yeSBsZWFrcyBhcm91bmQuIEV2ZW4gd2hlbiB3ZSBzdXJ2aXZlICBrbm93bmluZwoJICAgIHN3aWcgaXMgYSBtZW1vcnkgbGVhayBmYWN0b3J5LCBpdCB3YXMgYSBsaXR0bGUgb3V0IG9mCgkgICAgY29udHJvbC4gVG8gcnVuIHN0ZF9jb250YWluZXJzLmkgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLAoJICAgIHN3aWcgd2FzIHVzaW5nIH4yNjBNQiwgbm93IGl0IHVzZXMgJ29ubHknIH40ME1CLCB3aGljaCBpcwoJICAgIHRoZSBzYW1lIGFtbW91bnQgdGhhdCBnKysgdXNlcywgc28sIGlzIG5vdCB0aGF0IGJhZC4KCSAgICBJbiB0aGUgcHJvY2VzcywgSSBmb3VuZCBhIGNvdXBsZSBvZiBleHRyYSBEZWxldGVzLCB3aGljaAoJICAgIGluIHNvbWUgY2FzZXMgY291bGQgdHJpZ2dlciBzZWcuIGZhdWx0cyBhbmQvb3IKCSAgICBET0gvYXNzZXJ0cy4KCSAgICAKCSAgICBbcHl0aG9uXSBCZXR0ZXIgc3VwcG9ydCBmb3IgZGlyZWN0b3JzICsgZXhjZXB0aW9uLiBNb3JlCgkgICAgdmVyYm9zZSBlcnJvcnMgYW5kIGFkZGVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsZXIuCgoJICAgIFtweXRob25dIEZpeCBtZW1vcnkgbGVhayBmb3IgdGhlCgoJICAgIAkgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+IAoKCSAgICBjYXNlLHJlcG9ydGVkIGJ5IEJvIFBlbmcuCgoJICAgIFtweXRob25dIEZpeCBTd2lnUHlPYmplY3QgY29tcGFyZSBwcm9ibGVtIHJlcG9ydGUgYnkKCSAgICBDYW1lcm9uIFBhdHJpY2suIAoKCSAgICBbcHl0aG9uXSBGaXggc2V2ZXJhbCB3YXJuaW5ncyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgCgkgICAgZm9yIGdudS1nY2MsIEludGVsIGFuZCBWQzcuMSAgY29tcGlsZXJzLgoKCjAyLzI1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFVwZGF0ZSBkb2N1bWVudGF0aW9uIHRvIHVzZSBDU1MgYW5kIDxkaXY+IGluc3RlYWQgb2YgPGJsb2NrcXVvdGU+CgkgICAgSSB1c2VkIGEgc2NyaXB0IHRvIGNvbnZlcnQgdGhlIGRvY3MsIGFuZCBpdCBzZXQgYWxsIHRoZSBib3ggY2xhc3NlcwoJICAgIHRvIGJlICJjb2RlIi4gIFRoZXJlIGFyZSBhY3R1YWxseSA0IGRpZmZlcmVudCBjbGFzc2VzLAoJICAgICJzaGVsbCIsICJjb2RlIiwgInRhcmdldGxhbmciLCBhbmQgImRpYWdyYW0iLiAgV2UgbmVlZCB0byBnbyB0aHJvdWdoCgkgICAgYW5kIGNvbnZlcnQgdGhlIGRpdnMgZGVwZW5kaW5nIG9uIHdoYXQgdGhleSBjb250YWluLgoKMDIvMjMvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGVkIG9wdGlvbiAtbm9ydHRpIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBuYXRpdmUKCSAgICBDKysgUlRUSSB3aXRoIGRpcmVjdG9ycyAoZHluYW1pY19jYXN0PD4gaXMgbm90IHVzZWQpLgoKCSAgICBBZGQgbW9yZSBjb2RlIGZvciBkaXJlY3RvcnMgdG8gZGV0ZWN0IGFuZCByZXBvcnQgZXJyb3JzIGluCgkgICAgdGhlIHB5dGhvbiBzaWRlLgoKCSAgICBFeHRlbmQgdGhlIHVzZSBvZiBTV0lHSU5URVJOIHdoZW5ldmVyIGlzIHBvc3NpYmxlLgoKCSAgICBSZW1vdmUgdGVtcGxhdGUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgVkM3LjEuCgoJICAgIFJlbW92ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBnY2MvZysrLiBGaW5hbGx5IHlvdSBjYW4KCSAgICBjb21waWxlIHVzaW5nCgoJICAgICAgIGcrKyAtVyAtV2FsbCAtYyBteW1vZHVsZV93cmFwLmN4eAoKCSAgICBhbmQgbm8gc3B1cmlvdXMgZXJyb3JzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyCgkgICAgY29kZS4KCjAyLzIzLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEFkZGVkIC1leHRlcm5hbC1ydW50aW1lIGFyZ3VtZW50LiAgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGR1bXAKCSAgICBvdXQgYWxsIHRoZSBjb2RlIG5lZWRlZCBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSBydW50aW1lIHN5c3RlbSwKCSAgICBhbmQgaXQgcmVwbGFjZXMgaW5jbHVkaW5nIHRoZSBmaWxlcyBkaXJlY3RseS4gIFRoaXMgY2hhbmdlIGFkZHMKCSAgICB0d28gbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHRvIHRoZSBMYW5ndWFnZSBjbGFzcywgd2hpY2ggYXJlIHVzZWQKCSAgICB0byBmaW5kIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBydW50aW1lIGNvZGUuICBJIGFsc28gdXBkYXRlZAoJICAgIGFsbCBsYW5ndWFnZXMgdGhhdCB1c2UgdGhlIHJ1bnRpbWUgdG8gaW1wbGVtZW50IHRoZXNlIHR3byBmdW5jdGlvbnMuCgowMi8yMi8yMDA1OiBtbWF0dXMgCgkgICAgRml4ICV0ZW1wbGF0ZSArIHByaXZhdGUgZXJyb3IgU0YjMTA5OTk3Ni4KCjAyLzIxLzIwMDU6IG1tYXR1cyAKCgkgICAgRml4IHN3aWdydW4uc3dnIHdhcm5pbmdzIHJlcG9ydGVkIHdoZW4gdXNpbmcgImdjYyAtVyAtV2FsbCIKCSAgICAoc3RhdGljL2lubGluZSBub3QgdXNlZCBpbiBmcm9udCBvZiBhIGZ1bmN0aW9uCgkgICAgZGVjbGFyYXRpb24pLCBhbmQgYWRkIFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkCgkgICAgdW51c2VkIHdhcm5pbmdzIGVsc2V3aGVyZS4KCgkgICAgRml4IHVudXNlZCB2YXJpYWJsZSB3YXJuaW5ncy4KCgkgICAgW1B5dGhvbl0gVXNlIG5ldyBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncyBpbgoJICAgIFNXSUdJTlRFUk4gbWV0aG9kcy4KCgkgICAgW1B5dGhvbl0gRml4IFB5T1Nfc25wcmludGYgZm9yIHB5dGhvbiB2ZXJzaW9ucyA8IDIuMiAoU0YgIzExMDQ5MTkpLgoKCSAgICBbUHl0aG9uXSBGaXggbWFwL211bHRpbWFwIHRvIGFsbG93IGVtcHR5IG1hcHMgKHJlcG9ydGVkIGJ5CiAgCSAgICBQaGlsaXBwZSBIZXRyb3kpLgoKCSAgICBbRG9jc10gQWRkIHNvbWUgZG9jdW1lbnRhdGlvbiB0byBQeXRob24uaHRtbCBhbmQKCSAgICBTV0lHUGx1cy5odG1sLCBpbmNsdWRpbmcgZm9yIGV4YW1wbGUgdGhlIGZhY3QgdGhhdAoJICAgICdmcmllbmRzJyBhcmUgbm93IHN1cHBvcnRlZC4KCjAyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQSFBdIFBhdGNoIGZyb20gT2xseSBCZXR0cywgc28gdGhhdCB3cmFwcGVycyBjb21waWxlIHdpdGggWmVuZCB0aHJlYWQgc2FmZXR5IGVuYWJsZWQuCgowMi8xNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNZW1vcnkgbGVhayBmaXggaW4gc29tZSBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIG1vZHVsZXMgd2hlbiB1c2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBpbiBjb25zdHJ1Y3RvcnMuIFRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugd2FzIG5vdCB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZQogICAgICAgICAgICBDKysgb2JqZWN0IG1lbW9yeSB3aGVuIGFueSBvZiB0aGUgY29uc3RydWN0b3JzIHRoYXQgdXNlIGRlZmF1bHQgYXJndW1lbnRzIHdhcyBjYWxsZWQuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTExNTA1NTogRmFpbGVkIG1ha2UgaW5zdGFsbC4gUGF0Y2ggZnJvbSBSb2IgU3RvbmUuCgowMi8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgIzExMjM0MTYgZnJvbSBQYXVsIE1vb3JlLiBDb3JyZWN0IG1lbW9yeSBhbGxvY2F0aW9uIGZvciBTVFJJTkdBUlJBWQogICAgICAgICAgICB0eXBlbWFwcyBpbiB2YXJpb3VzLmkuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBEaXNhYmxlZCB0eXBlbWFwIHNlYXJjaCBjaGFuZ2VzIGZvciBub3cgKHNlZSBlbnRyeSAxOS8xMi8yMDA0KS4gSXQgYnJlYWtzCiAgICAgICAgICAgIG9sZCB0eXBlbWFwcywgbGVuZ3RoZW5zIHRoZSBleGVjdXRpb24gdGltZSBieSBhYm91dCAyNSUgYW5kIGludHJvZHVjZXMKICAgICAgICAgICAgaW5jb25zaXN0ZW5jaWVzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgc3dpZyAtaGVscCBmb2xsb3dzIG90aGVyIHNvZnR3YXJlIGJ5IHByaW50aW5nIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIHN3aWcgLXZlcnNpb24gYWxzbyBkaXNwbGF5cyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBCZWhhdmlvdXIgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBmb3IgdGhlIGxlc3MgY29tbW9ubHkgdXNlZCBvcmRlcmluZyBvZiAlaW5jbHVkZSBhbmQgI2luY2x1ZGUsIHNvCiAgICAgICAgICAgIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLiBCdWcgcmVwb3J0ZWQgYnkgcmVwb3J0ZWQgYnkgTWF4IEJvd3NoZXIuCiAgICAgICAgICAgICAgJWluY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJX0gCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFNXSUdfZXhjZXB0aW9uIG1hY3JvIHdpbGwgbm93IHJldHVybiBmcm9tIHVubWFuYWdlZCBjb2RlIC8gbmF0aXZlIGNvZGUKICAgICAgICAgICAgYXMgc29vbiBhcyBpdCBpcyBjYWxsZWQuIEZpeGVzIHBvc3NpYmxlIEpWTSBjcmFzaGVzIGFuZCBvdGhlciBjb2RlIHVuZXhwZWN0ZWRseQogICAgICAgICAgICBiZWluZyBleGVjdXRlZC4gTm90ZSBTV0lHX2V4Y2VwdGlvbiBpcyBvbmx5IG9jY2FzaW9uYWxseSB1c2VkIGJ5IFNXSUcgbGlicmFyeQogICAgICAgICAgICB3cml0ZXJzLCBhbmQgaXMgYmVzdCBhdm9pZGVkIGJ5IFNXSUcgdXNlcnMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIFR5cGVtYXBzIGNhbiBub3cgYmUgdGFyZ2V0ZWQgYXQgZ2xvYmFsIHZhcmlhYmxlIG5hbWVzCiAgICAgICAgICAgIGFuZCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIG5hbWVzLiBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgIHRoZSBzZXR0ZXJzIHdlcmUgaWdub3JlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgZ2xvYmFsaW50ICIuLi4iCiAgICAgICAgICAgICAgaW50IGdsb2JhbGludDsKCjAyLzEzLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZCAldHlwZWNoZWNrIGZvciBTV0lHVFlQRSwgYWRkICV0eXBlY2hlY2sgZm9yIHB0cmRpZmZfdCwgZml4CgkgICAgdHlwZW1hcHMgZm9yIHNpemVfdC4KCgkgICAgW1Bpa2VdIE1lcmdlIHBhdGNoIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmIGZvciBpbXByb3ZlZCBQaWtlIGNvbmZpZ3VyYXRpb24uCgowMi8xMi8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IGNvbmZpZ3VyZSBzd2l0Y2hlcyAtLXdpdGhvdXQtdGNsLCAtLXdpdGhvdXQtcHl0aG9uIGV0Yy4gYWxsb3cgdG8KICAgICAgICAgICAgZGlzYWJsZSB0aGUgc2VhcmNoIGZvciBpbnN0YWxsZWQgbGFuZ3VhZ2VzLgoKMDEvMzEvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gQWRkIERvaFNvcnRMaXN0IHRvIERPSAoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgcnVudGltZSB0eXBlIHN5c3RlbToKICAgICAgICAgICAgICAgKyBTcGVlZC4gVHlwZSBsb2FkaW5nIGlzIG5vdyBPKG4gbG9nIG4pIGluc3RlYWQgb2YgTyhOXjIpLCB3aGljaAoJICAgICAgICAgZm9yIGxhcmdlIG1vZHVsZXMgaXMgYSBodWdlIGltcHJvdmVtZW50LgogICAgICAgICAgICAgICArIEEgd2hvbGUgYnVuY2ggb2YgZnVuY3Rpb25zIGluIHN3aWdydW4uc3dnIG5vIGxvbmdlciBuZWVkIHRoZSAKICAgICAgICAgICAgICAgICBzd2lnX3R5cGVfbGlzdF9oYW5kbGUgcGFzc2VkIHRvIHRoZW0uICBUaGUgb25seSBvbmUgbGVmdCBpcyAKCQkgVHlwZVF1ZXJ5LiAgVGhpcyBhbHNvIG1ha2VzIHJ1bnRpbWUuc3dnIGEgbG90IHNtYWxsZXIuCgkgICAgICAgKyBTcGxpdCB1cCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgaW50byB0d28gc3RydWN0dXJlcwoJICAgICAgICAgKHN3aWdfdHlwZV9pbmZvIGFuZCBzd2lnX2Nhc3RfaW5mbykKCSAgICAgICArIFN0b3JlIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvIHJhdGhlciB0aGFuIGp1c3QgdGhlIHR5cGUKCSAgICAgICAgIG5hbWUgc3RyaW5nIGluIHRoZSBsaW5rZWQgbGlzdCBvZiBjYXN0cy4gRmlyc3Qgb2ZmLCB0aGlzIG1ha2VzCgkgICAgICAgICB0aGUgZ3VpbGUgbW9kdWxlIGEgbGl0dGxlIGZhc3RlciwgYW5kIHNlY29uZCwgdGhlCgkgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKCkgZnVuY3Rpb24gaXMgZmFzdGVyIHRvby4gCgkgICAgICAgKyBBZGQgdGhlIGlkZWEgb2YgYSBtb2R1bGUgaW50byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUsIGFsbCB0aGUKCSAgICAgICAgIHR5cGVzIHdlcmUgc3RvcmVkIGluIG9uZSBodWdlIGxpbmtlZCBsaXN0LiBOb3csIGFub3RoZXIgbGV2ZWwgaXMKCSAgICAgICAgIGFkZGVkLCBhbmQgdGhlIHR5cGUgc3lzdGVtIHN0b3JlcyBhIGxpbmtlZCBsaXN0IG9mIG1vZHVsZXMsIGVhY2gKCSAgICAgICAgIG9mIHdoaWNoIHN0b3JlcyBhbiBhcnJheSBvZiB0eXBlcyBhc3NvY2lhdGVkIHdpdGggaXQuCgkgICAgICAgKyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvZiBob3cgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gbm93IHdvcmtzLAoJICAgICAgICAgcGxlYXNlIHNlZSBEb2MvTWFudWFsL3R5cGVtYXBzLmh0bWwgYW5kIERvYy9EZXZlbC9ydW50aW1lLnR4dAoJCSAKCSAgICAtIFVwZGF0ZSBhbGwgbGFuZ3VhZ2UgbW9kdWxlcyB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFRoZSBjaGFuZ2VzCgkgICAgICB0byBlYWNoIGxhbmd1YWdlIG1vZHVsZSBhcmUgbWlub3IuICBBbGwgbGFuZ3VhZ2VzIGFyZSBub3cgYWJsZSB0bwoJICAgICAgdXNlIHJ1bnRpbWUuc3dnIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlCgkgICAgICBvbmx5IHB5dGhvbiBhbmQgcGVybCBkaWQuCgoJICAgIC0gW2d1aWxlLCBtenNjaGVtZSwgb2NhbWwsIGFuZCBwaHA0XSAgVGhlc2UgbGFuZ3VhZ2VzIG9wZW5lZCB1cCB0aGUKCSAgICAgIGluaXQgZnVuY3Rpb24gaW5zaWRlIHRoZSAuY3h4IGNvZGUsIGFuZCBhbnkgY29kZSBpbiB0aGUgLnN3ZyBmaWxlcwoJICAgICAgaW4gdGhlIGluaXQgc2VjdGlvbiB3YXMgaW5zaWRlIHRoaXMgZnVuY3Rpb24uICBUaGlzIHdhcyBhIHByb2JsZW0KCSAgICAgIGZvciBzd2lnaW5pdC5zd2csIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgU1dJR19pbml0CgkgICAgICBmdW5jdGlvbiBpcyBvcGVuZWQuICBUaHVzIEkgY2hhbmdlZCB0aGVzZSBsYW5ndWFnZXMgdG8gYmUgbGlrZQoJICAgICAgcHl0aG9uIG9yIHBlcmwsIHdoZXJlIHRoZSBpbml0IGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSAuc3dnCgkgICAgICBmaWxlLgoJICAgICAgCgkgICAgLSBbUnVieV0gSW5zdGVhZCBvZiBtb3ZpbmcgdGhlIGluaXQgZnVuY3Rpb24gdG8gdGhlIC5zd2cgZmlsZSwgSQoJICAgICAgYWRkZWQgYSBuZXcgc2VjdGlvbiBpbml0YmVmb3JlZnVuYywgYW5kIHRoZW4gYWRkZWQKCSAgICAgICVpbnNlcnQoaW5pdGJlZm9yZWZ1bmMpICJzd2lnaW5pdC5zd2ciCgoJICAgIC0gW016U2NoZW1lXSBGaXggZW51bXMgYW5kIGZpeCBFeGFtcGxlcy9NYWtlZmlsZS5pbiBzbyB0aGF0IGlmCgkgICAgICBtdWx0aXBsZSAtSSBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgSU5DTFVERVMgdmFyaWFibGUsIGVhY2gKCSAgICAgIGdldHMgYSArK2NjZi4KCgkgICAgLSBbR3VpbGUgR0hdIFVwZGF0ZSBHdWlsZSBHSCB0byB1c2UgdGhlIG5ldyB0eXBlIHN5c3RlbS4gIFNlZQoJICAgICAgRG9jL01hbnVhbC9HdWlsZS5odG1sIGZvciBob3cgc21vYnMgYXJlIG5vdyB1c2VkLgoKMDEvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2NzY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcCBjYWxsZWQgJ2phdmFjb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLiBBbm90aGVyIHR5cGVtYXAgbmFtZWQgJ2phdmFjb25zdHJ1Y3RfZGlyZWN0b3InCiAgICAgICAgICAgIGlzIHVzZWQgaW5zdGVhZCB3aGVuIHRoZSBwcm94eSBjbGFzcyBpcyBhIGRpcmVjdG9yIGNsYXNzLgoKICAgICAgICAgICAgW0MjLCBKYXZhXSBJZiBhIEMrKyBjbGFzcyBkaWQgbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBhIHByb3RlY3RlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHLiBUaGlzIHNlZW1zIGlzIHVubmVjZXNzYXJ5IGFuZCBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgIGFuZCB0aGVyZWJ5IGdpdmluZyB0aGUgdXNlciBhbG1vc3QgY29tcGxldGUgY29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgY29kZSBhbG9uZyB3aXRoIHRoZQogICAgICAgICAgICBuZXcgdHlwZW1hcHMgYWJvdmUuCgoxOS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW0Rpc2FibGVkLCBzZWUgZW50cnkgMDIvMTUvMjAwNF0KICAgICAgICAgICAgLSBGaXggdHlwZW1hcCBzZWFyY2gsIG5vdyB0aGUgIm91dCIgdHlwZW1hcCBzZWFyY2ggaXMgZG9uZSBhcyBmb2xsb3dzCgogICAgICAgICAgICAgICAgIGludCAqRm9vOjpmb28oaW50IGJhcikgICAtPiAgaW50ICpGb286OmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpGb286OmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKgoKICAgICAgICAgICAgICAgdGhlbiwgbm93IHlvdSBjYW4gYmUgbW9yZSBzcGVjaWZpYywgYW5kIGRlZmluZQoKICAgICAgICAgICAgICAvKiBhcHBseSBvbmx5IGZvciAgJ0Zvbzo6Zm9vJyBtZXRob2QgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIEZvbzo6Zm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAvKiBhcHBseSBmb3IgYWxsICdmb28nIGZ1bmN0aW9ucy9tZXRob2RzICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgICVpbmxpbmUgewogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgKmZvbyhpbnQgKmJhcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCSAgCgoxNS8xMi8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgLSBNb3JlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgYW5kIHRlbXBsYXRlIGRlZmF1bHQgYXJncy4KICAgICAgICAgICAgICBTZWUgdGVtcGxhdGVfZGVmYXVsdC5pIGZvciBzY2FyeSBjYXNlcyB0aGF0IG5vdyBhcmUgCiAgICAgICAgICAgICAgc3VwcG9ydGVkLCBiZXNpZGVzIHRoZSBhbHJlYWR5IHVnbHkgU1RML3N0ZCBjYXNlcy4KICAgICAgICAgICAgICAKICAgICAgICAgICAgLSBDb3NtZXRpY3MgYW5kIG1vcmUgdXNlIG9mICdjb25zdCcgd2hlcmUgaXQgd2FzIGltcGxpY2l0LgogICAgICAgICAgICAtIE90aGVyIGZpeGVzIGZvciBPU1MsIHdoaWNoIGlzIG5vdyB3b3JraW5nIGFnYWluIHdpdGggMS4zLjI1LgoJClZlcnNpb24gMS4zLjI0IChEZWNlbWJlciAxNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTIvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBGaXggYSBidW5jaCBvZiBidWdzIHJlbGF0aW5nIHRvIC1wcm94eSBzdXBwb3J0CgkgICAgICArIG5vbi1jbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgbWVtYmVyIGNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBhZGRlZCBhIC1ub3VuaXQgYXJndW1lbnQsIHdoaWNoIGRvZXMgbm90IGV4cG9ydCB0aGUgKGRlY2xhcmUgKHVuaXQgLi4uKSkKCSAgICAgICsgY29ycmVjdGx5IGluc3RhbGwgc3dpZ2Nsb3NwcmVmaXguc2NtCgkgICAgICArIGNvbnN0YW50cyAoZW51bXMsIGRlZmluZXMpIG5vdyBjb3JyZWNseSBleHBvcnQgd2hlbiB1c2luZyAtcHJveHkKCjEyLzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbmZpZ3VyZSBmaXggZm9yIHdoZW4gbW9yZSB0aGFuIG9uZSB2ZXJzaW9uIG9mIGpuaV9tZC5oIGlzIGZvdW5kCiAgICAgICAgICAgIGluIHRoZSBKYXZhIGluY2x1ZGUgZGlyZWN0b3J5ICh3YXMgZ2VuZXJhdGluZyBsb3RzIG9mIHNlZCBlcnJvcgogICAgICAgICAgICBtZXNzYWdlcykuCgoxMi8wOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgdG8gYXJyYXlzX2phdmEuaSBzbyB0aGF0IG9uZSBjYW4gYXBwbHkgdGhlIGFycmF5CiAgICAgICAgICAgIHR5cGVtYXBzIHRvIGZ1bmN0aW9ucyB0YWtpbmcgcG9pbnRlcnMgYXMgaW5wdXQsIGVnCgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICAlYXBwbHkgaW50W10ge2ludCp9OwogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICphKTsKCjEyLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBtb2RzIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbC4gTmV3IHR5cGVtYXBzCiAgICAgICAgICAgIGRpcmVjdG9yZGlzY29ubmVjdCBhbmQgZGlyZWN0b3JkaXNjb25uZWN0X2Rlcml2ZWQgZm9yIHRoZSAKICAgICAgICAgICAgc3dpZ0RpcmVjdG9yRGlzY29ubmVjdCgpIG1ldGhvZC4gQWxzbyBmaXggdG8gZ2V0IHRoZSBqYXZhcGFja2FnZQogICAgICAgICAgICB0eXBlbWFwIHdvcmtpbmcgYWdhaW4uCgoxMi8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpbmlzaGluZyB0aGUgZml4ZXMgZm9yIHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgKyBzcGVjaWFsaXphdGlvbnMuCgogICAgICAgICAgICAtIFtQeXRob25dIE5vdyB3ZSB1c2UgdGhlIG5ldyB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzIGluIHRoZSBzdGQvU1RMIGxpYnJhcnkuIFRoYXQgbWVhbnMgdGhlIGludGVybmFsCgkgICAgICBzd2lnIGZpbGVzIGFyZSBnZXR0aW5nIHVnbGllciBzaW5jZSB3ZSBub3cgc3VwcG9ydCB0aGUKCSAgICAgIG9yaWdpbmFsIGRlY2xhcmF0aW9uczoKCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8IF9UcCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCS4uLi4KCQl9OwoJICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlID0gc3RkOjpsZXNzPF9LZXkgPiwKCSAgICAgICAgY2xhc3MgX0FsbG9jID0gc3RkOjphbGxvY2F0b3I8c3RkOjpwYWlyPGNvbnN0IF9LZXksIF9UcCA+ID4gPgogICAgICAgICAgICAgICAgY2xhc3MgbWFwIHsKCQkuLi4uCgkJfTsKIAogICAgICAgICAgICAgIGFuZCB0aGUgdXNlciBjYW4gdXNlIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFzCgoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIHN0ZDo6YWxsb2NhdG9yPGludD4gPjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBNeUFsbG9jYXRvcjxpbnQ+ID47CgogICAgICAgICAgICAgIE5vdyB3ZSBhcmUgY2xvc2VyIHRvIHRoZSBjbGVhbmluZy9yZXdyaXRpbmcgb2YgdGhlCgkgICAgICBweXRob24gc3RkL1NUTCBzdXBwb3J0LCBzdWNoIHRoYXQgd2UgcmVjb3ZlciBzdXBwb3J0IGZvcgoJICAgICAgTVNWQysrIDYuMCwgYW5kIHdlIGNhbiBhZGQgc3VwcG9ydCBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgkgICAgICB0b28uCgoKMTIvMDIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3JzIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB1c2luZyBhIG1lbWJlciBlbnVtCiAgICAgICAgICAgIGFuZCB0eXBlc2FmZS9wcm9wZXIgZW51bXMgZW5hYmxlZC4KCjEyLzAxLzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHR5cGVtYXBzIHRvIHdvcmsgd2l0aCB0ZW1wbGF0ZXMgYW5kIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MsIGllCgoJICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBLCBjbGFzcyBCID0gaW50PgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICB9OwoKCSAgICAgICAldHlwZW1hcChpbikgRm9vPGludD4gKnsuLi59CgkgICAgICAgJXR5cGVtYXAob3V0KSBGb288aW50LGludD4gKnsuLi59CgoJICAgICAgIEZvbzxpbnQ+ICogZm9vKCBGb288aW50PiAqZjEsIEZvbzxpbnQsaW50PiAqZjIpOwoKCSAgICAgIG5vdyAnZjEnLCAnZjInIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHJlc29sdmUgdGhlIHByb3ZpZGVkCgkgICAgICB0eXBlbWFwcyBwcm9wZXJseS4KCgkgICAgICBUaGlzIGlzIGhpZ2hseSBuZWVkZWQgZm9yIHByb3BlciBTVEwgc3VwcG9ydCwgc2VlIG5ldyAKCSAgICAgIHN0ZF9iYXNpY19zdHJpbmcuaSwgc3RkX3NzdHJlYW0uaSwgZXRjLgoKCSAgICAtIEFkZGVkIHN0ZF9zc3RyZWFtLmksIGFuZCBmaXggc3RkX2Jhc2ljX3N0cmluZy5pIHRvIHVzZQoJICAgICAgdGhlIG5ldyB0eXBlbWFwcyArIHRlbXBsYXRlIGRlZi4gYXJnIG1lY2hhbmlzbS4gQWxzbywKCSAgICAgIGFkZGVkIHRoZSBuZWVkZWQgc3RkX2FsbG9jLmkuIE5vdywgYWxsIHRoZSBjb250YWluZXJzCgkgICAgICBjYW4gYmUgbW9kaWZpZWQgdG8gc3VwcG9ydCBzdGQ6OmFsbG9jYXRvciwgbGlrZSBpbjoKCSAgICAgIAoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBBID0gc3RkOjphbGxvY2F0b3I8VCA+ID4KCQljbGFzcyB2ZWN0b3IgewoJCXB1YmxpYzoKCQkuLi4uCgkJfTsKCSAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgb25seSBjb21wbGV0ZWQgYnkgbm93IGZvciBiYXNpY19zdHJpbmcuCgoJICAgIC0gRml4IGZvciBzbWFydCBwb2ludGVycyArIG1lbWJlcnMgKyBleHRlbnNpb25zOgoKCSAgICAgICVleHRlbmQgRm9vIHsKCSAgICAgICAgaW50IGV4dGVuc2lvbihpbnQgaSwgaW50IGopIHsgcmV0dXJuIGk7IH0KCQlpbnQgZXh0ZW5zaW9uKCkgeyByZXR1cm4gMTsgfQoJICAgICAgfQoKCSAgICAgICVpbmxpbmUgJXsKCgkgICAgICBjbGFzcyBGb28gewoJICAgICAgcHVibGljOgoJCWludCB5OwoJCXN0YXRpYyBjb25zdCBpbnQgejsKCSAgICAgIH07CiAgCgkgICAgICBjbGFzcyBCYXIgewoJICAgICAgICBGb28gKmY7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIEJhcihGb28gKmYpIDogZihmKSB7IH0KCQlGb28gKm9wZXJhdG9yLT4oKSB7CgkJICByZXR1cm4gZjsKCQl9CgkgICAgICB9OwoKCSAgICAgIG5vdyB5b3UgY2FuIAoJICAgICAKCSAgICAgIGYgPSBGb28oKQoJICAgICAgZi55ID0gMwoJICAgICAgYSA9IGYuegoJICAgICAgZi0+ZXh0ZW5zaW9uKCkKIAoJICAgICAgYiA9IEJhcihmKQoJICAgICAgYi55ID0gMwoJICAgICAgYSA9IGIuegoJICAgICAgYi0+ZXh0ZW5zaW9uKCkKCgkgICAgLSBPdGhlciBzbWFsbCBlcnJvcnMgZml4ZXMsIG1vc3RseSBweXRob24uCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTnVtZXJvdXMgZGlyZWN0b3IgYnVnIGZpeGVzIHNvIHRoYXQgdGhlIGNvcnJlY3QgamF2YSB0eXBlcwogICAgICAgICAgICBhbmQgY2Fub25pY2FsaXplZCB0eXBlcyBpbiB0aGUgSk5JIGNvZGUgYXJlIGVtaXR0ZWQuIFVzZSBvZiB0aGUKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZXMgaW4gdGhlIGRpcmVjdG9yIHR5cGVtYXBzIG5vdwogICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1kaXJlY3RvciB0eXBlbWFwcy4gVGhlIHR5cGVzIHVzZWQgZm9yIAogICAgICAgICAgICB0eXBlbWFwIGxvb2t1cHMgYXJlIGFsc28gY29ycmVjdGVkIGluIGEgZmV3IHBsYWNlcy4gSWYgeW91IAogICAgICAgICAgICBwcmV2aW91c2x5IGhhZCB5b3VyIG93biBkaXJlY3RvciB0eXBlbWFwcywgZW5zdXJlIHRoZXkgYXJlIHVzaW5nIHRoZQogICAgICAgICAgICBjb3JyZWN0IEMrKyB0eXBlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uc3QgZW51bSBTV0lHVFlQRSAmIHR5cGVtYXBzIGFkZGVkLiBUaGVzZSB3cmFwIGNvbnN0IGVudW0gcmVmZXJlbmNlcwogICAgICAgICAgICBhcyBpZiB0aGV5IHdlcmUgcGFzc2VkIGJ5IHZhbHVlLiBDb25zdCBlbnVtIHJlZmVyZW5jZXMgdGh1cyB3b3JrIHRoZQogICAgICAgICAgICBzYW1lIGFzIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgc3VjaCBhcyBjb25zdCBkb3VibGUgJiwgCiAgICAgICAgICAgIGNvbnN0IGludCAmIGV0Yy4gVHlwZW1hcHMgYWRkZWQgZm9yIEphdmEsIEMjLCBSdWJ5LCBUY2wsIFBlcmwgYW5kIFBpa2UuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE5ldyBzcGVjaWFsIHZhcmlhYmxlOiAkKmphdmFjbGFzc25hbWUsIHNpbWlsYXIgdG8gJGphdmFjbGFzc25hbWUKICAgICAgICAgICAgYW5kICQmamF2YWNsYXNzbmFtZS4gVGhlIG5ldyBvbmUgcmVtb3ZlcyBhIHBvaW50ZXIgZnJvbSB0aGUgQyB0eXBlIGJlZm9yZQogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIEphdmEgY2xhc3MgbmFtZS4gT25lIG9yIG1vcmUgb2YgJGphdmFjbGFzc25hbWUsCiAgICAgICAgICAgICQmamF2YWNsYXNzbmFtZSBvciAkKmphdmFjbGFzc25hbWUgbWF5IG5vdyBhcHBlYXIgaW4gYSB0eXBlbWFwLiBMaWtld2lzZSBmb3IKICAgICAgICAgICAgQyMgdXNpbmcgY3NjbGFzc25hbWUgaW5zdGVhZCBvZiBqYXZhY2xhc3NuYW1lLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGxhc3QgdmVzdGlnZXMgb2YgZW51bXMgYmVpbmcgaGFuZGxlZCBhcyBpbnRlZ2VycyByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgICAgIGludGVybmFscy4gVGhlIHdyYXBwZXIgbWV0aG9kcyB1c2UgdGhlIGVudW0gdHlwZSByYXRoZXIgdGhhbiBhbiBpbnQKICAgICAgICAgICAgbm93LiBUaGUgbmV0IHJlc3VsdCBpcyBhZGRlZCB0eXBlIHNhZmV0eSBmb3IgZW51bXMgd2hlbiBoYW5kbGVkIGFzCiAgICAgICAgICAgIHBvaW50ZXJzLCByZWZlcmVuY2VzIGV0Yy4gUHJldmlvdXNseSBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgYSBtZXRob2QKICAgICAgICAgICAgdGFraW5nIGEgcG9pbnRlciB0byBhbiBlbnVtLCBhIHBvaW50ZXIgdG8gYW4gaW50IG9yIGEgcG9pbnRlciB0byBhbgogICAgICAgICAgICBlbnVtIG9mIHNvbWUgb3RoZXIgdHlwZSBjb3VsZCBpbmFkdmVydGFudGx5IGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLgogICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgYW4gZW51bSBpcyBubyBsb25nZXIgYmFzZWQgb24KICAgICAgICAgICAgYW4gaW50LCBidXQgdGhlIGVudW0gdHlwZSBpbnN0ZWFkLiBBbm9ueW1vdXMgZW51bXMgYXJlIHN0aWxsIGhhbmRsZWQKICAgICAgICAgICAgYXMgaW50ZWdlcnMuCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgZm9yIHNjcmlwdGluZyBsYW5ndWFnZSB1c2VycyBpbiBjb3JyZWN0IHVzYWdlIG9mIGVudW1zCiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgbm90aWNlYWJsZS4gVGhlcmUgaXMgbm8gY2hhbmdlIGZvciBhbnkgb2YgdGhlIGxhbmd1YWdlcwogICAgICAgICAgICB3aGVyZSBlbnVtcyBhcmUgcGFzc2VkIGJ5IHZhbHVlIC0gbW9zdCBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aWxsCiAgICAgICAgICAgIHN0aWxsIGFjY2VwdCBhbiBpbnRlZ2VyIGZvciBhbiBlbnVtIHZhbHVlIGFuZCB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgbGFuZ3VhZ2VzIHN0aWxsIHVzZSBlaXRoZXIgdHlwZXNhZmUgZW51bXMsIGludGVnZXJzIG9yIHByb3BlciBlbnVtcwogICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hhdCB0aGUgdXNlciBjb25maWd1cmVzLiBGb3IgSmF2YSBhbmQgQyMgdXNlcnMgYSBjaGFuZ2UKICAgICAgICAgICAgaW4gdGhlIHR5cGV3cmFwcGVyIGNsYXNzIG5hbWUgaGFzIG9jY3VycmVkIChmb3IgZW51bSBwb2ludGVycywKICAgICAgICAgICAgcmVmZXJlbmNlcyBldGMpLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgb25lPTEsIHR3byB9OwogICAgICAgICAgICAgIGVudW0gTnVtYmVycyogbnVtYmVyKCk7CgogICAgICAgICAgICBJbiBKYXZhIGFuZCBDIyB0aGlzIG11c3Qgbm93IGJlIGNvZGVkIGFzCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfTnVtYmVycyBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgIHJhdGhlciB0aGFuCgogICAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50IG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMS8yMDA0OiB3c2Z1bHRvbi9tbWF0dXMKICAgICAgICAgICAgQWRkZWQgbWlzc2luZyBkZXByZWNhdGVkIHdhcm5pbmcgZm9yICVuYW1lIGFuZCByZW1vdmUgcmVtYWluaW5nICVuYW1lCiAgICAgICAgICAgIHVzYWdlIGluIHRoZSBTV0lHIGxpYnJhcmllcy4KCjExLzIxLzA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZGluZyB0aGUgUHlTd2lnT2JqZWN0IHRvIGJlIHVzZWQgZm9yIGNhcnJ5aW5nCgkgICAgICB0aGUgaW5zdGFuY2UgQy9DKysgcG9pbnRlcnMuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mCgkgICAgICBzdHJpbmcgYW5kIFB5Q09iamVjdHMuCgoJICAgICAgVGhlIG5ldyBQeVN3aWdPYmplY3QgaXMgZXZlbiBzYWZlciB0aGFuIFB5Q09iamVjdCwgYW5kCgkgICAgICBtb3JlIGZyaWVuZGx5IHRoYW4gcGxhaW4gc3RyaW5nczoKCgkgICAgICBub3cgeW91IGNhbiBkbwoKCSAgICAgICAgcHJpbnQgYS50aGlzCgkJPFN3aWcgT2JqZWN0IGF0IF8wMDY5MTYwOF9wX0E+CgoJCXByaW50IHN0cihhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQQoKCQlwcmludCBsb25nKGEudGhpcykKCQkxMzU2ODY0MDAKCgkJcHJpbnQgIiVzIDB4JXgiICUgKGEudGhpcywgYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EgMHg4MTY2OTAwCgoJICAgICAgdGhlIGxhc3Qgb25lIGlzIHZlcnkgdXNlZnVsIHdoZW4gZGVidWdnaW5nIHRoZSBDL0MrKwoJICAgICAgc2lkZSwgc2luY2UgaXMgdGhlIHBvaW50ZXIgdmFsdWUgeW91IHdpbGwgdXN1YWxseSBnZXQKCSAgICAgIGZyb20gdGhlIGRlYnVnZ2VyLgoKCSAgICAgIEFsc28sIGlmIHlvdSBoYXZlIHNvbWUgb2xkIGNvZGUgdGhhdCB1c2VzIHRoZSBzdHJpbmcKCSAgICAgIHJlcHJlc2VudGF0aW9uICJfMDA2OTE2MDhfcF9BIiwgeW91IGNhbiB1c2UgaXQgbm93IGFnYWluCgkgICAgICB1c2luZyAnc3RyKHB0ciknLCBvciBieSBjYWxsaW5nICdzdHIgPSBQeU9iamVjdF9TdHIob2JqKScKCSAgICAgIGluIHRoZSBDL0MrKyBzaWRlLgogCgkgICAgICBUaGlzIGNoYW5nZSBpcyBtYWlubHkgZm9yIG5vc3RhbGdpYyBzd2lnIHVzZXJzIHRoYXQgbWlzcwoJICAgICAgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgYnV0IGFsc28gYWxsb3dzIHRvIHNheSBhZ2FpbgoKCSAgICAgICAgaWYgYS50aGlzID09IGIudGhpczoKCQkgIHJldHVybiAiYSBpcyBiIgoKCSAgICAgIGFuZCB3ZWxsLCBzaW5jZSB0aGUgY2hhbmdlIHdlcmUgcmVhbGx5IHNpbXBsZSwgbWF5YmUgaW4KCSAgICAgIHRoZSBmdXR1cmUgd2Ugd2lsbCBiZSBhYmxlIHRvIGRvCiAgIAoJCW5leHQgPSBhLnRoaXMgKyAxCgoJICAgICAgb3IgYWRkIG5hdGl2ZSBweXRob24gaXRlcmF0aW9uIG92ZXIgbmF0aXZlIEMvQysrIGFycmF5cywKCSAgICAgIGllLCBubyBuZWVkIHRvIGNyZWF0ZS9jb3B5IG5ldyB0dXBsZXMgd2hlbiByZXR1cm5pbmcgYW5kCgkgICAgICBhcnJheSBvciB2ZWN0b3IuCgoJICAgICAgQWxzbywgYSBQeVN3aWdQYWNrZWQgb2JqZWN0IHdhcyBhZGRpbmcgdG8gY2FycnkgYSBtZW1iZXIKCSAgICAgIG1ldGhvZCBwb2ludGVyLCBidXQgdGhpcyBpcyBwcm9iYWJseSBhIHRlbXBvcmFsIHNvbHV0aW9uCgkgICAgICB1bnRpbCBhIG1vcmUgZ2VuZXJhbCBvYmplY3QgZm9yIG1ldGhvZHMgaXMgYWRkZWQuCgoJICAgICAgQmUgYXdhcmUgdGhhdCB0byBzaW1wbGlmeSBtYWludGFpbmluZyBhbmQgY29tcGF0aWJpbGl0eQoJICAgICAgd2l0aCBvdGhlciB0b29scywgdGhlIG9sZCBzdHJpbmcgYW5kIFB5Q09iamVjdHMKCSAgICAgIHJlcHJlc2VudGF0aW9uIGNvdWxkIGRpc2FwcGVhciB2ZXJ5IHNvb24sIGFuZCB0aGUKCSAgICAgIFNXSUdfQ09CSkVDVFNfVFlQRVMgb3IgU1dJR19OT19PQkpFQ1RfVFlQRVMgbWFjcm9zIHdpbGwKCSAgICAgIGhhdmUgbm8gZWZmZWN0IGF0IGNvbXBpbGF0aW9uIHRpbWUuIFN0aWxsLCB0aGUgdGhyZWUKCSAgICAgIG1lY2hhbmlzbXMgYXJlIHByZXNlbnQgaW4gdGhlIGNvZGUganVzdCBmb3IgdGVzdGluZywKCSAgICAgIGRlYnVnZ2luZyBhbmQgY29tcGFyaXNvbiBwdXJwb3Nlcy4KCSAgICAgIAoxMS8yMS8wNDogbW1hdHVzCgoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIGJhY2sgc3VwcG9ydCBmb3IgdXNpbmcgdGhlIHN3aWcgcnVudGltZSBjb2RlCgkgICAgICBpbnNpZGUgdGhlIHVzZXIgY29kZS4gV2UganVzdCBhbGxvdyB0aGUgdXNlciB0byBpbmNsdWRlCgkgICAgICB0aGUgbWluaW1hbCBjb2RlIG5lZWRlZCB0byBpbXBsZW1lbnQgdGhlIHJ1bnRpbWUKCSAgICAgIG1lY2hhbmlzbSBzdGF0aWNhbGx5LCBqdXN0IGFzIGluIGRvbmUgaW4gdGhlIHN3aWcKCSAgICAgIG1vZHVsZXMuCgkgICAgICAKCSAgICAgIFRvIHVzZSB0aGUgc3dpZyBydW50aW1lIGNvZGUsIGZvciBleGFtcGxlIHdpdGggcHl0aG9uLAoJICAgICAgdGhlIHVzZXIgbmVlZHMgaW5jbHVkZSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxQeXRob24uaD4gICAgICAgICAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxzd2lncnVuLnN3Zz4KICAgICAgICAgICAgICAgI2luY2x1ZGUgPHB5dGhvbi9weXJ1bi5zd2c+IC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHJ1bnRpbWUuc3dnPgoKCSAgICAgIHRoZSBmaWxlcyBzd2lncnVuLnN3ZywgcHlydW4uc3dnIGFuZCBydW50aW1lLnN3ZyBjYW4gCgkgICAgICBiZSBjaGVja2VkIG91dCBieSB1c2luZyBzd2lnIC1jbywgb3IgdGhleSBjYW4gc2ltcGx5IAoJICAgICAgYmUgZm91bmQgYnkgYWRkaW5nIHRoZSBzd2lnIGxpYiBkaXJlY3RvcnkgdG8gdGhlCgkgICAgICBjb21waWxlciBpbmNsdWRlIGRpcmVjdG9yeSBsaXN0LCBmb3IgZXhhbXBsZQoKCSAgICAgICBTV0lHTElCPWBzd2lnIC1zd2lnbGliYAoJICAgICAgIGMrKyAtSSR7U1dJR0xJQn0gLi4KCgkgICAgICBvZiBiZXR0ZXIsIHVzaW5nIHRoZSBDUFBGTEFHUywgYnV0IHRoYXQgZGVwZW5kcyBvbiB5b3VyCgkgICAgICBlbnZpcm9ubWVudC4KCSAgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGNhbiBiZSBwb3J0ZWQgdG8gdGhlIG90aGVyIGxhbmd1YWdlcyB0b28sCgkgICAgICB5b3UganVzdCBuZWVkIHRvIGlzb2xhdGUgdGhlIG5lZWRlZCBydW50aW1lIGNvZGUgaW4KCSAgICAgIGEgc2luZ2xlIGZpbGUgbGlrZSAncHlydW4uc3dnJywgYW5kIHByb3ZpZGUgdGhlIAoJICAgICAgU1dJR19SdW50aW1lX0dldFR5cGVMaXN0KCkgbWV0aG9kLiBMb29rIGF0IHRoZQoJICAgICAgTGliL3B5dGhvbi9weXJ1bi5zd2cgZmlsZSBhbmQgdGhlIEV4YW1wbGVzL3B5dGhvbi9zd2lncnVuCgkgICAgICBleGFtcGxlLgoKMTEvMTUvMDQ6IG1tYXR1cwoJICAgIC0gRml4IG1peGVkX3R5cGVzLmkgKyBnY2MtMy40LCBpZSwgYXJyYXlzICsgcmVmZXJlbmNlcyArCgkgICAgICB0eXBlZGVmcwoKCSAgICAtIEZpeCBtdWx0aWRpbSBhcnJheXMgKyB0eXBlZGVmcyxpZQoKCSAgICAgICB0eXBlZGVmIGNoYXIgY2hhcmFjdGVyWzFdOwoJICAgICAgIHR5cGVkZWYgY2hhcmFjdGVyIHdvcmRbNjRdOwoKCSAgICAtIFByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgYmFzZXMgaW4gdGhlIHNhbWUgd2F5IGJlZm9yZQoJICAgICAgd2UgcHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBtZW1iZXJzLCBpZSwgd2UgY2hlY2sKCSAgICAgIGZvciBjb25zdHJ1Y3RvcnMsIG9wZXJhdG9yIG5ldywgdmlydHVhbCBtZW1iZXJzLCBldGMuCiAgIAoJICAgIC0gRml4IFJ1YnkvSmF2YSB0byB3b3JrIChvciBpZ25vcmUpIG11bHRpLWluaGVyaXRhbmNlICsKICAgICAgICAgICAgICBkaXJlY3RvcnMuIEFsbG93IG90aGVyIGxhbmd1YWdlcyB0byBkZWZpbmUgaWYgaXQgaXMKICAgICAgICAgICAgICBzdXBwb3J0ZWQgb3Igbm90LgoJICAgIAoJICAgIC0gTm93IHlvdSBjYW4gcnVuCgogICAgICAgICAgICAgICAgU1dJR19GRUFUVVJFUz0iLWRpcmVjdG9ycyAtZGlycHJvdCIgCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stb2NhbWwtdGVzdC1zdWl0ZQoKCSAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgb25seSAncmVhbCcgZXJyb3JzLiBydWJ5IGFuZCBweXRob24KCSAgICAgIGNvbXBpbGUgd2l0aCBubyBlcnJvcnMsIGphdmEgc2hvd3Mgc29tZSBwcm9ibGVtcy4JCgpWZXJzaW9uIDEuMy4yMyAoTm92ZW1iZXIgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM5ODI3NTMgZnJvbSBGYWJyaWNlIFNhbHZhaXJlOiBBZGRzIGRlcGVuZGVuY2llcyBnZW5lcmF0aW9uIGZvcgogICAgICAgICAgICBjb25zdHJ1Y3RpbmcgbWFrZWZpbGVzLiBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgLU1GIC1NRCAtTU1EIHRvIHdvcmsKICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCBvcHRpb25zIC1NIGFuZCAtTU0uIFRoZXNlIG9wdGlvbnMgYXJlIG5hbWVkIHRoZSBzYW1lCiAgICAgICAgICAgIGFuZCB3b3JrIHRoZSBzYW1lIGFzIGluIGdjYy4KCjExLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVpZ25vcmUvJXJlbmFtZSBjaGFuZ2VzIGZvciBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgdG8gbWlycm9yCiAgICAgICAgICAgICVmZWF0dXJlIGJlaGF2aW91ci4gU2VlIHByZXZpb3VzIGVudHJ5LgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciBmaW5lIHR1bmluZyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgd2l0aAogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cy4gQW55ICVmZWF0dXJlIHRhcmdldGluZyBhIG1ldGhvZCB3aXRoIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcyBpZiB0aGUKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZS4gSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZQogICAgICAgICAgICBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLCB0aGVuIHRoZSBmZWF0dXJlIHdpbGwgbWF0Y2ggdGhhdCBleGFjdAogICAgICAgICAgICB3cmFwcGVyIG1ldGhvZCBvbmx5IGFuZCBub3QgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHdpbGwgYXBwbHkgdGhlIGZlYXR1cmUgdG8gYWxsIHRocmVlIHdyYXBwZXIgbWV0aG9kcywgdGhhdCBpczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0Iikgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG9ubHkgYXBwbHkgdG8gdGhpcyB3cmFwcGVyIG1ldGhvZDoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwoKICAgICAgICAgICBhbmQgbm90IHRoZXNlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbWFrZSAlZmVhdHVyZSBtb3JlIHBvd2VyZnVsIHRvIGVhc2UgdGhlIG1pZ3JhdGlvbgogICAgICAgICAgIHRvIG5ldyBkZWZhdWx0IGFyZ3VtZW50cyB3cmFwcGluZyBhcHByb2FjaC4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgSWYgeW91IHByZXZpb3VzbHkgaGFkIGEgJWZlYXR1cmUgYW5kIGRpZG4ndCBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFyZ3VtZW50cywKICAgICAgICAgICB5b3Ugd2lsbCBoYXZlIHRvIGFkZCB0aGVtIGluIG5vdyBvciB5b3UgY2FuIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyCiAgICAgICAgICAgYnkgdXNpbmcgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpLgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwcyBmb3Igc3RkOjp2ZWN0b3IgYWRkZWQgaW50byBzdGRfdmVjdG9yLmkuIFRoZSBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIGdlbmVyYXRlZCBhcmUgbW9kZWxsZWQgb24gdGhlIC5ORVQgQXJyYXlMaXN0IGNsYXNzLiBUaGlzIGlzbid0IHF1aXRlCiAgICAgICAgICAgIHJlYWR5IGZvciBnZW5lcmFsIGNvbnN1bXB0aW9uIHlldCwgYnV0IHdpbGwgd29yayB3aXRoIHZlY3RvcnMgb2YgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIGFuZCBzb21lIGNsYXNzZXMuCgoxMC8zLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbR1VJTEVdIFRoZSAtc2NtIGludGVyZmFjZSBpcyBub3cgdGhlIGRlZmF1bHQuICBUaGUgb2xkIEdIIGludGVyZmFjZSBjYW4KCSAgICBzdGlsbCBiZSBlbmFibGVkIGJ5IHBhc3NpbmcgLWdoIHRvIFNXSUcuCgoxMC8yLzIwMDQ6IG1tYXR1cwoKCSAgICAtIE1vcmUgZml4ZXMgZm9yIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucy4KCSAgICAgIEFzIGFuIGV4dHJhIGJvbnVzLCB3ZSBnZXQgJXRlbXBsYXRlIHN1cHBvcnQgZm9yIHN0YXRpYy9tZW1iZXJzIGNsYXNzCgkgICAgICBtZXRob2RzLCBpZSwgbm93IHlvdSBjYW4gc2F5OgoKCSAgICAgICAgbmFtZXNwYWNlIHNwYWNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQQkJCSAgICAKCSAgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JICAgIAoJICAgICAgICAgICBzdGF0aWMgdm9pZCBmb29UKFkgeSkgeyB9CgkgICAgICAgICB9OwkKCQl9CQkJICAgIAoJICAgICAgCSAgICAgIAkJCSAgICAKCSAgICAgICAgc3RydWN0IEIJCQkgICAgCgkgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkJICAgIAoJICAgICAgICAgIHZvaWQgYmFyVChZIHkpIHt9IAoJICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGludD47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8Y2hhcj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8aW50PjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGNoYXI+OwoKCSAgICAgIGFuZCBjYWxsCgoJICAgICAgICBBLmZvbygxKQoJCWIgPSBCKCkKCQliLmJhcigxKQoJICAgICAgCgkgICAgICBub3RlIHRoZSB0aGUgbWV0aG9kcyBhcmUgZW1pdHRlZCBpbnNpZGUgdGhlIGNsYXNzZXMsCgkgICAgICBhbmQgaGVuY2UsIHRoZSAldGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gdGhlICdtZW1iZXInCgkgICAgICBtZXRob2QgbmFtZSwgbm90IGEgZ2xvYmFsIG5hbWVzcGFjZSBuYW1lLgoKMTAvMzEvMjAwNDogbW1hdHVzCgkgICAgLSBTb2x2ZSBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMsIGFzIGluCgoJICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgIHN0cnVjdCBCYXI7CgkJIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHN0cnVjdCBmb286OkJhciA6IEZvbyB7CiAgICAgICAgICAgICAgIH07CgoJICAgICAgIHNlZSBuYW1lc3BhY2VfY2xhc3MuaSBmb3IgbW9yZSBleGFtcGxlcy4KCiAgICAgICAgICAgIC0gRml4ICV0ZW1wbGF0ZSBkaXJlY3RpdmUgdG8gcHJvcGVybHkgdXNlIG5hbWVzcGFjZXMsCiAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSBjYXNlOgoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewoJCSAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCQkgICAgICAgc3RydWN0IFB0ciB7fTsKICAgICAgICAgICAgICAgICAgIH0KCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsJCSAgCgkJICAgICAgIHN0cnVjdCBPYmoxIHt9OwoJCSAgICAgICB0eXBlZGVmIFB0cjxPYmoxPiBPYmoxX3B0cjsKICAJCSAgICAgICAldGVtcGxhdGUoT2JqMV9wdHIpIFB0cjxPYmoxPjsgCgkJICAgfQkJCQkgIAoJCSAgIAkJCQkgIAoJCSAgIG5hbWVzcGFjZSB0d28gIAoJCSAgIHsKCQkgICAgICAgc3RydWN0IE9iajIge307CQoJCSAgICAgICB0eXBlZGVmIG9uZTo6UHRyPE9iajI+IE9iajJfcHRyOwoJCSAgICAgICAldGVtcGxhdGUoT2JqMl9wdHIpIG9uZTo6UHRyPE9iajI+OwoJCSAgIH0KCgkgICAgICB0aGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIG5hbWVzcGFjZSBuYW1lICdvbmUnIHRvIGNyZWF0ZQogICAgICAgICAgICAgIGEgbmFtZXNwYWNlIG5vZGUgdG8gZW1pdCB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICBqdXN0IGFzIGJlZm9yZSwgYnV0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSByZXNvbHZlZAogICAgICAgICAgICAgIGFuZCBxdWFsaWZpZWQgaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlICgnb25lJyBvciAndHdvJykuCiAgICAgICAgICAgICAgVGhpcyBpcyBzYW1lIHdheSB0aGF0IHR5cGVkZWYgd29ya3MuIAoKCSAgICAgIFRoaXMgcmVzb2x2ZSB0aGUgc21hcnRfcG9pbnRlcl9uYW1lc3BhY2UyLmkgY2FzZSwgYW5kIGF0CiAgICAgICAgICAgICAgdGhlIHNhbWUgdGltZSwgc2V2ZXJhbCBvdGhlciBvbmVzIHdoZXJlIGJlZm9yZSBzd2lnIHdhcwogICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlCgoJICAgICAgICAiQ2FuJ3QgaW5zdGFudGlhdGUgdGVtcGxhdGUgJ3h4JyBpbnNpZGUgbmFtZXNwYWNlICd5eSciCgkgICAgICAKCSAgICAgIGVycm9yIG1lc3NhZ2UuIEluIGZhY3QsIHRoYXQgZXJyb3IgZG9lc24ndCBleGlzdAoJICAgICAgYW55bW9yZS4gWW91IGNhbiBvbmx5IGdldCBhbiBlcnJvciBpZiB5b3UgdXNlIGEgYmFkCgkgICAgICBuYW1lc3BhY2UgbmFtZSBvciBzby4KCjEwLzMwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW3J1YnldIERpcmVjdG9ycyBmaXhlczoKCSAgICAgIC0gZW51bXMgYW5kIHN0ZDo6c3RyaW5ncyBhcmUgd29ya2luZyBub3cgKHNldmVyYWwKCSAgICAgICAgcmVwb3J0cyBpbiBidWcgdHJhY2sgc3lzdGVtKQoJICAgICAgLSBhZGRlZCBwYXRjaCAxMDI1ODYxIGZvciBkaXJlY3RvciArIGV4Y2VwdGlvbnMKCQkKICAgICAgICAgICAgICAqKiogQXR0ZW50aW9uICoqKjogcnVieSB3aXRoIGRpcmVjdG9ycyArIHByb3RlY3RlZAogICAgICAgICAgICAgIG1lbWJlcnMgd29yayB3aXRoIHZlcnNpb24gMS43Ky4gT2xkZXIgdmVyc2lvbnMgc2VlbXMgdG8KICAgICAgICAgICAgICBoYXZlIGEgYnJva2VuIHNpZ25hdHVyZSBmb3IncmJfcHJvdGVjdCcuCgkJCgkgICAgICBJZiB5b3UgbmVlZCB0byB1c2UgYW4gb2xkIHZlcnNpb24sIGxvb2sgYXQKCgkgICAgICBodHRwOi8vZXhjcnVieS5zb3VyY2Vmb3JnZS5uZXQvZG9jcy9odG1sL3J1YnlfX2hhY2tzXzhocHAtc291cmNlLmh0bWwKICAJICAgICAgZm9yIHdvcmthcm91bmRzLgoJICAgICAgCiAgICAgICAgICAgIC0gW3J1YnldIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIGluIHR5cGVtYXAgKGJ1ZyAxMDM3MjU5KQoKCSAgICAtIFt0Y2xdIEZpeCAoZW51bXN8Y29uc3RhbnRzKSArIG5hbWVzcGFjZSBvcHRpb24gCgkgICAgICAgICAgICAocmVwb3J0ZWQgYnkgamFzb24ubS5zdXJwcmlzZUBpbnRlbC5jb20pLgoKICAgICAgICAgICAgLSBbcGVybF0gQWRkIHBhdGNoIDk2MjE2OCBmb3IgbXVsdGlwbGUgaW5oZXJldGFuY2UKCSAgICAKCSAgICAtIEZpeCAnZGVmaW5lZCcgYXMgdmFyaWFibGUgbmFtZS4KCjEwLzI5LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGdsb2JhbCBzY29wZSBvcGVyYXRvciB1c2VkIGZvciBmcmllbmQgbWV0aG9kczoKCiAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBmcmllbmQgdm9pZCA6Omdsb2JhbHNjb3BlKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMTAvMjgvMjAwNDptbWF0dXMKCSAgICAtIEFkZGVkIG1vZHVsZSBhbmQgc3dpZyBvcHRpb24gInRlbXBsYXRlcmVkdWNlIiB0byBmb3JjZSBzd2lnCgkgICAgICB0byByZWR1Y2UgYW55IHR5cGUgbmVlZGVkIHdpdGggdGVtcGxhdGVzLCBpZSwgaW4gdGhlc2UgY2FzZXMKCiAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0ZW1wbGF0ZXJlZHVjZSIpIHRlc3QKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEEgeyB9OwoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludDsKCSAgICAgICAgJXRlbXBsYXRlKEFfSW50KSBBPEludD4gID09PiAgJXRlbXBsYXRlKEFfSW50KSBBPGludD4KCiAgICAgICAgICAgICAgICB0eXBlZGVmIEIqIEJwOwoJICAgICAgICAldGVtcGxhdGUoQV9CcCkgQTxCcD4gID09PiAgJXRlbXBsYXRlKEFfQnApIEE8Qio+CgogICAgICAgICAgICAgIHN3aWcgcmVkdWNlcyB0aGUgdHlwZXMgSW50IGFuZCBCcCB0byB0aGVpciBwcmltaXRpdmVzCiAgICAgICAgICAgICAgaW50IGFuZCBCKi4gVGhpcyBpcyBjbG9zZXIgdG8gdGhlIHVzdWFsIGNvbXBpbGVyCiAgICAgICAgICAgICAgcmVzb2x1dGlvbiBtZWNoYW5pc20sIGFuZCBpdCBpcyByZWFsbHkgbmVlZGVkIHNvbWV0aW1lcwogICAgICAgICAgICAgIHdoZW4geW91IG1peCB0ZW1wbGF0ZXMgKyB0eXBlZGVmcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgICBEb24ndCB1c2UgaXQgaWYgeW91IGRvbid0IGhhdmUgYW55IHByb2JsZW0gYWxyZWFkeSwKCSAgICAgIHNpbmNlIHRoZSB0eXBlIHJlZHVjdGlvbiBjYW4gaW50ZXJmZXJlIHdpdGggc29tZQoJICAgICAgdXNlciB0eXBlbWFwcywgc3BlY2lhbGx5IGlmIHlvdSBkZWZpbmVkIHNvbWV0aGluZyBsaWtlCgoJCSAgIHR5cGVkZWYgaW50IEludDsKCQkgICAldHlwZW1hcChpbikgSW50IC4uLjsKCiAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLCB3aGVuIHlvdSB1c2UgdGhlICJ0ZW1wbGF0ZXJlZHVjZSIgb3B0aW9uLAoJICAgICAgc3dpZyB3aWxsIGlnbm9yZSB0aGUgdXNlciB0eXBlbWFwLCBzaW5jZSB0aGUgInR5cGVkZWYgaW50IEludCIKCSAgICAgIHdpbGwgdGFrZSBwcmVjZWRlbmNlLCBhbmQgdGhlIHVzdWFsICJpbnQiIHR5cGVtYXAgd2lsbCBiZQoJICAgICAgYXBwbGllZC4gCgoJICAgICAgTm90ZSB0aGF0IHRoZSBwcmV2aW91cyBjYXNlIGlzIG5vdCBjb21tb24sIGFuZCBzaG91bGQgYmUKCSAgICAgIGF2b2lkZWQsIGllLCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIGEgdHlwZWRlZiBhbmQgYQoJICAgICAgdHlwZW1hcCBhdCB0aGUgc2FtZSB0aW1lLCBzcGVjaWFsbHkgaWYgeW91IGFyZSBnb2luZyB0bwoJICAgICAgdXNlIHRlbXBsYXRlcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgLSBEaXJlY3RvcnM6CgoJICAgICAgICB2aXJ0dWFsIGRlc3RydWN0b3IgaXMgYWx3YXlzIGVtaXR0ZWQgbm93LCB0aGlzIGRvZXNuJ3QKCSAgICAgICAgY2F1c2UgYW55IGhhcm0sIGFuZCBjb3VsZCBzb2x2ZSBzb21lIG5hc3R5IGFuZAoJICAgICAgICBteXN0ZXJpb3VzIGVycm9ycywgbGlrZSB0aGUgb25lIG1lbnRpb25lZCBieSBTY290dC4KCgkJYWxzbyB0aGUgZGVzdHJ1Y3RvciBpcyBub3QgaW4tbGluZWQsIHNvLCB0aGF0IGNhbiBzb2x2ZQoJCXNvbWUgb3RoZXIgbXlzdGVyaW91cyBlcnJvcnMgd2hlbiBtaXhpbmcgZGlyZWN0b3JzICsKCQlpbXBvcnRzICsgZW1iZWRkZWQgYXBwbGljYXRpb25zICsgc29tZSBzcGVjaWZpYyBjb21waWxlcnMuCgkJCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUgd2l0aCBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBhZGRlZC4KCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcCBmaXhlcyBpbiBzdGRfc3RyaW5nLmkgZnJvbSBSdXNzZWxsIEtlaXRoLU1hZ2VlLgoKMTAvMjUvMjAwNDogbW1hdHVzIAoKCSAgICAtIFVzaW5nICsgbmFtZXNwYWNlIGlzIHdvcmtpbmcgbm93ICh1c2luZ19uYW1lc3BhY2UuaSkuCgoJICAgIC0gRGVyaXZlZCArIG5lc3RlZCBjbGFzc2VzIGlzIHdvcmtpbmcgbm93CgkgICAgICAoZGVyaXZlcl9uZXN0ZWQuaSksIGJ1dCBvZiBjb3Vyc2UsIHdlIGFyZSBzdGlsbCB3YWl0aW5nCgkgICAgICBmb3IgdGhlIG5lc3RlZCBjbGFzcyBzdXBwb3J0LgoJICAgIAoJICAgIC0gRGlyZWN0b3JzOgoJICAgICAgLSB1bm5hbWVkIHBhcmFtZXRlcnMgc3VwcG9ydCwKCgkgICAgICAtIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBzdXBwb3J0IChhdXRvbWF0aWMgYW5kIHdpdGgKICAgICAgICAgICAgICAgIGRpcnByb3QgbW9kZSksCgoJICAgICAgLSBkZXRlY3Rpb24gb2YgcmVhbGx5IG5lZWRlZCBwcm90ZWN0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAobWVtYmVycyBhbmQgY29uc3RydWN0b3JzKSBub3cgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LgogICAgICAgICAgICAgICAgRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZSAnZGlycHJvdCcgbW9kZSwgc3dpZyB3aWxsCiAgICAgICAgICAgICAgICB3cmFwIHdoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCAoYW5kIHByb3RlY3RlZCkgZm9yIHRoZQogICAgICAgICAgICAgICAgY29kZSB0byBjb21waWxlLgoJCQoJCXdoYXQgaXMgcHVibGljLCBhcyB1c3VhbCwgaXMgYWx3YXlzIHdyYXBwZWQsIGFuZCBpZgoJCXlvdSB1c2UgdGhlICdkaXJwb3J0JwoJCQoKCSAgICAtIEZpbmFsIGZpeGVzIGZvciB0aGUgT1NTIHRvIGNvbXBpbGUgd2l0aCBTV0lHIDEuMy4yMyAobXkKCSAgICAgIHZlcnkgdmVyeSB1Z2x5IEMrKyArIHRlbXBsYXRlcyArIGV2ZXJ5dGhpbmcgbW91bnRlcnMgd3JhcCkuCgoxMC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLWRsbGltcG9ydC4gVGhpcyBlbmFibGVzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBETEwgZm9yIHRoZSBEbGxJbXBvcnQgYXR0cmlidXRlLiBOb3JtYWxseSB0aGlzIG5hbWUKICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgbW9kdWxlIG5hbWUsIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzOgoKICAgICAgICAgICAgICBzd2lnIC1jc2hhcnAgLWRsbGltcG9ydCB4eXogZXhhbXBsZS5pCgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGZvciBhbGwgdGhlIHdyYXBwZWQgUEludm9rZSBtZXRob2RzOgoKICAgICAgICAgICAgICBbRGxsSW1wb3J0KCJ4eXoiLCBFbnRyeVBvaW50PSIuLi4iKV0KICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiAuLi4KCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmcm9tIG1hbnkgZGlmZmVyZW50IFNXSUcgaW52b2NhdGlvbnMgY2FuIHRodXMgYmUgY29tcGlsZWQKICAgICAgICAgICAgaW50byBvbmUgRExMLgoKICAgICAgICAgICAgQSBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkZGxsaW1wb3J0IGNhbiBhbHNvIGJlIHVzZWQgaW4gdHlwZW1hcHMsIHByYWdtYXMsCiAgICAgICAgICAgIGZlYXR1cmVzIGV0Yy4gVGhpcyB3aWxsIGdldCB0cmFuc2xhdGVkIGludG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSAtZGxsaW1wb3J0CiAgICAgICAgICAgIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHRoZSBtb2R1bGUgbmFtZS4KCjEwLzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTA0OTQ5NiBmcm9tIFNjb3R0IE1pY2hlbCBmaXhlcyBkaXJlY3RvcnMgbWV0aG9kcyB3aXRoIAogICAgICAgICAgICBlbnVtcyB3aGVuIHdyYXBwZWQgd2l0aCB0eXBlc2FmZSBvciBwcm9wZXIgSmF2YSBlbnVtcy4KCjEwLzIxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyBpbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgKFB5dGhvbiwgUnVieSwgT2NhbWwpLgoKMTAvMjEvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctY3BsdXNjYXN0JyBvcHRpb24gdG8gZW5hYmxlIHRoZSAnbmV3JwoJICAgICAgQysrIGNhc3Rpbmcgb3BlcmF0b3JzLCBzdWNoIGFzICdzdGF0aWNfY2FzdCcsIGluc2lkZSB0aGUKCSAgICAgIHR5cGVtYXBzLiBCeSBkZWZhdWx0IHN3aWcgdXNlIHRoZSBvbGQgQyBjYXN0IHN0eWxlLCBldmVuCgkgICAgICB3aGVuIHBhcnNpbmcgQysrLgoJICAgICAgCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbmV3X3Z3bScgb3B0aW9uIHRvIGVuYWJsZSB0aGUgbmV3CiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciBtb2RlLiBOb3cgdGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICB0aGF0IHRoZSB0eXBlbWFwcyBhcmUgcmVhbGx5IHNhZmUgZm9yIGFueSBmdXR1cmUKICAgICAgICAgICAgICBzb2x1dGlvbiwgYnV0IHlvdSBjYW4gdXNlIGl0IGlmIHlvdSBoYXZlIGEgdmVyeSBzdHJhbmdlCiAgICAgICAgICAgICAgZXJyb3Igd2l0aCBkZWZhdWx0IGNvc250cnVjdG9ycyBtaXNzaW5nICsgJWFwcGx5ICsKICAgICAgICAgICAgICAldHlwZW1hcCwgYW5kIGlmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlscyAoc2VlCiAgICAgICAgICAgICAgdmFsdXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFsdGVybmF0aXZlIGFuZCBjdXJyZW50CiAgICAgICAgICAgICAgc29sdXRpb25zKS4gSWYgeW91IGFyZSBhIHVzZXIgdGhhdCBkb24ndCBrbm93IHdoYXQgaXMKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBkb24ndCBldmVuIHRyeSBpdC4KCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbm9oJyBvcHRpb24gdG8gYmUgdXNlZCB3aXRoIGRpcmVjdG9ycwoJICAgICAgYW5kIHdoZW4geW91IHByZWZlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQoJICAgICAgZGlyZWN0b3IgaGVhZGVyIGZpbGUuIElmIG5vdCB1c2VkLCBzd2lnIHdpbGwgd29yayBhcwoJICAgICAgdXN1YWwgZ2VuZXJhdGluZyBib3RoIHRoZSB3cmFwLmN4eCBhbmQgd3JhcC5oIGZpbGVzLiBJZgoJICAgICAgeW91IHVzZSBpdCwgc3dpZyB3aWxsIG9ubHkgZ2VuZXJhdGUgd3JhcC5jeHguCgoxMC8yMS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBJZiB5b3UgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRSB3aGVuIGNvbXBpbGluZyBhIHdyYXBwZXIgZmlsZSwKCSAgICAgIHRoZSBydW50aW1lIHR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBnaXZlbiB0eXBlIHRhYmxlIG5hbWUuCgkgICAgICBVc2luZyB0aGlzLCB5b3UgY2FuIHNlcGVyYXRlIGRpZmZlcmVudCBtb2R1bGVzIHRvIHNoYXJlIHRoZWlyCgkgICAgICBvd24gdHlwZSBzeXN0ZW1zLiAgLURTV0lHX1RZUEVfVEFCTEU9TXl0YWJsZQoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19TVEFUSUNfUlVOVElNRSB0aGVuIHRoZSB0eXBlIGluZm9ybWF0aW9uCgkgICAgICB3aWxsIGJlIHN0YXRpYyB0byB0aGlzIHdyYXBwZXIuICBOb3RoaW5nIHdpbGwgYmUgc2hhcmVkIHdpdGggYW55CgkgICAgICBvdGhlciBtb2R1bGVzCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX0xJTktfUlVOVElNRSwgdGhlbiBpbnN0ZWFkIG9mIHVzaW5nCgkgICAgICB0aGUgbmV3IHdheSBvZiBzaGFyaW5nIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB3cmFwcGVyIHdpbGwgZXhwZWN0CgkgICAgICB0byBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgTGliL2xpbmtydW50aW1lLmMgZmlsZS4gIEFueSBtb2R1bGVzIGNvbXBpbGVkCgkgICAgICB3aXRoIFNXSUdfTElOS19SVU5USU1FIGFuZCBsaW5rZWQgYWdhaW5zdCBsaW5rcnVudGltZS5jIHdpbGwgYWxsCgkgICAgICBzaGFyZSB0eXBlIGluZm9ybWF0aW9uLgoKMTAvMjAvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBJbml0aWFsIGZpeCBmb3IgcHl0aG9uL2ltcG9ydCBleGFtcGxlLiBQbGVhc2UKCSAgICAgIHVwZGF0ZSB0aGUgTWFrZWZpbGUgKGF1dG9jb25mLCBjb25maWd1cmUsIGV0YywgZXhwZXJ0KSwKCSAgICAgIHNpbmNlIG5vdyBwcm9iYWJseSBpcyBvbmx5IHdvcmtpbmcgd2l0aCBnKyssIGljYyBhbmQgYQoJICAgICAgZmV3IG90aGVyIGNvbXBpbGVycyB0aGF0IGhhdmUgdGhlIC1zaGFyZWQgb3B0aW9uLgoKCSAgICAgIFdlIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlCgkgICAgICB2aXJ0dWFsIGRlc3RydWN0b3JzLiBPbGQgYW5kIHVzdWFsbHkgZm9yZ290dGVuIEMrKwoJICAgICAgcmVxdWlyZW1lbnQuCgkgICAgICAKCSAgICAgIFNhbWUgZml4IG5lZWQgdG8gYmUgdXNlZCBpbiBwZXJsLCBJIHRoaW5rLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBGaXggZ2VuZXJhdGlvbiBvZiBoZWFkZXIgZmlsZSBmb3IgZGlyZWN0b3JzLAogICAgICAgICAgICAgIG5vdyBkaXJlY3RvcnMuc3dnIGlzIGFsc28gaW5jbHVkZWQsIHNvLCBpdCBjYW4gYmUgcmVhbGx5CgkgICAgICB1c2VkIGZyb20gQysrLCBhbmQgaXQgc29sdmVzIHNvbWUgcHJvYmxlbSB3aXRoIGNvbXBpbGVyCgkgICAgICB0aGF0IHJlcXVpcmUgdGhhdCwgZXZlbiB3aXRoIHRoZSBzaW1wbGUgc3dpZyBpbmNsdXNpb24uICAKCiAgICAgICAgICAgIC0gW1B5dGhvbl0gUmVvcmRlcmluZyB0aGUgbWV0aG9kcyBhbmQgbW92aW5nIHNvbWUgYm9kaWVzCiAgICAgICAgICAgICAgb3V0c2lkZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgaXMgbmVlZGVkIGR1ZSB0bwogICAgICAgICAgICAgIHNvbWUgZ2NjLTIuOTYgaW50ZXJuYWwgY29tcGlsZXIgZXJyb3JzLiBJdCBzZWVtcyB0aGUKICAgICAgICAgICAgICBQWVRIT04gY2xhc3MgaXMgZ2V0dGluZyB0b28gbGFyZ2UgdG8gYmVlbiBkZWNsYXJlZCBhbmQKICAgICAgICAgICAgICBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIC0gQWRkIHRoZSAtb2ggb3B0aW9uIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGhlYWRlciBmaWxlIG5hbWUKICAgICAgICAgICAgICBpZiBuZWVkZWQ6CgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDIC1vaCB0ZXN0LkhICgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG1haW5seSBuZWVkZWQgd2hlbiB1c2luZyBkaXJlY3RvcnMsIGFuZCBpZiB0aGUKICAgICAgICAgICAgICBjdXJyZW50IGRlZmF1bHQgaGVhZGVyIGZpbGUgbmFtZSBpcyBub3QgZ29vZCBmb3IgeW91LAogICAgICAgICAgICAgIHdoaWNoIGlzIGdlbmVyYXRlZCBhcyBmb2xsb3c6CSAgICAgIAoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgICAgICAgICAgICAgPT4gdGVzdF93cmFwLmgKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAgPT4gdGVzdC5oCgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgMSkgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBmZWF0dXJlIGFkZGVkLiBUaGlzIGZlYXR1cmUgYWxsb3dzIG9uZQogICAgICAgICAgICAgIHRvIHVzZSB0aGUgZGVmYXVsdCBhcmd1bWVudCBjb2RlIGdlbmVyYXRpb24gdGhhdCB3YXMgdXNlZCBpbgogICAgICAgICAgICAgIFNXSUctMS4zLjIyIGFuZCBlYXJsaWVyIHZlcnNpb25zLiBJdCBwcm9kdWNlcyBtb3JlIGNvbXBhY3Qgd3JhcHBlcnMKICAgICAgICAgICAgICBhcyBvbmx5IG9uZSB3cmFwcGVyIG1ldGhvZCBpcyBnZW5lcmF0ZWQgZm9yIGFueSBtZXRob2Qgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgICAgYXJndW1lbnRzLiBTbyB0aGUgYWR2YW50YWdlIGlzIGl0IGdlbmVyYXRlcyBsZXNzIGNvZGUgYnV0IGhhcyB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBsaW1pdGF0aW9ucywgbGlrZSBpdCBpdCBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGNhbm5vdCBiZSB0YWtlbiBhZHZhbnRhZ2Ugb2YgaW4gdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgICAgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkuIEl0IGlzIGltcGxlbWVudGVkIHZpYSB0aGUgdXN1YWwgJWZlYXR1cmUgbWVjaGFuaXNtOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKTsKCiAgICAgICAgICAgIDIpIEtleXdvcmQgYXJndW1lbnRzIChrd2FyZ3MpIGFyZSB3b3JraW5nIGFnYWluIGZvciBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBpbiB0aGUgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBpdCwgaWUsIFB5dGhvbiBhbmQgUnVieS4gVGhlIG5ldyBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50IHdyYXBwaW5nIGFwcHJvYWNoIHVzaW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBjYW5ub3Qgc3VwcG9ydCBrd2FyZ3MKICAgICAgICAgICAgICAgc28gdGhlIGNvbXBhY3QgZGVmYXVsdCBhcmd1bWVudCBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4KICAgICAgICAgICAgICAga3dhcmdzIGFyZSBzcGVjaWZpZWQsIGJ5ICVmZWF0dXJlKCJrd2FyZ3MiKS4KCiAgICAgICAgICAgIDMpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgYXJlIGFsc28gYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiB3cmFwcGluZwogICAgICAgICAgICAgICBDIChub3QgQysrKSBjb2RlLiBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlIGJpemFycmUgbm90aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGZvciBDIGNvZGUuCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMgaW4gbmFtZXNwYWNlcyBhbHNvIHdvcmtpbmcgbm93LgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaW4gbmFtZXNwYWNlcyB0b28uCgoxMC8xOS8yMDA0OiBtbWF0dXMKCgkgICAgLSBBbGxvdyB0byBkaXNhYmxlIHRoZSBuZXcgU3dpZ1ZhbHVlV3JhcHBlciBtZWNoYW5pc20sCgkgICAgICBpZiB5b3UgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGxhbmd1YWdlIG1haW4uCgoJCSAvKiBUdXJuIG9uIHNhZmUgdmFsdWUgd3JhcHBlciB1c2UgbW9kZSAqLwogICAgICAgICAgICAgICAgIFN3aWdfdmFsdWVfd3JhcHBlcl9tb2RlKDEpOwoKCSAgICAgIAoJICAgICAgTm93IGlzIG9ubHkgYWN0aXZlIGluIHB5dGhvbi4gQWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICAgIGFyZSB1c2luZyB0aGUgb2xkIHJlc29sdXRpb24sIGJ1dCB0aGV5ICBjYW4gYWxzbyB1c2UgdGhlCgkgICAgICAidmFsdWV3cmFwcGVyIi8ibm92YWx1ZXdyYXBwZXIiIGZlYXR1cmVzIHRvIGZpeCBzb21lCgkgICAgICBvZiB0aGUgb2xkIGJyb2tlbiBjYXNlcy4gTm90ZSwgaG93ZXZlciwgIHRoYXQgbm90IGFsbCAKCSAgICAgIHRoZSBicm9rZW4gY2FzZXMgY2FuIGJlIHNvbHZlZCBpbiB0aGF0IHdheS4KCgkgICAgICBUaGUgbmV3IG1lY2hhbmlzbSBzZWVtcyB0byBiZSB3b3JraW5nIGZpbmUgaW4gcGVybCwgcnVieQoJICAgICAgYW5kIHRjbCwgYnV0IGZhaWxpbmcgaW4gc29tZSB0eXBlbWFwcyBpbiBqYXZhLgoKCSAgICAgIEhlbmNlLCBpcyB1cHRvIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRvIHRlc3QgaXQsIGFuZAoJICAgICAgZGVjaWRlIHRvIGVuYWJsZSBpdCBvciBub3QuCgoJICAgICAgTG9vayBhdCB0aGUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBleGFtcGxlcy4KCgkgICAgLSBGaXggbW9yZSBTd2lnVmFsdWVXcmFwcGVyIGNhc2VzIHdoZW4gdGhlIG5ldyBtZWNoYW5pc20KCSAgICAgIGlzIGFjdGl2ZS4gTm93IGl0IGFsc28gY2hlY2sgZm9yIGxvY2FsIHR5cGVtYXAKCSAgICAgIHZhcmlhYmxlcywgc2VlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgYW4gZXhhbXBsZSB3aGVuCgkgICAgICB0aGlzIGlzIG5lZWRlZC4gQnV0IGFnYWluLCB0aGlzIGV4dHJhIGNoZWNraW5nIHdpbGwgb25seQoJICAgICAgYmUgYWN0aXZhdGVkIHdoZW4gdXNpbmcgdGhlIG5ldyB2YWx1ZSB3cmFwcGVyIG1vZGUuCgoJICAgIC0gW1B5dGhvbl0gRml4IHZhcmlhYmxlIHdyYXBwaW5nIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlCgkgICAgICBhc3NpZ24gb3BlcmF0b3JzLiBJdCBzaG91bGQgYmUgZWFzeSB0byBmaXggaW4gYWxsIHRoZSAKCSAgICAgIG90aGVyIG1vZHVsZXMsIGluc3RlYWQgb2YgY2hlY2tpbmcKCgkgICAgICAgICBpZiAoIUdldGF0dHIobiwiaW1tdXRhYmxlIikpIC4uLgoJCgkgICAgICB5b3UgbmVlZCB0byB2ZXJpZnkKCgkgICAgICAgICBpZiAoaXNfYXNzaWduYWJsZShuKSkgLi4uCgoJICAgICAgTG9vayBhdCB0aGUgcHJpdmF0ZV9hc3NpZ24uaSBmb3IgYW4gZXhhbXBsZS4KCjEwLzE4LzIwMDQ6IG1tYXR1cwoJICAgIC0gJWZlYXR1cmVzICJkaXJlY3RvciIvIm5vZGlyZWN0b3IiIG5vdyB3b3JrIGFzIGV4cGVjdGVkLgogICAgICAgICAgICAtIEdlbmVyYWwgZml4ZXMgaW4gJWZlYXR1cmUgdG8gcmVzb2x2ZSBmdW5jdGlvbiBkZWNsCgkgICAgICBwcm9wZXJseSwKCSAgICAgIAoJICAgICAgICAlZmVhdHVyZSgiaGVsbG8iKSBmb28oKTsKCSAgICAgICAgY2hhciBmb28oKSAtPiAgZigpICAgIC8vIHdhcyB3b3JraW5nCgkgICAgICAgIGNoYXIgKmZvbygpIC0+IGYoKS5wICAvLyBpdCB3YXNuJ3QKIAoKICAgICAgICAgICAgLSBUZW1wbGF0ZSArIHNwZWNpYWxpemF0aW9uICsgZGVmYXVsdCB0ZW1wbGF0ZSBhcmdzIG5vdyBpcwoJICAgICAgd29ya2luZywgKGRvbid0IGNvbmZ1c2Ugd2l0aCB0ZW1wbGF0ZSArIGRlZmF1bHQgYXJnCgkgICAgICB2YWx1ZXMsIHRoYXQgd2FzIHNvbHZlZCBiZWZvcmUpLCBub3cgdGhpcyB1Z2x5IGNhc2UgaXMKCSAgICAgIHdvcmtpbmc6CgoJICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQSA9IEFsbG9jPFQ+ID4KCQlzdHJ1Y3QgVmVjdG9yCgkJewoJCSAgIFZlY3RvcihUIGEpe30KCQl9OwkJICAgCgoJCXRlbXBsYXRlIDw+CgkJc3RydWN0IFZlY3Rvcjxkb3VibGU+CgkJewoJCSAgVmVjdG9yKCl7fQoJCSAgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAldGVtcGxhdGUoVl9jKSBWZWN0b3I8Y2hhciwgQWxsb2M8Y2hhcj4gPjsKCSAgICAgICAgJXRlbXBsYXRlKFZfaSkgVmVjdG9yPGludD47ICAgIC8vIHBpY2tzIFZlY3RvcjxpbnQsQWxsb2M8aW50PiA+CgkgICAgICAgICV0ZW1wbGF0ZShWX2QpIFZlY3Rvcjxkb3VibGU+OyAvLyBwaWNrcyB0aGUgc3BlY2lhbGl6YXRpb24KCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgU1RMIHN1cHBvcnQgKGxhdGVyIHdpbGwKICAgICAgICAgICAgICBiZSkuCgoJICAgIC0gRml4IHRoZSB0ZW1wbGF0ZSArIHR5cGVkZWYgZXJyb3JzIGluIHRlc3Qtc3VpdGUsIHdoaWNoCiAgICAgICAgICAgICAgcHJvYmFibHkgd2lsbCBmaXggYW5vdGhlciBncm91cCBvZiBzdHJhbmdlIHRlbXBsYXRlICsKICAgICAgICAgICAgICBuYW1lc3BhY2VzICsgdHlwZWRlZnMgZXJyb3JzLgoKCSAgICAtICV3YXJuZmlsdGVyIGlzIHdvcmtpbmcgYmV0dGVyIG5vdywgcGFyc2VyLnkgdHJpZXMgdG8gdXNlCgkgICAgICB0aGVtIHdoZW4gbmVlZGVkLgoKCSAgICAtICoqKiogTmV3IGRlZmF1bHQgdHlwZSByZXNvbHV0aW9uIG1ldGhvZCAoc3R5cGUuYykgKioqKiogCgoJICAgICAgSXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBtaXhlZCB0eXBlcywgdGhlbiBpdCBnb2VzCgkgICAgICAnYmFja3dhcmQnIGZpcnN0IGRlbGV0aW5nIHRoZSBxdWFsaWZpZXIsIHRoZW4gdGhlIGlubmVyCgkgICAgICB0eXBlcywgZm9yIGV4YW1wbGU6CiAgICAJCSAJCQkJCQkJICAKICAgIAkJIHR5cGVkZWYgQSAqQXB0cjsJCQkJICAKICAgIAkJIGNvbnN0IEFwdHImOwkJCQkJCQogICAgCQkgci5xKGNvbnN0KS5BcHRyICAgICAgIC0+IHIucShjb25zdCkucC5TV0lHVFlQRQkJCiAgICAJCSByLnEoY29uc3QpLnAuU1dJR1RZUEUgLT4gci5wLlNXSUdUWVBFCQkJCiAgICAJCSByLnAuU1dJR1RZUEUgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGVudW0gSGVsbG8ge307CQkJCQkJCiAgICAJCSBjb25zdCBIZWxsbyYgaGk7CQkJCQkKICAgIAkJIHIucShjb25zdCkuSGVsbG8gICAgICAgICAgLT4gci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFCQogICAgCQkgci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFICAtPiByLmVudW0gU1dJR1RZUEUJCQogICAgCQkgci5lbnVtIFNXSUdUWVBFICAgICAgICAgICAtPiByLlNXSUdUWVBFCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgaW50IGFbMl1bNF07CQkJCQkJCiAgICAJCSBhKDIpLmEoNCkuaW50ICAgICAgICAgICAtPiBhKEFOWSkuYShBTlkpLlNXSUdUWVBFCQogICAgCQkgYShBTlkpLmEoQU5ZKS5TV0lHVFlQRSAgLT4gYShBTlkpLmEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuYSgpLlNXSUdUWVBFICAgICAtPiBhKEFOWSkucC5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkucC5TV0lHVFlQRSAgICAgICAtPiBhKEFOWSkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLlNXSUdUWVBFICAgICAgICAgLT4gYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoKS5TV0lHVFlQRSAgICAgICAgICAgIC0+IHAuU1dJR1RZUEUJCQkKICAgIAkJIHAuU1dJR1RZUEUgICAgICAgICAgICAgIC0+IFNXSUdUWVBFICAgICAgICAgICAgICAgICAgICAKCgkgICAgICBiZWZvcmUgaXQgYWx3YXlzIHN0b3BzIGFmdGVyIGZpbmRpbmcgcmVmL3BvaW50ZXIvZW51bS9hcnJheS9ldGMuCgkgICAgICAgCgkgICAgICBOb3csIHRoZW4sIHlvdSBjYW4gZGVmaW5lICh1c2UgYW5kIGFwcGx5KSAnaGlnaGVyJyB0eXBlbWFwcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAob3V0KSBjaGFyIEZJWFNJWkVbQU5ZXQogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgZW51bSBTV0lHVFlQRSYKCSAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFW0FOWV1bQU5ZXQoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAoJilbQU5ZXQoJICAgICAgIAoJICAgICAgSXQgaXMgcG9zc2libGUgd2l0aCB0aGlzIGNoYW5nZSB0aGF0IHByZXZpb3VzIHR5cGVtYXBzCgkgICAgICB0aGF0IHdlcmUgZGVmaW5lZCAoYnV0IGlnbm9yZWQpLCBub3cgd2lsbCBzdGFydCB0byB3b3JrLgoKCSAgICAgIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSBjaGVjayBmb3IgdGhlICcldHlwZW1hcCh2YXJpbikgU1dJR1RZUEVbXScsCgkgICAgICBiZWZvcmUgaXQgd2FzIHVzdWFsbHkgbm90IGRlZmluZWQgKGJ1dCBjaGFyW10gd2FzKSwKCSAgICAgIGFuZCB0aGF0IGNhbiBwcm9kdWNlIHNvbWUgaW5jb25zaXN0ZW5jaWVzLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICAgIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgZm9yIFNUTCwgc2luY2Ugc3RkOjp2ZWN0b3I8ZW51bSBIZWxsbz4gCgkgICAgICBzdGQ6OnZlY3RvcjxBKj4sIGV0Yywgd2lsbCBhbHdheXMgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0CgkgICAgICBtaXggY29uc3QgcmVmZXJlbmNlcyB3aXRoIHRoZSB2ZWN0b3IgdHlwZS4KCgkgICAgICBOb3cgdGhhdCBpcyB3b3JraW5nLCBhbGwgdGhlIHN0ZDo6Y29udGFpbmVyPFQqPgoJICAgICAgc3BlY2lhbGl6YXRpb24gd2lsbCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIHdlbGwsIGluCgkgICAgICB0aGVvcnkuIAoKCSAgICAgIEluIHRoZSBwcmFjdGljZSwgZXZlcnl0aGluIGlzIHdvcmtpbmcgYXMgYmVmb3JlIHVudGlsCgkgICAgICB0aGUgcHJvcGVyIG1peGVkIHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB0aGUgbGlicmFyaWVzCgkgICAgICBzaW1wbGlmaWVkIHRvIHVzZSB0aGVtLgoKCSAgICAtIENoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXh0ZXJuICJqYXZhIi8iZm9ydHJhbiIvImV0YyIsIAoJICAgICAgbm93IHN3aWcgcHJvZHVjZXMgYSB3YXJuaW5nLCBhbmQgdXNlIGV4dGVybiAiQyIgaW5zdGVhZC4KCSAgICAgIFRoZSB3YXJuaW5nIGNhbiBhbHNvIGJlIGRpc2FibGUgd2l0aCB0aGUgIi13IDMxMyIgZmxhZy4KCSAgICAgIChXQVJOX1BBUlNFX1VOREVGSU5FRF9FWFRFUk4pLgoKCSAgICAtIFN3aWdWYWx1ZVdyYXBwZXIgaXMgbm93IG1vcmUgc2VsZWN0aXZlIChsYW5nLmN4eCkuCgogICAgICAgICAgICBbUGVybC9UY2xdCgkgICAgLSBGaXggc29tZSB0eXBlbWFwcyAocGVybC90Y2wpIHRvIHdvcmsgcHJvcGVybHkgd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlci4gVGhpcyB3YXMgbm90IGEgcHJvYmxlbSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBidXQgd2l0aCB0aGUgdHlwZW1hcHMgdGhhdCBub3cgYXJlCgkgICAgICBzYWZlIHRvIHVzZSB3aXRoICVhcHBseS4KCgkgICAgW1B5dGhvbl0KCiAgICAgICAgICAgIC0gRml4ICVjYWxsYmFjay8lcHl0aG9uY2FsbGJhY2sgd29yayBub3cgYXMgYmVmb3JlIGFmdGVyCgkgICAgICB0aGUgZGVmIGFyZ3MgY2hhbmdlcy4gQWxzbywgJWNhbGxiYWNrIG5vdyBpcyBhbiBhbGlhcwoJICAgICAgZm9yICVweXRob25jYWxsYmFjaywgc28sIHRoZXkgZG8gdGhlIHNhbWUuCgoJICAgIFtQeXRob24vUnVieV0KCSAgICAtICVjYWxsYmFjayBpcyBtb3JlIHVzYWJsZSBhbmQgdW5pZm9ybToKCiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpIGZvbygpOyAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpOyAgICAgICAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKDEpIGZvbygpOyAgICAgICAgLy8gb25seSBpbiBweXRob24uCgoxMC8xNy8yMDA0OiBhcnR5CgkgICAgW09DQU1MXQoJICAgIC0gVHdlYWsgdG8gZW51bSB0eXBpbmcgZm9yIHNvdW5kbmVzcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUKCSAgICAgIG1vZHVsZXMuCgkgICAgLSBnbG9iYWwgZnVuY3Rpb25zIGFyZSBub3cgdW5hbWJpZ3VvdXMgaW4gbXVsdGlwbGUgbG9hZGVkIG1vZHVsZXMuCgkgICAgLSBGaXhlZCB0ZXN0IGNhc2UgY29kZSB0byBidWlsZCBtdWx0aW1vZHVsZSB0ZXN0IGNhc2VzIGNvcnJlY3RseS4KCSAgICAtIFRoZXJlIGlzIG5vIHdheSB0byBzaGFyZSBvdmVybG9hZCByZXNvbHV0aW9uIGFjcm9zcyBtb2R1bGVzCgkgICAgICBiZWNhdXNlIG9mIHNvdW5kbmVzcyBpc3N1ZXMuICBJZiB0aGUgdXNlciB3YW50cyB0byBjYWxsIHNvbWUKCSAgICAgIGZ1bmN0aW9uIGZvbyBmcm9tIGFuIGFyYml0cmFyeSBtb2R1bGUgYmFyLCB0aGV5IHdpbGwgaGF2ZSB0bwoJICAgICAgdXNlIEJhci5fZm9vIHRvIGNhbGwgaXQgY29ycmVjdGx5LiAgTGF0ZXIgSSB3aWxsIGZpeCB0aGUgCgkgICAgICBjYW1scDQgbW9kdWxlIHRvIGRvIHNvbWV0aGluZyBjbGV2ZXIgaW4gdGhpcyBjYXNlLiAgCiAgICAgICAgICAgIC0gUHJvbWlkZWQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb2YgY2xhc3MgbWVjaGFuaXNtLgoJICAgIC0gUmVtb3ZlZCBzeW1ib2wgaGFjayBmb3Igb2NhbWwtMy4wNyBhbmQgYmVsb3cgd2hpY2ggaXMgbm90IG5lZWRlZAoJICAgICAgZm9yIG9jYW1sLTMuMDggYW5kIGFib3ZlLgoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDSElDS0VOXQoJICAgIC0gQ29tcGxldGx5IGNoYW5nZSBob3cgY2hpY2tlbi5jeHggaGFuZGxlcyBDTE9TIGFuZCBnZW5lcmljIGNvZGUuCgkgICAgICBjaGlja2VuIG5vIGxvbmdlciBleHBvcnRzIC1jbG9zLnNjbSBhbmQgLWdlbmVyaWMuc2NtLiAgVGhlIGNsb3MKCSAgICAgIGNvZGUgaXMgZXhwb3J0ZWQgZGlyZWN0bHkgaW50byB0aGUgbW9kdWxlLnNjbSBmaWxlIGlmIC1wcm94eSBpcyBwYXNzZWQuCgkgICAgLSBUaGUgY29kZSBub3cgYWx3YXlzIGV4cG9ydHMgYSB1bml0LiAgUnVubmluZyB0aGUgdGVzdC1zdWl0ZSBpcyBub3cKCSAgICAgIG1ham9ybHkgYnJva2VuLCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQuCgkgICAgLSBDTE9TIG5vdyBnZW5lcmF0ZXMgdmlydHVhbCBzbG90cyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzaW1pbGFyIHRvIGhvdwoJICAgICAgR09PUFMgc3VwcG9ydCB3b3JrcyBpbiB0aGUgZ3VpbGUgbW9kdWxlLgoJICAgIC0gY2hpY2tlbiBubyBsb25nZXIgcHJlZml4ZXMgc3ltYm9scyBieSB0aGUgbW9kdWxlIG5hbWUsIGFuZCBubyBsb25nZXIKCSAgICAgIGZvcmNlcyBhbGwgbmFtZXMgdG8gbG93ZXIgY2FzZS4gIEl0IG5vdyBoYXMgLXVzZWNsYXNzcHJlZml4IGFuZCAtY2xvc3ByZWZpeAoJICAgICAgc2ltaWxhciB0byBob3cgZ3VpbGUgaGFuZGxlcyBHT09QUyBuYW1lcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB3b3JraW5nIHdpdGggbmV3IGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgd3JhcHBpbmcgYXBwcm9hY2guIFRoZSBuZXcgYXBwcm9hY2ggbm8gbG9uZ2VyIGZhaWxzIHdpdGggdGhlIGZvbGxvd2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50IHBhdHRlcm4gKHByZXZpb3VzbHkgZmFpbGVkIHdpdGggc29tZSBwcmltaXRpdmUgdHlwZXMsIGxpa2UgCiAgICAgICAgICAgIHVuc2lnbmVkIHByaW1pdGl2ZSB0eXBlcyk6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBmb28oY29uc3QgVCYgdSA9IFQoKSk7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPHVuc2lnbmVkIGludD47CgogICAgICAgICAgICBUaGlzIHJlbGllcyBvbiB0aGUgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHN1cHBvcnQganVzdCBhZGRlZCwgc28gYWxsCiAgICAgICAgICAgIHRoZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgbm9ybWFsIHBhcmFtZXRlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBvdmVybG9hZGluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyB3b3Jrcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXJnZSByYW5nZSBvZiB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgdGhhdCBDKysKICAgICAgICAgICAgc3VwcG9ydHMuCgogICAgICAgICAgICAtIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucywgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCwgY29uc3QgVCAmcik7CgogICAgICAgICAgICAtIEZpeGVzIHdoZXJlIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpcyBub3QgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgeHl6KCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIHh5ejxkb3VibGU+KCk7CgogICAgICAgICAgICAtIEZpeGVzIGZvciBvdmVybG9hZGluZyBvZiBwbGFpbiBmdW5jdGlvbnMgYnkgYSB0ZW1wbGF0ZWQgZnVuY3Rpb246CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwoKICAgICAgICAgICAgLSBPdmVybG9hZGluZyBieSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyBmaXhlZDoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmb28oVCB0KSB7fQogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHZvaWQgZm9vKFQgdCwgVSB1KSB7fQoKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288ZG91YmxlLCBkb3VibGU+OwoKICAgICAgICAgICAgLSBBbGwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBhbHNvIHdvcmtpbmcgaW5jbHVkaW5nIHNwZWNpYWxpemF0aW9ucywgZWc6CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmM8ZG91YmxlPihkb3VibGUgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYyhpbnQgdCk7CgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW1vdmUgdGhlIGFiaWxpdHkgdG8gc2hhcmUgdHlwZSBpbmZvcm1hdGlvbiBieSB1c2luZyBjIGxpbmtpbmcuCiAgICAgICAgICAgICAgQWxsIHR5cGUgc2hhcmluZyBoYXBwZW5zIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgICAgICsgUmVtb3ZlIFNXSUdfTk9JTVBPUlQsIFNXSUdfUlVOVElNRSwgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KICAgICAgICAgICAgICAgICsgRGVwcmVjaWF0ZSAtcnVudGltZSwgLW5vcnVudGltZSBjb21tYW5kIGxpbmUgb3B0aW9ucwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGVzdC1zdWl0ZSBjb21tb24ubWsgdG8gY29ycmVjdGx5IGJ1aWxkIG11bHRpY3BwdGVzdAogICAgICAgICAgICAgICAgKyBSZW1vdmUgcmVmZXJlbmNlIHRvIHByZWNvbW1vbi5zd2cKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRoZSBndWlsZV9naCBpbnRlcmZhY2UgdG8gc2hhcmUgZGF0YSBieSBhIGdsb2JhbCB2YXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICBvZiBjIGxpbmthZ2UuCgogICAgICAgICAgICAtIFJlbW92ZSBBZHZhbmNlZC5odG1sLCBzaW5jZSBldmVyeXRoaW5nIGluIGl0IGlzIG5vdyBvYnNvbGV0ZQoKMTAvMDkvMjAwNDogbW1hdHVzCgkgICAgLSBTcGxpdCB0aGUgcHl0aG9uIHN0ZC9TVEwgQysrIGxpYnJhcnkgZmlsZXMsIG5vdwoJICAgICAgYWxsIHRoZSBsYW5ndWFnZSBpbmRlcGVuZGVudCBkZWZpbml0aW9ucyBhcmUgdW5kZXIKCSAgICAgIHRoZSBkaXJlY3RvcnkKCSAgICAgIAoJCUxpYi9zdGQKCgkgICAgICBhbmQgaGVuY2UsIGNhbiBiZSB1c2VkIGZyb20gb3RoZXIgbGFuZ3VhZ2VzLgoKCSAgICAtIEFkZCBtb3JlIGRvY3VtZW50YXRpb24gdG8gdGhlIFB5dGhvbiBTVEwsIGFuZAoJICAgICAgY2xlYW4gdW5uZWNlc3NhcnkgY29kZS4KCgkgICAgLSBBZGQgaW5pdGlhbCBDOTkgY29tcGxleCBzdXBwb3J0LCBhbmQgc29tZSBmaXhlcwoJICAgICAgZm9yIGxvbmcgZG91YmxlLgoKMTAvMDgvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdGhlIFN3aWdWYWx1ZVdyYXBwZXIgZm9yIG9wYXF1ZSB0eXBlcywgbm93IGl0IGlzIAoJICAgICAgYXBwbGllZCBmb3Igb3BhcXVlIHRlbXBsYXRlcyBhbmQgY2xhc3NlcywgZm9yIHdoaWNoIHdlCgkgICAgICBkb24ndCBrbm93IGlmIHRoZXJlIGlzIG9yIG5vdCBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGllCgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKGludCk7CiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgIFN0aWxsLCBpZiB5b3Uga25vdyB0aGF0IHlvdSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGFuZCBmb3Igc29tZSB2ZXJ5IHZlcnkgcGFydGljdWxhciByZWFzb24KICAgICAgICAgICAgICB5b3Ugd2FudCB0byBhdm9pZCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciwgYW5kIHlvdSBkb24ndAogICAgICAgICAgICAgIHdhbnQgb3IgY2FuJ3QgZXhwb3NlIHRoZSBjbGFzcyB0byBzd2lnLCBub3cgeW91IGNhbgogICAgICAgICAgICAgIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm92YWx1ZXdyYXBwZXIiKSBBOyAgICAKICAgICAgICAgICAgICAgICBjbGFzcyBBOwogICAgICAgICAgICAgICAKICAgICAgICAgICAgICBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgaWYgdGhlIGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYnV0IHlvdSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgd3JhcHBlciwgeW91CiAgICAgICAgICAgICAgY2FuIHNheQoKICAgICAgICAgICAgICAgICAlZmVhdHVyZSgidmFsdWV3cmFwcGVyIikgQTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQSgpOwoJCSAgIC4uLi4KICAgICAgICAgICAgICAgICB9OyAgIAogICAgICAKCSAgICAtIEZpeCBmb3IgY2hhciA+IDEyOCwgaWUKCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHRpbGRlX2EgPSAnXDM0MSc7CgogICAgICAgICAgICAtIEFkZCBwYXRjaCAxMDQxODU4IGZvciAkbGV4dHlwZSwgd2hpY2ggY2FycmllcyB0aGUgCiAgICAgICAgICAgICAgbGl0ZXJhbCB0eXBlIG9mIGEgc3ltYm9sLiBTZWUgbGV4dHlwZS5pIGluIHRoZQogICAgICAgICAgICAgIHRlc3Qtc3VpdGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAoKMTAvMDcvMjAwNDogd3NmdWx0b24KCSAgICB7UnVieSwgSmF2YV0gRml4IGRpcmVjdG9yICsgJ2VtcHR5JyB0aHJvd3MKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICBBKCkgdGhyb3coKTsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgICBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCgoxMC8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW1RDTF0KICAgICAgICAgICAgLSBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbGxpYW0gQS4gSG9mZm1hbiBwcm9wYWdhdGluZyBjbGllbnRkYXRhCiAgICAgICAgICAgIGJldHdlZW4gbW9kdWxlcy4gIEFkZGVkIGNsaWVudGRhdGFfcHJvcC5tdWx0aWNwcHRlc3QgdG8gY2hlY2sgZm9yCiAgICAgICAgICAgIHRoaXMgYnVnLiAgVGhlIGZpeCBpbnZvbHZlZCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgICArIFN3aWdUeXBlX2NsaWVudGRhdGFfY29sbGVjdCBkb2VzIG5vdCBuZWVkIHRvIGNoZWNrCiAgICAgICAgICAgICAgICB0eXBlcyBpbiByX3Jlc29sdmVkIGJlY2F1c2Ugd2Ugb25seSB3YW50IHRvIHByb3BhZ2F0ZSBjbGllbnRkYXRhCiAgICAgICAgICAgICAgICB0byB0eXBlZGVmZWQgY2xhc3NlcywgYW5kIHJfbWFuZ2xlZCBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdHlwZWRlZnMuCgogICAgICAgICAgICAgICAgKyBTV0lHX1R5cGVSZWdpc3RlciBub3cgY29waWVzIHRoZSBjbGllbnRkYXRhIGZpZWxkIGNvcnJlY3RseQoKICAgICAgICAgICAgICAgICsgTW92ZSBTV0lHX0d1aWxlX1Byb3BhZ2F0ZUNsaWVudERhdGEgZnVuY3Rpb24gZnJvbSBndWlsZSBtb2R1bGUKICAgICAgICAgICAgICAgIGludG8gY29tbW9uLnN3ZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGNhbGwgaXQgZnJvbSBib3RoIGd1aWxlIGFuZCB0Y2wuCgogICAgICAgICAgICAgICAgKyBBZGQgYmFzZV9uYW1lcyB0byBzd2lnX2NsYXNzIHRvIGRlbGF5IHRoZSBsb29rdXAgb2YgYmFzZXMuICBTV0lHCiAgICAgICAgICAgICAgICBub3cgZXhwb3J0cyB0aGUgYmFzZSBuYW1lcyBhbmQgb25seSB3aGVuIHRoZSBiYXNlIHN3aWdfY2xhc3MgaXMKICAgICAgICAgICAgICAgIG5lZWRlZCBpcyBTV0lHX1R5cGVRdWVyeShuYW1lKS0+Y2xpZW50ZGF0YSBsb29rZWQgdXAuCgogICAgICAgICAgICAtIGNvbnZlcnNpb25fbnNfdGVtcGxhdGUgdGVzdHN1aXRlIHRlc3Qgd2FzIGZhaWxpbmcgYmVjYXVzZQogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3YXMgbm90IGNhbGN1bGF0ZWQKICAgICAgICAgICAgY29ycmVjdGx5IGZvciBzdHJ1Y3RzLiAgRml4ZWQuCgoxMC8wNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGVmYXVsdCBhcmd1bWVudHMgdXNlZCBpbiBkaXJlY3RvcnMgLSBpbiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMgYW5kIGRpcmVjdG9yIGNvbnN0cnVjdG9ycy4KCjEwLzA2LzIwMDQ6IG1tYXR1cwoJICAgIEZpeCB0aGUgX19jcGx1c3BsdXMgbWFjcm8sIGFuZCBidWcgMTA0MTE3MC4KCSAgICBOb3cgaXQgaXMgd29ya2luZyBhcyBzdXBwb3NlZCwgaWUsIHlvdSBjYW4gc2FmZWx5IHVzZQoKCSAgICAgICNpZmRlZiBfX2NwbHVzcGx1cwoJICAgICAgLi4uCgkgICAgCgkgICAgYWxsIG92ZXIgc3dpZywgaW5jbHVkaW5nIGluc2lkZSAlZGVmaW5lcyBhbmQgJXsgJX0gYm9kaWVzLgoKCSAgICAKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGUgb2xkIHRyaWNrIG9mIHVzaW5nCgoJICAgICAgI2lmIF9fY3BsdXNwbHVzCgoJICAgIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gU28sIGlmIHlvdSBoYXZlIHlvdXIgb3duIHR5cGVtYXBzCgkgICAgdXNpbmcgdGhhdCBzeW50YXgsIHlvdSB3aWxsIG5lZWQgdG8gbWlncmF0ZSB0aGVtIHRvIHVzZQoJICAgICIjaWZkZWYgX19jcGx1c3BsdXMiLgoKMTAvMDUvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIC0gUmVvcmdhbml6ZSBob3cgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBhbmQgc2hhcmVkCgkgICAgYmV0d2VlbiBtb2R1bGVzLiAgRm9yIGNoaWNrZW4gYW5kIG16c2NoZW1lLCBJIHJlbW92ZWQKCSAgICB0aGUgYWJpbGl0eSB0byB1c2UgcnVudGltZSBsaWJyYXJpZXMsIHdoaWxlIHBlcmwsIHRjbCwgcHl0aG9uLCBhbmQKCSAgICBydWJ5IGRlZmF1bHQgdG8gdXNpbmcgdGhlIG5ldyBtZXRob2QgYnV0IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQKCSAgICBtZXRob2QgYnkgZGVjbGFyaW5nIFNXSUdfQUxMT1dfUlVOVElNRS4KCgkgICAgLSBsaW5lIDU4MiBpbiBtenNjaGVtZS5jeHggd2FzIGdlbmVyYXRpbmcgYSBzZWdmYXVsdCBvbiAKCSAgICBpbXBvcnRzLm11bHRpY3BwdGVzdCwgc28gSSBmaXhlZCBpdC4KCjEwLzA1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAlZXh0ZW5kIGFuZCBvdmVybG9hZGVkIHN0YXRpYyBtZXRob2RzIHdpdGggZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMuCgoxMC8wNS8yMDA0OiBtbWF0dXMKCSAgICAtIFtweXRob25dIEZpeCBkaXJlY3RvciArIG1ldGhvZCB3aXRoICdlbXB0eScgdGhyb3csIGllCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCBpbnQgZm9vKCkgdGhyb3coKTsKCQkgICAgfTsKCQkgICAgCgkgICAgICBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIGFsc28gZWFzeSB0byBmaXgsIGxvb2sgZm9yCgkgICAgICBHZXRhdHRyKG4sInRocm93IikgaW4gcHl0aG9uLmN4eC4KCgkgICAgLSBGaXggZGlyZWN0b3IgKyBkZXN0cnVjdG9yIHdpdGggJ2VtcHR5JyB0aHJvdwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICB9OwoKCSAgICAtIE5vdyBTV0lHX0ZFQVRVUkVTIHBhcnNlIGFsbCBhbmQgdGhlIHNhbWUgIG9wdGlvbnMgeW91CiAgICAgICAgICAgICAgY2FuIHBhc3MgdG8gc3dpZyBpbiB0aGUgY29tbWFuZCBsaW5lLgoJICAgICAgCgkgICAgLSBOZXcgY29tbWFuZCBsaW5lIGZsYWc6IC1mZWF0dXJlcyA8bGlzdD4sIGFzIGluCgoJICAgICAgICBzd2lnIC1mZWF0dXJlcyBhdXRvZG9jPTMsZGlyZWN0b3IKCgkgICAgICBpZSwgYW55IGdsb2JhbCBmZWF0dXJlIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIHRoZQoJICAgICAgY29tbWFuZCBsaW5lLiBUaGlzIGlzIG1haW5seSBmb3IgdGVzdGluZywgYnV0IHVzZXJzCgkgICAgICBjYW4gYWxzbyB0YWtlIGFkdmFudGFnZSBvZiBpdC4KCjEwLzA0LzIwMDQ6IG1tYXR1cwoJICAgIC0gUHJvcGVybHkgcXVhbGlmeSB0eXBlIGluIHN5bnRheCBhcyAnbG9uZygyKScgb3IgJ0ZvbygpJywKCSAgICAgIHRoaXMgc29sdmUgb2xkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3MsIGFuZCBwcm9iYWJseQoJICAgICAgb3RoZXIgcHJvYmxlbXMgYXJvdW5kLiBIb3dldmVyLCB0aGUgZGVmYXVsdCBhcmcgcHJvYmxlbQoJICAgICAgd2FzIGFsc28gYWxyZWFkeSBzb2x2ZWQgYnkgV2lsbGlhbSAoc2VlIGJlbGxvdykuCgoJICAgIC0gRml4IGZlYXR1cmVfc2V0IGFuZCBmZWF0dXJlX2dldCBtZXRob2RzLiBCZWZvcmUKCSAgICAgIHRoZXkgbG9vayBmcm9tIHBhcnRpY3VsYXIgdG8gZ2VuZXJhbCBhbmQga2VlcCB0aGUgZmlyc3QKCSAgICAgIGZlYXR1cmUgZm91bmQuIFRoaXMgZGlkbid0IHdvcmsgd2VsbCB3aXRoIHRlbXBsYXRlcy4KCSAgICAgIE5vdyB0aGUgbWV0aG9kcyBsb29rIGZyb20gZ2VuZXJhbCB0byBwYXJ0aWN1bGFyLCBhbmQKCSAgICAgIG92ZXJyaWRlIGFueSBmb3VuZCBmZWF0dXJlLgoKICAgICAgICAgICAgLSBQcmV2aW91c2x5IGEgZmVhdHVyZSBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICBvciBkZXN0cnVjdG9ycyB0aGF0IHdlcmVuJ3QgZXhwbGljaXRseSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIEZvbygpICIuLi4iCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSB+Rm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IEZvbygpIGFuZCB+Rm9vKCkKICAgICAgICAgICAgICAgIH07CgoJICAgIC0gRml4IG1pc3NpbmcgZmVhdHVyZXMgZm9yIGRlZmF1bHQgY29uc3QvZGVzdCwgYnkgcmVhbGx5CgkgICAgICAnY3JlYXRpbmcnIHRoZSBtZXRob2RzIGFuZCBhcHBseWluZyB0aGUgZmVhdHVyZXMuCgoJICAgIC0gRml4IHJldHVybl9jb25zdF92YWx1ZS5pIGNhc2UgYnkgYWRkaW5nIFN3aWdWYWx1ZVdyYXBwZXI8Y29uc3QgVD4KCSAgICAgIHNwZWNpYWxpemF0aW9uLgoKCSAgICAtIEZpeCAlZXh0ZW5kICsgb3ZlcmxvYWQsIGluY2x1ZGluZyBvdmVybG9hZGluZyBhY3R1YWwKICAgICAgICAgICAgICBjbGFzcyBtZXRob2RzLiAKCgkgICAgLSBBZGRpbmcgbW9yZSBjYXNlcyBpbiByZWxhdGVkIGZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlLiAgCgoxMC8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSB3YXkgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHdyYXBwZWQuIFByZXZpb3VzbHkgYSBzaW5nbGUKICAgICAgICAgICAgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIGVhY2ggbWV0aG9kIHRoYXQgaGFkIGRlZmF1bHQgYXJndW1lbnRzLiBJZgogICAgICAgICAgICBhIG1ldGhvZCBoYWQgNSBhcmd1bWVudHMsIHNheSwgb2Ygd2hpY2ggMSBoYWQgYSBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHRoZW4gdGhlIGNhbGwgdG8gdGhlIHdyYXBwZWQgbWV0aG9kIHdvdWxkIHBhc3MgNSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0CiAgICAgICAgICAgIHZhbHVlIHdhcyBjb3BpZWQgaW50byB0aGUgd3JhcHBlciBtZXRob2QgYW5kIHVzZWQgaWYgdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBwYXNzZWQganVzdCA0IGFyZ3VtZW50cy4gSG93ZXZlciwgdGhpcyB3YXMgZmxhd2VkIGFzIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50IHNvbWV0aW1lcyBkb2VzIG5vdCBoYXZlIGdsb2JhbCBhY2Nlc3MsIGZvciBleGFtcGxlCiAgICAgICAgICAgIFNXSUcgd291bGQgZ2VuZXJhdGUgY29kZSB0aGF0IGNvdWxkbid0IGNvbXBpbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY2xhc3MgVHJpY2t5IHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsID0gcHJpdmF0ZXZhbHVlKTsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB2YWwgPSBUcmlja3k6OmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZW51bSB7IHByaXZhdGV2YWx1ZSA9IDIwMCB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGJ1Z3MgaW4gcmVzb2x2aW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAocHJvYmFibHkgZml4YWJsZSB0aG91Z2gpOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3MgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEtsYXNzIGNvbnN0cnVjdG9yY2FsbChjb25zdCBLbGFzcyYgayA9IEtsYXNzKCkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBhcHByb2FjaCBhbHNvIGRvZXMgbm90IHdvcmsgZm9yIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkKICAgICAgICAgICAgYXMgdGhlc2UgbGFuZ3VhZ2VzIGRvIG5vdCBhbGxvdyBtZXRob2RzIHRvIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgICAgQWx0aG91Z2ggQyMgaGFzIGEgbWVjaGFuaXNtIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZXkKICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhcmUgbW9yZSBsaWtlIHZhcmFyZ3MuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbXMgYW5kIHdyYXBzIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLiBTbyBTV0lHIHdpbGwgbm93IHRyZWF0CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhcyBpZiBpdCBoYWQgcGFyc2VkOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgIHZvaWQgZm9vKCk7CgogICAgICAgICAgICBUaGUgY29kZSBnZW5lcmF0ZWQgaXMgdGhlbiBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIFNXSUcgaGFkIHBhcnNlZCB0aGUgdHdvCiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgY291bnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYW5kIGNhbGwKICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCwganVzdCBsaWtlIG92ZXJsb2FkZWQgbWV0aG9kcy4gQyMgYW5kIEphdmEgYXJlIG5vdyBhYmxlCiAgICAgICAgICAgIHRvIHByb3Blcmx5IHdyYXAgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGJ5IGdlbmVyYXRpbmcgZXh0cmEgbWV0aG9kcywKICAgICAgICAgICAgYWdhaW4gYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZCwgc28gZm9yOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcz0iaGVsbG8iLCBkb3VibGUgZD0xMC4wLCBpbnQgaT0wKTsKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJveHkgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQsIGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzKTsKICAgICAgICAgICAgICB2b2lkIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBjb21lcyB3aXRoIGEgY291cGxlIG9mIG1pbm9yIGtub2NrIG9uIGVmZmVjdHMuCgogICAgICAgICAgICAxKSBTV0lHIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGZvciBDIChub3QgQysrKSBjb2RlIG5vIGxvbmdlciB3b3Jrcy4KICAgICAgICAgICAgUHJldmlvdXNseSB5b3UgY291bGQgaGF2ZSB0aGlzIGludGVyZmFjZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGUgd3JhcHBlZCBtZXRob2QgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgcGFzcyBubyBhcmd1bWVudHMKICAgICAgICAgICAgd2hlcmV1cG9uIHRoZSBkZWZhdWx0IG9mIDAgd2FzIHVzZWQuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGJlaGF2aW91ciBmb3IgQwogICAgICAgICAgICBjb2RlIGJ5IHVzaW5nIHRoZSAiZGVmYXVsdCIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoZGVmYXVsdCkgaW50IHZhbCAiJDEgPSAwOyI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwoKICAgICAgICAgICAgb3IgeW91IGNvdWxkIG9mIGNvdXJzZSBjb21waWxlIHlvdXIgY29kZSBhcyBDKysgaWYgeW91IHdhbnQgQysrIGZlYXR1cmVzIDopIDoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIEEgY291cGxlIG9mIFNXSUcncyBsaWJyYXJpZXMgdXNlZCB0aGlzIEMgZXh0ZW5zaW9uIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQKICAgICAgICAgICAgdG8gdXNlIHRoZSAiZGVmYXVsdCIgdHlwZW1hcC4gVGhlICJkZWZhdWx0IiB0eXBlbWFwIGlzIHRodXMgdW5jaGFuZ2VkIChhbmQgc3RpbGwKICAgICAgICAgICAgaXMgbm90IGFuZCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IEMjIGFuZCBKYXZhLCBhbmQgaXMgbGlrZWx5IHRvIHJlbWFpbiBzbykuCgoKICAgICAgICAgICAgMikgQWxsIGZlYXR1cmVzICglZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSBldGMpIG5vIGxvbmdlciB3b3JrIGFzIGlmIHRoZSBtZXRob2QKICAgICAgICAgICAgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpcyBqdXN0IG9uZSBtZXRob2QuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CgogICAgICAgICAgICB3b3VsZCBoYXZlIGlnbm9yZWQgdGhlIG1ldGhvZCBjb21wbGV0ZWx5LiBOb3cgaXQgd2lsbCBvbmx5IGlnbm9yZSBmb28oaW50KSBidXQKICAgICAgICAgICAgbm90IHRoZSBleHRyYSBmb28oKSBtZXRob2QuIEluc3RlYWQgdXNlOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbzsKCiAgICAgICAgICAgIHRvIGlnbm9yZSB0aGVtIGFsbC4gb3IKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwoKICAgICAgICAgICAgVGhpcyBvZiBjb3Vyc2UgYWxsb3dzIG9uZSB0byBmaW5lIHR1bmUgdGhlIHdyYXBwaW5nLCBmb3IgZXhhbXBsZSBvbmUgY291bGQgdXNlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2ludCkgZm9vKGludCk7CiAgICAgICAgICAgICAgJXJlbmFtZShmb29kZWZhdWx0cykgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZW0gZnJvbSBhbnkgbGFuZ3VhZ2UgbGlrZSBzbzoKCiAgICAgICAgICAgICAgZm9vaW50KDIwMCkKICAgICAgICAgICAgICBmb29kZWZhdWx0cygpCgogICAgICAgICAgICBvciBmb3IgZXhhbXBsZSBpZ25vcmUgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kLCBzbyB0aGUgZGVmYXVsdHMgY2Fubm90IGJlIHVzZWQ6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzIvMjAwNDogbW1hdHVzCgkgICBbUHl0aG9uXQoJICAgLSBNb3JlIGNsZWFuaW5nIHVwIGFuZCB1bmlmb3JtYXRpb24gb24gdGhlIFB5dGhvbiBMaWIKCgkgICAtIEFkZGVkIFJvYmluJ3MgZG9jc3RyaW5nIHBhdGNoLCBwbHVzIHNvbWUgZml4ZXMsIHBsdXMKCSAgICAgc29tZSBleHRlbnNpb25zLCBzZWUgYXV0b2RvYy5pIGV4YW1wbGUgaW4gdGhlIHRlc3Qtc3VpdGUsCgkgICAgIGFuZCB0cnkgdXNpbmcgJWZlYXR1cmUoImF1dG9kb2MiLCJleHRlbmRlZCIpLgoJICAgIAoJICAgICBUaGlzIHBhdGNoIGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciB0aGUKCSAgICAgZG9jdW1lbnRhdGlvbiBwcm9ibGVtLCBqdXN0IGVub3VnaCB0byBpbmZvcm0gcHl0aG9uIGFib3V0CgkgICAgIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCgkgICAgIFRoZSBleHBlY3RlZCBzd2lnIGRvY3VtZW50YXRpb24gc3VwcG9ydCBpcyBmYXIgZmFyIGF3YXkgeWV0LgoJICAgICAKCjEwLzEvMjAwNDogbW1hdHVzCgkgICAtIEZpeCB0aGUgJWNhbGxiYWNrIGZlYXR1cmUgKG9ubHkgdXNlZCBpbiBydWJ5IGFuZCBweXRob24gZXhhbXBsZXMsCgkgICAgIGJ5IG5vdywgYnV0IGl0IHNob3VsZCBiZSBnZW5lcmljKSwgbm93IG1lbWJlciBjYWxsYmFja3MKCSAgICAgYXJlIHdvcmtpbmcgYWdhaW4KCSAgICAgCgkgICAtIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbnMgcG9pbnRlcnMgbGlrZQoKCQkgc3RkOjpvc3RyZWFtJiBzdGQ6OmVuZGwoc3RkOjpvc3RyZWFtJik7CgoJICAgICBpZSwgdGhlIG9uZXMgdGhhdCByZXR1cm4gcmVmZXJlbmNlcyBvciBlbnVtcy4KCSAKCSAgIFtQeXRob25dIEFkZCB0aGUgJXB5dGhvbmNhbGxiYWNrIGRpcmVjdGl2ZSwgd2hpY2ggaXMgCgkgICBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mICVjYWxsYmFjaywgaWUsCgoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgZm9vOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFyOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFybTsKCgkgICAgIGludCBmb28oaW50IGEpIHsKCSAgICAgICAgIHJldHVybiBhOwoJICAgICB9CiAgCgkgICAgIHN0cnVjdCBBIAoJICAgICB7CgkgICAgICAgc3RhdGljIGludCBiYXIoaW50IGEpOwoJICAgICAgIGludCBiYXJtKGludCBhKTsKCgkgICAgIH07CgogICAgICAgICAgICAgaW50IGZvb2JhcihpbnQgYSwgaW50ICgqcGYpKGludCBhKSk7CgoJICAgaW4gcHl0aG9uIHlvdSBjYW4gdXNlCgogICAgICAgICAgICAgZm9vKDIpCgkgICAgIGZvb2JhcigyLGZvbykKICAgICAgICAgICAgIEEuYmFyKDIpCgkgICAgIGZvb2JhcigyLEEuYmFyKQogICAgICAgICAgCiAgICAgICAgICAgaWUsIG5vIGFkZGl0aW9uYWwgcG9pbnRlciBlbGVtZW50cyBhcmUgY3JlYXRlZCwgYW5kCgkgICB0aGUgb3JpZ2luYWwgJ2ZvbycgYW5kICdBLmJhcicgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycy4KCgkgICBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgZnVjbnRpb24gaG93ZXZlciwgc3RpbGwgeW91IG5lZWQKCSAgIHRvIHVzZSB0aGUgc3BlY2lhbCB2YXJpYWJsZSBDbGFzczo6PGZuY19uYW1lPl9jYl9wdHIsIGllOgoKIAkgICAgIGZvb2Jhcm0oMywgYSwgQS5iYXJtX2NiX3B0cikKCSAgIAoJICAgd2Ugd2lsbCB0cnkgdG8gZml4IHRoaXMgc2l0dWF0aW9uIGFsc28sIGJ1dCBsYXRlci4gIAoKCSAgIFtQeXRob25dIEFkZCBtb3JlIGVsZW1lbnRzIGZyb20gdGhlIFNUTCBsaWJyYXJ5LCBub3cKCSAgIHlvdSBjYW4gdXNlCgoJICAgICBpbXBvcnQgc3RkCgkgICAgIHN0ZC5jb3V0IDw8ICJoZWxsbyAiIDw8IDEyMyA8PCBzdGQuZW5kbAoKCSAgIFtQeXRob25dIEZpeCBpbi9vdXQgcmV0dXJuIG1lY2hhbmlzbSwgbm93IHN3aWcgd2lsbCBiZWhhdmUKCSAgIGFzIDEuMy4yMSBidXQgdXNpbmcgYSBweXRob24gbGlzdCB3aGVuIG5lZWRlZC4gVGhlIHByb2JsZW0KCSAgIGlzIHRoYXQgdGhlIHR5cGVzIHN0ZDo6cGFpcixzdGQ6OnZlY3RvcixldGMsIHVzZSB0dXBsZXMsCgkgICBhbmQgdGhleSBpbnRlcmZlciB3aXRoIHRoZSBwcmV2aW91cyBpbm91dCB0dXBsZSB0eXBlLgoKCSAgIEJ5IHVzaW5nIGxpc3RzIHdlIHNvbHZlIHRoZSBjb25mbGljdHMsIHN3aWcgYWN0cyBhcyBiZWZvcmUsCgkgICBidXQgcmV0dXJucyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhcmUgdXNpbmcKCSAgIHRoZSBPVVQgdHlwZW1hcC4gU2VlIHRoZSBuZXcgaW5vdXQuaSBleGFtcGxlIGluIHRoZQoJICAgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJCSAgIAogICAgICAgICAgIFtQeXRob25dIE11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBiYWQgYXJndW1lbnRzLCBub3cKCSAgIHlvdSBhbHdheXMgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgoKMDkvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSAtCiAgICAgICAgICAgIDEpIFdhcm5pbmcgZW1pdHRlZCB3aGVuIC1pbXBvcnRhbGwgYW5kIC1pbmNsdWRlYWxsIGlzIHVzZWQgdG9nZXRoZXIsCiAgICAgICAgICAgICAgIHdpdGggLWluY2x1ZGVhbGwgdGFraW5nIHByZWNlZGVuY2UuCiAgICAgICAgICAgIDIpIEVuc3VyZSBTV0lHSU1QT1JURUQgaXMgYWx3YXlzIGRlZmluZWQgd2hlbiBhIGZpbGUgaXMgYmVpbmcKICAgICAgICAgICAgICAgaW1wb3J0ZWQgd2l0aCAlaW1wb3J0LiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgU1dJR0lNUE9SVCwKICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBkZWZpbmVkIGluIGFsbCBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlcy4KCjA5LzI2LzIwMDQ6IG1tYXR1cwoKCSAgICAtIGFkZCAlZmVhdHVyZSgiZXhjZXB0aW9uY2xhc3MiKSB0byBpZGVudGlmeSBhIGNsYXNzIHVzZWQKCSAgICAgIGFzIGV4Y2VwdGlvbi4gQmVmb3JlIHN3aWcgaWRlbnRpZmllZCBhbmQgbWFya2VkIGEgY2xhc3MKCSAgICAgIHVzaW5nIHRoZSAiY3BsdXM6ZXhjZXB0aW9uY2xhc3MiIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlCgkgICAgICBjbGFzcyBuZWVkZWQgdG8gYXBwZWFyIG9uIGFuIHRocm93KCkgc3RhdGVtZW50LiAgTm93CgkgICAgICBzd2lnIGtlZXBzIHRyeWluZyB0byBpZGVudGlmeSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMsIGFzCgkgICAgICBiZWZvcmUsIGJ1dCBpdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtYXJrIGEgY2xhc3MgYnkKCSAgICAgIHVzaW5nIHRoZSAlZmVhdHVyZSBleHBsaWNpdGx5LiAobW9zdGx5IHJlbGV2YW50IGZvcgoJICAgICAgcHl0aG9uIGFuZCBjaGlja2VuKQoKCSAgICBbUHl0aG9uXQoKCSAgICAtIGZpeCAtbW9kZXJuIG9wdGlvbiArIGV4Y2VwdGlvbnMsIHdoaWNoIG1peCBvbGQgY2xhc3MKCSAgICAgIHN0eWxlIHdpdGggdGhlIG5ldyBvbmUuIFNvLCB3ZSBhbHdheXMgbmVlZCB0byBlbWl0CgkgICAgICB0aGUgIm5vbm1vZGVybiIgcHl0aG9uIGNvZGUuCgoJICAgIC0gYWRkIHRoZSAicHl0aG9uOm5vbmR5bmFtaWMiIGZlYXR1cmUgYW5kIGl0cyBoYW5kbGVyCgoJICAgICAgbm93IGlmIHlvdSBoYXZlCgkgICAgICAKCSAgICAgICVweXRob25ub25keW5hbWljKDEpIEE7CgkgICAgICAKCSAgICAgIHN0cnVjdCBBIHsKCSAgICAgICBpbnQgYTsKCSAgICAgICBpbnQgYjsKCSAgICAgIH07CgoJICAgICAgdGhlbiwgaW4gdGhlIHB5dGhvbiBzaWRlCgkgICAgICAKCSAgICAgIGFhID0gQSgpCgkgICAgICAKCSAgICAgIGFhLmEgPSAxICMgb2sKCSAgICAgIGFhLmIgPSAyICMgb2sKCSAgICAgIGFhLmMgPSAzICMgZXJyb3IsIHRoZSBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LgoKCSAgICAKCSAgICBTaW5jZSB0aGlzIGlzIGEgZmVhdHVyZSwgeW91IGNhbiB1c2UKCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYygxKTsKCiAgICAgICAgICAgIG9yIAoKCSAgICAgICVweXRob25keW5hbWljKDApOyBbIE5vdGU6ICVweXRob25keW5hbWljIHNpbmNlIGRlcHJlY2F0ZWQgXQogICAKCSAgICB0byBmb3JjZSBhbGwgdGhlIHdyYXBwZWQgY2xhc3NlcyB0byBiZSAibm9uZHluYW1pYyIgb25lcy4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHJlZ3VsYXIgcHl0aG9uLCBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZAoJICAgIGNsYXNzZXMgYXJlIGR5bmFtaWNzLiBTbywgY2FyZWZ1bCB3aXRoIHlvdXIgc3BlbGxpbmcuCgowOS8xNC8yMDA0OiBtbWF0dXMgCgkgICAgLSBTdXBwb3J0IHRoZSAtSS0gb3B0aW9uLgoKCSAgICAtIERpZmZlcmVudGlhdGUgYmV0d2VlbiAlaW5jbHVkZSA8ZmlsZT4gYW5kICVpbmNsdWRlICJmaWxlIi4KCSAgICAgIFRoaXMgZml4IHNldmVyYWwgY29ybmVyIGNhc2VzLgoKCSAgICAKCSAgICBbUHl0aG9uXSBTZXZlcmFsIHBhdGNoZXM6CgoJICAgIC0gTm9ybWFsaXplIHRoZSBMaWIgZmlsZSBuYW1lczogCgkJKi5zd2cgaW50ZXJuYWwgZmlsZXMsIAoJCSouaSAgIHVzZXIgZmlsZXMuCgoJICAgIC0gRml4IENoYXJbQU5ZXSB0eXBlbWFwcywgc28gdGhleSBhbHNvIGRlbGV0ZSBhbnkgZXh0cmEgJ1wwJyBjaGFycywKCSAgICAgIG5vdyB0aGV5IGJlaGF2ZSBhcyBiZWZvcmUgKDEuMy4yMSkuIFN0aWxsLCB5b3UgY2FuIHVzZQoJICAgICAgdGhlIFNXSUdfUFJFU0VSVkVfQ0FSUkFZX1NJWkUgbWFjcm8gaWYgeW91IG5lZWQgdG8KCSAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzaXplIChzZWUgcHlzdHJiYXNlLnN3ZykuCgoJICAgIC0gQWRkIHRoZSBDaGFyIEZJWFNJWkVbQU5ZXSB0eXBlbWFwcywgdG8gcHJlc2VydmUgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgQyBhcnJheSBzaXplcyAoc2VlIGFib3ZlKS4gVGhvdWdoLCB5b3UgY2FuJ3QKICAgICAgICAgICAgICB1c2UgdGhlbSB5ZXQgc2luY2UgJWFwcGx5IGFuZCBhcnJheXMgYXJlIG5vdCB3b3JraW5nCiAgICAgICAgICAgICAgdG9nZXRoZXIuCgogICAgICAgICAgICAtIEFkZCBweWZyYWdtZW50cy5zd2csIG5vdyB0aGUgdXNlciBjYW4gYWRkIGZyYWdtZW50cwoJICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25lcy4KCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2Ugd2hpY2ggZml4ZXMgc3B1cmlvdXMgcHJlcHJvY2Vzc29yIGJ1ZyB3aGljaAogICAgICAgICAgICBzaG93cyBvbiBTb2xhcmlzIGFuZCBnY2MsIGVnOgogICAgICAgICAgICAgICAgV2FybmluZygyMDIpOiBDb3VsZCBub3QgZXZhbHVhdGUgJyFkZWZpbmVkKFNXSUdKQVZBKSAmJgogICAgICAgICAgICAgICAgIShkZWZpbmVkKFNXSUdDU0hBUlApJwogICAgICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIHdoZXJlICcjaWYgImEiID09ICJiIiA9PSAxJyB3b3VsZG4ndCBoYXZlIHdvcmtlZCAKCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdC1zdWl0ZS4gUGF0Y2ggZnJvbQogICAgICAgICAgICBCaWxsIENsYXJrZS4KCjA5LzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBtaXNzaW5nIHJ1bnRpbWUuZHNwIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcyBmb3IgdGhlCiAgICAgICAgICAgIGltcG9ydCBleGFtcGxlcyB0byB3b3JrLgoKClZlcnNpb24gMS4zLjIyIChTZXB0ZW1iZXIgNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHN3aWcubTQgbWFjcm8gZm9yIHVzZSB3aXRoIHRoZSBBdXRvY29uZi9BdXRvbWFrZS9MaWJ0b29sIGhhcwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBhbmQgYmV0dGVyCiAgICAgICAgICAgIG1haW50YWluZWQgdmVyc2lvbiBkZXJpdmVkIGZyb20gc3dpZy5tNCBpbiB0aGUgQXV0b2NvbmYgbWFjcm8gYXJjaGl2ZS4KICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcGtnX3N3aWcuaHRtbCBhbmQKICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19weXRob25fZGV2ZWwuaHRtbC4KCjA5LzAxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkIHBhdGNoICMxMDE5NjY5IGZyb20gQ2hyaXN0b3BoIEZsYW1tLiBBZGRzIHN1cHBvcnQKICAgICAgICAgICAgZm9yICVmZWF0dXJlKCJzaGFkb3ciKSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd29ya3MgaW4gUHl0aG9uLiBUaGlzCiAgICAgICAgICAgIGVuYWJsZXMgb25lIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgc2hhZG93L3Byb3h5IG1ldGhvZHMsIGluY2x1ZGluZwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLyogTGV0J3MgbWFrZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIFNxdWFyZSBtb3JlIHZlcmJvc2UgKi8KCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpIFNxdWFyZShkb3VibGUgdykKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3ViIG5ldyB7CiAgICAgICAgICAgICAgICAgIG15ICRwa2cgPSBzaGlmdDsKICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgPSBleGFtcGxlYzo6bmV3X1NxdWFyZShAXyk7CiAgICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiQ29uc3RydWN0ZWQgYW4gQHtbcmVmKCRzZWxmKV19XG4iOwogICAgICAgICAgICAgICAgICBibGVzcyAkc2VsZiwgJHBrZyBpZiBkZWZpbmVkKCRzZWxmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICBjbGFzcyBTcXVhcmUgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIFNxdWFyZShkb3VibGUgdyk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMDgvMzEvMjAwNDogbW1hdHVzIAoJICAgIFtQeXRob25dIEluY29tcGF0aWJpbGl0eSByZXBvcnRlZCBieSBCaWxsIENsYXJrZSAobGxpYkBjb21wdXRlci5vcmcpOgoJICAgIAoJICAgIElmIHlvdSBhcmUgdXNpbmcgU3VuIFN0dWRpbyA4IChhbmQgcG9zc2libHkgZWFybGllcgoJICAgIHZlcnNpb25zKSB0byBjb21waWxlIHRoZSBvdXRwdXQgcHJvZHVjZWQgYnkgc3dpZwoJICAgIDEuMy4yMnJjMSwgYW5kIHlvdSBhcmUgdXNpbmcgQysrIGFuZCBTVEwgdGVtcGxhdGVzIHRoZW4KCSAgICB5b3UgbmVlZCB0byB1c2UgZWl0aGVyICItcnVudGltZSIgb3IgIi1ub3J1bnRpbWUiLiAgSWYgeW91CgkgICAgdXNlIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IGdldAoJICAgIGNvbXBpbGVyIGVycm9ycyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSB3cmFwcGVyIGZpbGU7CgkgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsaWtlIHRoaXM6IFRoZSBuYW1lCgkgICAgU1dJR19QeXRob25fQ29udmVydFB0clsuLi5dIGlzIHVudXNhYmxlIGluIHN0YXRpYwoJICAgIHN3aWdweTo6dHJhaXRzX2FzcHRyWy4uLl0gIElmIHlvdSBnZXQgdGhpcyBlcnJvciBtZXNzYWdlLAoJICAgIHlvdSBuZWVkIHRvIHJlZ2VuZXJhdGUgeW91ciB3cmFwcGVyIGZpbGUgdXNpbmcgJ3N3aWcKCSAgICAtcnVudGltZScgb3IgJ3N3aWcgLW5vcnVudGltZScuCgoJICAgIFlvdSBzaG91bGRuJ3QgZ2V0IHRoaXMgcHJvYmxlbSB3aXRoIFN1biBTdHVkaW8gOS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJICAgIAowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCAjOTMyMzMzIGZyb20gSWtlZ2FtaSBUc3V0b211LiBGaXhlcyBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICBhbmQgdW5zaWduZWQgbG9uZyBsb25nICpPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzg1NzM0NCBmcm9tIEFydCBZZXJrZXMuIFdvcmthcm91bmQgZm9yIGF1dG9jb25mIGJ1ZyB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGFydCBvZiBwYXRjaCAjOTgyNzUzIGFwcGxpZWQuIFRoaXMgaW1wbGVtZW50cyBhICVwZXJsY29kZSBkaXJlY3RpdmUuCiAgICAgICAgICAgIEl0IGFsbG93cyBvbmUgdG8gYWRkIFBlcmwgY29kZSB0byB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiBXb3JrcyB0aGUgc2FtZSAKICAgICAgICAgICAgYXMgJXB5dGhvbmNvZGUuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyB2aXJ0dWFsIG1ldGhvZHMgd2l0aCBleGNlcHRpb24KICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCB3ZXJlIG5vdCBzaW1wbGUgdHlwZXMuIFByZXZpb3VzbHkgY29kZSB3YXMgZ2VuZXJhdGVkIHRoYXQKICAgICAgICAgICAgZGlkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlIHdoZW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdhcyBhIHBvaW50ZXIuCgowOC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXAgZml4IGZvciBtZXRob2RzIHRoYXQgcmV0dXJuIGNoYXIgKi4gVGhlIENMUiB3b3VsZCBpbmNvcnJlY3RseQogICAgICAgICAgICBkZWxldGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNoYXIgKi4gQWxzbyBhcHBsaWVkIHRoZSBzYW1lIGNvcnJlY3Rpb24gdG8KICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMuCgowOC8yNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgLWZtaWNyb3NvZnQgZXJyb3Ivd2FybmluZyBtZXNzYWdlIGRpc3BsYXk6IAogICAgICAgICAgICAtIEVuZCBvZiBmaWxlIChFT0YpIHdhcm5pbmcgbWVzc2FnZXMgbm90IGRpc3BsYXlpbmcgaW4gY29ycmVjdCBmb3JtYXQKICAgICAgICAgICAgLSBTb21lIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYSBmaWxlIHBhdGggd2VyZSBkaXNwbGF5aW5nIGEgZG91YmxlIGJhY2tzbGFzaAogICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYmFja3NsYXNoCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICMxMDExNjA0IHN1Ym1pdHRlZCBieSBDaGFybGVzIFNjaHdpZXRlcnMuIEZpeCBmb3IgNjQgYml0IHRjbAogICAgICAgICAgICBpbnRlcnByZXRlcnMuCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGJ1ZyAjODc1NTgzIC0gZW51bSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBwcmV2aW91c2x5IGdhdmUgYSBzeW50YXggZXJyb3IuCgowOC8yMy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSB0eXBlbWFwcyAiZmZpdHlwZSIgYW5kICJsaXNwdHlwZSIgdG8gZGV0ZXJtaW5lIHRoZSBGRkkgdHlwZQoJICAgIHNwZWNpZmllcnMgZnJvbSB0aGUgQyB0eXBlLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGluc3RhbmNlLCB0byBjb250cm9sCgkgICAgd2hldGhlciBhIEMgImNoYXIiIGFyZ3VtZW50IHRha2VzIGEgTGlzcCBjaGFyYWN0ZXIgb3IgYSBMaXNwIGludGVnZXIgdmFsdWUuCgkgICAgVGhlIGRlZmF1bHQgKHRha2luZyBMaXNwIGNoYXJhY3RlcnMpIGlzIGRvbmUgYnkgdGhlc2UgYnVpbHQtaW4gdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJjaGFyYWN0ZXIiOwoJICAgIElmIGNoYXIgbWVhbnMgYW4gaW50ZWdlciBpbnN0ZWFkLCB1c2UgdGhlc2UgdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJpbnRlZ2VyIjsKCjA4LzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFzIGRpc2N1c3NlZCBpbiBidWcgIzc3MjQ1MywgdGhlIFNXSUcgbGlicmFyeSBkaXJlY3RvcnkgaXMgbm93IGluc3RhbGxlZAogICAgICAgICAgICBpbnRvIGEgZGlmZmVyZW50IGRlZmF1bHQgZGlyZWN0b3J5LiBUaGUgbGlicmFyeSB1c2VkIHRvIGJlIGluc3RhbGxlZCB0bwogICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9zd2lnMS4zLiBJdCBpcyBub3cgaW4gdGhlIG1vcmUgdXN1YWwgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50CiAgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgSSBoYXZlIGFkZGl0aW9uYWxseSB1c2VkIGEgdmVyc2lvbiBzcGVjaWZpYyBzdWJkaXJlY3RvcnkgYXMKICAgICAgICAgICAgdGhlIGxpYnJhcnkgd2lsbCByYXJlbHkgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcuIFRoaXMgcmVsZWFzZQogICAgICAgICAgICB3aWxsIHRodXMgdXNlIC91c3IvbG9jYWwvc2hhcmUvc3dpZy8xLjMuMjIgYnkgZGVmYXVsdCwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHRhaWxvcmVkIGFzIGJlZm9yZSB1c2luZyAnLi9jb25maWd1cmUgLS1zd2lnbGliZGlyJy4KCjA4LzE3LzIwMDQ6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIEFkZCBzdXBwb3J0IHRvIGNyZWF0ZSBuYXRpdmUgTXpTY2hlbWUgc3RydWN0dXJlcyBmcm9tIEMgc3RydWN0dXJlcy4KCSAgICBUbyBjb252ZXJ0IGEgQyBzdHJ1Y3R1cmUgdG8gYW4gTXpTY2hlbWUgc3RydWN0dXJlLCB1c2UgdGhlIG5ldyBydW50aW1lIG1hY3JvCgkgICAgU1dJR19OZXdTdHJ1Y3RGcm9tUHRyIGluIGEgdHlwZW1hcC4gIFBhdGNoIGZyb20gRG1pdHJpeSBaYXZpbi4gCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODM3NzE1IGZyb20gQmVuIFJlc2VyIHRvIGNvcnJlY3RseSBkZXRlY3QgUHl0aG9uIGxpYiBkaXJlY3RvcnkKICAgICAgICAgICAgb24gNjQgYml0IHN5c3RlbXMuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIEphdmFdIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIG9mIGVhcmx5IHJldHVybgogICAgICAgICAgICBmcm9tIHdyYXBwZXIgbWV0aG9kcyB1c2luZyBjb25zdCBzdGQ6OnN0cmluZyAmIHBhcmFtZXRlcnMuIE1vZGlmaWVkCiAgICAgICAgICAgIE1hcmsgVHJhdWR0IHBhdGNoICM5NTE1NjUuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgIzk0Mzc4MyB3aXRoIHBhdGNoIGZpeGVzIHBocCBjaGFyICogb3V0IHR5cGVtYXAgTlVMTCB2YWx1ZXMuCgowOC8wMy8yMDA0OiBBaG1vbiBEYW5jeSAgPGRhbmN5QGRhbmN5PgoKICAgICAgICAgICAgW2FsbGVncm9jbF0gQWRkaXRpb25hbCBjYXNlIG1vZGUgZml4ZXMuICBBbHNvLCBtYWtlIHN1cmUKCSAgICBmb3JlaWduIHR5cGVzIGFyZSBleHBvcnRlZC4KCjA3LzI0LzIwMDQ6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIFNXSUcgbW9kdWxlcyBub3cgZXhjaGFuZ2UgdGhlaXIgcG9pbnRlciB0eXBlCgkgICAgaW5mb3JtYXRpb24gdmlhIHRoZSBHdWlsZSBpbnRlcnByZXRlci4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYnVpbGQgYQoJICAgIHJ1bnRpbWUgbGlicmFyeSBvciB0byB1c2UgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgZXRjLgoJICAgIAoJICAgIFRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlIGNoYW5nZSBvZiAwNS8xNy8yMDA0IGlzCgkgICAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgYnVpbHQuICBJZiB5b3UgbmVlZCBpdCwgcnVuIFNXSUcgb24gdGhlIGludGVyZmFjZSBmaWxlCgkgICAgc3dpZ3J1bi5pLiAKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQnVnICM5MTc2MDEgTWFwcGluZyBDKysgYm9vbCBmaXggZnJvbSBNYXJrIFRyYXVkdAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUlBNIGZpeGVzIGZvciBsYXRlc3QgQ1ZTIHZlcnNpb24gaW5jbHVkaW5nIHJlbW92YWwgb2YgcnVudGltZQogICAgICAgICAgICBsaWJyYXJ5LgoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzkwODk1NSBmcm9tIFJvYmVydCBIIERlIFZyaWVzLgogICAgICAgICAgICBSUE0gZmlsZSBnZW5lcmF0aW9uIGZpeCBmb3IgRmVkb3JlIENvcmUgMSBhbmQgUmVkaGF0IEFTMi4xLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzg2NDY4OSBmcm9tIFJvYmluIER1bm46CgogICAgICAgICAgICBUaGlzIHBhdGNoIGNvcnJlY3RzIHR3byBwcm9ibGVtcyBpbiB0aGUgWE1MIG91dHB1dCBvZiBTV0lHOgogICAgICAgICAgICAgCiAgICAgICAgICAgICAgMS4gVGhlcmUgd2VyZSBvZnRlbiBleHRyYSAnLz5cbicgaW4gdGhlIG91dHB1dC4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAyLiB2YWx1ZSBhdHRyaWJ1dGVzIHdlcmUgb3V0cHV0IHdpdGggJ1xuJyBpbiB0aGVtIGJ1dAogICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbm90IHRlY2huaWNhbGx5IGxlZ2FsIG1vc3QgKGFsbD8pIFhNTAogICAgICAgICAgICAgIHBhcnNlcnMgd2lsbCBzdHJpcCB0aGVtIG91dC4gUmVwbGFjaW5nIHRoZSAnXG4nIHdpdGgKICAgICAgICAgICAgICB0aGUgJyYjMTA7JyBlbnRpdHkgcmVmZXJlbmNlIHNvbHZlcyB0aGlzIGFzIHRoYXQgaXMKICAgICAgICAgICAgICBsZWdhbCBhbmQgWE1MIHBhcnNlcnMgd2lsbCBjb252ZXJ0IGl0IHRvIGEgJ1xuJyB3aGVuCiAgICAgICAgICAgICAgcmVhZGluZyB0aGUgdmFsdWVzIGJhY2sgaW4uCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgYSBuZXcgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAgICAgICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlIHBhcnNlIHRyZWUgdG8gYmUgd3JpdHRlbiBvdXQgaW4gWE1MCiAgICAgICAgICAgICAgKmFmdGVyKiBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZSBoYXMgYmVlbiBydW4sIGluCiAgICAgICAgICAgICAgb3JkZXIgdG8gYmUgYWJsZSB0byBnZXQgZXh0cmEgaW5mbyB0aGF0IHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgIG1vZHVsZSBwdXRzIGluIHRoZSB0cmVlLiBJbiB0aGlzIHdheSB0aGUgWE1MIGlzIGEKICAgICAgICAgICAgICBwb3N0LXByb2Nlc3NlZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIHJhdGhlciB0aGFuIGEKICAgICAgICAgICAgICBwcmUtcHJvY2Vzc2VkIHZlcnNpb24uIAogCiAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtZHVtcF94bWwgb3IgLXhtbG91dCA8ZmlsZT4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB0byBmaXggdHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcwogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEhUTUwgZG9jdW1lbnRhdGlvbiAobWFrZWNoYXAucHkpIGZpbGUgZ2VuZXJhdG9yIG1pc3NpbmcgZW5kIG9mIGxpbmUKICAgICAgICAgICAgcGF0Y2ggIzkwODk1MSBmcm9tIFJvYmVydCBkZSBWcmllcy4KCjA3LzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZXByZWNhdGVkIHJ1bnRpbWUgbGlicmFyeSBidWlsZCBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGFsc28gcmVtb3ZlcwogICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBvbiBMaWJ0b29sLiBMaWJ0b29sIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBidWlsZCBTV0lHLgogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCAtbGRmbGFncyBTV0lHIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYWxzbyBiZWVuIHJlbW92ZWQuCgogICAgICAgICAgICBUaGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdGVzdGNhc2VzIHRoYXQgdXNlZCB0aGUgcnVudGltZSBsaWJyYXJ5IGhhdmUKICAgICAgICAgICAgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgcmVwbGFjZW1lbnQgYXBwcm9hY2ggdG8gdXNpbmcgU1dJRyBhY3Jvc3MgCiAgICAgICAgICAgIG11bHRpcGxlIG1vZHVsZXMsIHRoYXQgaXMgdGhleSB1c2UgdGhlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMsIHNlZSBNb2R1bGVzLmh0bWwuIEVmZmVjdGl2ZWx5IHRoZXkgYnVpbGQgdGhlaXIgb3duIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyaWVzIHVzaW5nIC1ydW50aW1lLiBUaGUgZXhhbXBsZXMgYXJlIGltcG9ydCBhbmQgaW1wb3J0X3RlbXBsYXRlLgogICAgICAgICAgICBUaGUgdGVzdCBjYXNlcyBhcmUgaW4gdGhlIGltcG9ydHMgYW5kIHRlbXBsYXRlX3R5cGVkZWZfaW1wb3J0IGRpcmVjdG9yaWVzLgoKICAgICAgICAgICAgQW55b25lIHdobyB3YW50cyB0aGUgb3JpZ2luYWwgcnVudGltZSBsaWJyYXJpZXMgY2FuIGVpdGhlciBydW4gdGhlIHRlc3Qtc3VpdGUKICAgICAgICAgICAgb3IgYnVpbGQgdGhlIGV4YW1wbGVzIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBvYmplY3QvRExMIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIHdpdGggdGhlIC1ydW50aW1lIGNvbW1hbmRsaW5lIG9wdGlvbi4gRm9yIGV4YW1wbGUgbGliaW1wb3J0c19ydW50aW1lLnNvCiAgICAgICAgICAgIChQeXRob24gY2FsbHMgaXQgbGliX2ltcG9ydHNfcnVudGltZS5zbykgaXMgZ2VuZXJhdGVkIGFmdGVyIHJ1bm5pbmcgdGhlIAogICAgICAgICAgICAnbWFrZSBpbXBvcnRzLm11bHRpY3BwdGVzdCcgdGVzdGNhc2UgaW4gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvPGxhbmc+CiAgICAgICAgICAgIGRpcmVjdG9yeS4gT3IgdXNlIGxpYnJ1bnRpbWUuc28gLyBydW50aW1lLmRsbCBhZnRlciBidWlsZGluZyB0aGUgaW1wb3J0CiAgICAgICAgICAgIGV4YW1wbGVzIGluIEV4YW1wbGVzLzxsYW5nPi9pbXBvcnQuCgowNy8wNy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIENvbnZlcnQgY2hhcmFjdGVyIGFuZCBzdHJpbmcgbGl0ZXJhbHMgaW4gY29uc3RhbnRzIHRvIAoJICAgIENMIHN5bnRheC4gIEZpeCBGRjpERUYtRk9SRUlHTi1DQUxMIGZvciBtaXhlZC1jYXNlIEMgZnVuY3Rpb25zLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyBmZWF0dXJlIGZvciBKYXZhIGV4Y2VwdGlvbnMgd2l0aCBmb3JtYXQgJWphdmFleGNlcHRpb24oZXhjZXB0aW9uY2xhc3NlcykuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBhIHNsaWdodCBlbmhhbmNlbWVudCB0byAlZXhjZXB0aW9uIGFuZCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSAKICAgICAgICAgICAgYWRkaXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgaW50byBhIHRocm93cyBjbGF1c2UuCiAgICAgICAgICAgIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGFzc29jaWF0ZWQgcHJveHkgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4gVGhlICdleGNlcHRpb25jbGFzc2VzJwogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIGxpa2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGluIHRoZSAndGhyb3dzJyBhdHRyaWJ1dGUgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXBzLiBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvcnJlY3RseSBoYW5kbGluZyBjaGVja2VkIGV4Y2VwdGlvbnMKICAgICAgICAgICAgdGhyb3duIGZyb20gSk5JIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWV4Y2VwdGlvbigiamF2YS5sYW5nLkV4Y2VwdGlvbiIpIHRocm93RXhjZXB0aW9uICV7CiAgICAgICAgICAgICAgICAuLi4gY29udmVydCBhIHN0ZDo6bG9naWNfZXJyb3IgaW50byBhIGphdmEubGFuZy5FeGNlcHRpb24gdXNpbmcgSk5JIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICAgICAgICAgICAgICB2b2lkIHRocm93RXhjZXB0aW9uKCkgewogICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiTG9naWMgZXJyb3IhIik7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBhIG1ldGhvZCB3aXRoIGEgdGhyb3dzIGNsYXVzZSBpbiB0aGUgbW9kdWxlIGNsYXNzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7IC4uLiB9CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyAlY3Njb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gVGhpcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgJWphdmFjb25zdHZhbHVlLiBGb3IgQyMsIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgIGlzIHRoZSBvbmx5IHdheSB0aGF0IG9uZSBjYW4gZml4IHdyYXBwaW5nIG9mIEMvQysrIGVudW1zIHdpdGggcHJvcGVyIEMjCiAgICAgICAgICAgIGVudW1zIGlmIHRoZSBlbnVtIGl0ZW0ncyBpbml0aWFsaXNlciBjYW5ub3QgY29tcGlsZSBhcyBDIyBjb2RlLiBUaGlzIGlzCiAgICAgICAgICAgIGJlY2F1c2UgSmF2YSBlbnVtcyBjYW4gdXNlIGEgY2FsbCBpbnRvIEMgY29kZSB0byBpbml0aWFsaXNlIHRoZSBlbnVtIGl0ZW0sCiAgICAgICAgICAgIHdoZXJlYXMgaW4gQyMsIHRoZSBlbnVtIHZhbHVlIG11c3QgYmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuIFRoYXQgaXMsCiAgICAgICAgICAgIHVzaW5nICVjc2NvbnN0KDApIGNhbm5vdCBiZSB1c2VkIGluIEMjIHRvIGluaXRpYWxpc2UgdGhlIEMjIGVudW0gaXRlbSB2aWEKICAgICAgICAgICAgYSBQSU5WT0tFIGNhbGwuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3ICVqYXZhY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFNvbWV0aW1lcyB0aGUgdXNlIG9mICVqYXZhY29uc3QoMSkgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCB3b24ndCBjb21waWxlCiAgICAgICAgICAgIHVuZGVyIEphdmEuIElmIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGlzIHJlcXVpcmVkLCAlamF2YWNvbnN0KDApIGlzIG5vdCBhbgogICAgICAgICAgICBvcHRpb24uIFRoZSAlamF2YWNvbnN0dmFsdWUgZGlyZWN0aXZlIGFjaGlldmVzIHRoaXMgZ29hbCBhbmQgdGhlIHZhbHVlIHNwZWNpZmllZAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQgYXMgSmF2YSBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSk7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwMDApIEJJRzsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoIm5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihcIjIwMDBcIikiKSBMQVJHRTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTApIGJhcjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgY29uc3QgaW50IGJhciA9IDEwOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgI2RlZmluZSBCSUcgMTAwMExMCiAgICAgICAgICAgICAgICAjZGVmaW5lIExBUkdFIDIwMDBVTEwKICAgICAgICAgICAgICAgIGVudW0gRm9vIHsgQkFSID0gOjpiYXIgfTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgR2VuZXJhdGVzOgoKICAgICAgICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIGV4YW1wbGVDb25zdGFudHMgewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEwMDA7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIExBUkdFID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIyMDAwIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGb28gQkFSID0gbmV3IEZvbygiQkFSIiwgMTApOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUHJldmlvdXNseSwgbm9uZSBvZiBCSUcsIExBUkdFIG9yIEJBUiB3b3VsZCBoYXZlIHByb2R1Y2VkIGNvbXBpbGVhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgZW5oYW5jZW1lbnRzLiBGZWF0dXJlcyBjYW4gbm93IHRha2UgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGluIGFkZGl0aW9uIHRvIHRoZSBmZWF0dXJlIG5hbWUgYW5kIGZlYXR1cmUgdmFsdWUuIFRoZSBhdHRyaWJ1dGVzIGFyZSBvcHRpb25hbCAKICAgICAgICAgICAgYW5kIGFyZSBtdWNoIHRoZSBzYW1lIGFzIHRoZSB0eXBlbWFwIGF0dHJpYnV0ZXMuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHNwZWNpZmllcyB0d28gb3B0aW9uYWwgYXR0cmlidXRlcywgYXR0cmliMSBhbmQgYXR0cmliMjoKCiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lICJ2YWwiOwogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIHZhbCwgYXR0cmliMT0iYXR0cmlidmFsMSIsIGF0dHJpYjI9ImF0dHJpYnZhbDIiKSBuYW1lOwoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWZlYXR1cmUgaW1wcm92ZW1lbnRzIGZvciB0aGUgc3ludGF4IHRoYXQgdGFrZXMgdGhlIGZlYXR1cmUgdmFsdWUgd2l0aGluIHRoZQogICAgICAgICAgICAlZmVhdHVyZSgpIGJyYWNrZXRzLiBUaGUgdmFsdWUgc3BlY2lmaWVkIGlzIG5vIGxvbmdlciByZXN0cmljdGVkIHRvIGJlaW5nIGp1c3QKICAgICAgICAgICAgYSBzdHJpbmcuIEl0IGNhbiBiZSBhIHN0cmluZyBvciBhIG51bWJlci4gRm9yIGV4YW1wbGUsIHRoaXMgaXMgbm93IGFjY2VwdGFibGUKICAgICAgICAgICAgc3ludGF4OgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsMjAuMCk7CiAgICAgICAgICAgIHdoZXJlYXMgcHJldmlvdXNseSBpdCB3b3VsZCBoYXZlIHRvIGhhdmUgYmVlbjoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLCIyMC4wIik7CiAgICAgICAgICAgIFVzZWZ1bCBmb3IgZmVhdHVyZXMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgYXMgYSBtYWNybywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSAlc29tZWZlYXR1cmUodmFsdWUpICAgICAgJWZlYXR1cmUoInNvbWVmZWF0dXJlIix2YWx1ZSkKICAgICAgICAgICAgVGhlc2Ugd2lsbCBub3cgd29yayBhY2NlcHRpbmcgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbnVtYmVyOgogICAgICAgICAgICAgICVzb21lZmVhdHVyZSgiRnJlZCIpOwogICAgICAgICAgICAgICVzb21lZmVhdHVyZSg0KTsKCjA2LzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbiwgR3VpbGVdCiAgICAgICAgICAgICAtIENyZWF0ZWQgdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvc2NoZW1lcnVubWUgZGlyZWN0b3J5LCB3aGljaCBob2xkcyBhbGwgdGhlCgkgICAgICAgcnVubWUgc2NyaXB0cyBmb3IgZ3VpbGUgYW5kIGNoaWNrZW4gKGFuZCBwb3NzaWJseSBtenNjaGVtZS4uLikuICBUaGUgZ3VpbGUKCSAgICAgICBhbmQgY2hpY2tlbiBfcnVubWUgZmlsZXMgdGhlbiAobG9hZCAiLi4vc2NoZW1lcnVubWUvZm9vLnNjbSIpLgogICAgICAgICAgICAgLSBJbiBjaGlja2VuIG1vZHVsZSwgZml4IGEgZmV3IGJ1Z3MgaW52bG9sdmluZyBkeW5hbWljIGNhc3RzLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggdG8gZml4IHdyYXBwaW5nIG9mIHRlbXBsYXRlZCBtZXRob2RzLiBJU08gY29tcGxpYW50IGNvbXBpbGVycywgbGlrZQogICAgICAgICAgICBDb21lYXUgYW5kIEdDQy0zLjQuMCwgZG9uJ3QgbGlrZSB0aGUgdGVtcGxhdGUgc3BlY2lmaWVyIHRoYXQgU1dJRyB3YXMgZ2VuZXJhdGluZwogICAgICAgICAgICB3aGVuIGNhbGxpbmcgdGhlIG1ldGhvZC4gVGhpcyBmaXggbWF5IGJyZWFrIHNvbWUgbm9uIHN0YW5kYXJkIGNvbXBsaWFudCBjb21waWxlcnMsCiAgICAgICAgICAgIGZvciBleGFtcGxlLCBTdW4gd29ya3Nob3AgY29tcGlsZXJzIHByaW9yIHRvIHZlcnNpb24gNi4yLnAyLiBQYXRjaCBzdWJtaXR0ZWQKICAgICAgICAgICAgYnkgQmlsbCBDbGFya2UuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFVuZG9jdW1lbnRlZCBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZSByZW1vdmVkLgogICAgICAgICAgICBOZXcgc3BlY2lhbCB2YXJpYWJsZSAkbW9kdWxlIGlzIHJlcGxhY2VkIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYXMgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5ICVtb2R1bGUgb3IgLW1vZHVsZSBjb21tYW5kbGluZSBvcHRpb24uICRpbWNsYXNzbmFtZSBjYW4gYmUgY3JlYXRlZCBmcm9tICRtb2R1bGUuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFNhbWUgYXMgZm9yIEphdmEgYmVsb3cuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIG5hbWVkIGRpZmZlcmVudGx5LCBuYW1lbHksCiAgICAgICAgICAgIGNzYm9keSBhbmQgY3Nib2R5X2Rlcml2ZWQuIFRoZSBkZXByZWNhdGVkIHR5cGVtYXBzIGFyZSBjc2dldGNwdHIgYW5kCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFR5cGVtYXAgY2hhbmdlcyBmb3IgdGhlIEphdmEgcHJveHkgLyB0eXBld3JhcHBlciBhbmQgZW51bSBjbGFzc2VzLiBBIG5ldwogICAgICAgICAgICB0eXBlbWFwIGNhbGxlZCBqYXZhYm9keSBjb250YWlucyB0aGUgZXNzZW50aWFsIHN1cHBvcnQgY29kZSBmb3IgZ2VuZXJhdGlvbiBpbnRvIHRoZSBib2R5CiAgICAgICAgICAgIG9mIHRoZXNlIGNsYXNzZXMuIFRoZXJlIGlzIGFsc28gYSBuZXcgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwIHdoaWNoIGlzIHVzZWQgaW5zdGVhZCBmb3IKICAgICAgICAgICAgd3JhcHBlZCBjbGFzc2VzIHRoYXQgaGF2ZSBhIHdyYXBwZWQgYmFzZSBjbGFzcy4gVGhlIGNvZGUgaXMgYmFzaWNhbGx5LCB0aGUgZ2V0Q1B0cigpCiAgICAgICAgICAgIG1ldGhvZCBhbmQgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMuIFRoZXNlIHVzZWQgdG8gYmUgaGFyZCBjb2RlZAogICAgICAgICAgICB3aXRoIG5vIHdheSB0byBtb2RpZnkgdGhlIGNvZGUuIFRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhpcyB0eXBlbWFwIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgICB0aGUgdXNlciB0byB0YWlsb3IgbmVhcmx5IGV2ZXJ5IGFzcGVjdCBvZiB0aGUgY29kZSBnZW5lcmF0aW9uLgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIG5vdyBpcyB0aGUgY29kZSBmb3IgZGlyZWN0b3IgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciBhbmQgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIHR5cGVtYXBzIGFyZSBkZXByZWNhdGVkIGFuZCBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgdGhhdCB0aGVzZSBnZW5lcmF0ZWQgY2FuIGJlIHB1dCBpbiB0aGUgbW9yZSBmbGV4aWJsZQogICAgICAgICAgICBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGNvbnRyaWJ1dGVkIGJ5IFNjb3R0IE1pY2hlbCBtYXkgaGVscCB5b3UgdXBncmFkZSBpZiB5b3UgaGF2ZSB1c2VkCiAgICAgICAgICAgIHRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwOgoKICAgICAgICAgICAgICAgIC8qIFV0aWxpdHkgbWFjcm8gZm9yIG1hbmlwdWxhdGluZyB0aGUgSmF2YSBib2R5IGNvZGUgbWV0aG9kIGF0dHJpYnV0ZXMgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgQ1RPUl9BVFRSSUIsIEdFVENQVFJfQVRUUklCKQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHkpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3dpZ0NNZW1Pd247CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN3aWdDTWVtT3duID0gY01lbW9yeU93bjsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5X2Rlcml2ZWQpIFRZUEVOQU1FICV7CiAgICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzd2lnQ1B0cjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIoJG1vZHVsZUpOSS5TV0lHJGphdmFjbGFzc25hbWVVcGNhc3QoY1B0ciksIGNNZW1vcnlPd24pOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogVGhlIGRlZmF1bHQgaXMgcHJvdGVjdGVkIGdldENQdHIsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhTV0lHVFlQRSwgcHJvdGVjdGVkLCBwcm90ZWN0ZWQpCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0dFVENQVFIoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwcm90ZWN0ZWQsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHB1YmxpYyBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfQk9EWU1FVEhPRFMoVFlQRU5BTUUpCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBwdWJsaWMsIHB1YmxpYykKICAgICAgICAgICAgICAgICVlbmRkZWYKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVGhlIGNvbnRlbnRzIG9mIHRoZSBjbGFzcyBtb2RpZmllciB0eXBlbWFwcyBhbmQgcHJhZ21hcyBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgIFRoZXkgbXVzdCBub3cgaW5jbHVkZSB0aGUgY2xhc3MgdHlwZS4gUHJldmlvdXNseSAnY2xhc3MnIHdhcyBoYXJkIGNvZGVkLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBlbmFibGVzIGZsZXhpYmlsaXR5IGludG8gd2hhdCB0eXBlIG9mIGNsYXNzIGlzIGdlbmVyYXRlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgdGhlIHByb3h5IGNsYXNzIGNvdWxkIGJlIGFuIGludGVyZmFjZSBpbnN0ZWFkIG9mIGEgY2xhc3MuCgogICAgICAgICAgICBGb3IgSmF2YSB0aGlzIGFmZmVjdHMgdGhlIGphdmFjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIEZvciBDIyB0aGlzIGFmZmVjdHMgdGhlIGNzY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbmQgbW9kdWxlY2xhc3Ntb2RpZmllcnMgcHJhZ21hcy4KCiAgICAgICAgICAgIFVubGVzcyB5b3UgaGF2ZSBvdmVycmlkZGVuIHRoZSBkZWZhdWx0IHZlcnNpb25zIG9mIHRoZXNlIHR5cGVtYXBzIG9yIHByYWdtYXMsIHlvdQogICAgICAgICAgICBzaG91bGRuJ3QgYmUgYWZmZWN0ZWQuIEhvd2V2ZXIsIGlmIHlvdSBoYXZlLCB1cGdyYWRpbmcgaXMgZWFzeSwgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIgoKICAgICAgICAgICAgbXVzdCBub3cgYmU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCBjbGFzcyIKCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gUHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBPcmVuIE1pbGxlci4gQWxzbyBpbXByb3ZlcyB0aGUgZ2VuZXJhdGVkIGV4Y2VwdGlvbiBkZWNsYXJhdGlvbnMgaW4gdGhlCiAgICAgICAgICAgIGNhdGNoIGhhbmRsZXIgZm9yIHBvaW50ZXJzIC0gYSBwb2ludGVyIGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZmVyZW5jZSB0bwogICAgICAgICAgICBhIHBvaW50ZXIuIEFkZGVkIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIGZvciBTV0lHVFlQRSAmLCBTV0lHVFlQRSAqIGFuZAogICAgICAgICAgICBTV0lHVFlQRVtBTlldIChKYXZhIGFuZCBDIykuCgowNS8zMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFNvbWUgbWlub3IgdHlwZXNhZmUgZW51bSBpbXByb3ZlbWVudHMsIGluY2x1ZGluZyBzdG9yaW5nIHRoZSBuYW1lIG9mCiAgICAgICAgICAgIHRoZSBlbnVtIGl0ZW0uIFRoZSB0b1NyaW5nKCkgLyBUb1N0cmluZygpIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoaXMgbmFtZS4KCjA1LzMwLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gCgkgICAgIC0gVXBkYXRlIGhvdyBleGFtcGxlcyBhbmQgdGhlIHRlc3Qgc3VpdGUgYXJlIGJ1aWx0LgoJICAgICAtIFN5bWJvbCBuYW1lcyBhcmUgbm8gbG9uZ2VyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlCgkgICAgIC0gQWRkZWQgdW5pb25fcnVubWUuc3MsIHdoaWNoIHdhcyBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gdGhlIGd1aWxlIG1vZHVsZQoKMDUvMjYvMjAwNDogbGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgQ29tbWl0dGVkIG9uIGJlaGFsZiBvZiBNYXJjZWxvICh3aG8gc3RpbGwgaGFzIHByb2JsZW1zIHdpdGggCgkgICAgdGhlIFNvdXJjZUZvcmdlIENWUy4pCgoJICAgIEFkZGVkIFB5dGhvbiB0eXBlbWFwcyBmb3IgRklMRSogd2l0aCAoUHl0aG9uLW9ubHkpIHRlc3QuCgo1LzI0LzIwMDQ6ICBkYW5jeQoKCSogQWxsZWdybyBDTCBtb2R1bGU6ICBOb3cgdXNpbmcgc29tZSBtYWNyb3MgKGRlZmluZWQgaW4KCUxpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZyksIHN3aWctZGVmY29uc3RhbnQgYW5kIHN3aWctZGVmdW4sIGZvcgoJZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBmb3JlaWduIGZ1bmN0aW9ucy4gIFRoaXMgbWFrZXMgdGhlCglnZW5lcmF0ZWQgZmlsZSBhIGJpdCBuZWF0ZXIuICAgIAoKCU5vdyBzdHJpcHMgYSBsYXllciBvZiBwYXJlbnRoZXNpcyBmcm9tIGNvbnN0YW50cy4KCglVc2VzICgqIDp2b2lkKSBpbnN0ZWFkIG9mIDpmb3JlaWduLWFkZHJlc3Mgbm93LgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVW5uYW1lZCBlbnVtIGdsb2JhbCB2YXJpYWJsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgaW4gYWRkaXRpb24KICAgICAgICAgICAgdG8gdGhlIHJlY2VudGx5IGFkZGVkIHN1cHBvcnQgZm9yIHVubmFtZWQgZW51bSBtZW1iZXIgdmFyaWFibGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgZW51bSB7IGVudW0xLCBlbnVtMiB9IE1lbWJlckluc3RhbmNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMywgZW51bTQgfSBHbG9iYWxJbnN0YW5jZTsKCiAgICAgICAgICAgIFRoZSBpbnQgdHlwZW1hcHMgYXJlIHVzZWQgZm9yIHdyYXBwaW5nIHRoZSBnZXQvc2V0IGFjY2Vzc29yIG1ldGhvZHMuCiAgICAgICAgICAgIElmIHRoZSBzaXplb2YgYW4gZW51bSBpcyBub3QgdGhlIHNhbWUgc2l6ZSBhcyBhbiBpbnQgdGhlbiBzZXR0aW5nIHRoZQogICAgICAgICAgICB2YXJpYWJsZSB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcgYXMgdGhlIGNhc3RzIGNhbm5vdCBiZSBlYXNpbHkgYW5kIHBvcnRhYmx5CiAgICAgICAgICAgIGdlbmVyYXRlZC4gSWYgeW91IG5lZWQgdG8gc29sdmUgdGhpcyBoaWdobHkgb2JzY3VyZSBzaXR1YXRpb24sIHdyaXRlCiAgICAgICAgICAgIHRoZSBhc3NpZ25tZW50IHVzaW5nIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEMjIGVudW0gd3JhcHBpbmcgbW9kcy4gU2ltaWxhciB0byB0aGUgSmF2YSBtb2R1bGUsIGVudW1zIGNhbiBiZSB3cmFwcGVkIHVzaW5nCiAgICAgICAgICAgIG9uZSBvZiAzIGFwcHJvYWNoZXM6CgogICAgICAgICAgICAxKSBQcm9wZXIgQyMgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlY3NlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgW05vIGltcGxlbWVudGF0aW9uIGRlZW1lZCBuZWNlc3NhcnkgZm9yIHR5cGUgdW5zYWZlIGVudW1zXS4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHByb3BlciBDIyBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEphdmEgZW51bSBzdXBwb3J0IGFkZGVkLiBUaGVyZSBhcmUgbm93IDQgd2F5cyBpbiB3aGljaCBlbnVtcyBjYW4gYmUgd3JhcHBlZDoKCiAgICAgICAgICAgIDEpIFByb3BlciBKYXZhIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBUeXBlIHVuc2FmZSBlbnVtcyAoY29uc3RhbnQgaW50ZWdlcnMpIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXVuc2FmZS5zd2ciCiAgICAgICAgICAgIDQpIFNpbXBsZSBjb25zdGFudCBpbnRlZ2VycyAob3JpZ2luYWwgYXBwcm9hY2gpIC0gdXNlICVpbmNsdWRlICJlbnVtc2ltcGxlLnN3ZyIKCiAgICAgICAgICAgIFNlZSBlYWNoIG9mIHRoZXNlIGZpbGVzIGZvciBmdXJ0aGVyIGRldGFpbHMuIEVhY2ggb2YgdGhlc2UgZmlsZXMgdXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGFuZCBhIG5ldyBmZWF0dXJlIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGUgZmVhdHVyZSBpczoKCiAgICAgICAgICAgICAgICAlamF2YWVudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwcyB3aWxsIGhhbmRsZSBlbnVtcyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgc3BlY2lmaWVkIGluaXRpYWwKICAgICAgICAgICAgdmFsdWVzLCBmb3IgZXhhbXBsZSB0ZW4gaXMgc3BlY2lmaWVkOgoKICAgICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IHplcm8sIHRlbigxMCkgfTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBhbW91bnQgb2YgZ2VuZXJhdGVkIEphdmEgY29kZSBjYW4gYmUgY3V0IGRvd24sIGJ5IG1vZGlmeWluZyB0aGVzZSB0eXBlbWFwcwogICAgICAgICAgICBpZiBub25lIG9mIHRoZSBlbnVtcyBoYXZlIGluaXRpYWwgdmFsdWVzIChwcm9wZXIgSmF2YSBlbnVtcyBhbmQgdHlwZXNhZmUgZW51bXMgYXBwcm9hY2gpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgdHlwZXNhZmUgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggYnVnIHVzaW5nICVyZW5hbWUgb24gZW51bSBpdGVtcyBhbmQgd2hlbiB1c2luZwogICAgICAgICAgICAlamF2YWNvbnN0KDEpIC8gJWNzY29uc3QoMSkKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdXNlZCB0byBnZW5lcmF0ZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKE9iaikgT2JqZWN0OwogICAgICAgICAgICAgICAgZW51bSBHcmFtbWFyIHsgU3ViamVjdCwgT2JqZWN0IH07CgowNC8yOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIE1pbm9yIGZpeGVzIHdoZW4gdXNpbmcgY29tYmluYXRpb25zIG9mIHRoZSAKICAgICAgICAgICAgamF2YWludGVyZmFjZXMsIGphdmFiYXNlLCBjc2ludGVyZmFjZXMgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCjA1LzE4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKVk0gbGluayBmYWlsdXJlIG9uIHNvbWUgc3lzdGVtcyBmaXhlZCB3aGVuIHVzaW5nIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgQWxzbyBhZGRzIGRlZmF1bHQgdmVjdG9yIGNvbnN0cnVjdG9yIGZvciB1c2UgZnJvbSBKYXZhLgoKMDUvMTcvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoKCSAgICBbR3VpbGVdIE5ldyBydW50aW1lIGZ1bmN0aW9ucyBTV0lHX1BvaW50ZXJBZGRyZXNzLAoJICAgIFNXSUdfUG9pbnRlclR5cGUsIFNXSUdfSXNQb2ludGVyT2ZUeXBlLCBTV0lHX0lzUG9pbnRlci4KCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIHdyYXAgc2V2ZXJhbCBTV0lHIHJ1bnRpbWUgZnVuY3Rpb25zCgkgICAgYW5kIGV4cG9ydCB0aGVtIGludG8gdGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKS4gIFRoZQoJICAgIHJ1bnRpbWUgbW9kdWxlIGlzIG5vdyBidWlsdCB3aXRoICJtb2R1bGUiIGxpbmthZ2UuCgoJICAgIFtHdWlsZV0gR09PUFMgcHJveHkgb2JqZWN0cyBub3cgYWxzbyBwcmludCB0aGUgcG9pbnRlcgoJICAgIGFkZHJlc3Mgb2YgdGhlIEMgb2JqZWN0LgoKMDUvMTQvMjAwNDogbHlsZQogICAgICAgICAgICBBZGRlZCBLb3UncyBwYXRjaCBmb3IgdGhlIFJ1YnkgJWltcG9ydCBkaXJlY3RpdmUgc28gdGhhdCBtb2R1bGVzCiAgICAgICAgICAgIHdpdGggIm5lc3RlZCIgbmFtZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkuIENvbnNpZGVyIGFuIGludGVyZmFjZQogICAgICAgICAgICBmaWxlIGZvby5pIHRoYXQgaGFzIHRoaXMgJW1vZHVsZSBkZWNsYXJhdGlvbiBhdCBpdHMgdG9wOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIm1pc2M6OnRleHQ6OmZvbyIKCiAgICAgICAgICAgIE5vdyBjb25zaWRlciBhbm90aGVyIGludGVyZmFjZSBmaWxlIHNwYW0uaSB0aGF0IGltcG9ydHMgZm9vLmk6CgogICAgICAgICAgICAgICAgJWltcG9ydCBmb28uaQogICAgICAgICAgICAKICAgICAgICAgICAgQmVmb3JlIHRoaXMgcGF0Y2gsIHRoaXMgd291bGQgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29kZSBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgZm9yIHNwYW1fd3JhcC5jOgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2M6OnRleHQ6OmZvbyIpOwoKICAgICAgICAgICAgV2l0aCB0aGlzIHBhdGNoLCBob3dldmVyLCB5b3UnbGwgZ2V0IHRoZSBjb3JyZWN0IHBhdGggbmFtZQogICAgICAgICAgICBmb3IgdGhlIGNhbGwgdG8gcmJfcmVxdWlyZSgpLCBlLmcuCgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYy90ZXh0L2ZvbyIpOwoKICAgICAgICAgICAgU2VlIFNvdXJjZUZvcmdlIEJ1ZyAjOTI4Mjk5LgoKMDUvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZm9yIGVtaXR0aW5nIGRpcmVjdG9ycyB3aGVuICVmZWF0dXJlKCJkaXJlY3RvciIpIHNwZWNpZmllZAogICAgICAgICAgICBmb3IgYSBjbGFzcyB3aXRoIG5vIHZpcnR1YWwgbWV0aG9kcywgYnV0IGRvZXMgaGF2ZSBhIHZpcnR1YWwgZGVzdHJ1Y3Rvci4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEtldmluIFNtaXRoLgoKMDUvMDYvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBTV0lHIHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUHJldHR5TmFtZSwgd2hpY2ggCgkgICAgcmV0dXJucyBhbiB1bm1hbmdsZWQgdHlwZSBuYW1lIGZvciBhIHN3aWdfdHlwZV9pbmZvCgkgICAgb2JqZWN0LiAKCgkgICAgW0d1aWxlXTogVXNlIGl0IGZvciBwcmludGluZyBwb2ludGVyIG9iamVjdHMuCgowNS8wMy8yMDA0OiAgZGFuY3kgKEFobW9uIERhbmN5KQoKCSogTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnOiAgVXBkYXRlZCBjb21tZW50cyBhYm91dCBpZGVudGlmZXIKCWNvbnZlcnNpb24uICAKCgkqIFNvdXJjZXMvTW9kdWxlcy9hbGxlZ3JvY2wuY3h4OiAgUmVnaXN0ZXIgL2Rldi9udWxsIGZvciAiaGVhZGVyIgoJdGFyZ2V0LiAgIEFsc28sIGRpc3JlZ2FyZCAiY29uc3QiIHF1YWxpZmllcnMgZHVyaW5nIHR5cGUKCWNvbnZlcnNpb24uICAKCgkKMDUvMDIvMjAwNDogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEZpeCBidWcgNzgyNDY4LgoJICAgIFRvIGZpeCB0aGlzIGJ1ZywgdGhlIHJ1bnRpbWUgY29kZSBoYXMgYmVlbiByZXdyaXR0ZW4sIGFuZAoJICAgIHBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgYSBDX1NXSUdfUE9JTlRFUl9UWVBFLgoKCSAgICBDaGlja2VuIHZlcnNpb24gPiAxLjQwIGlzIG5vdyByZXF1aXJlZCEKCgkgICAgKiBUeXBlbWFwIGluY29tcGF0aWJpbGl0eTogIHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgY2hpY2tlbl93b3Jkcy4KCSAgICAgIElmIGEgdHlwZW1hcCBuZWVkcyBzb21lIHNwYWNlLCBpdCBzaG91bGQganVzdCBjYWxsIENfYWxsb2MKCgkgICAgKiBhcmdvdXQgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSB0aGUgLyogaWYgT05FICovIGNvbnN0cnVjdCB0bwoJICAgICAgYnVpbGQgYW4gb3V0cHV0IGxpc3QuICBBIFNXSUdfQVBQRU5EX1ZBTFVFIG1hY3JvLCBleGFjdGx5IGxpa2UKCSAgICAgIGd1aWxlIGFuZCBtenNjaGVtZSBpcyBub3cgdXNlZC4KCjA0LzI1LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIHRoZSBnZW5lcmF0ZWQgR09PUFMgY29kZSwgZG9uJ3QgY3JlYXRlIG1ldGhvZHMKCSAgICB0aGF0IHdvdWxkIG5vdCBzcGVjaWFsaXplIGFueSBhcmd1bWVudHM7IHNpbXBseSByZS1leHBvcnQKCSAgICB0aGUgcHJpbWl0aXZlIGZ1bmN0aW9ucy4gIChUaGlzIGlzIGEgcGVyZm9ybWFuY2UKCSAgICBvcHRpbWl6YXRpb24gd2hpY2ggcmVkdWNlcyBsb2FkIHRpbWUgYW5kIGV4ZWN1dGlvbiB0aW1lLikKCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZml4IHRoZSAidG9vIG1hbnkgaW5pdGlhbGl6ZXJzIiBlcnJvcgoJICAgIHdoaWNoIHdhcyBjYXVzZWQgYnkgYW4gaW5jb21wYXRpYmxlIHN3aWdfdHlwZV9pbmZvIGxheW91dC4KCgkgICAgW0d1aWxlXSBUaGUgdHlwZW1hcCBmb3IgRklMRSAqIGluIHBvcnRzLmkgbm93IGFsc28gYWNjZXB0cwoJICAgIGEgcmVndWxhciBGSUxFICogcG9pbnRlciBvYmplY3QuICBBbHNvIGEgYnVnIHdpdGggU2NoZW1lCgkgICAgZmlsZSBwb3J0cyB0aGF0IGFyZSBvcGVuIGZvciBpbnB1dCBhbmQgb3V0cHV0IGhhcyBiZWVuCgkgICAgZml4ZWQuIAoKMDQvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQ2hhbmdlIGVudHJ5IDAzLzIxLzIwMDQgcmV2b2tlZC4gVGhlIGNoYW5nZSBpbnRyb2R1Y2VkIGFub3RoZXIKICAgICAgICAgICAgaW5jb25zaXN0ZW5jeSAocmVmZXJlbmNlIHR5cGVtYXBzIGJlaW5ncyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlciB0eXBlbWFwcyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIHN0YXRpYwogICAgICAgICAgICBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIGZvciBzb21lIGxhbmd1YWdlcywKICAgICAgICAgICAgYnV0IG9ubHkgZm9yIEMrKyBhbmQgbm90IEMpLiBUaGlzIHdvdWxkIGJyZWFrIHVzZXIncyBjdXJyZW50CiAgICAgICAgICAgIHR5cGVtYXBzIGFuZCBpbnRyb2R1Y2UgZnVydGhlciBpbmNvbnNpc3RlbmNpZXMuIEFsdGVybmF0aXZlCiAgICAgICAgICAgIHNvbHV0aW9uIHJlcXVpcmVkIGFuZCBiZWluZyBkaXNjdXNzZWQuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIEFkZGVkIHRoZSAtZGlyZWN0b3JzIGZsYWcuIFRoaXMgZW5hYmxlcyB0aGUgZGlyZWN0b3IKCSAgICBtb2RlIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBhbGwgdGhlIGNsYXNzZXMgdGhhdAoJICAgIGRvbid0IHNldCB0aGUgImZlYXR1cmU6bm9kaXJlY3RvciIgZXhwbGljaXRseS4KCgkgICAgWW91IGNhbiB1c2UgdGhpcyBpbiB5b3VyIG1vZHVsZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlCgkgICAgZGlyZWN0b3IgZmVhdHVyZSBpbiBhbGwgeW91ciBjbGFzc2VzLCBidXQgaXQgaXMgbW9zdAoJICAgIGludGVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBsaWtlOgoKCSAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoKCSAgICBUaGVzZSBjb21tYW5kcyB3aWxsIHJ1biB0aGUgZW50aXJlIHRlc3Qtc3VpdGUgdXNpbmcKCSAgICBkaXJlY3RvcnMsIGFuZCBub3Qgb25seSB0aGUgc3BlY2lmaWMgJ2RpcmVjdG9yc18qJwoJICAgIGNhc2VzLiBUaGlzIHNob3VsZCBiZSBkb25lIGZyb20gdGltZSB0byB0aW1lLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBBZGRlZCBzdXBwb3J0IGZvciBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QsCgkgICAgZm9yIGNvbXBpbGVyIGFuZCBweXRob24gdmVyc2lvbnMgdGhhdCBzdXBwb3J0IHRoZW0uCgkgICAgCgkgICAgV2hlbiBuZWVkZWQsIHVzZSAKCgkgICAgICVpbmxjdWRlIHN0ZF9zdHJpbmcuaSAgICAgIC8vICdjaGFyJyBzdHJpbmdzCgkgICAgICVpbmxjdWRlIHN0ZF93c3RyaW5nLmkgICAgIC8vICd3Y2hhcl90JyBzdHJpbmdzCgkgICAgCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEZpeCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgKHNlZy4gZmF1bHQpIHdoZW4gYW4KCSAgICBpbnBsYWNlIG9wZXJhdG9yICgrPSwtPSwuLi4pIHdhcyB3cmFwcGVkLCBhcyByZXBvcnRlZCBieQoJICAgIEx1Y3JpeiAobHVjcml6QHNpdGlsYW5kaWEuaXQpLCB3aGVuIHRoZSBtb3N0IGNvbW1vbgoJICAgIGZvcm0gd2FzIHVzZWQ6CgogICAgICAgICAgICAgICAgICAgQSYgIEE6Om9wZXJhdG9yKz0oaW50IGkpIHsgLi4uOyByZXR1cm4gKnRoaXM7IH0KICAgICAgICAgICAgICAgICAgXl5eXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgoJICAgIAoKCSAgICBpZSwgYW4gb2JqZWN0IGlzIHJldHVybmVkIGFuZCBpdHMgY29udGFpbnMgdGhlIHNhbWUgJ3RoaXMnCgkgICAgdmFsdWUgdGhhbiB0aGUgaW5wdXQgb2JqZWN0LCB3aGljaCBpcyBkZWxldGVkIGFmdGVyIHRoZQoJICAgIG9wZXJhdGlvbiAiYSArPSBiIiwgbGVhdmluZyB0aGUgcmVzdWx0IHdpdGggbm8gcmVhbAoJICAgIG9iamVjdCwgYnV0IGEgc2VnLiBmYXVsdC4KCgkgICAgVG8gZml4IGl0LCB3ZSBuZWVkZWQgdG8gaW50cm9kdWNlIGEgbmV3IGZlYXR1cmUgYW5kIHVzZSBhbgoJICAgIG9sZCBvbmU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IikgQTo6b3BlcmF0b3IrPTsKCSAgICAKCSAgICBoZXJlLCAic2VsZjpkaXNvd24iIGRpc2FibGUgdGhlIG93bmVyc2hpcCBvZiB0aGUgJ3NlbGYnCgkgICAgb3IgaW5wdXQgb2JqZWN0LCBhbmQgdGhlICJuZXciIGZlYXR1cmUgdHJhbnNmZXJzIHRoZQoJICAgIG93bmVyc2hpcCB0byB0aGUgcmVzdWx0IG9iamVjdC4KCSAgICAKCSAgICBUaGUgZmVhdHVyZS9zb2x1dGlvbiBjb3VsZCBhbHNvIGJlIHVzZWQgaW4gb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCB1c2UgZ2MgYW5kIGltcGxlbWVudCB0aGUgaW5wbGFjZSBvcGVyYXRvcnMsIG9yIG90aGVyCgkgICAgb3BlcmF0b3JzLCBpbiBhIHNpbWlsYXIgd2F5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFB5dGhvbiBNT0RVTEUgKioqCgoJICAgIElmIHlvdSBhbHJlYWR5IGFyZSB1c2luZyB0aGUgaW5wbGFjZSBvcGVyYXRvcnMgaW4gcHl0aG9uLAoJICAgIGFuZCB5b3UgaW1wbGVtZW50ZWQgc29tZSBraW5kIG9mIHdvcmthcm91bmQgdG8gdGhlIHByb2JsZW0KCSAgICBmaXhlZCBoZXJlLCBpdCBpcyBwb3NzaWJsZSB5b3UgY291bGQgZW5kIHdpdGggJ2ZyZWUnCgkgICAgb2JqZWN0cyB0aGF0IG5ldmVyIGdldCBkZWxldGVkLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBhbmQKCSAgICB5b3Ugd2FudCB0byBkaXNhYmxlIHRoZSBjdXJyZW50IGZpeCwgdXNlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIiwiIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIsIiIpIEE6Om9wZXJhdG9yKz07CgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQysrIGVudW1zIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBpbnRlZ2VycywgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgCiAgICAgICAgICAgIEMjIGVudW1zLiBGb3IgRXhhbXBsZSwgZ2l2ZW4gQysrOgoKICAgICAgICAgICAgICAgIGVudW0gQW5FbnVtIHsgZm9vLCBiYXIgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgQW5FbnVtIEFuRW51bWVyYXRpb247CiAgICAgICAgICAgICAgICB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtZXJhdGlvbiBmKTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBlbnVtIEFuRW51bSB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW0gZikgey4uLn0KCiAgICAgICAgICAgIE5vdGUgdGhhdCBhIGdsb2JhbCBlbnVtIGxpa2UgQW5FbnVtIGFib3ZlIGlzIGdlbmVyYXRlZCBpbnRvIGl0cyBvd24KICAgICAgICAgICAgZmlsZSBjYWxsZWQgQW5FbnVtLmNzLiBFbnVtcyBkZWZpbmVkIHdpdGhpbiBhIEMrKyBjbGFzcyBhcmUgZGVmaW5lZAogICAgICAgICAgICB3aXRoaW4gdGhlIEMjIHByb3h5IGNsYXNzLiBTb21lIG9mIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nIEMjIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMgYWxzbyB3b3JrIGZvciBlbnVtcy4gRm9yIGV4YW1wbGUgZ2xvYmFsIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2ltcG9ydHMpIHRvIGFkZCBpbiBleHRyYSB1c2luZyBzdGF0ZW1lbnRzLgoKICAgICAgICAgICAgR2xvYmFsIGVudW1zIGFuZCBjbGFzcyBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgdG8gbWFrZSB0aGUgZW51bSBwcml2YXRlLCBwdWJsaWMgZXRjLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSB0byBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZW51bSB0eXBlIChlbnVtIGJhc2UpCgogICAgICAgICAgICBJZiB3ZSBhZGQgdGhpcyBmb3IgdGhlIGFib3ZlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NjbGFzc21vZGlmaWVycykgQW5FbnVtICJwcm90ZWN0ZWQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIEFuRW51bSAibG9uZyIKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgaXMgZ2VuZXJhdGVkOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHByb3RlY3RlZCBlbnVtIEFuRW51bSA6IGxvbmcgewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTZWcgZmF1bHQgZml4IGZvciBlbXB0eSBlbnVtcywgbGlrZQogICAgICAgICAgICAgICAgZW51bSBGb28ge307CgowMy8yMS8yMDA0OiBtbWF0dXMKICAgICAgICAgICAgW05vdGU6IHRoaXMgY2hhbmdlIHJldm9rZWQgb24gMDQvMjUvMjAwNF0KCSAgICBbUHl0aG9uXSBNYWtlcyB0aGUgZm9sbG93aW5nICd2YXInIGNhc2VzIG1vcmUgdW5pZm9ybToKCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBnYTsKIAogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgc2E7CiAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBub3cgdGhlIHRocmVlIHZhcmlhYmxlcyAoZ2EsIHNhLCBtYSkgY2FuIGJlIGFzc2lnbmVkIGFzOgoKCiAgICAgICAgICAgICAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBBLnNhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgYS5tYSA9ICJoZWxsbyI7CgogICAgICAgICAgICBpZSwgbm93ICdtYScgd2lsbCBhbHNvIHVzZSBhIHN0ZDo6c3RyaW5nIHR5cGVtYXAgJ2luJyBpZgogICAgICAgICAgICBkZWZpbmVkLCBiZWZvcmUgaXQgd2FzIG9ubHkgYWNjZXB0aW5nIGEgJ3Bfc3RkX3N0cmluZycKICAgICAgICAgICAgcG9pbnRlci4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgJ21hJyB3aWxsIG5vdCB1c2UgdGhlCiAgICAgICAgICAgICd2YXJpbi92YXJvdXQnIHR5cGVtYXBzICh0aGF0IHByb2JhYmx5IGNvdWxkIGJlIG1vcmUKICAgICAgICAgICAgbmF0dXJhbCksIGJ1dCBpdCB3aWxsIHBpY2sgdXAgdGhlICdpbicgdHlwZW1hcCBmb3IgY29uc3QKICAgICAgICAgICAgc3RkOjpzdHJpbmcmICh3aGljaCBpcyBlYXNpZXIpLgoKCSAgICBUaGUgY2hhbmdlcyBpbiBjd3JhcC5jIGFuZCBsYW5nLmN4eCB3aWxsIHByb2JhYmx5IGZpeCB0aGUKCSAgICBiZWhhdmlvdXIgaW4gb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IG92ZXJsb2FkIHRoZQoJICAgIG1lbWJlcnZhckhhbmRsZXIgbWV0aG9kICJ0b28gbXVjaCIuCiAKICAgICAgICAgICAgCjAzLzIxLzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIERpc2FibGluZyB0aGUgZGVmYXVsdCBpbnN0YW50aWF0aW9ucyBsaWtlOgoKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxpbnQsaW50PjsKCiAgICAgICAgICAgIGZvciBhbGwgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgU1RMIGNvbnRhaW5lcnMvY2xhc3Nlcy4KCSAgICBUaGV5IGFyZSBleHBlbnNpdmUsIHNwZWNpYWxseSBmb3IgcGFpciBhbmQgbWFwLCBhbmQgdGhlCgkgICAgcHJldmlvdXMgYmVoYXZpb3VyIGFsc28gcmVxdWlyZXMgdGhlIHVzZXIgdG8gcGVyZm9ybQoJICAgIG1hbnVhbCBpbnN0YW50aWF0aW9ucy4gU3RpbGwsIGlmIHRoZSBzcGVlZCBkaWZmZXJlbmNlIGlzCgkgICAgbm90IGltcG9ydGFudCwgaXQgY2FuIGJlIHJlLWVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIG1hY3JvCgkgICAgU1dJR19TVERfREVGQVVMVF9JTlNUQU5USUFUSU9OIChzZWUgc3RkX2NvbW1vbi5pKS4KCgkgICAgQWxzbywgbm9ybWFsaXppbmcgdGhlIElOUFVUL09VVFBVVC9JTk9VVCB0eXBlbWFwcy4gTm93CgkgICAgdGhleSB1c2UgdGhlIHNhbWUgY29udmVyc29ycyB0aGFuIHRoZSByZXN0IG9mIHRoZQoJICAgIHR5cGVtYXBzLCBhbmQgeW91IGNhbiB1c2UgdGhlbSBmb3Igc3RkOjpwYWlyLCBzdGQ6OnN0cmluZwoJICAgIGFuZCBhbGwgdGhlIG90aGVyIFNUTCB0eXBlcywgbGlrZSBpbjoKCgkgICAgICB2b2lkIHBfaW5vdXRkKHN0ZDo6cGFpcjxkb3VibGUsIGRvdWJsZT4gKklOT1VUKTsKCgkgICAgQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGFuZCBpbXBsaWNpdC5pIGZpbGVzIHdpdGggbWFjcm9zIHRvCgkgICAgdHJhbnNmb3JtIGZ1bmN0aW9ucyBwYWlycyBsaWtlICdzZXRfeCcvJ2dldF94JyAKCSAgICAob3IgJ1QmIHgoKScvJ2NvbnN0IFQmIHgoKSBjb25zdCcpIGludG8gYW4gYXR0cmlidXRlLAoJICAgIGFuZCBhbGxvd2luZyB0aGUgdXNlIG9mIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBpbiB0eXBlbWFwcwoJICAgIChzZWUgdGhlIGZpbGVzIGZvciBtb3JlIGRldGFpbHMpLgoKMDMvMjEvMjAwNDogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZ3Mgb2YgZnVuY3Rpb25zIHdpdGgKCSAgICBhbm9ueW1vdXMgYXJndW1lbnRzLgoKMDMvMTgvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gTW9yZSBnZW5lcmFsIHN0ZF9zdHJpbmcuaSBpbnRlcmZhY2UuCgkgICAgTm93IHlvdSBjYW4gd3JhcCBpdCB1c2luZwoKCSAgICAgICV0ZW1wbGF0ZShzdHJpbmcpIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+OwoKICAgICAgICAgICAgYW5kIHVzZSB0aGUgc3RkOjpzdHJpbmcgYXMgYSBiYXNlIGNsYXNzOgoKCSAgICAgIHN0cnVjdCBBIDogc3RkOjpzdHJpbmcgewogICAgICAgICAgICAgIH07CgoJICAgIEJ1dCBtb3JlIGltcG9ydGFudCwgc3dpZyB3aWxsIHJlY29nbml6ZSAKCSAgICBib3RoIHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXI+IGFuZCBzdGQ6OnN0cmluZyBhcwoJICAgIHRoZSBzYW1lIHR5cGUuCgowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBQcmV2aW91c2x5IGFkZGVkLCBidXQgbm90IG1lbnRpb25lZCBiZWZvcmU6CgoJICAgIC0gZnJpZW5kIGRlY2xhcmF0aW9uIHN1cHBvcnQsIHN3aWcgbm93IGVtaXRzIGEgZ2xvYmFsCgkgICAgICBmdW5jdGlvbiBpbiB0aGUgc2FtZSBjbGFzcyBzY29wZS4KCgkgICAgLSByZWYvdW5yZWYgZmVhdHVyZXM6IHRvIG1peCByZWYgY291bnRpbmcgQysrIGNsYXNzZXMKCSAgICAgIGFuZCBuYXRpdmUgc2NyaXB0IHJlZiBjb3VudGluZyBtZWNoYW5pc21zIChsaWtlIGluIHB5dGhvbikuCgkgICAgCgkgICAgICBVc2UgaXQgbGlrZToKCiAJICAgICAgICAlZmVhdHVyZSgicmVmIikgICBSQ09iaiAiJHRoaXMtPnJlZigpOyIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ1bnJlZiIpIFJDT2JqICIkdGhpcy0+dW5yZWYoKTsiCgoJICAgICAgQW5kIHRoZSBjbGFzcyBSQ09iaiwgYW5kIGFsbCB0aGUgZGVyaXZlZCBvbmVzLCB3aWxsCgkgICAgICBwZXJmb3JtIHRoZSByaWdodCByZWYvdW5yZWYgY2FsbHMgd2hlbiBhIG5ldyBwb2ludGVyICAKCSAgICAgIGlzIHJldHVybmVkIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UsIG9yIHdoZW4gdGhlIHRhcmdldAoJICAgICAgbGFuZ3VhZ2UgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZSBvYmplY3QuCgkgICAgICAKCSAgICAgIFNlZSB0aGUgcmVmY291bnQuaSBmaWxlIGluIHRoZSB0ZXN0LXN1aXRlIGZvciBtb3JlCgkgICAgICBkZXRhaWxzLgoKCSAgICAKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gVXNpbmcgdGhlIG5ldyAlZnJhZ21lbnQgc3VwcG9ydCwgbWFqb3IgcmV3cm90ZSAKCSAgICBvZiB0aGUgcHl0aG9uIHN3aWcgbGlicmFyeSwgaW5jbHVkaW5nOgoKCSAgICAtIEFsbW9zdCBhdXRvbWF0aWMgdGVtcGxhdGUvdHlwZW1hcCBpbnN0YW50aWF0aW9uIGZvcgoJICAgICAgdGhlIFNUTCBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgbm93IHlvdSBjYW4gd3JpdGU6CgoJCSAgICV0ZW1wbGF0ZSh2ZWN0b3JfaSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgYW5kIGEgc3BlY2lhbGl6ZWQgdmVjdG9yX2kgY2xhc3MgaXMgZW1pdHRlZCB3aXRoIGFsbAoJICAgICAgdGhlIG5lZWRlZCB0eXBlbWFwcy4gTm8gbmVlZCB0byB1c2UgdGhlIG9sZAoJICAgICAgJ3NwZWNpYWxpemVfdmVjdG9yJyBtYWNyb3MuCgoJICAgICAgTm90ZSB5b3UgY2FuIGFsc28gZGVmaW5lCgoJICAgICAgICAgICV0ZW1wbGF0ZShtYXRyaXhfaSkgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID47CgkgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9waWkpIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsaW50PiA+OwoKCSAgICAtIFRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogCSAKICAgICAgICAgICAJICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIGRlZmluZXMgdGhlIHZlY3RvciB0eXBlbWFwcywgYnV0IG5vIHByb3h5IGNsYXNzLiBGb3IgYWxsIHRoZQogICAgICAgICAgICAgIGZ1bmRhbWVudGFsIHR5cGVzLCB0aGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBhcmUKICAgICAgICAgICAgICBkZWZpbmVkLCBzbywgeW91IGNhbiBzYXkKCgkgICAgICAlaW5jbHVkZSBzdGRfdmVjdG9yCgoJICAgICAgaW50IGZ1bmMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgYSk7CgkgICAgICAKCSAgICAgIHdoZXJlIHRoZSBwcm9wZXIgdHlwZW1hcCBpcyBhcHBsaWVkIHRvICdhJywgYnV0IG5vCgkgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHByb3h5IGlzIGdlbmVyYXRlZC4KCSAgICAgIAoKICAgICAgICAgICAgLSBBbGwgdGhlIFNUTCBjb250YWluZXJzIHByZXNlbnQgYSBtb3JlIHVuaWZvcm0gYmVoYXZpb3IgYW5kCgkgICAgICBtb3JlIGNvbXBsZXRlIGludGVyZmFjZSBkZWNsYXJhdGlvbi4gVGhlIGZvbGxvd2luZyBhcmUgCgkgICAgICBub3cgc3VwcG9ydGVkOgoKCQkgIHN0ZDo6dmVjdG9yPFQ+CgkJICBzdGQ6Omxpc3Q8VD4KCQkgIHN0ZDo6ZGVxdWU8VD4KCQkgIHN0ZDo6c2V0PFQ+CgkJICBzdGQ6Om11bHRpc2V0PFQ+CgkJICBzdGQ6Om1hcDxUPgoJCSAgc3RkOjptdWx0aW1hcDxUPgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIG5vdCBhIGNvbnRhaW5lciwgYnV0IGFsc28gc3VwcG9ydGVkOgoKCQkgIHN0ZDo6cGFpcjxULFU+CgogICAgICAgICAgICAgIGFsc28sIG1vcmUgdHlwZW1hcHMgYXJlIGRlZmluZWQgZm9yIGFsbCBvZiB0aGVtLAoJICAgICAgaW5jbHVkaW5nIHZhcmluLCB2YXJvdXQsIHR5cGVjaGVjaywgZXRjLgoKICAgICAgICAgICAgLSBJbml0aWFsIGF0dGVtcHQgdG8gaW1wbGVtZW50IHRoZSBTVEwgY29udGFpbmVycwogICAgICAgICAgICAgIGNvbnNpZGVyaW5nIGFsbG9jYXRvcnMsIGllOgoKCSAgICAgICAgICBzdGQ6OnZlY3RvcjxULEE+CQkJCgoJICAgICAgaXQgaXMgcGFydGlhbGx5IHdvcmtpbmcsIGJ1dCBpdCBpcyBqdXN0IGEgd29ya2Fyb3VuZAoJICAgICAgd2hpbGUgc3dpZyBpbXByb3ZlcyBpdHMgdGVtcGxhdGUgdHlwZSBzdXBwb3J0LgoJICAgICAgCgkgICAgICAKCSAgICAgUGxlYXNlIHRlc3Qgd2l0aCB5b3VyIHBhcnRpY3VsYXIgc2V0dXAuIEl0IHNlZW1zIHRvIGJlCgkgICAgIHdvcmtpbmcgd2l0aCBnKysgMy4yLjIsIGcrKyAyLjk2LCBJbnRlbCBpY2MgYW5kIFNHSSBDQwoJICAgICBjb21waWxlcnMsIHBsdXMgcHl0aG9uIDEuNS4yLCAyLjAgYW5kIDIuMywgYnV0IHNpbmNlCgkgICAgIHdlIGFyZSB1c2luZyB0ZW1wbGF0ZXMsIHRoZXJlIGlzIGEgY2hhbmNlIHlvdSBjYW4gZmluZAoJICAgICBzb21lIHByb2JsZW1zIHdoZW4gdXNpbmcgd2l0aCBhbiBvbGQgQysrIGNvbXBpbGVyLgoKMDMvMTYvMjAwNDogbW1hdHVzCgogICAgICAgICAgICAtIEFsbG93aW5nIHRoZSBlbXB0eSAldGVtcGxhdGUgZGlyZWN0aXZlLCBzdWNoIGFzCgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgdG8gcHJvY2VzcyB0aGUgY2xhc3MgInR5cGVkZWYicyBhbmQgInR5cGVtYXAicy4gQmVmb3JlCgkgICAgICBvbmx5IHRoZSBpbnRlcm5hbCAidHlwZWRlZiJzIHdlcmUgcHJvY2Vzc2VkLgoKICAgICAgICAgICAgICBUaGlzIG1ha2VzIHBvc3NpYmxlIHRvIGVtaXQgdGhlIGRlZmF1bHQgaW4vb3V0CiAgICAgICAgICAgICAgdHlwZW1hcHMgd2l0aG91dCB0aGUgbmVlZCBvZiB3cmFwcGluZyBhbiBzcGVjaWFsaXplZAogICAgICAgICAgICAgIHZlY3RvciBpbnN0YW5jZS4KCgkgICAgLSBBZGRpbmcgdGhlIHByZXByb2Nlc3NvciBleHRlbnNpb24gI0Agd2hpY2ggbWFuZ2xlcyB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgbWFjcm8gYXJndW1lbnQsIGxpa2UgaW46CgogICAgICAgICAgICAgICAgI2RlZmluZSBtYWNybyhYKSAgI0BYCiAgICAgICAgICAgICAgICBtYWNybyhpbnQpICAgICAgICAgLT4gaW50CiAgICAgICAgICAgICAgICBtYWNybyhzdGQ6OnN0cmluZykgLT4gc3RkX3Nfc19zdHJpbmcKICAgICAgICAgICAgICAgIAoJICAgIC0gRnJhZ21lbnRzIGNhbiBub3cgYmUgInR5cGUgc3BlY2lhbGl6ZWQiLCBhcyB0aGUgdHlwZW1hcHMuIFRoZQoJICAgICAgc3ludGF4IGlzIGFzIGZvbGxvd3MKIAogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiwiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogYSB0eXBlIGluZGVwZW5kZW50IGZyYWdtZW50IChvbGQgc3ludGF4KSAqLyB9CiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiIHtUeXBlfSwgImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIHRoZSBmcmFnbWVudCBpcyB0eXBlIGRlcGVuZGVudCAqL30KIAogICAgICAgICAgICAgIE5vdyBmcmFnbWVudHMgY2FuIGFsc28gYmUgdXNlZCBpbnNpZGUgdGVtcGxhdGVzOiAKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICVmcmFnbWVudCgiaW5jb2RlIntBPFQ+fSwiaGVhZGVyIikgewoJCSAgICAgIC8qICdpbmNvZGUnIHNwZWNpYWxpemVkIGZyYWdtZW50ICovCgkJICAgfQogCgkJICAgJXR5cGVtYXAoaW4sZnJhZ21lbnQ9ImluY29kZSJ7QTxUPn0pIHsKCQkgICAgICAvKgoJCSAgICAgICAgIGhlcmUgd2UgdXNlIHRoZSAndHlwZSBzcGVjaWFsaXplZCcgCiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCAiaW5jb2RlIntBPFQ+fQogICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgfQogICAgICAgICAgICAgICAgfTsKCQkJICAgICAJCgowMy8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIGJ1ZyB3aGljaCBtZWFudCB0aGF0IHNvbWUgdmlydHVhbCBmdW5jdGlvbnMgb3ZlcnJpZGRlbiBpbgogICAgICAgICAgICBKYXZhIHdlcmUgbm90IGJlaW5nIGNhbGxlZCBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiBCdWcgcmVwb3J0ZWQgYW5kIGZpeGVkCiAgICAgICAgICAgIGJ5IFJvYmVydCBkZSBWcmllcyBhbmQgU2NvdHQgTWljaGVsLgoKMDMvMDIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCBmb3JnZXQgdG8gY2hlY2sgdGhlIHR5cGUgb2Ygc3RyaW5nIGFyZ3VtZW50cy4KCjAyLzI0LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW5hbWVzcGFjZSA8bmFtZT4uIFRoaXMgYWxsb3dzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIGEgQyMgbmFtZXNwYWNlIGludG8gd2hpY2ggYWxsIEMjIGNsYXNzZXMgYXJlIGdlbmVyYXRlZC4KCjAyLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkgCgkgICAgW016U2NoZW1lXSBVc2UgRlVOQ19OQU1FIHJhdGhlciB0aGFuIGEgYm9ndXMgdHlwZW1hcCB2YXJpYWJsZSBmb3Igc2lnbmFsbGluZwoJICAgIGVycm9ycy4gIENhbGwgc2NoZW1lX3dyb25nX3R5cGUgd2l0aCBhIHplcm8tYmFzZWQgYXJndW1lbnQgbnVtYmVyLiAgCgkgICAgUmVwb3J0ZWQgYnkgT25kcmVqIFBhY292c2t5LCBTRiAjOTAyNjIxLgoKCSAgICBbR3VpbGVdIERlZmluZSBGVU5DX05BTUUgYWxzbyBpbiB0aGUgZGlzcGF0Y2ggd3JhcHBlciBmb3Igb3ZlcmxvYWRlZAoJICAgIGZ1bmN0aW9ucy4gIFBhdGNoIGJ5IEpvaG4gTGVueiwgU0YgIzg5NjI1NS4KCjAyLzIyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgdHJ5IHRvIGludm9rZSBhIG51bGwgZGVzdHJ1Y3RvciBmdW5jdGlvbi4KCjAyLzIwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBzbyB0aGF0IHRoZSBTV0lHIHNvdXJjZSB3aWxsIGNvbXBpbGUgdXNpbmcgdGhlIERpZ2l0YWwgTWFycyBDb21waWxlcgogICAgICAgICAgICAoZm9ybWVybHkgU3ltYW50aWMgY29tcGlsZXIpIG9uIFdpbmRvd3MuIFN1Ym1pdHRlZCBieSBTY290dCBNaWNoZWwuCgowMi8xMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBOZXcgY29tbWFuZC1saW5lIGFyZ3VtZW50IC1ub2luaXQuICBVc2UgaXQgZm9yIGJ1aWxkaW5nCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyeSwgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIGZ1bmN0aW9ucwoJICAgIHNjaGVtZV9pbml0aWFsaXplIGV0Yy4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTc1NC4KCgkgICAgW016U2NoZW1lXSBEb24ndCBwcm9kdWNlIGludmFsaWQgQyBjb2RlIHdoZW4gaW52b2tlZCB3aXRoIHRoZQoJICAgIC1kZWNsYXJlbW9kdWxlIG9wdGlvbi4gIFJlcG9ydGVkIGJ5IFRpbSBCcm93biwgU0YgIzg5MTEwOC4KCSAgICAKCSAgICBbR3VpbGVdIEJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcnkgd2l0aCBwYXNzaXZlIGxpbmthZ2UsIHRvIHJlbmFtZQoJICAgIHRoZSBTV0lHX2luaXQgZnVuY3Rpb24gdW5pcXVlbHkuCgowMi8xMi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCBzdWJtaXR0ZWQgYnkgQmlsbCBIb2ZmbWFuIHdoaWNoIHByZXZlbnRzIFNXSUcgZnJvbSBjcmFzaGluZwogICAgICAgICAgICB3aGVuIGEgZmlsZSBmb3IgdGhlIHR5cGV3cmFwcGVyIGNsYXNzIGNhbm5vdCBiZSBvcGVuZWQuCgowMi8xMS8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBPdmVybG9hZGluZyBjaGFuZ2VzOgogICAgICAgICAgICAgIC0gTWV0aG9kcyB3aGljaCBhcmUgb3ZlcmxvYWRlZCBpbiBjb25zdCBvbmx5IG5vIGxvbmdlciBnZW5lcmF0ZSBKYXZhCiAgICAgICAgICAgICAgICBjb2RlIHRoYXQgd29uJ3QgY29tcGlsZSAtIHRoZSBmaXJzdCBtZXRob2QgcGFyc2VkIGlzIHVzZWQgYW5kIGEKICAgICAgICAgICAgICAgIHdhcm5pbmcgaXMgZGlzcGxheWVkLiBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgc2xpZ2h0bHkgZGlmZmVyZW50CiAgICAgICAgICAgICAgICB0byB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyB3aGljaCBhbHdheXMgdXNlcyB0aGUgbm9uLWNvbnN0IG1ldGhvZC4KICAgICAgICAgICAgICAtIFdhcm5pbmcgbWVzc2FnZXMgNTA5IGFuZCA1MTIgcmVwbGFjZWQgYnkgbmV3IHdhcm5pbmcgbnVtYmVyIDUxNiwgd2hpY2ggCiAgICAgICAgICAgICAgICBpcyBtb3JlIHJlbGV2YW50IHRvIHRoZXNlIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIGFzIHRoZSBvdmVybG9hZGVkCiAgICAgICAgICAgICAgICBtZXRob2RzIGFyZW4ndCAnc2hhZG93ZWQnLCB0aGV5IGFyZSBpZ25vcmVkLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVwbGFjZSB0aGUgImtub3duX2NsYXNzZXMiIGhhc2ggdGFibGUgYnkgYSBub2RlCgkgICAgYXR0cmlidXRlLiAgTWV0aG9kcyBvZiBjbGFzc2VzIGluIEMrKyBuYW1lc3BhY2VzIG5vdyBnZXQKCSAgICB0aGUgcHJvcGVyIHNwZWNpYWxpemVyIGluIHRoZSBHT09QUyBkZWNsYXJhdGlvbi4KCSAgICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFVuaXF1aWZ5IHRoZSBhcmd1bWVudCBuYW1lcyBpbiBHT09QUyBzaGFkb3cgbWV0aG9kCgkgICAgZGVjbGFyYXRpb25zLiAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMS8yMDA0OiBzdW5zaGluZSAoRXJpYyBTdW5zaGluZSkKICAgICAgICAgICAgUmV2aXZlZCB0aGUgTmV4dFN0ZXAgcG9ydCBvZiBTV0lHLgoKICAgICAgICAgICAgRml4ZWQgZmF0YWwgcHJvYmxlbSBpbiBEb2hTdHJzdHIoKSBjYXVzZWQgYnkgZGlmZmVyZW5jZSBpbiBzdHJzdHIoKQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB3aGljaCBtYWRlICVhcHBseSBiZWNvbWUgZW50aXJlbHkgZHlzZnVuY3Rpb25hbC4gIE9uCiAgICAgICAgICAgIE5leHRTdGVwLCBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRlcyB0byBOVUxMOyB3aGVyZWFzLCBvbiBtb2Rlcm4KICAgICAgICAgICAgcGxhdGZvcm1zLCBpdCBldmFsdWF0ZXMgdG8gImZvbyIuICAlYXBwbHkgcmVsaWVzIGV4dGVuc2l2ZWx5IHVwb24KICAgICAgICAgICAgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0aW5nIHRvIG5vbi1OVUxMLCB0aGVyZWZvcmUgaXQgZmFpbGVkCiAgICAgICAgICAgIGNhdGFzdHJvcGhpY2FsbHkgd2hlbiBmYWNlZCB3aXRoIE5leHRTdGVwJ3Mgc3Ryc3RyKCkuCgogICAgICAgICAgICBBZGRlZCBgYm9vbCcgY2hlY2sgdG8gY29uZmlndXJlLmluIHNpbmNlIE5leHRTdGVwJ3MgQysrIGNvbXBpbGVyCiAgICAgICAgICAgIGRvZXMgbm90IHN1cHBseSB0aGlzIHR5cGUuICBzd2lnLmggbm93IGZha2VzIHVwIGBib29sJyBpZiBuZWVkZWQuCgogICAgICAgICAgICBXb3JrZWQgYXJvdW5kIE5leHRTdGVwIEMrKyBjb21waWxlciBidWcgaW4gd2hpY2ggQysrIGNvZGUgaXMKICAgICAgICAgICAgZGlzYWxsb3dlZCBpbnNpZGUgZXh0ZXJuICJDIiBmdW5jdGlvbnMuICBUaGlzIHByb2JsZW0gYWZmZWN0ZWQgYWxsCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMsIHNpbmNlIHRoZXkgcHVibGlzaCBob29rIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICBGaXhlZCBieSBjcmVhdGluZyBhIEMrKyB3cmFwcGVyOgogICAgICAgICAgICAgICAgc3RhdGljIExhbmd1YWdlICpuZXdfc3dpZ19mb28oKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKnN3aWdfZm9vKHZvaWQpIHsgcmV0dXJuIG5ld19zd2lnX2ZvbygpOyB9CgogICAgICAgICAgICBFbnN1cmVkIHRoYXQgU3dpZ19jb3B5X3N0cmluZygpIGlzIHVzZWQgaW4gcGxhY2Ugb2Ygc3RyZHVwKCkgc2luY2UKICAgICAgICAgICAgTmV4dFN0ZXAgZG9lcyBub3Qgc3VwcGx5IHN0cmR1cCgpLgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFJ1YnkgbGlicmFyeSBuYW1lIGFuZCBsb2NhdGlvbiBpbiBjb25maWd1cmUuaW4uCiAgICAgICAgICAgIFByb2JsZW0gMTogQXNzdW1lZCB0aGF0IGxpYnJhcnkgYWx3YXlzIHJlc2lkZWQgaW4gUnVieSdzICJhcmNoZGlyIiwKICAgICAgICAgICAgd2hpY2ggd2FzIGNvcnJlY3QgZm9yIFJ1YnkgMS42LngsIGJ1dCB3aGljaCBpcyBpbmNvcnJlY3QgZm9yIFJ1YnkKICAgICAgICAgICAgMS44LngsIGluIHdoaWNoIGNhc2UgdGhlIGxpYnJhcnkgbm9ybWFsbHkgcmVzaWRlcyBpbiBSdWJ5J3MKICAgICAgICAgICAgImxpYmRpciIuICBQcm9ibGVtIDI6IEFzc3VtZWQgdGhhdCB0aGUgbGlicmFyeSBjb3VsZCBhbHdheXMgYmUKICAgICAgICAgICAgbGlua2VkIHZpYSAiLWwiK1JVQllfSU5TVEFMTF9OQU1FICh3aGVyZSBSVUJZX0lOU1RBTExfTkFNRQogICAgICAgICAgICB0eXBpY2FsbHkgaXMgInJ1YnkiKSwgaG93ZXZlciB0aGlzIGZhaWxlZCBmb3IgcGxhdGZvcm1zLCBzdWNoIGFzCiAgICAgICAgICAgIE5leHRTdGVwLCB3aGljaCBkbyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLiAgSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgICAgc3RhdGljIGxpYnJhcnkgbmFtZSBpbiAxLjgueCBpcyBsaWJydWJ5LXN0YXRpYy5hLCB0aHVzCiAgICAgICAgICAgIC1scnVieS1zdGF0aWMgaXMgcmVxdWlyZWQuICBUaGUgbmV3IGxvZ2ljIHdvcmtzIGNvcnJlY3RseSBmb3IKICAgICAgICAgICAgc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyaWVzIGZvciAxLjYueCBhbmQgMS44LnguCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUGVybCBDRkxBR1MgaW4gY29uZmlndXJlLmluIGZvciBOZXh0U3RlcC4KICAgICAgICAgICAgRGV0ZWN0aW9uIGNvZGUgZXh0cmFjdGVkIENGTEFHUyBmcm9tIFBlcmwncyAlQ29uZmlnIGhhc2ggYnV0CiAgICAgICAgICAgIG5lZ2xlY3RlZCB0byBhZGQgYSBuZXdsaW5lIHRvIHRoZSB2YWx1ZSBiZWZvcmUgcGFzc2luZyBpdCB0aHJvdWdoCiAgICAgICAgICAgIGBzZWQnLiAgTmV4dFN0ZXAncyBhbmNpZW50IGBzZWQnIGRpc2NhcmRzIGlucHV0IHdoaWNoIGlzIG5vdAogICAgICAgICAgICB0ZXJtaW5hdGVkIHdpdGggYSBuZXdsaW5lLCB0aHVzIFBlcmwgQ0ZMQUdTIGFsd2F5cyBldmFsdWF0ZWQgdG8gdGhlCiAgICAgICAgICAgIGVtcHR5IHN0cmluZy4KCjAxLzE2LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaWR5IHVwIGluIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0aGF0IGlzIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgICAgIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgYXJlIHdyYXBwZWQgd2l0aCB0aGUgdGhyb3dzIHR5cGVtYXAuCiAgICAgICAgICAgIFRoaXMgcmVkdW5kYW50IGNvZGUgaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdzsgCiAgICAgICAgICAgICAgICB9CgowMS8xMi8yMDA0OiB3c2Z1bHRvbiBvbiBiZWhhbGYgb2YgbW1hdHVzIChtYXJjZWxvIG1hdHVzKSAKICAgICAgICAgICAgaWYgYSBtZXRob2QgdXNlcyAlZXhjZXB0aW9uIGFuZCB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSB1c2UKICAgICAgICAgICAgb2YgdGhlIHRocm93cyB0eXBlbWFwLCB0aGUgY29kZSBpbiBhIHRocm93cyB0eXBlbWFwIHdpbGwgYmUKICAgICAgICAgICAgZ2VuZXJhdGVkIGluc2lkZSB0aGUgdHJ5IGJvZHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIG1ldGhvZCB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgRXhjZXB0ICV7CiAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBjbGFzcyBFeGNlcHQge307CiAgICAgICAgICAgICAgdm9pZCBtZXRob2QoaW50IGkpIHRocm93IChFeGNlcHQpOwoKICAgICAgICAgICAgV2lsbCBnZW5lcmF0ZToKCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0ICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBBcyBjYW4gYmUgc2VlbiwgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jayBpcyBmb3IgdGhlIHRocm93cyB0eXBlbWFwcy4KICAgICAgICAgICAgUHJldmlvdXNseSwgdGhpcyB3YXMgcmV2ZXJzZWQgc28gdGhhdCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrCiAgICAgICAgICAgIHdhcyB0aGUgJWV4Y2VwdGlvbiBjb2RlLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgaXQgd291bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgIGltcG9zc2libGUgdG8gY2F0Y2ggRXhjZXB0IGFzIHRoZSBjYXRjaCBhbGwgKC4uLikgd291bGQgY2F0Y2ggdGhlCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpbnN0ZWFkLgoKVmVyc2lvbiAxLjMuMjEgKEphbnVhcnkgMTEsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMTAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBvdXRwdXQgZm9ybWF0IGZvciBib3RoIHdhcm5pbmdzIGFuZCBlcnJvcnMgY2FuIGJlIHNlbGVjdGVkIGZvcgogICAgICAgICAgICBpbnRlZ3JhdGlvbiB3aXRoIHlvdXIgZmF2b3VyaXRlIElERS9lZGl0b3IuIEVkaXRvcnMgYW5kIElERXMgY2FuIHVzdWFsbHkKICAgICAgICAgICAgcGFyc2UgZXJyb3IgbWVzc2FnZXMgYW5kIGlmIGluIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgd2lsbCBlYXNpbHkgdGFrZSB5b3UgCiAgICAgICAgICAgIGRpcmVjdGx5IHRvIHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yLiBUaGUgc3RhbmRhcmQgZm9ybWF0IGlzIHVzZWQgYnkgCiAgICAgICAgICAgIGRlZmF1bHQgZXhjZXB0IG9uIFdpbmRvd3Mgd2hlcmUgdGhlIE1pY3Jvc29mdCBmb3JtYXQgaXMgdXNlZCBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZzdGFuZGFyZCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaTo0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRm1pY3Jvc29mdCBleGFtcGxlLmkKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSg0KTogU3ludGF4IGVycm9yIGluIGlucHV0LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg3MTkwOSBdIHNpbXBsZSBuYW1lc3BhY2UgcHJvYmxlbS4KICAgICAgICAgICAgVGhpcyB3YXMgYSBwcm9ibGVtIHVzaW5nIGFub255bW91cyBzdHJ1Y3R1cmVzIGluIGEgbmFtZXNwYWNlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBuOwogICAgICAgICAgICAgICAgICAgfSBTOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2ggQ2hlcnJ5LgoKMDEvMDkvMjAwNDogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIGJyb2tlbiBQZXJsIGV4YW1wbGVzLgoKMTIvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhIGFuZCBDI10gRml4ZXMgZm9yIHdyYXBwaW5nIGNvdmFyaWFudCAocG9seW1vcnBoaWMpIHJldHVybiB0eXBlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXNlKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgQmFzZSogY29weSgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgICB2aXJ0dWFsIERlcml2ZWQqIGNvcHkoKSBjb25zdDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgRGVyaXZlZDo6Y29weSBwcm94eSBtZXRob2QgcmV0dXJucyBCYXNlIG5vdCBEZXJpdmVkLiBBIHdhcm5pbmcgaXMgaXNzdWVkCiAgICAgICAgICAgIGFib3V0IHRoaXMuIFByZXZpb3VzbHkgdGhlIHBvaW50ZXIgdXNlZCBieSB0aGUgcHJveHkgY2xhc3Mgd2FzIGluY29ycmVjdGx5CiAgICAgICAgICAgIHRyZWF0ZWQgYXMgYSBCYXNlKiBpbnN0ZWFkIG9mIGEgRGVyaXZlZCouCgoxMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IHNvIHRoYXQgV2luZG93cyBwYXRocyBhcmUgZGlzcGxheWVkIGNvcnJlY3RseSB3aGVuIHJlcG9ydGluZyBlcnJvcnMuCiAgICAgICAgICAgIEFuIGVycm9yIHByZXZpb3VzbHkgd291bGQgaGF2ZSBiZWVuIHNob3duIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICAuP3hhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgogICAgICAgICAgICBpbnN0ZWFkIG9mOgoKICAgICAgICAgICAgICAuXGV4YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKClZlcnNpb24gMS4zLjIwIChEZWNlbWJlciAxNywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTIvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBMYXN0IG1pbnV0ZSBtb2RpZmljYXRpb25zLiAgIFBlcmw1IG1vZHVsZSBub3cgZ2VuZXJhdGVzIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgIGJ5IGRlZmF1bHQgbGlrZSBhbGwgb2YgdGhlIG90aGVyIG1vZHVsZXMuICBQSFA0IHdyYXBwZXJzIG5vIGxvbmdlcgogICAgICAgICAgICBpbmNsdWRlICJjb25maWcuaCIuIAoKMTIvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBXZWFrZW5lZCB3YXJuaW5nIG1lc3NhZ2UgcmVsYXRlZCB0byBjb25zdHJ1Y3RvciBuYW1lcyBzbyB0aGF0IGFuCiAgICAgICAgICAgIHVudXN1YWwgbmVzdGVkLWNsYXNzIHdyYXBwaW5nIHRlY2huaXF1ZSB3b3VsZCB3b3JrIGFnYWluIChhcHBhcmVudGx5CiAgICAgICAgICAgIGl0IHdvcmtlZCBpbiBzb21lIG9sZGVyIFNXSUcgcmVsZWFzZXMpLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGUgewogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NBOwogICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3NCOwogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NBIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0IgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogIFRoZXJlIGlzIHN0aWxsIHNvbWUgb2RkIGludGVyYWN0aW9uIHdpdGggdGhlIFNXSUcgc3ltYm9sCiAgICAgICAgICAgIHRhYmxlL3R5cGUgc3lzdGVtIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGxvb2tlZCBhdCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBHdXN0YXZvIE5pZW1leWVyLgoKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJvdGVjdGVkIGNsYXNzIG1ldGhvZHMgYXJlIHdyYXBwZWQgYXMgcHJvdGVjdGVkIEphdmEgbWV0aG9kcyAKICAgICAgICAgICAgd2hlbiB1c2luZyB0aGUgZGlycHJvdCBkaXJlY3RvciBmZWF0dXJlLiBUaGlzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIHRvIHNvbWV0aGluZyBlbHNlIHNob3VsZCB0aGUgbmVlZCBhcmlzZSwgZm9yCiAgICAgICAgICAgIGV4YW1wbGUsIHByaXZhdGUgb3IgcGFja2FnZSBhY2Nlc3MuCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSAKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgKEphdmEpIGFuZCAlY3NtZXRob2Rtb2RpZmllcnMgKEMjKSBvcGVyYXRlIHNsaWdodGx5IAogICAgICAgICAgICBkaWZmZXJlbnRseS4gUHJldmlvdXNseSB0aGlzIGZlYXR1cmUgaGFkIHRvIGJlIHByZXNlbnQgdG8gc2V0IHRoZSBtZXRob2QKICAgICAgICAgICAgbW9kaWZpZXJzLiBOb3cgaXQgaXMgb25seSB1c2VkIGlmIGl0IGV4aXN0cyBmb3IgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkLgogICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAicHVibGljIiBhcyBwcmV2aW91cyBob3dldmVyLCB3aGVuIHdyYXBwaW5nIHByb3RlY3RlZAogICAgICAgICAgICBkaXJlY3RvciBtZXRob2RzIGl0IGlzICJwcm90ZWN0ZWQiLiBUaGlzIGNoYW5nZSB3aWxsIG5vdCBhZmZlY3QgZXhpc3RpbmcKICAgICAgICAgICAgdXNlIG9mIHRoZSAlamF2YW1ldGhvZG1vZGlmaWVycyBvciAlY3NtZXRob2Rtb2RpZmllcnMuCgoxMi8xMS8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoaXMgZml4IHNvbWUgcmVjdXJyaW5nIHJlcG9ydHMgYWJvdXQga2V5d29yZHMgbm90IGJlZW4KCSAgICBwcm9wZXJseSBpZGVudGlmaWVkIGFuZCB3YXJuZWQsIGFuZCBpdCBzb2x2ZXMgdGhlIHByb2JsZW0KCSAgICBvZiBob3cgdG8gYWRkIGEgdGVzdCBmaWxlIHRvIHRoZSB0ZXN0LXN1aXRlIHN1Y2ggdGhhdCBpdAoJICAgIGRvZXNuJ3QgdXNlIGFueSBrZXl3b3JkIG9mIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcwoJICAgIChhbmQgZG9pbmcgaXQgd2l0aG91dCBjb21waWxpbmcgdGhlIHRlc3QgZm9yIGFsbCB0aGUKCSAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCB0aGluZyB0aGF0IGlzIG5vdCBhbHdheXMgcG9zc2libGUsCgkgICAgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHlvdSB0byBrbm93IGFsbCB0aGUgc3VwcG9ydGVkCgkgICAgbGFuZ3VhZ2Uga2V5d29yZHMsIHRoaW5nIHRoYXQgaXMgYWx3YXlzIGltcG9zc2libGUpLgoKCSAgICBTbyB0aGVzZSBhcmUgdGhlIGNoYW5nZXMgZ2xvYmFsbHkgc3BlYWtpbmc6CgoJICAgIC0gVW5pZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUga2V5d29yZCB3YXJuaW5ncyB0aHJvdWdoCgkgICAgICB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlczogYWxsIHRoZSBsYW5ndWFnZXMgaGFzIG5vdyBhCgkgICAgICBzZXBhcmF0ZSBmaWxlIHRoYXQgZGVmaW5lcyB0aGUga2V5d29yZHMgb3IgYmFkIG5hbWVzOgoKCQkgIHB5dGhvbi9weXRob25rdy5zd2cKCQkgIGNoaWNrZW4vY2hpY2tlbmt3LnN3ZwogICAgICAgICAgICAgICAgICAuLi4uCgoJICAgIC0gQWRkZWQga2V5d29yZCBsaXN0IGZvciBtb3N0IG9mIHRoZSBsYW5ndWFnZXMgdGhhdCBkaWRuJ3QKCSAgICAgIGhhdmUgb25lICh1c2luZyB0aGUgbmV3IHNlcGFyYXRlZCBmaWxlKS4KCQkgICAgCSAgICAKCSAgICAtIEFkZGVkIHRoZSAiQWxsIGtleXdvcmRzIiB3YXJuaW5nIHN1cHBvcnQ6IC1XYWxsa3cgb3B0aW9uLgoKICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGluY2x1ZGUgYWxsIHRoZSBrbm93biBrZXl3b3JkcwoJICAgICAgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcywgYW5kIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICAgICBzd2lnIC1XYWxsa3cgLi4uLgoJICAgIAoJICAgICAgVGhpcyB3aWxsIGhlbHAgdG8gdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIGEgdGVzdC1zdWl0ZQoJICAgICAgZmlsZSB0aGF0IGNhbiBiZSBjb21waWxlZCBpbiBhbGwgdGhlIHN3aWcgc3VwcG9ydGVkCgkgICAgICBsYW5ndWFnZXMsIGFuZCBpdCB3aWxsIGJlIGFsc28gaGVscGZ1bCBmb3IgdXNlcnMgd2hvCgkgICAgICB3YW50IHRvIGNyZWF0ZSBtdWx0aS1sYW5ndWFnZSBsaWJyYXJpZXMuCgkgICAgCgkgICAgQW5kIHRoZXNlIGFyZSB0aGUgZGV0YWlsZWQgY2hhbmdlcyAobW9zdGx5IGZpbGUgYWRkaXRpb24pOgoKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgYWxyZWFkeSBoYXZlIHNvbWUgc29ydCBvZiBrZXl3b3JkCgkgICAgICB3YXJuaW5nIGxpc3QsIG1vdmUgaXQgdG8gYW4gZXh0ZXJuYWwgbGFuZ3VhZ2Vrdy5zd2cKCSAgICAgIGZpbGUsIGllOgoJICAgIAoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHB5dGhvbi5zd2cgLT4gcHl0aG9ua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gY2hpY2tlbi5zd2cgLT4gY2hpY2tlbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIHRjbDguc3dnIC0+IHRjbGt3LnN3ZwogCiAgICAgICAgICAgICAgYW5kIHJlLWluY2x1ZGUgbGFuZ3VhZ2Vrdy5zd2cgZnJvbSBsYW5ndWFnZS5zd2cuCgkgICAgCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlIHRoYXQgZGlkbid0IGhhdmUgYSBrZXl3b3JkIGxpc3QsIGFuZAoJICAgICAgZm9yIHRoZSBvbmVzIHRoYXQgSSBjb3VsZCBmaW5kIGEgbGlzdCwgYWRkIHRoZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSwgaWU6CgogICAgICAgICAgICAgICAgIGNzaGFycC9jc2hhcnBrdy5zd2cKICAgICAgICAgICAgICAgICBqYXZhL2phdmFrdy5zd2cKICAgICAgICAgICAgICAgICBwaHA0L3BocGt3LnN3ZwoJCSBwaWtlL3Bpa2Vrdy5zd2cJIAoJCSBydWJ5L3J1Ynlrdy5zd2cKCgogICAgICAgICAgICAgIGFsc28gYWRkIGEgbGluZSBpbiBsYW5ndWFnZS5zd2cgdG8gaW5jbHVkZQoJICAgICAgbGFuZ3VhZ2Vrdy5zd2csIGJ1dCBub3cgaXQgaXMgY29tbWVudGVkISEhLCBsaWtlIGluCgkgICAgICBqYXZhLnN3ZzoKCiAgICAgICAgICAgICAgICAgIC8qIGphdmEga2V5d29yZHMgKi8KICAgICAgICAgICAgICAgICAgLyogcGxlYXNlIHRlc3QgYW5kIGFjdGl2YXRlICovCiAgICAgICAgICAgICAgICAgIC8vJWluY2x1ZGUgImphdmFrdy5zd2ciCgoJICAgICAgaWUsIHRoZXJlIHdpbGwgYmUgbm8gY2hhbmdlIGluIGhvdyBzd2lnIHJ1bnMgbm9ybWFsbHkKCSAgICAgIHVudGlsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRlc3QgYW5kIHVuY29tbWVudCB0aGF0CgkgICAgICBsaW5lLgoJICAgICAgCgkgICAgICBTbywgcGxlYXNlIGNoZWNrIGVhY2ggbGFuZ3VhZ2Vrdy5zd2cgZmlsZSAoSSBsZWZ0IHRoZQoJICAgICAgbGluayB0byB0aGUga2V5d29yZCBsaXN0IHNvdXJjZSBmb3IgY2hlY2tpbmcpLCBhbmQgYWZ0ZXIKCSAgICAgIHRlc3RpbmcsIHVuY29tbWVudCB0aGUgJWluY2x1ZGUgbGluZS4KCgkgICAgLSBBZGRlZCB0aGUgZmlsZSBhbGxrdy5zd2csIHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUKICAgICAgICAgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlcy4KCgkgICAgICBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGhhcyBubyBsYW5ndWFnZWt3LnN3ZyBmaWxlIHJpZ2h0CgkgICAgICBub3csIGFuZCBpZiB0aGV5IG5lZWQgb25lLCBhZGQgdGhlIGZpbGUgaW50byB0aGUKCSAgICAgIGxhbmd1YWdlIGRpcmVjdG9yeSwgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBpbmNsdWRlCgkgICAgICBsaW5lIGludG8gdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgCgkgICAgLSBBZGRlZCB0aGUgLVdhbGxrdyB0aGF0IGluY2x1ZGVzIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIE5vdGUgdGhhdCB0aGUgb2xkIC1sYWxsa3cuc3dnIG9wdGlvbiBjb3VsZG4ndCBiZSB1c2VkCgkgICAgICBzaW5jZSBpdCBpbmNsdWRlIHRoZSBmaWxlIGFmdGVyIGl0IHdvdWxkIGJlIG5lZWRlZC4KCgoJICAgIEhvcGVmdWxseSwgdGhlIC1XYWxsa3cgb3B0aW9uIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQKCSAgICBydWxlcyBpbiB0aGUgcmVsYXRlZCB0ZXN0LXN1aXRlIE1ha2VmaWxlcywgc28sIHdoZW4KCSAgICBjcmVhdGluZyBhIG5ldyB0ZXN0LCBvciBhZGRpbmcgYSBuZXcgc3dpZyBsaWJyYXJ5IGZpbGUKCSAgICAobGlrZSBfc3RkX2RlcXVlLmkpLCBzd2lnIHdpbGwgd2FybiB5b3UgaWYgeW91IGFyZSB1c2luZyBhCgkgICAgYmFkIG5hbWUsIGNvbnNpZGVyaW5nIGFsbCB0aGUgbGFuZ3VhZ2Ugd2hlcmUgaXQgbmVlZHMgdG8KCSAgICBydW4uCgkgICAgCgkgICAgUmlnaHQgbm93IHlvdSBjYW4gdGVzdCBpdCBieSB1c2luZzoKCiAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUgU1dJRz0ic3dpZyAtV2FsbGt3IgoKCSAgICBvciB1c2luZyB5b3VyIGZhdm9yaXRlIHRhcmdldCBsYW5ndWFnZSwgaXQgZG9lc24ndCBtYXR0ZXIuCgoJICAgIEFuZCB5ZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGV4YW1wbGVzIHRoYXQgYXJlIHVzaW5nCgkgICAgcmVzZXJ2ZWQga2V5d29yZHMsIHNwZWNpYWxseSBmcm9tIGNzaGFycC4KICAgICAgICAgIAoJICAgICoqKiBSZW1lbWJlciAqKioqOiB0aGUgbmV3IGtleXdvcmQgd2FybmluZyBsaXN0cyBhcmUgbm90CgkgICAgaW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbnkgb2YgbGFuZ3VhZ2UgdGhhdCBiZWZvcmUgZGlkbid0CgkgICAgaGF2ZSBvbmUuIFRvIGVuYWJsZSB0aGUga2V5d29yZCB3YXJuaW5ncyBhcyB0aGUgZGVmYXVsdAoJICAgIGJlaGF2aW9yLCB0aGUgaW5jbHVzaW9uIG9mIHRoZSBsYW5ndWFnZWt3LnN3ZyBmaWxlIGhhcyB0bwoJICAgIGJlIHVuY29tbWVudGVkIGF0IGVhY2ggbGFuZ3VhZ2Uuc3dnIGZpbGUuCgoJICAgIFNvLCBhbGwgdGhlIGxhbmd1YWdlIG1haW50YWluZXJzLCBwbGVhc2UgY2hlY2sgdGhlCgkgICAga2V5d29yZHMgbGlzdC4gCgoJICAgIEFsc28sIHlvdSBjYW4gYWRkIGJ1aXQtaW4gbmFtZXMsIGFuZCBub3Qgb25seSBrZXl3b3JkcywgbGlrZQoJICAgICdUcnVlL0ZhbHNlJyBpbiBweXRob24uICBSZW1lbWJlciB0aGF0IHlvdSBjYW4gYmUgbW9yZQoJICAgIHNwZWNpZmljIGFuZCByZWZlciBvbmx5IHRvIG1lbWJlciBuYW1lcywgbGlrZSAqOjpjb25maWd1cmUKCSAgICBvciAqOjpjZ2V0IChzZWUgYW4gZXhhbXBsZSBpbiB0aGUgdGNsOC90Y2w4a3cuc3dnIGZpbGUpLAoJICAgIG9yIG9ubHkgZ2xvYmFsIG5hbWVzLCBsaWtlIDo6cmFuZ2UgKHNlZSBhbiBleGFtcGxlIGluIHRoZQoJICAgIHB5dGhvbi9weXRob25rdy5zd2cgZmlsZS4KCgkgICAgSnVzdCB0byBiZSBjb25zaXN0ZW50LCB1c2UgdGhlIGZvbGxvd2luZyBjb2RlczoKCgkgICAgLSBVc2UgY29kZSAzMTQgZm9yIGtleXdvcmQgYW5kL29yIGZhdGFsIGJhZCBuYW1lcy4KCSAgICAtIFVzZSBjb2RlIDMyMSBmb3IgYnVpdC1pbiBhbmQvb3Igbm90IGZhdGFsIGJhZCBuYW1lcy4KICAgICAgICAgICAKICAgICAgICAgICAgc28sIHRoZXkgY2FuJ3QgYmUgZGlzYWJsZWQvZW5hYmxlZCBpbmRlcGVuZGVudGx5IChzZWUKCSAgICBweXRob24vcHlodG9ua3cuc3dnIGZvciBleGFtcGxlcykuCgoJICAgICoqKiogQW5kIGRvbid0IGFkZCBhbnkgbmV3IHRlc3QgZmlsZSB3aXRob3V0IGNoZWNraW5nIGl0CgkgICAgd2l0aCB0aGUgLVdhbGxrdyBvcHRpb24hISAodGhhdCBpbmNsdWRlcyBtZSkgKioqKiouCgkgIAoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNGIGJ1ZyAjODU0NjM0CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFjY2VwdGluZyB0aGUgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yICcvJyBvbiAKICAgICAgICAgICAgV2luZG93cyBhbmQgdGhlIE1hYyBpbiBhZGRpdGlvbiB0byB0aGUgbmF0aXZlIG9uZSAoICdcJyBvbiAKICAgICAgICAgICAgV2luZG93cykuIFRoaXMgY2FuIGJlIHVzZWQgaW4gJWltcG9ydCwgJWluY2x1ZGUgYW5kIGNvbW1hbmRsaW5lIAogICAgICAgICAgICBvcHRpb25zIHRha2luZyBhIHBhdGgsIGZvciBleGFtcGxlIC1JLiBPbiBDeWd3aW4sIGJvdGggdGhlIFdpbmRvd3MKICAgICAgICAgICAgYW5kIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciBjYW4gbm93IGJlIHVzZWQgKHdhcyAnLycgb25seSkuCiAgICAgICAgICAgIAoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgogICAgICAgICAgICBbcHl0aG9uXSBJbXBsZW1lbnRpbmcgdGhlIHJ1bnRpbWUgInJlcHJvdGVjdGVkIiBkaXJlY3RvcgoJICAgIG1lbWJlcnMsIGlmIHlvdSBoYXZlOgogICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhcigpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBoZWxsbygpIHsgcmV0dXJuIGRvX2hlbGxvKCk7KQoKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGkoKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oZWxsbygpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlCgogICAgICAgICAgICAgICAgaW1wb3J0IG15X21vZHVsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyhteV9tb2R1bGUuQmFyKToKICAgICAgICAgICAgICAgICAgZGVmIGRvX2hlbGxvKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAKCSAgICAgICAgYiA9IEJhcigpICMgUHVyZSBDKysgRGlyZWN0b3IgY2xhc3MKICAgICAgICAgICAgICAgIGYgPSBGb28oKSAjIEMrKyBEaXJlY3RvciArIHB5dGhvbiBtZXRob2RzCgogICAgICAgICAgICAgICAgYi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBDKysgQmFyOjpkb19oZWxsbygpCiAgICAgICAgICAgICAgICBmLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIFB5dGhvbiBGb286OmRvX2hlbGxvKCkKCiAgICAgICAgICAgICAgICBiLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogCiAgICAgICAgICAgICAgICBiLmRvX2hlbGxvKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hlbGxvKCkgaXMgcHJvdGVjdGVkISEKICAgICAgICAgICAgICAgIGYuZG9faGVsbG8oKSAjIE9rLCBzaW5jZSBpdCBpdHMgcmVkZWZpbmVkIGluIHB5dGhvbi4KCiAgICAgICAgICAgIEhlcmUgQmFyLmRvX2hlbGxvIGlzIGFsd2F5cyBwcm90ZWN0ZWQsIGJ1dCBGb28uZG9faGVsbG8KICAgICAgICAgICAgaXMgInB1YmxpYyIsIGJlY2F1c2UgaXQgaXMgcmVkZWZpbmVkIGluIHB5dGhvbi4gQmVmb3JlLAoJICAgIGFsbCB0aGUgJ2RvX2hlbGxvJyBtZXRob2RzIHdlcmUgcHVibGljLgoKCSAgICBUaGlzIHNlZW1zIHRvIGJlIGEgZ29vZCBjb21wcm9taXNlIGJldHdlZW4gQysrIGFuZCBweXRob24KCSAgICBwaGlsb3NvcGhpZXMsIGllLCBhbGwgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZXRob2RzIGtlZXAKCSAgICBwcm90ZWN0ZWQgYXQgdGhlIHVzZXIgc2lkZSAoQysrIHdheSkgdW50aWwgdGhleSBhcmUKCSAgICByZWRlZmluZWQgKHB5dGhvbiB3YXksIHdlcmUgYWxsIGRlZmluZWQgbWV0aG9kcyBhcmUgYWx3YXlzCgkgICAgcHVibGljKS4gQW5kIHRoaXMgaXMgbm90IG9ubHkgYSBnb29kIGNvbXByb21pc2UsIGl0IGFsc28KCSAgICBzZWVtcyB0byBiZSB0aGUgb25seSB3YXkgdG8gZG8gaXQgOikuCgoJICAgIE5vdyBydWJ5IGhhcyBuYXRpdmUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlcnMsIGFuZCBweXRob24KCSAgICBwdXJlIHJ1bnRpbWUgc3VwcG9ydC4gSSBndWVzcyB0aGVzZSBhcmUgdGhlIHR3byBwb3NzaWJsZQoJICAgIGV4dHJlbWUgY2FzZXMuIEFuZCBob3BlZnVsbHksIHRoZXkgY291bGQgYmUgdXNlZCBhcwoJICAgIHRlbXBsYXRlcyB0byBtb2RpZnkgdGhlIG90aGVyIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQKCSAgICBkaXJlY3RvcnMsIHNvIHRoZXkgY2FuICJyZXByb3RlY3QiIHRoZSBwcm90ZWN0ZWQgZGlyZWN0b3IKCSAgICBtZW1iZXJzIGF0IHRoZSB0YXJnZXQgbGFuZ3VhZ2Ugc2lkZS4KCgkgICAgVGhpcyBmaW5pc2hlZCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIHN1cHBvcnQgZm9yIHRoZSAKCSAgICBweXRob24gbGFuZ3VhZ2UuIE9jYWxtIHdpbGwgbmVlZCB0byBhZGQgdGhlCgkgICAgInJlcHJvdGVjdGlvbiIgbGF0ZXIuCgoxMi8xMC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIFRoZSBmb2xsb3dpbmcgY2FzZSAocmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uKSB3YXMgZml4ZWQ6CgoJICAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAoJICAgICAgY2xhc3MgRm9vIHsgCgkgICAgICBwdWJsaWM6CgkgICAgICAgIHZvaWQgeSgpOwoKCSAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgaW50IHg7CgkgICAgICB9OwoKCSAgIHN3aWcgd2FybmVkIHRoYXQgdGhlIHN5bWJvbCAneCcgd2FzIGFscmVhZHkgZGVmaW5lZCwgYW5kCiAgICAgICAgICAgdGhlIHJlbmFtaW5nIGZhaWxzLiAneCcgd2FzIG5vdCBlbWl0dGVkLCBzaW5jZSBpdCBpcwogICAgICAgICAgIHByb3RlY3RlZCwgYnV0IGl0IHdhcyBrZXB0IGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0b28KICAgICAgICAgICBtdWNoIGluZm9ybWF0aW9uLgoKCSAgIE5vdyBzd2lnIHdvcmtzIGZvciBhbGwgdGhlIGNhc2VzIChwbGFpbiwgZGlyZWN0b3IgYW5kCgkgICBkaXJwcm90KSBhZ2Fpbi4gVGhpcyB3YXMgZml4ZWQgYnkgYWxsb3dpbmcgdGhlIHBhcnNlci55IHRvCgkgICBkZWNpZGUgbXVjaCBjbG9zZXIgd2hhdCB0byBkbyB3aXRoICd4Jy4gQmVmb3JlIGFsbCB0aGUKCSAgIGRpc2NhcmRpbmcgb3IgZ2VuZXJhdGlvbiB3YXMgcmVzb2x2ZWQgYXQgdGhlIGxhbmcuY3h4CgkgICBzdGFnZS4gQWxzbyB0aGUgY2hhbmdlcyBpbiBwYXJzZXIueSB0byBpbXBsZW1lbnQgdGhlCgkgICBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZSBhcmUgbm93IG11Y2ggbW9yZSBlbmNhcHN1bGF0ZWQsIGFuZAoJICAgdGhleSBnZXQgZGlzYWJsZWQgaWYgdGhlIG1vZGUgaXMgbm90IGVuYWJsZWQuIEJlZm9yZSB0aGUKCSAgIGRlYWN0aXZhdGlvbiB3YXMgZG9uZSBhdCB0aGUgZ2VuZXJhdGlvbiBzdGFnZSAobGFuZy5jeHgpLgoKCSAgIEJ5IHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgZGlyZWN0b3IgbW9kZSBpcyBlbmFibGVkLCBhbmQKCSAgICVyZW5hbWUgaXMgZG9uZSwgcmV1c2luZyBhIHByb3RlY3RlZCBtZW1iZXIgbmFtZSwgdGhlcmUgaXMKCSAgIGEgcGF0aG9sb2dpY2FsIGNhc2U6CgoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCiAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQSB7CgkgICAgIHB1YmxpYzoKCSAgICAgICB2b2lkIHkoKTsKCgkgICAgIHByb3RlY3RlZDoKCSAgICAgICBpbnQgeDsgICAgICAgICAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgaW50IHg7ICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICB2b2lkIHgoKTsgLyogd29ya3MgKi8KCSAgICAgICB0eXBlZGVmIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoKCSAgICAgICB2aXJ0dWFsIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGFzIGl0IHNob3VsZCwgc2luY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9vOjp4KCkgd2lsbCBiZSBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvciAqLwoKCSAgICAgICB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBidXQgc29tZXRpbWVzIGl0IHNob3VsZG4ndCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmNlIHRoZSBGb286OngoKSB3aWxsIG5vdCBiZSBlbWl0dGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBub3QgdmlydHVhbCAqLwoKCSAgICAgfTsKCgkgICBUaGUgbGFzdCBjYXNlIGlzIG5vdCBhbHdheXMgcmlnaHQgYmVjYXVzZSBhdCB0aGUgcGFyc2VyLnB5CgkgICBzdGFnZSBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVjaWRlIGlmIHRoZSBwcm90ZWN0ZWQgbWVtYmVyCgkgICBGb286OngoKSBjb3VsZCBvciBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcmVuYW1lZCBGb286OnkoKSwKCSAgIHNpbmNlIEZvbzo6eCgpIGNvdWxkIGJlIHZpcnR1YWwgYnkgaW5oZXJpdGFuY2UuCgoJICAgSSBndWVzcyB0aGlzIGp1c3QgYW4gaW50cmluc2ljIGxpbWl0YXRpb24sIGFuZCBubyBtdWNoIGNhbgoJICAgYmUgZG9uZSBhYm91dCBpdCB3aXRob3V0IHJlc29ydGluZyBpbnRvIGxhcmdlciBjaGFuZ2VzIHRvCgkgICBwb3N0cG9uZSwgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGUgbXVsdGlwbHkgc3ltYm9sCgkgICBkZXRlY3Rpb24gKGxhbmcuY3h4IHN0YWdlKS4KCSAgIAoJICAgU28sIGJ5IG5vdywgaXQgaXMganVzdCBjb25zaWRlcmVkIGEgd2VsbCBrbm93biAiZmVhdHVyZSIgaW4KCSAgIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbW9kZS4gVGhlIGdvb2QgbmV3cyBpcyB0aGF0IGl0IHNlZW1zCgkgICB0byBiZSBhIHJhcmUgY2FzZSwgYW5kIGl0IGNhbiBiZSBhdm9pZGVkIGJ5IHRoZSB1c2VyIGJ5CgkgICBoaWRpbmcgJ3gnIGJlZm9yZSByZW5hbWluZyAneSc6CgoJICAgICAlcmVuYW1lKF94KSBGb286OngoKTsKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKCSAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSB2aXJ0dWFsIG1ldGhvZCBkZXRlY3Rpb25zIG5vdyBwcm9wZXJseQoJICAgIHRyZWF0cyB0aGUgZm9sbG93aW5nIGNhc2VzOgoKICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28geyB0eXBlZGVmIGludCBJbnQ7IH0KCSAgICAgc3RydWN0IEEge307CgkgICAgIHR5cGVkZWYgQSBCOwoKICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICB2aXJ0dWFsIH5Gb28oKSB7fQoKICAgICAgICAgICAgICAgdmlydHVhbCBGb28qIGNsb25lcigpID0gMDsKCSAgICAgICB2aXJ0dWFsIGludCBnZXRfdmFsdWUoKSA9IDA7CgkgICAgICAgdmlydHVhbCBBKiBnZXRfY2xhc3MoKSA9IDA7CgkgICAgICAgdmlydHVhbCB2b2lkIGp1c3RfZG9faXQoKSA9IDA7CgkgICAgIH07CgogICAgICAgICAgICAgc3RydWN0IEJhciA6IEZvbwogICAgICAgICAgICAgewogICAgICAgICAgICAgICBCYXIqIGNsb25lcigpOwogICAgICAgICAgICAgICBmb286OkludCBnZXRfdmFsdWUoKTsKICAgICAgICAgICAgICAgQiogZ2V0X2NsYXNzKCk7CiAgICAgICAgICAgICAgIHZvaWQganVzdF9kb19pdCgpOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICBBbGwgdGhlIEZvbyBhbmQgQmFyIG1ldGhvZHMgYXJlIHZpcnR1YWwuICBBIG5ldyBhdHRyaWJ1dGUKCSAgICAidmlydHVhbDp0eXBlIiByZWNvcmQgdGhlIGJhc2UgcG9seW1vcnBoaWMgdHlwZS4gSW4gdGhlCgkgICAgcHJldmlvdXMgY2FzZXMgd2UgaGF2ZToKCgkgICAgICAgdHlwZSA6IEJhciAgICAgICB2aXJ0dWFsOnR5cGUgOiBGb28KCSAgICAgICB0eXBlIDogZm9vOjpJbnQgIHZpcnR1YWw6dHlwZSA6IGludAoJICAgICAgIHR5cGUgOiBCICAgICAgICAgdmlydHVhbDp0eXBlIDogQQoJICAgICAgIHR5cGUgOiB2b2lkICAgICAgdmlydHVhbDp0eXBlIDogdm9pZAoKICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGluIGxhbmd1YWdlcyAoamF2YStkaXJlY3RvcnMpCgkgICAgdGhhdCBjb3VsZCBoYXZlIHByb2JsZW1zIHJlZGVmaW5pbmcgQmFyKiBCYXI6OmNsb25lcigpLgoKCSAgICBJZiB5b3UgbmV2ZXIgaGFkIGNvZGUgbGlrZSB0aGUgYWJvdmUsIHlvdSB3aWxsIHNlZSBubwoJICAgIGVmZmVjdHMuIEJ1dCBpZiB5b3UgaGF2ZSBzb21lIGNvZGUgbGlrZSB0aGF0LCB5b3UKCSAgICB3aWxsIHNlZSBzb21lIGVmZmVjdHMgc2luY2Ugc29tZSBtZXRob2RzIHRoYXQKCSAgICBiZWZvcmUgd2VyZSBub3QgcHJvcGVybHkgdHJlYXRlZCBhcyB2aXJ0dWFsLAoJICAgIHdpbGwgc3RhcnQgdG8gYWN0IGxpa2UgdGhhdC4gVGhpcyBjb3VsZCBlbmxhcmdlCgkgICAgeW91ciBkaXJlY3RvciBjbGFzc2VzLgoJICAgIAoKMTIvMDgvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgKGRpcnByb3QpCgkgICAgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICAKCSAgICBJdCBjYW4gYmUgZW5hYmxlIGJ5IHVzaW5nICctZGlycHJvdCcgb3IgYnkgYWRkaW5nCgkgICAgdGhlIG9wdGlvbiB0byB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uLCBsaWtlOgoKICAgICAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiLGRpcnByb3Q9IjEiKSBteV9tb2R1bGUKCgkgICAgVGhpcyBtb2R1bGUgb3B0aW9uIHdhcyBhZGRlZCB0byBwcm9wZXJseSBjb21waWxlIHRoZQoJICAgIGRpcmVjdG9yX3Byb3RlY3RlZC5pIGFuZCBkaXJlY3Rvcl9uZXN0ZWQuaSBleGFtcGxlcy4KCSAgICAKCSAgICBUaGUgZmVhdHVyZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob25bMi4yLDIuM10gCgkgICAgYW5kIHJ1YnlbMS42LjddLCBib3RoIGF0IGNvbXBpbGF0aW9uIGFuZCBydW50aW1lLCBhbmQgCgkgICAgamF2YVtqMnNkazEuNC4xXzAxXSwgYnV0IG9ubHkgYXQgY29tcGlsYXRpb24gKG15IGphdmEKCSAgICBpbnN0YWxsYXRpb24gZG9lc24ndCBydW4gYW55IG9mIHRoZSBkaXJlY3RvciBleGFtcGxlcywKCSAgICBvbGRzIG5vciBuZXdzKS4KCgkgICAgUGxlYXNlIHRlc3QgZm9yIG9jYW1sIGFuZCBqYXZhLgoJICAgIAoJICAgIFRoZSBlcnJvcnMgcmVwb3J0ZWQgYnkgV2lsbGlhbSBhbmQgU2NvdHQgd2VyZSBmaXhlZCwKCSAgICBleGNlcHQgZm9yIGEgd2FybmluZyBhYm91dCAgU1dJR19KYXZhVGhyb3dFeGVjcHRpb24oKQoJICAgIG11bHRpcGx5IGRlZmluZWQuIEkgY2FuJ3QgcmVwcm9kdWNlIHRoaXMgZXJyb3Igd2l0aCBteQoJICAgIGV4YW1wbGVzLiBXZSB3aWxsIHdhaXQgZm9yIFNjb3R0IHRvIHNlbmQgdXMgYSBtaW5pbWFsCgkgICAgY2FzZS4KCgoxMi8wNy8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCBoYXMgYmVlbgoJICAgIGNvbXBsZXRseSBtb3ZlZCBvdXQgZnJvbSBweXRob24uY3h4LCBhbmQgbm93CgkgICAgcmVzaWRlcyBpbiB0aGUgY29tbW9uIGxhbmcuY3h4LCBlbWl0LmN4eCBhbmQKCSAgICBhbGxvY2F0ZS5jeHggZmlsZXMuIAoKCSAgICBUaGlzIG1lYW5zIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgZGlyZWN0b3JzLCBpZSwgcHl0aG9uLCBqYXZhLCBvY2FsbQoJICAgIGFuZCBydWJ5LgoKCSAgICBUaGUgY2hhbmdlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvbiAoY29tcGlsYXRpb24rcnVudGltZSkKCSAgICBhbmQgamF2YSAoanVzdCBjb21waWxhdGlvbikuCgkgICAgCgkgICAgUGxlYXNlIGFkZCBydW50aW1lIHRlc3RzIGZvciB0aGUgbWlzc2luZyBsYW5ndWFnZXMgCgkgICAgYW5kIHRlc3QgaXQuCgoJICAgIFRoZSAnLW5vZGlycHJvdCcgb3B0aW9uIHdhcyBtb3ZlZCB0byB0aGUgcHJpbmNpcGFsIG1haW4sCgkgICAgYW5kIGNhbiBiZSB1c2VkIGZyb20gYWxsIHRoZSBsYW5ndWFnZXMuCgoxMi8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIGFuZCBpbXByb3ZlZCBlcnJvciBjaGVja2luZyBvZiBTVFJJTkdfT1VUIHR5cGVtYXBzIGluIAogICAgICAgICAgICB2YXJpb3VzLmkuCgoxMi8wNC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgoJICAgIC0gTm93IHRoZSB2aXJ0dWFsIG1lbWJlcnMgd2l0aCBubyBleHBsaWNpdCBkZWNsYXJhdG9yCgkgICAgYXJlIHByb3Blcmx5IGlkZW50aWZpZWQ6CgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7CiAgICAgICAgICAgICAgICAgIGludCBmKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBIZXJlLCBCOjpmKCkgaXMgdmlydHVhbCwgYW5kIHRoZSBkaXJlY3RvciBhbmQgdGhlCgkgICAgdmlydHVhbCBlbGltaW5hdGlvbiBtZWNoYW5pc20gbm93IHJlY29nbml6ZSB0aGF0LgoKICAgICAgICAgICAgLSBbQyNdIFRoaXMgZml4IGFsc28gZml4ZXMgdGhlIHByb2JsZW0gd2hlcmUgJ292ZXJyaWRlJyB3YXMgbm90IGJlaW5nIAogICAgICAgICAgICB1c2VkIG9uIGFueSBvdmVycmlkZGVuIHZpcnR1YWwgbWV0aG9kLCBzbyBmb3Igc3RydWN0IEIgYWJvdmUsIAogICAgICAgICAgICB0aGlzIEMjIGNvZGUgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBCIDogQSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IGYoKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoJICAgIC0gSW5pdGlhbCBzdXBwb3J0IGZvciBwcm90ZWN0ZWQgdmlydHVhbCBtZXRob2RzLiBUaGV5IGFyZSBub3cKCSAgICBwcm9wZXJseSBlbWl0dGVkIHdoZW4gdXNpbmcgd2l0aCBkaXJlY3RvciAocHl0aG9uIG9ubHkgYnkKCSAgICBub3cpLgoJICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSAgewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBCOwogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBmMigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgVGhpcyBjYW4gYmUgZGlzc2FibGVkIGJ5IHVzaW5nIHRoZSAnLW5vZGlycHJvdCcgb3B0aW9uLgoKCSAgICAtIFRoZSBmZWF0dXJlICdub2RpcmVjdG9yJyBpcyB3b3JraW5nIG5vdyBhdCB0aGUgdG9wIGxldmVsLAoJICAgIHNvLCBpdCBtdXN0IHdvcmsgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7CiAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm9kaXJlY3RvciIpIEE6OmYyOwoKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYyKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgCgkgICAgaW4gdGhpcyBjYXNlLCBvbmx5ICdmMScgaXMgZXhwb3J0ZWQgdG8gdGhlIGRpcmVjdG9yIGNsYXNzLgoJICAgIAoJICAgIC0gQWRkZWQgZGlyZWN0b3Igc3VwcG9ydCBmb3IgY29uc3QgVFlQRSYgYXJndW1lbnRzIChweXRob24pLgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIElOT1VUIGFuZCBPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3Igd2hlbiB0aGUgSk5JIHR5cGUgCiAgICAgICAgICAgIGlzIGJpZ2dlciB0aGFuIHRoZSBDIHR5cGUuIEZvciBleGFtcGxlLCB1bnNpZ25lZCBsb25nICgzMmJpdHMgb24gbW9zdCBzeXN0ZW1zKQogICAgICAgICAgICBpcyBtYXBwZWQgdG8gamxvbmcgKDY0Yml0cykuIFJldHVybmVkIHZhbHVlIHdhcyBpbmNvcnJlY3QuIEJ1ZyByZXBvcnRlZCBieSAKICAgICAgICAgICAgQnJpYW4gSGF3bGV5LgoKMTIvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQmV0dGVyIGZpeCBmb3IgZW50cnkgZGF0ZWQgMDUvMTEvMjAwMy4gRml4ZXMgdGhlIGZvbGxvd2luZwogICAgICAgICAgICB0eXBlbWFwczoKCiAgICAgICAgICAgIEphdmE6IGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCiAgICAgICAgICAgIEMjOiBjc2Jhc2UsIGNzaW50ZXJmYWNlcywgY3NpbXBvcnRzLCBjc2NsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBjc2ZpbmFsaXplLCBjc2dldGNwdHIgJiBjc2NvZGUuCgogICAgICAgICAgICBJdCBhbHNvIGZpeGVzIGJ1ZyBpbiB1c2luZyBhcnJheXMgb2YgQyBzdHJ1Y3RzIHdpdGggYXJyYXlzX2phdmEuaSAKICAgICAgICAgICAgYXMgcmVwb3J0ZWQgU2NvdHQgTWljaGVsLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybF0gRml4ZWQgWyA4NTIxMTkgXSByZWN1cnNpdmUgaW5oZXJpdGFuY2UgaW4gb3V0cHV0IC5wbSwgcGVybDUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRG93bGluZy4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgWyA3NTUzODIgXSBjYWxsaW5nIGZ1bmMoY29uc3QgdmVjdG9yPFQ+JiBwKSBldmFsdWF0ZXMgcFswXSBpbiBpbnRlcnAuCiAgICAgICAgICAgIFRoZSBUY2wgdHlwZSBjaGVja2VyIHdhcyBpbXByb3Blcmx5IGhhbmRsaW5nIHRoZSBpbnRlcnByZXRlciByZXN1bHQgd2hlbgogICAgICAgICAgICB0eXBlIHZpb2xhdGlvbnMgd2VyZSBzdXBwb3NlZCB0byBiZSBpZ25vcmVkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGF2aXUgUG9wcC1Ob3dhay4KCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDU0NTA1OCBdIGNvbmZpZ3VyZSdzIC0td2l0aC10Y2xpbmNsIGhhcyBubyBlZmZlY3QKCjExLzMwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA3NjY0MDkgXSBtaXNzaW5nIHN5bWJvbCBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBkdXJpbmcgbW9kdWxlIGxvYWQKICAgICAgICAgICAgU1dJR3MgaW50ZXJuYWwgZnVuY3Rpb25zIGFyZSBhbGwgc3RhdGljIGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGRpZmZlcmVudCBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHRvIHNoYXJlIGFueSBjb2RlIGF0IHJ1bnRpbWUuCgoxMS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgODQ4MzM1IF0gRGlyZWN0b3JzOiAjaW5jbHVkZSB3cmFwcGVyIC5oIGZpbGUgLSB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgYWRkaW5nIGEgZGlyZWN0b3J5IHRvIHRoZSBnZW5lcmF0ZWQgI2luY2x1ZGUgImZvb193cmFwLmgiIHN0YXRlbWVudAogICAgICAgICAgICBpbiBzb21lIHNpdHVhdGlvbnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgODQ5MDY0IF0gSkFWQSA6IEFjY2VzcyBtb2RpZmllciBmb3IgZGVyaXZlZCBjbGFzcyB3cm9uZy4KICAgICAgICAgICAgVGhlIGRlbGV0ZSgpIG1ldGhvZCBpcyBhbHdheXMgcHVibGljIG5vdy4gSXQgdXNlZCB0byBiZSBwcm90ZWN0ZWQgd2hlbmV2ZXIgYSAKICAgICAgICAgICAgZGVzdHJ1Y3RvciB3YXMgbm9uIHB1YmxpYy4gQW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gcnVudGltZSAKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpbnN0ZWFkIG9mIG1ha2luZyBkZWxldGUoKSBwcm90ZWN0ZWQgbm93LgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg1MDE1MSBdIFBZVkVSU0lPTiB3aXRoIHB5dGhvbjIuMyBpbiBjb25maWd1cmUgb2YgU1dJRyAxLjMuMTkgKE1heWJlKS4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgIFsgODUwNjY2IF0gI2luY2x1ZGUgZXh0cmEgbGluZSBhZGRlZC4gIAogICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggc29tZSBwcm9ibGVtcyB3aXRoIGdldHRpbmcgY29ycmVjdCBsaW5lIG51bWJlcnMgb24KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGFub3RoZXIgb25lIG9mIE1hcmNlbG8ncyBldmlsIHRlbXBsYXRlIGJ1Z3MgKGluZmluaXRlCiAgICAgICAgICAgIHJlY3Vyc2lvbikuIFsgODQ5NTA0IF0gdGVtcGxhdGUgYW5kIHR5cGVkZWYgLT4gaW5mLiByZWN1cnNpb24uCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6CgoJICAgICAgICAgaW50ICp4ID0gJnNvbWVhcnJheVswXTsKCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NTY1NTIgXSBtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgY2xhc3Mgc2NvcGUgd2l0aCAifCIuCiAgICAgICAgICAgIFRoaXMgaXMgcmVhbGx5IG9ubHkgYSBiYW5kLWFpZCBmaXggZm9yIHVzZSBvZiBjbGFzcy1lbnVtcyBpbgogICAgICAgICAgICBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgZW51bSBGbGFnIHsgZmxhZzEgPSAweDEsIGZsYWcyID0gMHgyIH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB4ID0gZmxhZzEgfCBmbGFnMik7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlOiB0aGVyZSBhcmUgc3RpbGwgc29tZSAobW9yZSBzdWJ0bGUpIGNhc2VzIHRoYXQgYXJlIGJyb2tlbiwKICAgICAgICAgICAgYnV0IGhhcmQgdG8gZml4IGR1ZSB0byBhbiBpc3N1ZSB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4gV2lsbAogICAgICAgICAgICBhZGRyZXNzIGxhdGVyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEbWl0cnkgTWlyb25vdi4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgODQwODc4IF0gc3VwcG9ydCBmb3IgJWlubGluZSB7IC4uLiB9IChQQVRDSCkuCiAgICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kICVpbmxpbmUgJXsgLi4uICV9IGlzIHRoYXQgdGhlCiAgICAgICAgICAgIGVuY2xvc2VkIHRleHQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gICBUaGlzCiAgICAgICAgICAgIGFsbG93cyBzcGVjaWFsIG1hY3JvcyBhbmQgb3RoZXIgcHJvY2Vzc2luZyB0byBiZSB1c2VkIGluIAogICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoICVpbmxpbmUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgzNjkwMyBdIEMrKyBpbmNvbnNpc3RlbmN5ICh3aXRoIHZvaWQgYXJndW1lbnRzKS4KICAgICAgICAgICAgU1dJRyB3YXMgaGF2aW5nIGRpZmZpY3VsdHkgd2l0aCBmKCkgdnMgZih2b2lkKSBpbiBDKysgcHJvZ3JhbXMuCiAgICAgICAgICAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZih2b2lkKSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYoKTsgICAgLy8gTm90IG1hdGNoZWQgdG8gZih2b2lkKSBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgfTsgCgogICAgICAgICAgICBUaGUgcGFyc2VyIG5vdyBub3JtYWxpemVzIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0gZih2b2lkKSAKICAgICAgICAgICAgaW4gQysrIGNsYXNzZXMgdG8gZigpLiAgVGhpcyBzaG91bGQgZml4IGEgdmFyaWV0eSBvZiBzdWJ0bGUgCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UsIG9wdGltaXphdGlvbnMsIG92ZXJsb2FkaW5nLCBldGMuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFydGhvIEJob3dtaWNrLgogCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJbmNvcnBvcmF0ZWQgWyA4NDEwNzQgXSBiZXR0ZXIgY3JvYWtpbmcgKFBBVENIKS4gIFRoaXMgZml4ZXMgc29tZSBwcm9ibGVtcwogICAgICAgICAgICB3aXRoIHN0cmluZ3MgYW5kIHByb3ZpZGVzIHNvbWUgbmV3IGVycm9yIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgogICAgICAgICAgICAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTgzNSBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBjYXN0OiB0eHQgPSAoY2hhciAqKSJ0eHQiIHN5bnRheCBFcnJvci4KICAgICAgICAgICAgVGhlIHBhcnNlciBzaG91bGQgbm93IGFjY2VwdCB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpzID0gKGNoYXIgKikgIkhlbGxvIik7CgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENsYXVkaXVzIFNjaG5vcnIuCgoxMS8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIHByb2JsZW0gd2l0aCBjcm9zcyBtb2R1bGUgbGlua2luZy4gIFByZXZpb3VzbHkgbW9kdWxlcyByZWZlcnJlZAogICAgICAgICAgICB0byBiYXNlIGNsYXNzZXMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZS4gICBOb3csIHRoZSBtb2R1bGUgbG9va3MgdXAgYmFzZQogICAgICAgICAgICBjbGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgc3lzdGVtIGl0c2VsZi0tLWF2b2lkaW5nIHRoZSBuZWVkIHRvIGxpbmsgdG8gYSBnbG9iYWwKICAgICAgICAgICAgbGlrZSBiZWZvcmUuICBDYXZlYXQ6ICBtb2R1bGVzIHdpdGggYmFzZSBjbGFzc2VzIG11c3QgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICBtb2R1bGVzIHdpdGggZGVyaXZlZCBjbGFzc2VzLgogCjExLzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgdXNlICgpIHRvIHJlcHJlc2VudCBudWxsIHBvaW50ZXJzLAoJICAgIGFzIGl0IGlzIGRvbmUgaW4gLWdoIG1vZGUuCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgQWRkIGEgZ2VuZXJhdGVkIHNjcmlwdCAicHJlaW5zdC1zd2lnIiwgd2hpY2ggY2FuIGJlIHVzZWQKCSAgICB0byBpbnZva2UgU1dJRyBiZWZvcmUgaXQgaGFzIGJlZW4gaW5zdGFsbGVkLiAgSXQgYXJyYW5nZXMKCSAgICB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZQoJICAgIHVzZWQuIAoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGRvbid0IGZvcmdldCB0byBjYWxsIFNXSUdfR3VpbGVfSW5pdC4KCSAgICBBZGQgYSBTV0lHX2NvbnRyYWN0X2Fzc2VydCBtYWNyby4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFVwZGF0ZSB0aGUgY29uZmlndXJlIGNoZWNrIGZvciB0aGUgZHluZXh0IG9iamVjdCB0byB3b3JrCgkgICAgd2l0aCBNelNjaGVtZSAyMDUuCgoxMS8yMC8yMDAzOiBtbWF0dXMKCSAgICBGaXhlZCB0aGUgaW5jbHVkZS9pbXBvcnQgZXJyb3IgcmVwb3J0ZWQgYnkgS2VyaW0gQm9yY2hhZXYsCgkgICAgd2hlcmUgdHdvIGZpbGVzIHdpdGggbmFtZXMgbGlrZQoKCSAgICAnZGlyMS9oZWxsby5pJwoJICAgICdkaXIyL2hlbGxvLmknCgkgICAgCgkgICAgY2FuIG5vdCBiZSBpbmNsdWRlIGF0IHRoZSBzYW1lIHRpbWUuIFN3aWcgd2FzIGluY2x1ZGluZwoJICAgIGp1c3QgdGhlIGZpcnN0IG9uZSwgYXNzdW1pbmcgdGhlIHNlY29uZCBvbmUgd2FzIG5vdCBhCgkgICAgZGlmZmVyZW50IG9uZSwgc2luY2UgaXQgd2FzIGNoZWNraW5nL2tlZXBpbmcganVzdCB0aGUKCSAgICBiYXNlbmFtZSAnaGVsbG8uaScuCgoxMS8xOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFNXSUcgcnVudGltZSBsaWJyYXJ5IHN1cHBvcnQuIAogICAgICAgICAgICAgIC0gIFRoZSAtYyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gLW5vcnVudGltZQogICAgICAgICAgICAgIC0gIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtcnVudGltZS4gIFdoZW4gc3VwcGxpZWQsIHRoaXMKICAgICAgICAgICAgICAgICBpbnNlcnRzIHRoZSBzeW1ib2wgU1dJR19HTE9CQUwgaW50byB0aGUgd3JhcHBlciBjb2RlLiAgVGhpcywKICAgICAgICAgICAgICAgICBpbiB0dXJuLCBtYWtlcyBhbGwgb2YgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgZ2xvYmFsbHkKICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAtIE5ldyBsaWJyYXJ5IGZpbGU6IHN3aWdydW4uaS4gICBVc2VkIHRvIGNyZWF0ZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAgZm9yIHJ1bnRpbWUgbGlicmFyeSAoaWYgbmVlZGVkKS4KICAgIAoxMS8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgJ21ha2Ugc3JjcnBtJyBycG1idWlsZCBmaXggLSBwYXRjaCBmcm9tIEpvZSBDb29wZXIKCjExLzE4LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIENoYW5nZSBtZWFuaW5nIG9mIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWd1aWxlIHRvCgkgICAgdGhlIG5hbWUgb2YgdGhlIEd1aWxlIGV4ZWN1dGFibGUuICBUaGUgbmV3IG9wdGlvbiAtLXdpdGgtZ3VpbGUtcHJlZml4IAoJICAgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWUgd2hlcmUgR3VpbGUgaXMKCSAgICBpbnN0YWxsZWQuICAoSG93ZXZlciwgdXN1YWxseSBpdCBzdWZmaWNlcyB0byB1c2UgdGhlCgkgICAgc2luZ2xlIG9wdGlvbiAtLXdpdGgtZ3VpbGUtY29uZmlnLikgIAoJICAgIFdoZW4gcnVubmluZyB0aGUgcnVuIHRlc3RzIHRlc3Qtc3VpdGUsIG1ha2Ugc3VyZSB0byB1c2UgdGhlCgkgICAgdmVyc2lvbiBvZiBHdWlsZSB0aGF0IFNXSUcgd2FzIGNvbmZpZ3VyZWQgZm9yLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW1wcm92ZW1lbnRzIHRvIG9iamVjdC1vd25lcnNoaXAgbWFuYWdlbWVudCBpbiAKCSAgICAiLXNjbSIgbW9kZS4gIChUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgZGVmYXVsdCAiLWdoIiBtb2RlLikKCSAgICAqIFJlbmFtZWQgdGhlIHNtb2IgdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuCgkgICAgICBiZSBnYXJiYWdlIGNvbGxlY3RlZCBmcm9tICJjb2xsZWN0ZWQgc3dpZyIgdG8gImNvbGxlY3RhYmxlCgkgICAgICBzd2lnIiwgd2hpY2ggaXMgbW9yZSBwcmVjaXNlLiAgCgkgICAgKiBFeHBvcnQgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb25zIGFnYWluLiAgSXQgaXMgbm93CiAJICAgICAgYWxsb3dlZCB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3RvcnMsIGV2ZW4gZm9yCgkgICAgICBnYXJiYWdlLWNvbGxlY3RlZCBwb2ludGVyIG9iamVjdHMuICBBIHBvaW50ZXIgb2JqZWN0CgkgICAgICB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0byBhIGRlc3RydWN0b3IgaXMgbWFya2VkIGluIGEKCSAgICAgIHNwZWNpYWwgd2F5IHVzaW5nIGEgbmV3IHNtb2IgdHlwZSwgImRlc3Ryb3llZCBzd2lnIi4KCSAgICAgIChUaGlzIGhlbHBzIGF2b2lkIG5hc3R5IG1lbW9yeSBidWdzLCB3aGVyZSByZWZlcmVuY2VzIHRvCgkgICAgICBkZWFkIEMgb2JqZWN0cyBhcmUgc3RpbGwgaGVsZCBpbiBTY2hlbWUuIE1vcmVvdmVyLCB0aGUKCSAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgbm90IHRyeSB0byBmcmVlIGEgZGVzdHJveWVkCgkgICAgICBvYmplY3Qgb25jZSBtb3JlLikKCSAgICAqIERlc3RydWN0b3ItbGlrZSBmdW5jdGlvbnMgY2FuIGFsc28gbWFyayB0aGVpciBhcmd1bWVudHMgCgkgICAgICBhcyBkZXN0cm95ZWQgYnkgYXBwbHlpbmcgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkRFU1RST1lFRC4KCSAgICAgIChJdCBjYWxscyB0aGUgZnVuY3Rpb24gU1dJR19HdWlsZV9NYXJrUG9pbnRlckRlc3Ryb3llZC4pCgkgICAgKiBGdW5jdGlvbnMgdGhhdCAiY29uc3VtZSIgdGhlaXIgb2JqZWN0cyAob3IgdGhhdCAib3duIgoJICAgICAgdGhlbSBhZnRlciB0aGUgY2FsbCkgY2FuIG1hcmsgdGhlaXIgYXJndW1lbnRzIGFzCgkgICAgICBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgYXBwbHlpbmcKCSAgICAgIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpDT05TVU1FRC4gIChJdCBjYWxscyB0aGUgZnVuY3Rpb24KCSAgICAgIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJOb25jb2xsZWN0YWJsZS4pCgkgICAgKiBUaGUgbWFjcm8gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVCBmcm9tIGxpYnJhcnkKCSAgICAgIHBvaW50ZXItaW4tb3V0LmkgY3JlYXRlcyBhZGRpdGlvbmFsIHR5cGVtYXBzIAoJICAgICAgUFRSVFlQRSAqSU5QVVRfQ09OU1VNRUQsIFBUUlRZUEUgKklOUFVUX0RFU1RST1lFRC4KCSAgICAgIFRoZXkgbWFyayB0aGUgcGFzc2VkIHBvaW50ZXIgb2JqZWN0IGxpa2V3aXNlLgoJICAgICAgVGhlIHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUIGNyZWF0ZXMgYSBnYXJiYWdlLWNvbGxlY3RhYmxlCgkgICAgICBwb2ludGVyIG9iamVjdCwgbGlrZSAlbmV3b2JqZWN0IGRvZXMgZm9yIGEgcmV0dXJuZWQgCgkgICAgICBwb2ludGVyLiAgVXNlIHRoZSBuZXcgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVRfTk9OQ09MTEVDVEFCTEUKCSAgICAgIHRvIGNyZWF0ZSBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBIYW5kbGUgJGlucHV0IGluICJmcmVlYXJnIiB0eXBlbWFwcy4KCSAgICBOZXZlciBxdWFsaWZ5IEdPT1BTIHNsb3QgbmFtZXMgd2l0aCB0aGUgY2xhc3MgbmFtZS4gCgkgICAgSGFuZGxlIG9wdGlvbmFsIGFyZ3VtZW50cyBwcm9wZXJseSBpbiB0aGUgR09PUFMgbWV0aG9kcy4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgaW5zdGFsbGF0aW9uIHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgQXV0b21ha2UtMS44LgogICAgICAgICAgICBta2luc3RhbGxkaXJzIHdhcyBiZWluZyB1c2VkIGJ5IGEgbm9uLUF1dG9tYWtlIG1ha2VmaWxlLiAKICAgICAgICAgICAgbWtpbnN0YWxsZGlycyBpcyBiZWluZyBwaGFzZWQgb3V0IGFuZCBzbyB3YXMgbm90IGJlaW5nCiAgICAgICAgICAgIGNyZWF0ZWQgYnkgQXV0b21ha2UuIGluc3RhbGwtc2ggdXNlZCBpbnN0ZWFkLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBpbXByb3ZlbWVudHMsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzIHNpbmNlIAogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuICVmZWF0dXJlKCJzaGFkb3ciKSBpcyB1c2VkIHRvIGFkZCBjb2RlIHRvIHNoYWRvdwogICAgICAgICAgICBjbGFzc2VzLCB0aGUgc3BlY2lhbCB2YXJpYWJsZSAkYWN0aW9uIGV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIHVuZGVybHlpbmcgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgbm9ybWFsbHkuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gZ2VuZXJhdGluZyBwcm94eSBjbGFzcyBjb2RlLCBTV0lHIGVtaXRzIGEgZmV3CiAgICAgICAgICAgIGRlZmF1bHQgbWV0aG9kcyBmb3IgX19yZXByX18oKSBhbmQgb3RoZXIgUHl0aG9uIHNwZWNpYWwKICAgICAgICAgICAgbWV0aG9kcy4gIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZW1pdHRlZCBhZnRlciBhbGwgb2YgdGhlCiAgICAgICAgICAgIGNvbnRlbnRzIG9mIGEgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgaGFyZCB0byBvdmVycmlkZQogICAgICAgICAgICB0aGUgbWV0aG9kcyB1c2luZyAlcHl0aG9uY29kZSBhbmQgc29tZSBvdGhlciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgICAgYWxsb3cgY29kZSB0byBiZSBpbnNlcnRlZCBpbnRvIGEgY2xhc3MuICBUaGVzZSBzcGVjaWFsIG1ldGhvZHMKICAgICAgICAgICAgYXJlIG5vdyBlbWl0dGVkIGludG8gdGhlIGNvZGUgKmJlZm9yZSogYWxsIG9mIHRoZSBvdGhlciBtZXRob2RzLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgRXJpYyBKb25lcy4KIAoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFByZXByb2Nlc3NvciBlbmhhbmNlbWVudC4gICBGb3IgaW5jbHVkZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlICJmb28vYmFyLmkiCgogICAgICAgICAgICB0aGUgZGlyZWN0b3J5ICJmb28iIGlzIG5vdyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggd2hpbGUgCiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGJhci5pLiAgVGh1cywgaWYgYmFyLmkgaW5jbHVkZXMgb3RoZXIKICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGV5IHdpbGwgYmUgZm91bmQuIFByZXZpb3VzbHksCiAgICAgICAgICAgIHlvdSB3b3VsZCBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHVzaW5nIC1JIHRvIG1ha2UgdGhpcwogICAgICAgICAgICB3b3JrIGNvcnJlY3RseS4gIE5vdGU6IHRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBiZWhhdmUgaW4KICAgICAgICAgICAgYW4gaWRlbnRpY2FsIG1hbm5lciBvbiBtYW55IChtb3N0PyBhbGw/KSBzeXN0ZW1zLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS2VyaW0gQm9yY2hhZXYuCgoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayBvbiBNYWMgT1NYIDEwLjMueCAoUGFudGhlcikuCiAgICAgICAgICAgIFRlc3RlZCB3aXRoIFB5dGhvbiwgVGNsLCBQZXJsLCBhbmQgUnVieS0tLWFsbCBvZiB3aGljaCBzZWVtIHRvIHdvcmsuCgoxMS8wOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIHRoZSB0eXBlbWFwcyBpbiB2YXJpb3VzLmkgd2hpY2ggd2VyZSBtb3N0bHkgYnJva2VuLgogICAgICAgICAgICBjaGFyICoqU1RSSU5HX0lOIGFuZCBjaGFyICoqU1RSSU5HX1JFVCB0eXBlbWFwcyByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBTVFJJTkdfQVJSQVkuIGZsb2F0ICpGTE9BVF9BUlJBWV9SRVRVUk4gdHlwZW1hcCByZW1vdmVkLgoKMTEvMDgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBUY2wgbW9kdWxlIG5vdyBlbWl0cyBhIHNhZmUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5CiAgICAgICAgICAgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmVtb3ZlZCBieSBydW5uaW5nICdzd2lnIC1ub3NhZmUnLgoKMTEvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gT25seSB1c2UgdGhlIFNDTV8gQVBJIHdoZW4gdGhlIGZ1bmN0aW9uCgkgICAgYHNjbV9zbG90X2V4aXN0c19wJyBleGlzdHMgKG5lZWRlZCBmb3IgR09PUFMgc3VwcG9ydCkuICAKCSAgICBUaGlzIGZ1bmN0aW9uIHdhcyByZW5hbWVkIGR1cmluZyB0aGUgR3VpbGUgMS41IHNlcmllcwoJICAgIGZyb20gYHNjbV9zbG90c19leGlzdHNfcCcuCgkgICAgUmVwb3J0IHRoZSByaWdodCBydW50aW1lIGxpYnJhcnkgd2hlbiBpbnZva2VkIHdpdGgKCSAgICAtc2NtIC1sZGZsYWdzLgoKMTEvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBGaXggIzc4MjA1Mi4gIFRoZSAtLXdpdGgtY2hpY2tlbmNmZyBjb25maWd1cmUKCSAgICBvcHRpb24gKGFuZCBvdGhlcnMpIHdlcmUgbm90IGFjY2VwdGVkLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTWVyZ2UgbmV3IHNldCBvZiBHT09QUyBjaGFuZ2VzIGJ5IEpvaG4gTGVuei4KCSAgICBHT09QUyBvYmplY3RzIGFyZSBub3cgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgYnkgdGhlIEMgY29kZS4KCSAgICBTb21lIGZpeGVzIHRvIHR5cGVtYXAtR09PUFMgaW50ZXJhY3Rpb24uCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZW1vdmUgdGhlIGZpbGUgYXJndW1lbnQgdG8gLXNjbXN0dWIgYW5kIC1nb29wcy4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgYWx3YXlzIGNhbGxlZCBNT0RVTEUuc2NtIG9yCgkgICAgTU9EVUxFLXByaW1pdGl2ZS5zY20sIHdoZXJlIE1PRFVMRSBpcyB0aGUgbW9kdWxlIG5hbWUgYW5kIAoJICAgICJwcmltaXRpdmUiIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSAtcHJpbXN1ZmZpeCBvcHRpb24uCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IHBsYWNlZCBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5CgkgICAgdGhlIC1vdXRkaXIgb3B0aW9uLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgkgICAgKFBhdGNoIGJ5IEpvaG4gTGVueiwgc2xpZ2h0bHkgbW9kaWZpZWQuKQoKCSAgICAqKiogSU5DT01QQVRJQklMSVRZIFtHdWlsZV0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgVW5pZnkgdGhlIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4gIFRoZSBzdGFuZGFyZAoJICAgIGZ1bmN0aW9ucyBhcmU6CgkgICAgICogU1dJR19OZXdQb2ludGVyT2JqIChQT0lOVEVSLCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gQ3JlYXRlIGFuIHNjcmlwdGluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgdHlwZWQKCQkgICBwb2ludGVyLiBGTEFHUyBhcmUgbGFuZ3VhZ2Ugc3BlY2lmaWMuCgkgICAgICogU1dJR19Db252ZXJ0UHRyIChJTlBVVCwgUkVTVUxULCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHN0b3JlIGl0IGluIHRoZSBwbGFjZSBSRVNVTFQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCAKCQkgICBvY2N1cnMsIHJldHVybiBub256ZXJvLgoJICAgICAqIFNXSUdfTXVzdEdldFB0ciAoSU5QVVQsIFRZUEUsIEFSR05VTSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICByZXR1cm4gaXQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCBvY2N1cnMsIHRocm93IGFuCgkJICAgZXhjZXB0aW9uLiAgSWYgQVJHTlVNID4gMCwgcmVwb3J0IGl0IGFzIHRoZSAKCQkgICBhcmd1bWVudCBudW1iZXIgdGhhdCBoYXMgdGhlIHR5cGUgbWlzbWF0Y2guCiAgICAgICAgICAgIFtHdWlsZV06ICAgIE5vIGNoYW5nZXMuCgkgICAgW016U2NoZW1lXTogTm8gY2hhbmdlcy4KCSAgICBbUGVybF06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iai4KCQkgICAgICAgIFRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgaXMga2VwdC4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgbm90CgkJCXN1cHBvcnRlZC4KCSAgICBbUHl0aG9uXTogICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbUnVieV06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbVGNsXTogICAgICBSZW1vdmUgdGhlICJpbnRlcnAiIGFyZ3VtZW50IG9mCgkJICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqLCBTV0lHX0NvbnZlcnRQdHIsCgkJICAgICAgICBTV0lHX0NvbnZlcnRQYWNrZWQsIGFuZCBTV0lHX0NvbnZlcnRQdHJGcm9tU3RyaW5nLgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSAKCQkJbm90IHN1cHBvcnRlZC4KCSAgICBObyBjaGFuZ2VzIHRvIFBpa2UgYmVjYXVzZSBpdHMgcG9pbnRlciBjb252ZXJzaW9uIGNvZGUgZGlkCgkgICAgbm90IGxvb2sgY29tcGxldGUuICBObyBjaGFuZ2VzIHRvIFBIUDQsIGJlY2F1c2UgSSBkaWQgbm90CgkgICAgdW5kZXJzdGFuZCBpdHMgcnVudGltZSBjb2RlLiAgTm8gY2hhbmdlcyB0byBDaGlja2VuCgkgICAgYmVjYXVzZSBtYWpvciBjaGFuZ2VzIGFyZSBleHBlY3RlZCBzb29uIGFueXdheS4gIE5vCgkgICAgY2hhbmdlcyB0byBKYXZhLCBPQ2FtbCwgQyMgYmVjYXVzZSB0aGV5IGRvIG5vdCBzZWVtIHRvCgkgICAgaGF2ZSBhIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4KCiAgICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW1RjbF0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW1Blcmw1LCBQSFA0LCBQaWtlLCBQeXRob24sIFJ1YnksIFRjbF06IFVzZSB0aGUKCSAgICBwcmVwcm9jZXNzb3IgdG8gcmVuYW1lIGV4dGVybmFsIGZ1bmN0aW9ucyBvZiB0aGUgU1dJRwoJICAgIHJ1bnRpbWUgQVBJIHRvIGZvbGxvdyB0aGUgbmFtaW5nIGNvbnZlbnRpb24KCSAgICBTV0lHXzxsYW5ndWFnZT5fPGZ1bmN0aW9uPi4gIFRoaXMgc2hvdWxkIGFsbG93IGxpbmtpbmcKCSAgICBtb3JlIHRoYW4gb25lIGludGVycHJldGVyIGludG8gYSBwcm9ncmFtLgoKMTAvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHNpbmNlIGludHJvZHVjaW5nIHRoZSBleGNlcHRpb24gYW5kIHN0ZDo6c3RyaW5nIGRlbGVnYXRlcy4KICAgICAgICAgICAgVGhlIGZpeCBvdmVyY29tZXMgbGlua2VyIGVycm9ycyB3aGVuIHVzaW5nIG1vcmUgdGhhbiBvbmUgU1dJRyBtb2R1bGUuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2j2cmsuCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjMzMDIgXSBJbmNyIFRjbCBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBBbGV4ZXkgRHlhY2hlbmtvLgogICAgICAgICAgICBOb3RlOiBuZWVkcyBkb2N1bWVudGF0aW9uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzI1IF0gbmV3IFB5dGhvbiBNb2R1bGUgb3B0aW9ucyBhbmQgZmVhdHVyZXMuCiAgICAgICAgICAgIFJvYmluIER1bm4gd3JpdGVzOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBtYWtlcyBhIG51bWJlciBvZiBjaGFuZ2VzIHRvIHRoZSBTV0lHIHB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgICAxLiBBZGQgLWFwcGx5IG9wdGlvbiwgYW5kIGNoYW5nZSB0aGUgZGVmYXVsdCBjb2RlCiAgICAgICAgICAgIG91dHB1dCB0byB1c2UgdGhlIGZvbygqYXJncywgKiprdykgY2FsbGluZyBzeW50YXgKICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyBhcHBseSgpLiBJZiB0aGUgLWFwcGx5IG9wdGlvbiBpcwogICAgICAgICAgICBnaXZlbiB0aGVuIGNvZGUgaXMgZ2VuZXJhdGVkIGFzIGJlZm9yZS4gVGhpcyBpcyB2ZXJ5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gUGF0Y2ggIzczNzI4MSBidXQgdGhlIG5ldyAtbW9kZXJuIG9wdGlvbgogICAgICAgICAgICBtYWtlcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhhdCBwYXRjaCB1bm5lY2Vzc2FyeSBzbyBpdAogICAgICAgICAgICBpcyBub3QgaW5jbHVkZWQgaGVyZS4KCSAgICAKICAgICAgICAgICAgMi4gQWRkIC1uZXdfcmVwciBvcHRpb24uIFRoaXMgaXMgdGhlIHNhbWUgYXMgbXkgUGF0Y2gKICAgICAgICAgICAgIzc5NzAwMiB3aGljaCBJIHdpbGwgbWFyayBhcyBjbG9zZWQgc2luY2UgaXQgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIG5lZWRlZC4gV2hlbiB0aGlzIG5ldyBvcHRpb24gaXMgdXNlZCB0aGVuIHRoZQogICAgICAgICAgICBfX3JlcHJfXyBtZXRob2RzIHRoYXQgYXJlIGdlbmVyYXRlZCBmb3IgcHJveHkgY2xhc3NlcwogICAgICAgICAgICB3aWxsIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGdpdmUgZGV0YWlscyBhYm91dCB0aGUKICAgICAgICAgICAgcHl0aG9uIGNsYXNzIGFuZCB0aGUgQysrIGNsYXNzLgoJICAgIAogICAgICAgICAgICAzLiBBZGQgJWZlYXR1cmUoImFkZHRvZnVuYyIpLiBJdCBhbGxvd3MgeW91IHRvIGluc2VydAogICAgICAgICAgICBvbmUgb3IgbW9yZSBsaW5lcyBvZiBjb2RlIGluc2lkZSB0aGUgc2hhZG93IG1ldGhvZCBvcgogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGlzIGFscmVhZHkgZ2VuZXJhdGVkLCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgbGlrZSAlZmVhdHVyZSgic2hhZG93IikgZG9lcy4KICAgICAgICAgICAgRm9yIF9faW5pdF9fIGl0IGdvZXMgYXQgdGhlIGVuZCwgZm9yIF9fZGVsX18gaXQgZ29lcwogICAgICAgICAgICBhdCB0aGUgYmVnaW5pbmcgYW5kIGZvciBhbGwgb3RoZXJzIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgICBpcyBleHBhbmRlZCBvdXQgdG8gYmUgbGlrZQoJICAgIAogICAgICAgICAgICBkZWYgQmFyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHZhbCA9IF9tb2R1bGUuRm9vX0JhcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHJldHVybiB2YWwKCSAgICAKICAgICAgICAgICAgYW5kIHRoZSAiYWRkdG9mdW5jIiBjb2RlIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIHRoZQogICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgdXNlZCBmb3IgYQogICAgICAgICAgICBwYXJ0aWN1bGFyIG1ldGhvZCBvciBmdW5jdGlvbiB0aGVuIHRoZSBzaG9ydGVyIGNvZGUgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGp1c3QgbGlrZSBiZWZvcmUuCgkgICAgCiAgICAgICAgICAgIDQuIEEgbGl0dGxlIGJpdCBvZiByZWZhY3RvcmluZyB0byBtYWtlIGltcGxlbWVudGluZwogICAgICAgICAgICBhZGR0b2Z1bmMgYSBsaXR0bGUgZWFzaWVyLgoJICAgIAogICAgICAgICAgICA1LiBBZGRlZCBhIC1tb2Rlcm4gY29tbWFuZC1saW5lIGZsYWcgdGhhdCB3aWxsIGNhdXNlCiAgICAgICAgICAgIFNXSUcgdG8gb21pdCB0aGUgY3J1ZnQgaW4gdGhlIHByb3h5IG1vZHVsZXMgdGhhdCBhbGxvd3MKICAgICAgICAgICAgaXQgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mIFB5dGhvbiBwcmlvciB0byAyLjIuIFRoZQogICAgICAgICAgICByZXN1bHQgaXMgYSBzaW1wbGVyLCBjbGVhbmVyIGFuZCBmYXN0ZXIgcHl0aG9uIHByb3h5CiAgICAgICAgICAgIG1vZHVsZSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIFB5dGhvbiAyLjIgb3IgZ3JlYXRlci4gCgoxMC8zMS8yMDAzOiBiZWF6bGV5IAogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE5IF0gWE1MIG1vZHVsZSB0d2Vha3MuCiAgICAgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC14bWxsaXRlIHRoYXQgCiAgICAgICAgICAgIGdyZWF0bHkgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGVtaXR0ZWQgWE1MIGNvZGUgYnkKICAgICAgICAgICAgZWxpbWluYXRpbmcgc29tZSBmaWVsZHMgbW9zdGx5IHVzZWQgaW4gU1dJRydzCiAgICAgICAgICAgIGludGVybmFsIHByb2Nlc3NpbmcuICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE3IF0gQWRkcyBEb2hTcGxpdExpbmVzIGZ1bmN0aW9uLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNzkwNyBdIGFyZ291dCBvYmplY3RzIG5vdCBiZWluZyB3cmFwcGVkIHByb3Blcmx5IChQQVRIKS4KICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgkgICAgIAoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI2OTk2IF0gcGVybCB0eXBlIGNoZWNraW5nIGlnbm9yZXMgcGVybCBzdWJjbGFzc2VzLgogICAgICAgICAgICBUaGlzIGVuaGFuY2VtZW50IG1ha2VzIGl0IHNvIHdyYXBwZWQgY2xhc3NlcyBhbmQgc3RydWN0cyBjYW4KICAgICAgICAgICAgYmUgc3ViY2xhc3NlZCBpbiBQZXJsIGFuZCB1c2VkIG5vcm1hbGx5LiAKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgoxMC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbnRQdHIgbWFyc2hhbGxlZCB3aXRoIGEgdm9pZCogaW5zdGVhZCBvZiBpbnQgaW4gQyBmdW5jdGlvbiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiBUaGUgY2FzdHMgdGh1cyBsb29rIG1vcmUgY29udmVudGlvbmFsLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAvLyBvbGQKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KGludCBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAqKFNoYXBlICoqKSZqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBuZXcKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KHZvaWQgKiBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAoU2hhcGUgKilqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoKMTAvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgSWYgYSBjbGFzcyBoYXMgb3ZlcmxvYWRlZCBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50IHgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgeCwgaW50IHkpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhbmQgdGhlIGNsYXNzIGlzIHVzZWQgYXMgYSBzbWFydCBwb2ludGVyOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb1B0ciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBTV0lHIHdvdWxkIHRyeSB0byBleHBvc2UgdGhlIHN0YXRpYyBtZW1iZXIgRm9vOjpiYXIKICAgICAgICAgICAgdGhyb3VnaCBGb29QdHItLS1yZXN1bHRpbmcgYm9ndXMgd3JhcHBlciBjb2RlIGFuZCBhIGNvbXBpbGVyCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRHVlIHRvIHRoZSB3YXkgaW4gd2hpY2ggb3ZlcmxvYWRpbmcgaXMgaGFuZGxlZCwgaXQgaXMKICAgICAgICAgICAgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBlbGltaW5hdGUgdGhlIHN0YXRpYyBtZXRob2QgaW4KICAgICAgICAgICAgdGhpcyBjYXNlLiAgVGhlcmVmb3JlLCBpdCBpcyBzdGlsbCBleHBvc2VkLiAgSG93ZXZlciwKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIG5vdyBjb21waWxlcyBhbmQgd29ya3MuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbl06IFJlbW92ZSBzeW1ib2wgY2xhc2hlcyBiZXR3ZWVuCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGJ5IHJlbmFtaW5nIGFsbCBleHRlcm4gY29tbW9uLnN3ZwoJICAgIGZ1bmN0aW9ucyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBiYXNpYyBHT09QUyBzdXBwb3J0LCBjb250cmlidXRlZCBieSBKb2huIExlbnouCgkgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgoJICAgIAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBOZXcgb3B0aW9uLCAtb25seS1zZXR0ZXJzLCB3aGljaCBkaXNhYmxlcwoJICAgIHRyYWRpdGlvbmFsIGdldHRlciBhbmQgc2V0dGVyIHByb2NlZHVyZXMgZm9yIHN0cnVjdHVyZSBzbG90cy4KCjEwLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIHJ1biB0ZXN0IGZvciByZWZlcmVuY2VfZ2xvYmFsX3ZhcnMgYnkgSm9obiBMZW56LgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBQYXJ0aWFsIHNvbHV0aW9uIHRvIFsgNzkyMTgwIF0gQysrIHNtYXJ0LXBvaW50ZXIvbmFtZXNwYWNlIG1peHVwIHJldmlzaXRlZC4KICAgICAgICAgICAgVGhlIHByb2JsZW0gaXMgbm90IGVhc3kgdG8gZml4IChhdCBsZWFzdCBpdCBkb2Vzbid0IHNlZW0gc28pLCBidXQgaXMKICAgICAgICAgICAgcmVsYXRlZCB0byB0aGUgaW5zdGFudGlhdGlvbiBvZiBxdWFsaWZpZWQgdGVtcGxhdGVzIGluc2lkZSBvZiBvdGhlcgogICAgICAgICAgICBuYW1lc3BhY2VzLiAgIFNXSUcgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZSByYXRoZXIKICAgICAgICAgICAgdGhhbiBnZW5lcmF0aW5nIGJyb2tlbiB3cmFwcGVycy4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MDAwMTIgXSBFTlRFUiBtYWNybyBmcm9tIENPUkUvc2NvcGUuaCBjbGFzaGVzIHdpdGggbGliYyBzZWFyY2guaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODExNTE4IF0gQ2FzdGluZyBpbnRzIHRvIGRvdWJsZXMgKHcvIHNvbHV0aW9uPykKICAgICAgICAgICAgQWRkcmVzc2VzIGEgcHJvYmxlbSB3aXRoIG92ZXJsb2FkaW5nIGluIHRoZSBQZXJsIG1vZHVsZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIERhbGxleS4KCjA5LzI4LzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGUgd2l0aCAtc2NtIG9wdGlvbl0gRml4IHR5cG8gaW4gZ2VuZXJhdGVkIGNvZGUgZm9yCgkgICAgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMuICBSZXBvcnRlZCBieSBKb2huIExlbnouCgowOS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODEyNTI4IF0gZXh0ZXJucyBub3QgY29ycmVjdCB3aGVuIHRocm93IGlzIGluIHNpZ25hdHVyZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCiAgICAgICAgICAgIAowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU1dJRyB3YXMgZ2VuZXJhdGluZyBhIG51bWJlciBvZiBzeW1ib2xzIHRoYXQgZGlkbid0IGNvbXBseSB3aXRoIAogICAgICAgICAgICB0aGUgSVNPIEMvQysrIHN0YW5kYXJkLCBpbiBwYXJ0aWN1bGFyIElTTy9JRUMgMTQ4ODI6MTk5OChFKSAxNy40LjMuMS4yCiAgICAgICAgICAgIHdoZXJlIGRvdWJsZSB1bmRlcnNjb3JlcyBhcmUgZm9yYmlkZGVuIGFzIHdlbGwgYXMgc3ltYm9scyBzdGFydGluZyB3aXRoCiAgICAgICAgICAgIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1vc3Qgb2YgdGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHJvb3RlZCBvdXQuIFNlZSBuZXcgc2VjdGlvbiBhZGRlZCB0byBpbnRlcm5hbHMuaHRtbCBkZXZlbG9wbWVudAogICAgICAgICAgICBtYW51YWwgJ1N5bWJvbCBOYW1pbmcgR3VpZGVsaW5lcyBmb3IgR2VuZXJhdGVkIEMvQysrIENvZGUnLgoKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpcmVjdG9yIHR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBpbnYgICAgID0+IGRpcmVjdG9yaW4KICAgICAgICAgICAgb3V0diAgICA9PiBkaXJlY3Rvcm91dAogICAgICAgICAgICBhcmdvdXR2ID0+IGRpcmVjdG9yYXJnb3V0CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzE5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIGNvbnN0cnVjdG9ycyBub3cgZGVmYXVsdCB0byBfX2Rpc293biA9IDAsIAoJICAgIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBhbmQgZml4ZXMgdGhlIGRpcmVjdG9yX2ZpbmFsaXplciAKCSAgICB0ZXN0IGNhc2UgdW5kZXIgcHl0aG9uLgoKMDkvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gLSBUeXBlbWFwcyBhZGRlZCBmb3Igc3RkOjpzdHJpbmcgYW5kIGNvbnN0IHN0ZDo6c3RyaW5nICYuCiAgICAgICAgICAgICAgICAgLSBOZXcgZGVsZWdhdGUgZm9yIGNyZWF0aW5nIGEgQyMgc3RyaW5nIGdpdmVuIGEgY2hhciAqLiBJdAogICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgYnkgY2FsbGluZyBTV0lHX2NzaGFycF9zdHJpbmdfY2FsbGJhY2sgYXMgc2hvd24KICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdGQ6OnN0cmluZyAnb3V0JyB0eXBlbWFwLiBVc2VmdWwgaWYgdGhlIHJldHVybiB0eXBlIGlzCiAgICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gYSBDIyBzdHJpbmcgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIAogICAgICAgICAgICAgICAgICAgZm9yIGNsZWFuaW5nIHVwIG1lbW9yeSBhcyB0aGUgQyMgZ2FyYmFnZSBjb2xsZWN0b3IgZG9lc24ndAogICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgbWVtb3J5IGNyZWF0ZWQgaW4gQy9DKysgYW5kIHRoZW4gcmV0dXJuZWQgYXMgYSBDIyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgLSBUaGUgZXhjZXB0aW9uIGRlbGVnYXRlcyBoYXZlIG1vdmVkIGludG8gYW4gaW5uZXIgY2xhc3MgaW4gdGhlCiAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgY2xhc3MsIHRoZXJlYnkgZnJlZWluZyB1cCB0aGUgc3RhdGljIGNvbnN0cnVjdG9yLgoKMDkvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICAoSW50ZXJuYWxzKQogICAgICAgICAgICBNYWpvciByZWZhY3RvcmluZyBvZiBpdGVyYXRpb24gb3ZlciBsaXN0cyBhbmQgaGFzaGVzLiAgVGhlCiAgICAgICAgICAgIERPSCBsaWJyYXJ5IG5vdyB1c2VzIGl0ZXJhdG9ycy4gIFRoZXkgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgTGlzdCAqbCA9IChzb21lIGxpc3QpOwoKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBjb250YWlucyB0aGUgYWN0dWFsIGxpc3QgaXRlbS4KICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gaXMgTlVMTCBhdCBlbmQgb2YgbGlzdAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEhhc2ggKmggPSAoc29tZSBoYXNoKTsKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGo7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChoKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGouaXRlbSBjb250YWlucyBoYXNoIHRhYmxlIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBqLmtleSAgY29udGFpbnMgaGFzaCB0YWJsZSBrZXkKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIGouaXRlbSBhbmQgai5rZXkgYXJlIE5VTEwgYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgVGhlIG9sZCBpdGVyYXRpb24gZnVuY3Rpb25zIEZpcnN0aXRlbSgpLCBOZXh0aXRlbSgpLCBGaXJzdGtleSgpLAogICAgICAgICAgICBhbmQgTmV4dGtleSgpIGFyZSBnb25lLiAgCgogICAgICAgICAgICBUaGUgbmV3IGl0ZXJhdG9ycyBhcmUgc2ltcGxlciwgcmVzdWx0IGluIGJldHRlciBtZW1vcnkgdXNlLAogICAgICAgICAgICBhbmQgbWF5IGJlIGZhc3Rlci4gIEFsc28sIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IHByb2JsZW1zCiAgICAgICAgICAgIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIGxpc3QvaGFzaCBpbiBtdWx0aXBsZSBwbGFjZXMgYXQKICAgICAgICAgICAgdGhlIHNhbWUgdGltZS4gIEZvciBleGFtcGxlLCB0aGlzIGlzIGZpbmU6CgogICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGksajsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGwpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKFRoaXMgbmV2ZXIgd29ya2VkIGluIHByZXZpb3VzIHZlcnNpb25zKS4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLiAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIAogICAgICAgICAgICB0aGlyZCBwYXJ0eSBleHRlbnNpb25zIHRvIFNXSUcgKG9yIGdpdmUgdGhlbSBmdXJ0aGVyIGVuY291cmFnZW1lbnQKICAgICAgICAgICAgdG8gam9pbiB0aGUgU1dJRyBDVlMtdHJlZSA6LSkuCgowOS8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSAibGlzdC12ZWN0b3IuaSIgdHlwZW1hcHMuCgowOS8wOS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIFVzZSBDX21rX2Jvb2wgcmF0aGVyIHRoYW4gQ19ta2Jvb2wuICBUaGlzIGZpeGVzCgkgICAgdGhlIHdyYXBwaW5nIG9mIGJvb2xlYW4gdmFsdWVzIGZvciBDaGlja2VuIDEuMTAgYW5kIG5ld2VyLgoJICAgIFJlcG9ydGVkIGJ5IERhdmUgPGh1bmRvQHlhaG9vLmNvbT4gLyBGZWxpeCBXaW5rZWxtYW5uCgkgICAgPGZlbGl4QHByb3hpbWEtbXQuZGU+LgoKMDkvMDUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvcnMgaW1wbGVtZW50ZWQgZm9yIEphdmEuIEluIHN1bW1hcnkgdGhpcyBpcyBhIGJpZyBuZXcgZmVhdHVyZSAKICAgICAgICAgICAgd2hpY2ggc3VwcG9ydHMgdXBjYWxscyBmcm9tIEMrKyB0byBKYXZhLiBDb2RlIGlzIGdlbmVyYXRlZCB0byBzdXBwb3J0IEMrKyAKICAgICAgICAgICAgY2FsbGJhY2tzIHRvIGNhbGwgaW50byBKYXZhIGFuZCB0cnVlIHBvbHltb3JwaGljIGJlaGF2aW91ciBmb3IgSmF2YSBjbGFzc2VzIAogICAgICAgICAgICBkZXJpdmVkIGZyb20gQysrIGNsYXNzZXMuIFNlZSBqYXZhLmh0bWwgZm9yIGRldGFpbHMuIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBTY290dCBNaWNoZWwuCgowOS8wNS8yMDAzOiBUaWdlcgogICAgICAgICAgICBDcmVhdGVkIGNvbnRyYWN0IGV4YW1wbGUgZGlyZWN0b3J5IGF0IC9TV0lHL0V4YW1wbGVzL2NvbnRyYWN0CiAgICAgICAgICAgIEFkZGVkIHNpbXBsZSBjb250cmFjdCBleGFtcGxlcyAoc2ltcGxlX2MgJiBzaW1wbGVfY3h4KQogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBtb2R1bGUncyBvdXRwdXQgZm9ybWF0CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGVzdC1zdWl0ZSBidWlsZCBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIC0gTXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgd29ya2luZyBmb3IgdGhlIHRlc3Qgc3VpdGUsIHNvIGl0IGlzIG5vdwogICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHJ1biBjb25maWd1cmUgaW4gbXVsdGlwbGUgc3ViZGlyZWN0b3JpZXMgYW5kIHJ1biB0aGUgdGVzdAogICAgICAgICAgICAgIHN1aXRlIGluIGVhY2ggb2YgdGhlc2Ugc3ViIGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtICdtYWtlIGRpc3RjbGVhbicgZml4ZWQgc28gaXQgZG9lc24ndCBib21iIG91dCBvbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgd2hlbiB1c2luZyBtdWx0aXBsZSBzdWJkaXJldG9yeSBidWlsZHMuIFJlcXVpcmVkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICB0byBiZSBtb3ZlZDoKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGVybCAtPiBFeGFtcGxlcy9HSUZQbG90L1Blcmw1CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BocCAgLT4gRXhhbXBsZXMvR0lGUGxvdC9QaHA0CiAgICAgICAgICAgICAgVGhlc2UgbmV3IGRpcmVjdG9yaWVzIHVzZWQgdG8gYmUgc3ltYm9saWMgbGlua3MgdG8gdGhlIG9sZCBkaXJlY3RvcnkuCiAgICAgICAgICAgICAgQWxzbyB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9QZXJsIHN5bWJvbGljIGxpbmsgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgICAgICAgLSBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBvdGhlciB0aGFuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LCBzYXkKICAgICAgICAgICAgICBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL3B5dGhvbiB3aWxsIG5vdyBkaXNwbGF5IGFsbCB0aGUgY29kZSBiZWluZwogICAgICAgICAgICAgIGV4ZWN1dGVkLgogICAgICAgICAgICAtIFRoZSBmb2xsb3dpbmcgMyBDIyBjb21waWxlcnMgYXJlIGRldGVjdGVkIGR1cmluZyBjb25maWd1cmUgYW5kIHdvcmsgd2l0aCAKICAgICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZTogTW9ubywgUG9ydGFibGUuTkVUIGFuZCBNaWNyb3NvZnQuCgowOS8wMS8yMDAzOiBUaWdlcgogICAgICAgICAgICBBZGRlZCBpbmhlcml0YW5jZSBzdXBwb3J0IGZvciBkZXNpZ24gYnkgY29udHJhY3QgZmVhdHVyZS4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTQ5MTQgXSBXcm9uZyB0eXBlcyBpbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgU1dJRyB3YXMgbm90IGhhbmRsaW5nIGFyZ3VtZW50cyBjb3JyZWN0bHkgaW4gdGVtcGxhdGUgCiAgICAgICAgICAgIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb288VCAqPiB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgVCAqYmxhaCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vSW50KSBGb288aW50ICo+OwoKICAgICAgICAgICAgaW4gdGhpcyBjbGFzcywgdGhlIHJldHVybiB0eXBlIG9mIGJsYWggd2FzIHNldCB0bwogICAgICAgICAgICAnaW50ICoqJywgYnV0IGl0IHNob3VsZCByZWFsbHkgYmUgJ2ludCAqJy4gIFRoaXMgaGFzIGJlZW4KICAgICAgICAgICAgZml4ZWQsIGJ1dCBpdCB3aWxsIGFmZmVjdCBhbGwgcHJpb3IgdXNlcyBvZiBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uLgogCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODYzOTQgXSBQYXRjaCBmb3IgZ2VuZXJhdGVkIHBlcmwgY29kZSBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFJlZEhhdDkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNjb3R0IEZpbm5lcmFuLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTU3OSBdICh1bnNpZ25lZCkgbG9uZyBsb25nIGhhbmRsZWQgaW5jb3JyZWN0bHkgKFRjbCkuCiAgICAgICAgICAgIFRoaXMgd2FzIGFuIGVycm9yIGluIHRoZSBUY2wgdHlwZW1hcHMuaSBmaWxlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgS2plbGwgV29vZGluZy4KICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3MyBdIG5vIHdheSB0byByZW5hbWUgY2xhc3NlcyBjb21pbmcgZnJvbSBDIHN0cnVjdHVyZXMuCiAgICAgICAgICAgIFRoaXMgcHJvYmxlbSByZWxhdGVzIHRvIHJlbmFtaW5nIG9mIGFub255bW91cyBzdHJ1Y3R1cmVzIHdpdGggYQogICAgICAgICAgICB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KICAgICAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzYgXSAtaGVscCBzZWVtcyB0byBpbXBseSB0aGF0IG9ubHkgdGNsLXNwZWNpZmljIG9wdGlvbnMgZXhpc3QuCiAgICAgICAgICAgIEFkZGVkIGEgY29tbWVudCB0byBhbGVydCB1c2VyIHRvIG90aGVyIG9wdGlvbnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5ODIwNSBdIFNlZ2ZhdWx0IGluIFNXSUdfQ29udmVydFB0ci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUHJhYmh1IFJhbWFjaGFuZHJhbi4KCjA4LzMwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1vZGlmaWVkIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBpbiBweXRob24vc3RkX2NvbXBsZXguaSB0byB1c2UgdGhlIAoJICAgIG5ldy1zdHlsZSBtYWNybyBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMsIHdoaWNoIGVsaW1pbmF0ZWQgc29tZQoJICAgIHJlZHVuZGFudCBjb2RlLiAgRml4ZWQgYSBmZXcgYnVncyBpbiB0aGVzZSB0eXBlbWFwcyBhcyB3ZWxsLCBhbHRob3VnaAoJICAgIG1vcmUgdGVzdGluZyBpcyBuZWVkZWQuCgowOC8yOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDb21wbGV0ZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBhYnN0cmFjdCBjbGFzc2VzIHdpdGggZGlyZWN0b3JzLgoJICAgIENvbnN0cnVjdG9yIHdyYXBwZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhYnN0cmFjdCBjbGFzc2VzIHRoYXQgaGF2ZQoJICAgIGRpcmVjdG9ycywgYW5kIGluc3RhbmNlcyBvZiB0aGUgZGlyZWN0b3IgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcwoJICAgIG9mIHdoZXRoZXIgdGhlIHByb3h5IGNsYXNzIGhhcyBiZWVuIHN1YmNsYXNzZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCSAgICBObyBjaGVja3MgYXJlIG1hZGUgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgcHVyZSB2aXJ0dWFsCgkgICAgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEluc3RlYWQsIGNhbGxzIHRvCgkgICAgdW5pbXBsZW1lbnRlZCBtZXRob2RzIHdpbGwgdGhyb3cgU1dJR19ESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OCgkgICAgZXhjZXB0aW9ucyBpbiBDKysuCgoJICAgIEludGVncmF0ZWQgUHJhYmh1IFJhbWFjaGFuZHJhbidzIHR5cGVtYXAgcGF0Y2hlcywgd2hpY2ggcHJvdmlkZSBkaXJlY3RvcgoJICAgIHR5cGVtYXAgc3VwcG9ydCBmb3IgZW51bXMgYW5kIHN0ZDo6c2l6ZV90LCBhbmQgZml4IGEgY291cGxlIGJ1Z3MgaW4gdGhlIAoJICAgIGRpcmVjdG9yIHN0ZDo6dmVjdG9yPD4gdHlwZW1hcHMuCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXBsZW1lbnRlZCBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHRocm93aW5nIEMjIGV4Y2VwdGlvbnMgZnJvbSBDL0MrKyBjb2RlLgogICAgICAgICAgICBBIGZldyBkZWxlZ2F0ZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY2FsbGluZyB3aGljaCB0aGVuIHRocm93IHRoZSBDIwogICAgICAgICAgICBleGNlcHRpb24uIFVzZSB0aGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbiBmdW5jdGlvbiBmcm9tIEMvQysrIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgb3IgY3NoYXJwaGVhZC5zd2cgZm9yIGFsbCBhdmFpbGFibGUgZXhjZXB0aW9ucy4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbihTV0lHX0NTaGFycEV4Y2VwdGlvbiwgImV4Y2VwdGlvbiBkZXNjcmlwdGlvbiIpOwoKICAgICAgICAgICAgVGhlICd0aHJvd3MnIHR5cGVtYXBzIGFyZSBhbHNvIG5vdyBpbXBsZW1lbnRlZCwgc28gY29kZSBpcyBhdXRvbWF0aWNhbGx5IAogICAgICAgICAgICBnZW5lcmF0ZWQgdG8gY29udmVydCBhbnkgQysrIGV4Y2VwdGlvbiBpbnRvIGEgQyMgU3lzdGVtLkV4Y2VwdGlvbiB3aGVuIHRoZSBDKysgCiAgICAgICAgICAgIG1ldGhvZCBkZWNsYXJlcyBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBzdWNoIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEJhcik7CgogICAgICAgICAgICBBbHNvIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gYSBDKysgY2xhc3Mgb3IgYSBjbGFzcyBwYXNzZWQgYnkgdmFsdWUKICAgICAgICAgICAgYW5kIGFyZSBwYXNzZWQgYXMgYSBDIyBudWxsIHdpbGwgbm93IHRocm93IGEgQyMgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbi4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCB0byBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGFsbCBwaW52b2tlIG1ldGhvZHMgc28gdGhhdCB0aGV5CiAgICAgICAgICAgIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSBkZWZhdWx0IGluIHRoZSBDIyAnc3RhdGljIGV4dGVybicgZGVjbGFyYXRpb25zIAogICAgICAgICAgICAoX19zdGRjYWxsIGlzIHVzZWQgb24gV2luZG93cykuCgowOC8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJld29ya2VkIHN0ZDo6c3RyaW5nIHR5cGVtYXBzLiBGaXhlcyBhIG51bWJlciBvZiBzdHJpbmcgaW4gc3RkIG5hbWVzcGFjZSAKICAgICAgICAgICAgcHJvYmxlbXMuIEZvciBleGFtcGxlICV0ZW1wbGF0ZSB2ZWN0b3I8c3RyaW5nPi4gVGhlIHRlbXBsYXRlZCBjbGFzcycgZ2V0IG1ldGhvZCAKICAgICAgICAgICAgd2Fzbid0IHJldHVybmluZyBhIEphdmEgU3RyaW5nLCBidXQgYSBTV0lHVFlQRV9wX3N0cmluZy4gUmVwb3J0ZWQKICAgICAgICAgICAgYnkgWmFjaCBCYXVtLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzUyMiBdIDEuMy4xOSBzZWdmYXVsdCBpbiBTd2lnVHlwZV9hZGRfcG9pbnRlci9Eb2hJbnNlcnRpdGVtLgogICAgICAgICAgICBSZWxhdGVkIHRvIHByb2JsZW0gd2l0aCB1bm5hbWVkIGNsYXNzIGhhbmRsaW5nIGluIFBlcmwgbW9kdWxlLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzU2MyBdIE1pc3NpbmcgaW5kaWNhdGlvbiBvZiBvcHRpb25hbCBhcmd1bWVudHMuCiAgICAgICAgICAgIFRjbCBtb2R1bGUuICBSZXBvcnRlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NzQzMiBdIGxvbmcgcGFyYW0gaGFuZGxlZCBhcyBpbnQuICBUY2wgbW9kdWxlCiAgICAgICAgICAgIG5vdyB1c2VzIFRjbF9HZXRMb25nRnJvbU9iaiB0byBjb252ZXJ0IGludGVnZXIgdmFsdWVzLgoKMDgvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTk4OSBdIG51bWVyaWMgdGVtcGxhdGUgcGFyYW1ldGVycy4gICBUaGVyZSB3ZXJlCiAgICAgICAgICAgIHNvbWUgZXJyb3JzIGluIHRlbXBsYXRlIGV4cGFuc2lvbiByZWxhdGVkIHRvIHRoZSB1c2Ugb2YKICAgICAgICAgICAgYXJyYXlzIHdoZXJlIHRoZSBhcnJheSBkaW1lbnNpb24gd2FzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBSZXBvcnRlZCBieSBCcnlhbiBHcmVlbi4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgZGlyZWN0b3IgdHlwZW1hcCAob3V0dikgZm9yIHJldHVybiBieSB2YWx1ZSBhbmQgY2xlYW5lZCB1cCB1cCBhIGZldyAKCSAgICBvZiB0aGUgY29tbWVudGVkIGRpcmVjdG9yIHR5cGVtYXBzLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiBmb3IgZGlyZWN0b3IgY2xhc3NlcyB0byBpZ25vcmUgcHJpdmF0ZQoJICAgIGNvbnN0cnVjdG9ycy4gIFByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYXJlIGFsc28gaWdub3JlZCBmb3Igbm93LCBwZW5kaW5nCgkgICAgYSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiB3cmFwcGluZyBjbGFzc2VzIHRoYXQgb25seSBkZWZpbmUgcHJvdGVjdGVkCgkgICAgY29uc3RydWN0b3JzLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW91dGRpciA8ZGlyPiB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBmaWxlcyBhcmUgdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0IGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwKICAgICAgICAgICAgSmF2YSBldGMgd2hpY2ggZ2VuZXJhdGUgcHJveHkgZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlLgogICAgICAgICAgICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgQy9DKysgd3JhcHBlciBmaWxlLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE9uIFdpbmRvd3MgdGhlIGdlbmVyYXRlZCBmaWxlcyAob3RoZXIgdGhhbiB0aGUgX3dyYXAuYyBvciBfd3JhcC5jeHggZmlsZXMpCiAgICAgICAgICAgIHdlcmUgc29tZXRpbWVzIGluY29ycmVjdGx5IGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1bmxlc3MKICAgICAgICAgICAgdGhlIGlucHV0IGZpbGUgdXNlZCB0aGUgVW5peCBwYXRoIHNlcGFyYXRvci4gVGhlIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3IgCiAgICAgICAgICAgIHNob3VsZCBub3cgYmUgdXNlZC4gQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBEYXZpZXMuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFycmF5IHZhcmlhYmxlIHNldCB0eXBlbWFwIHRvIFBlcmwgbW9kdWxlLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTY3NyBdIEFycmF5IGluaXQgY2F1c2VzIGNvZGVnZW4gYnVnLi4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzkwNjIgXSBDbGFzcyJcbiI6OmZvbyBub3Qgc3VwcG9ydGVkLiAgU1dJRwogICAgICAgICAgICBzaG91bGQgbm93IGNvcnJlY3RseSBoYW5kbGUgd2hpdGVzcGFjZSBpbiBiZXR3ZWVuIAogICAgICAgICAgICBuYW1lc3BhY2UgcXVhbGlmaWVycy4gIEZvciBleGFtcGxlICJBIDo6IEZvbyA6OiBCYXIiLgogICAgICAgICAgICAKMDcvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjbGFzc2VzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBhbmQgaGF2ZSAKICAgICAgICAgICAgYSBkZWZhdWx0IHZhbHVlLiBBIGNvcHkgY29uc3RydWN0b3IgZm9yIFN3aWdWYWx1ZVdyYXBwZXIgaXMgcmVxdWlyZWQgCiAgICAgICAgICAgIChTRiAjNzgwMDU2KS4gQWxzbyBmaXhlZCBtZW1vcnkgbGVhayBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzLiBUaGVzZSBtb2RzCiAgICAgICAgICAgIGFsc28gZml4IFNGICM3ODAwNTQuCgowNy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHJ1bi10aW1lIGVycm9yIG1lc3NhZ2UgZm9yIHBvaW50ZXJzIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFpvb2tvLgoKMDcvMTAvMjAwMzogYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBbQWxtb3N0IGFsbCBsYW5ndWFnZXNdIFdyYXBwZXJzIGZvciBzdGQ6OnBhaXIgYWRkZWQuCgkgICAgVHlwZW1hcHMgZm9yIFB5dGhvbiwgUnVieSwgR3VpbGUgYW5kIE16U2NoZW1lLgoKMDcvMDEvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBIYW5kbGUgdGhlIGNhc2Ugb2YgbW9yZSB0aGFuIG9uZSBhcmdvdXQgdHlwZW1hcAoJICAgIHBlciBmdW5jdGlvbi4KCjA2LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFNGICM2NzA5NDkgcmVxdWVzdC4gVGhlIGRlc3RydWN0b3Igd3JhcHBlciBmdW5jdGlvbiBuYW1lIGlzIG5vdyAKICAgICAgICAgICAgY29uZmlndXJhYmxlLiAgQSBuZXcgYXR0cmlidXRlIGNhbGxlZCBtZXRob2RuYW1lIGluIHRoZSAKICAgICAgICAgICAgamF2YWRlc3RydWN0L2phdmFkZXN0cnVjdF9kZXJpdmVkIChKYXZhKSBvciBjc2Rlc3RydWN0L2NzZGVzdHJ1Y3RfZGVyaXZlZCAoQyMpCiAgICAgICAgICAgIHR5cGVtYXBzIHNwZWNpZmllcyB0aGUgbWV0aG9kIG5hbWUuIEZvciBleGFtcGxlIGluIEphdmEgdGhlIGRlc3RydWN0b3IgaXMgCiAgICAgICAgICAgIHdyYXBwZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBkZWxldGUgbWV0aG9kOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFkZXN0cnVjdCwgbWV0aG9kbmFtZT0iZGVsZXRlIikgU1dJR1RZUEUgey4uLn0KCjA2LzI3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSB0aHJvd3MgYXR0cmlidXRlIGZvciBhZGRpbmcgZXhjZXB0aW9uIGNsYXNzZXMgdG8gdGhlIHRocm93cwogICAgICAgICAgICBjbGF1c2UgYWxzbyBub3cgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiAKICAgICAgICAgICAgbmV3ZnJlZQogICAgICAgICAgICBqYXZhaW4sIGphdmFvdXQgKEphdmEpCiAgICAgICAgICAgIGNzaW4sIGNzb3V0IChDIykKCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgJ0FuRXhjZXB0aW9uJyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aHJvd3MgY2xhdXNlIGluIHRoZQogICAgICAgICAgICBwcm94eSBmdW5jdGlvbjoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQsIHRocm93cz0iQW5FeGNlcHRpb24iKSBpbnQgewogICAgICAgICAgICAgICAgaW50IHJldHVyblZhbHVlPSRqbmljYWxsOwogICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlPT0wKSB0aHJvdyBuZXcgQW5FeGNlcHRpb24oIlZhbHVlIG11c3Qgbm90IGJlIHplcm8iKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgfQoKMDYvMjUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgdHlwZW1hcCBtYXJzaGFsbGluZyBjaGVja3MgZm9yIG51bGwgcG9pbnRlcnMgd2hlbgoJICAgIHdhbGtpbmcgdGhlIHBhcmFtZXRlciBsaXN0IGluc3RlYWQgb2YgcmVseWluZyBzb2xleSBvbiB0aGUgcGFyYW1ldGVyCgkgICAgY291bnQuICBDdXJlcyBhIHNlZ2ZhdWx0IHRoYXQgb2NjdXJlZCBmb3IgbXVsdGlwbGUgYXJndW1lbnQgaW52IHR5cGVtYXBzLgoJICAgIFNvbWVvbmUgd2l0aCBtb3JlIFN3aWcgZXhwZXJpZW5jZSBzaG91bGQgcHJvYmFibHkgcmV2aWV3IHRoaXMgY29kZS4KCjA2LzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRG9uJ3QgZW1pdCBjYWxscyB0byAiQ19jaGVja19mb3JfaW50ZXJydXB0IiwKCSAgICB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGVuZGxlc3MgbG9vcC4gIFBhdGNoIGJ5IGZlbGl4QHByb3hpbWEtbXQuZGUuCgowNi8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaW5hbGl6ZXJzIG5vdyB1c2UgZGVzdHJ1Y3RvciBzeW50YXggYXMgdGhlIG92ZXJyaWRlIHdoaWNoIHdhcyB1c2VkIGluIAogICAgICAgICAgICB0aGUgRmluYWxpemUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgRUNNQSBzdGFuZGFyZHMsIHNwb3R0ZWQgYnkgdGhlIE1TIGNvbXBpbGVyLgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQSBudW1iZXIgb2YgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byByZW1vdmUgdGhlIEphdmEgbmFtaW5nIAogICAgICAgICAgICB0aGF0IHdhcyB1c2VkIGluIHRoZSBDIyBtb2R1bGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUeXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgam5pICAgICAgICAgICAgICAgICAgICAgICAgIC0+IGN0eXBlCiAgICAgICAgICAgIGp0eXBlICAgICAgICAgICAgICAgICAgICAgICAtPiBpbXR5cGUKICAgICAgICAgICAganN0eXBlICAgICAgICAgICAgICAgICAgICAgIC0+IGNzdHlwZQogICAgICAgICAgICBqYXZhaW4gICAgICAgICAgICAgICAgICAgICAgLT4gY3NpbgogICAgICAgICAgICBqYXZhb3V0ICAgICAgICAgICAgICAgICAgICAgLT4gY3NvdXQKICAgICAgICAgICAgamF2YWludGVyZmFjZXMgICAgICAgICAgICAgIC0+IGNzaW50ZXJmYWNlcwogICAgICAgICAgICBqYXZhYmFzZSAgICAgICAgICAgICAgICAgICAgLT4gY3NiYXNlCiAgICAgICAgICAgIGphdmFjbGFzc21vZGlmaWVycyAgICAgICAgICAtPiBjc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFjb2RlICAgICAgICAgICAgICAgICAgICAtPiBjc2NvZGUKICAgICAgICAgICAgamF2YWltcG9ydHMgICAgICAgICAgICAgICAgIC0+IGNzaW1wb3J0cwogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgLT4gY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycwogICAgICAgICAgICBqYXZhZ2V0Y3B0ciAgICAgICAgICAgICAgICAgLT4gY3NnZXRjcHRyCiAgICAgICAgICAgIGphdmFmaW5hbGl6ZSAgICAgICAgICAgICAgICAtPiBjc2ZpbmFsaXplCgogICAgICAgICAgICBGZWF0dXJlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgamF2YWNvbnN0ICAgICAgICAgICAgICAgICAgIC0+IGNzY29uc3QKICAgICAgICAgICAgamF2YW1ldGhvZG1vZGlmaWVycyAgICAgICAgIC0+IGNzbWV0aG9kbW9kaWZpZXJzCgogICAgICAgICAgICBQcmFnbWEgY2hhbmdlczoKICAgICAgICAgICAgcHJhZ21hKGphdmEpICAgICAgICAgICAgICAgIC0+IHByYWdtYShjc2hhcnApCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzICAgICAgLT4gaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzY29kZSAgICAgICAgICAgICAgICAtPiBpbWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2ltcG9ydHMgICAgICAgICAgICAgLT4gaW1jbGFzc2ltcG9ydHMKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2VzICAgICAgICAgIC0+IGltY2xhc3NpbnRlcmZhY2VzCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgJGphdmFjbGFzc25hbWUgICAgICAgICAgICAgIC0+ICRjc2NsYXNzbmFtZQogICAgICAgICAgICAkamF2YWlucHV0ICAgICAgICAgICAgICAgICAgLT4gJGNzaW5wdXQKICAgICAgICAgICAgJGpuaWNhbGwgICAgICAgICAgICAgICAgICAgIC0+ICRpbWNhbGwKCiAgICAgICAgICAgIFRoaXMgd2lsbCBicmVhayBTV0lHIGludGVyZmFjZSBmaWxlcyB0aGF0IHVzZSB0aGVzZSB0eXBlbWFwcywgZmVhdHVyZXMKICAgICAgICAgICAgYW5kIHByYWdtYXMuIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIG9yIHVzZSBtYWNyb3MgZm9yIGJhY2t3YXJkcwogICAgICAgICAgICBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzEwLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIEFwcGxpZWQgTXpTY2hlbWUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uCgogICAgICAgICAgICAtIFVwZGF0ZWQgbXpzY2hlbWUgdG8gdXNlIFNXSUcncyBjb21tb24gcnVudGltZSB0eXBlCiAgICAgICAgICAgICAgc3lzdGVtIGZyb20gY29tbW9uLnN3Zy4gCgoJICAgIC0gVGhlIExpYi9tenNjaGVtZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgdGhlIGxhbmd1YWdlIG1vZHVsZXM6CiAgICAgICAgICAgICAgbXpzY2hlbWUuaSB3YXMgbW92ZWQgdG8gbXpzY2hlbWUuc3dnLCBtenNjaGVtZS5zd2cgYW5kCiAgICAgICAgICAgICAgbXpzY2hlbWVkZWMuc3dnIGhhdmUgYmVlbiByZW1vdmVkLCBtenJ1bi5zd2cgKHdoaWNoCiAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJ1bnRpbWUgY29kZSkgaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAtIFRoZSBzd2lnX3Byb3h5IHN0cnVjdHVyZSB3YXMgcmVuYW1lZCB0byBzd2lnX216X3Byb3h5LgogICAgICAgICAgICAgIHN3aWdfbXpfcHJveHkgbm93IGNvbnRhaW5zIGEgcG9pbnRlciB0byBhIHN3aWdfdHlwZV9pbmZvCiAgICAgICAgICAgICAgc3RydWN0dXJlLiAgCgoJICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kCiAgICAgICAgICAgICAgU1dJR1RZUEUgJi4KCgkgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gYnkgY2FsbGluZyBzY2hlbWVfYWRkX2ZpbmFsaXplcigpIGhhcwogICAgICAgICAgICAgIGJlZW4gYWRkZWQuCgoJICAgICoqKiBORVcgRkVBVFVSRSBbTXpTY2hlbWVdICoqKgoKMDYvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgdHlwZW1hcHM6IGphdmFkZXN0cnVjdCBhbmQgamF2YWRlc3RydWN0X2Rlcml2ZWQKICAgICAgICAgICAgZm9yIHRoZSBDKysgZGVzdHJ1Y3RvciB3cmFwcGVyLiBUaGUgamF2YWRlc3RydWN0IHZlcnNpb24gZ2V0cyB1c2VkIGJ5CiAgICAgICAgICAgIGNsYXNzZXMgYXQgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBjaGFpbiBhbmQgdGhlIGphdmFkZXN0cnVjdF9kZXJpdmVkIAogICAgICAgICAgICB2ZXJzaW9uIGdldHMgdXNlZCBieSBvdGhlciBjbGFzc2VzLgoKICAgICAgICAgICAgW0MjXSBjaWxkaXNwb3NlIGFuZCBjaWxkaXNwb3Nlb3ZlcnJpZGUgdHlwZW1hcHMgcmVwbGFjZWQgYnkKICAgICAgICAgICAgY3NkZXN0cnVjdCBhbmQgY3NkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXBzLiBUaGUgZGVsZXRlKCkKICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIHJlbW92ZWQgYW5kIGl0cyBmdW5jdGlvbmFsaXR5IHB1dCBpbnRvIHRoZXNlCiAgICAgICAgICAgIHR5cGVtYXBzIGRlc2lnbmVkIGZvciB0aGUgRGlzcG9zZSgpIG1ldGhvZC4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXBzIGNzaW50ZXJmYWNlcyBhbmQgY3NpbnRlcmZhY2VzX2Rlcml2ZWQgcmVwbGFjZQogICAgICAgICAgICB0aGUgamF2YWludGVyZmFjZXMgdHlwZW1hcC4gQWxzbyBmaXhlcyB0aGUgcGVjdWxpYXJpdHkgb2YgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4gaW5kaXZpZHVhbGx5IGRlcml2aW5nIGZyb20gdGhlIElEaXNwb3NhYmxlIAogICAgICAgICAgICBpbnRlcmZhY2UuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwIGNzZmluYWxpemUgZm9yIGZpbmFsaXplcnMuIEMrKyBkZXN0cnVjdG9ycyBhcmUgbm93IGNhbGxlZAogICAgICAgICAgICBieSBnYXJiYWdlIGNvbGxlY3RvciBkdXJpbmcgZmluYWxpemF0aW9uLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBBbmRyZWFzIFNjaPZyay4KCjA2LzEwLzIwMDM6IFRpZ2VyCgkgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSBmb3IgZXJyb3IgbWVzc2FnZSBvdXRwdXQuCiAgICAgICAgICAgIENvbnRyYWN0IGNvZGUgY2FuIG5vdyBwcmludCBvdXQgc2ltcGxlIGVycm9yIG1lc3NhZ2UuCiAgICAgICAgICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgdG8gcHJlcGFyZSBmb3IgaW5oZXJpdGFuY2UKICAgICAgICAgICAgCjA2LzAzLzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEFwcGxpZWQgR3VpbGUgbW9kdWxlIHVwZGF0ZXMgY29udHJpYnV0ZWQgYnkgCgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LiAKCgkgICAgLSBTV0lHIGN1cnJlbnRseSB1c2VzIEd1aWxlJ3MgZ2hfIEFQSSwgd2hpY2ggaXMgbWFya2VkIGFzCgkgICAgICBkZXByZWNhdGVkIGluIEd1aWxlIDEuNiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIEd1aWxlCgkgICAgICAxLjkuICBUaGlzIGNoYW5nZSBpbnRyb2R1Y2VzIGEgY29tbWFuZC1saW5lIGZsYWcgIi1zY20iCgkgICAgICB3aGljaCBjYXVzZXMgU1dJRyB0byBnZW5lcmF0ZSB3cmFwcGVycyB0aGF0IHVzZSBHdWlsZSdzCgkgICAgICBTQ00gQVBJIGluc3RlYWQ7IHRoaXMgcmVxdWlyZXMgR3VpbGUgPj0gMS42LgoJICAgIAoJICAgIC0gVGhlIExpYi9ndWlsZSBkaXJlY3RvcnkgaGFzIGJlZW4gcmVvcmdhbml6ZWQgdG8KICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSBuYW1lcyBhY3Jvc3MgbGFuZ3VhZ2UgbW9kdWxlczogZ3VpbGVkZWMuc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlLnN3ZyBoYXZlIGJlZW4gbW92ZWQgaW50byBndWlsZV9naF9ydW4uc3dnLAogICAgICAgICAgICAgIGd1aWxlLmkgaGFzIGJlZW4gbW92ZWQgdG8gZ3VpbGVfZ2guc3dnLCBndWlsZV9zY20uc3dnCiAgICAgICAgICAgICAgYW5kIGd1aWxlX3NjbV9ydW4uc3dnIHdoaWNoIGNvbnRhaW4gdGhlIFNDTSBBUEkgc3R1ZmYKICAgICAgICAgICAgICBoYXZlIGJlZW4gYWRkZWQKCgkgICAgLSBnaGludGVyZmFjZS5pLCB3aGljaCBjb250YWlucyB0aGUgZGVmaW5lcyBmcm9tIHRoZSBnaF8KICAgICAgICAgICAgICBmdW5jdGlvbnMgdG8gdGhlIHNjbV9mdW5jdGlvbnMgaGFzIGJlZW4gYWRkZWQKCgkgICAgLSBUaGUgQVBJIGZvciBkZWFsaW5nIHdpdGggcG9pbnRlciBvYmplY3RzIGlzIG5vdwoJICAgICAgU1dJR19Db252ZXJ0UHRyLCBTV0lHX011c3RHZXRQdHIsIFNXSUdfTmV3UG9pbnRlck9iai4KCiAgICAgICAgICAgIC0gQWRkZWQgdmFyaW4gYW5kIHZhcm91dCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgW10gYW5kIFNXSUdUWVBFICYKCiAgICAgICAgICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFIFtHdWlsZV0gKioqCgkgICAgCQowNi8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRGltZW5zaW9ubGVzcyBhcnJheXMgc3VjaCBhcyAKCiAgICAgICAgICAgICAgICBpbnQgZm9vW10gPSB7MSwgMn07CiAgICAgICAgICAgICAgICBleHRlcm4gaW50IGJhcltdOwoKICAgICAgICAgICAgcHJvZHVjZSBhIHdhcm5pbmcgdGhhdCB0aGUgdmFyaWFibGUgaXMgcmVhZC1vbmx5LiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSwgdGhpcyB1c2VkIHRvIGNhdXNlIGNvbXBpbGUgZXJyb3JzIG9yIGdlbmVyYXRlIGEgc2V0dGVyIHRoYXQKICAgICAgICAgICAgZ2VuZXJhdGVkIGEgcnVudGltZSBlcnJvci4gQSBzZXR0ZXIgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlIGFycmF5IHNpemUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgU1dJRy4gQSB2YXJpbiwgZ2xvYmFsaW4gCiAgICAgICAgICAgIG9yIG1lbWJlcmluIHR5cGVtYXAgKGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKSBtdXN0IGJlIHdyaXR0ZW4gCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyLgoKMDUvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWZpbmVtZW50IHRvIGRlZmF1bHQgdHlwZW1hcCBtYXRjaGluZyBhbmQgYXJyYXlzLiAgV2hlbiBhbgogICAgICAgICAgICBhcnJheSBpcyBkZWNsYXJlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgIGludCBmb29bNF07CgogICAgICAgICAgICBUaGUgZGVmYXVsdCB0eXBlbWFwIG5vdyByZXNvbHZlcyB0byAKCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW0FOWV0KCiAgICAgICAgICAgIElmIG5vIG1hdGNoIGlzIGZvdW5kIGZvciB0aGF0LCBpdCB0aGVuIHJlc29sdmVzIHRvCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCgogICAgICAgICAgICBJZiBubyBhcnJheSBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcmlnaW5hbCBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgdGhlIFNXSUdUWVBFIFtdIGlzIHVzZWQgcmlnaHQgYXdheS4gCgogICAgICAgICAgICBOb3RlOiBUaGlzIGNoYW5nZSBoYXMgYmVlbiBtYWRlIHRvIHJlc29sdmUgcHJvYmxlbXMgcmVsYXRlZCB0bwogICAgICAgICAgICBhcnJheXMgd2l0aCBhbmQgd2l0aG91dCBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIHNvbWV0aW1lcyBTV0lHCiAgICAgICAgICAgIHdhcyBnZW5lcmF0aW5nIHNldHRlciBmdW5jdGlvbnMgZm9yIGFycmF5IHZhcmlhYmxlcyB3aXRoIG5vIGRpbWVuc2lvbnMKICAgICAgICAgICAgKGFuIGVycm9yKS4gTGlrZXdpc2UsIFNXSUcgc29tZXRpbWVzIG1hZGUgYXJyYXlzIHdpdGggZGltZW5zaW9ucwogICAgICAgICAgICByZWFkLW9ubHkgKGFsc28gYW4gZXJyb3IpLiAgVGhpcyBmaXhlcyB0aGUgYXJyYXlzX2dsb2JhbCB0ZXN0CiAgICAgICAgICAgIHByb2JsZW0uCiAgICAgICAgICAgICAgICAgICAgICAgIAowNS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0eXBlIGhhbmRsaW5nIGJ1ZyB3aXRoIHJlZmVyZW5jZXMgYW5kIHBvaW50ZXJzLgogICAgICAgICAgICBJZiB5b3UgaGFkIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICAgICAgICBGb28gKmZ1bmMxKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgZnVuYzIoQmFyICZ4KTsKCiAgICAgICAgICAgIFRoZW4gZnVuYzIoKSB3b3VsZG4ndCBhY2NlcHQgb2JqZWN0cyByZXR1cm5lZCBieSBmdW5jMSgpCiAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB0eXBlIGVycm9yLiAgIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpYW4gWWFuZy4KCjA1LzIxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyB0byBzb21lIG9mIHRoZSBWaXN1YWwgQysrIGV4YW1wbGUgcHJvamVjdCBmaWxlcyB3aGljaCB3b3VsZCBub3QgCiAgICAgICAgICAgIHdvcmsgd2l0aCBzcGFjZXMgaW4gdGhlIHBhdGhzIGhlbGQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2VkIHRvIAogICAgICAgICAgICBwb2ludCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlJ3MgbGlicmFyeSAvIGluY2x1ZGUgZGlyZWN0b3J5LgogICAgICAgICAgICBTRiBidWcgIzc0MDc2OQoKMDUvMjEvMjAwMzogIHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWNvbnRyYWN0cyBvcHRpb24uCiAgICAgICAgICAgIEZpcnN0IHRyeSBvZiB0aGUgaWRlYSBvZiAiV3JhcCBieSBDb250cmFjdCI6IAogICAgICAgICAgICBidWlsZCB1cCByZWFsaWFibGUgY3Jvc3MtbGFuZ3VhZ2UgbW9kdWxlIGJ5IHdyYXBwaW5nIHdpdGggU1dJRy4KICAgICAgICAgICAgSW1wbGVtZW50ZWQgYmFzaWMgYXNzZXJ0aW9uCiAgICAgICAgICAgIChwcmVhc3NlcnRpb24gJiBwb3N0YXNzZXJ0aW9uICYgaW52YXJpYW50KQogICAgICAgICAgICBmb3Igc2ltcGxlIEMvQysrIGZ1bmN0aW9ucy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEN1cnJlbnQgZm9ybWF0IG9mIGNvbnRyYWN0cyBhcmU6CiAgICAgICAgICAgICVjb250cmFjdCBjbGFzc19uYW1lIDo6IGZ1bmNfbmFtZSAocGFyYXMuLi4pIHsKICAgICAgICAgICAgcmVxdWlyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcnM7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgZW5zdXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGludmFyaWFudDoKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgkgICAgCQowNS8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgdHdlYWtzLiBUaGVyZSB3ZXJlIGEgZmV3IHByZXByb2Nlc3NvciBkZWZpbml0aW9ucyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgTWFrZWZpbGUgZm9yIHBhc3Npbmcgb24gdGhlIGNvbW1hbmRsaW5lIHdoZW4gY29tcGlsaW5nLgogICAgICAgICAgICBUaGVzZSBhcmUgbm93IGFsbCBkZWZpbmVkIGluIHN3aWdjb25maWcuaC4gQXV0b2NvbmYgZG9lc24ndCBub3JtYWxseSAKICAgICAgICAgICAgYWxsb3cgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzIHRvIGJlIGRlZmluZWQgaW4gdGhpcyBjb25maWcgaGVhZGVyIGZpbGUsIAogICAgICAgICAgICBidXQgYW4gYXV0b2NvbmYgYXJjaGl2ZSBtYWNybyBlbmFibGVzIHRoaXMuIFRoaXMgbWFjcm8gYWxvbmcgd2l0aCBmdXR1cmUgCiAgICAgICAgICAgIGF1dG9jb25mIG1hY3JvcyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSBUb29scy9jb25maWcgZGlyZWN0b3J5LgoKICAgICAgICAgICAgJ3N3aWcgLXZlcnNpb24nIG5vdyByZXBvcnRzIHRoZSB0YXJnZXQgYnVpbGQgcGxhdGZvcm0uCgowNS8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBGaXggdG8gdGhlIGZvbGxvd2luZyB0eXBlbWFwczoKCiAgICAgICAgICAgIGphdmFiYXNlLCBqYXZhaW50ZXJmYWNlcywgamF2YWltcG9ydHMsIGphdmFjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLCBqYXZhZmluYWxpemUsIGphdmFnZXRjcHRyICYgamF2YWNvZGUuCgogICAgICAgICAgICBUaGVzZSBhcmUgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcvZ2VuZXJhdGluZyBwcm94eSBjbGFzc2VzLgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSB0eXBlbWFwcyB3b3VsZCB1c2UgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIG5vdCB0aGUgCiAgICAgICAgICAgIEMrKyB0eXBlLCB3aGljaCB3YXMgaW5jb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHR5cGVtYXBzLiAKCiAgICAgICAgICAgIEluIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgdGhlIEMrKyBjbGFzcyBuYW1lL3R5cGUgCiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgY2xhc3NlcyBpbiBuYW1lc3BhY2UsIHRlbXBsYXRlZCBjbGFzc2VzIGV0Yy4gc28KICAgICAgICAgICAgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IG1vc3QgY2FzZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBhbmQgQyMgTU9EVUxFUyAqKioKCjA1LzA5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWaXN1YWwgQysrIFByb2plY3QgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIHNvIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICAgIGNhbiBiZSBidWlsdCBvbiBXaW5kb3dzIChmb3IgVGNsLCBQZXJsLCBQeXRob24gYW5kIFJ1YnkpLgoKMDUvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmV0dXJuIGJ5IHZhbHVlLCBjb25zdCwgYW5kIHByaXZhdGUgY29uc3RydWN0b3JzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICBCKCk7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBCKGNvbnN0IEImKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEIgcmV0dXJuQigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJvYmxlbSBhbmQgcGF0Y2ggc3VnZ2VzdGlvbiByZXBvcnRlZCBieSBCaWxsIEhvZmZtYW4uCgowNC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBTaW5nbGUgYXV0b2NvbmYgaW52b2NhdGlvbiAtIGF1dG9jb25mIGluIHRoZSBUb29scyBkaXJlY3RvcnkgaGFzIGdvbmUuCgogICAgICAgICAgICAtIExpYnRvb2wgYm9vdHN0cmFwcGVkIHdoZW4gcnVubmluZyBhdXRvZ2VuLnNoLiBUaGlzIHJlcXVpcmVzIGFueW9uZQogICAgICAgICAgICAgIHVzaW5nIHRoZSBjdnMgdmVyc2lvbiBvZiBTV0lHIHRvIGhhdmUgbGlidG9vbCBpbnN0YWxsZWQgb24gdGhlaXIKICAgICAgICAgICAgICBtYWNoaW5lLiBTdWdnZXN0IHZlcnNpb24gMS40LjIgb3IgaGlnaGVyLCBwcmVmZXJhYmx5IHRoZSBsYXRlc3QgLSAxLjUuCgogICAgICAgICAgICAtIEF1dG9tYWtlIGlzIG5vdyB1c2VkIHRvIGJ1aWxkIHRoZSBydW50aW1lIGxpYnJhcmllcyBpbiBjb25qdW5jdGlvbiAKICAgICAgICAgICAgICB3aXRoIGxpYnRvb2wuCgogICAgICAgICAgICAtIFJ1bnRpbWUgbGlicmFyaWVzIGFyZSBub3cgc3VjY2Vzc2Z1bGx5IGJ1aWx0IGFzIERMTHMgb24gQ3lnd2luLgoKICAgICAgICAgICAgLSBTa2lwcGluZyBsYW5ndWFnZXMgaXMgbm8gbG9uZ2VyIGp1c3QgZGV0ZXJtaW5lZCBpbiB0aGUgdG9wIGxldmVsIAogICAgICAgICAgICAgIG1ha2VmaWxlIGJ1dCBpbiBjb25maWd1cmUuaW4uIFRoaXMgaW5mbyBpcyB1c2VkIGZvciBidWlsZGluZwogICAgICAgICAgICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBhbmQgZm9yIHJ1bm5pbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgLSBUaGVzZSBjaGFuZ2VzIGhhdmUgZml4ZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3J5IGJ1aWxkcywgdGhhdCBpcwogICAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZGlyZWN0b3JpZXMgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeS4gCiAgICAgICAgICAgICAgSW5zdGFsbGF0aW9uIGZyb20gbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgYWxzbyB3b3JraW5nLiBBbiBpbml0aWFsCiAgICAgICAgICAgICAgY29uZmlndXJlIGluIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlzIG5vIGxvbmdlciBuZWVkZWQgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgICAgaW4gMDQvMDIvMjAwMyBlbnRyeS4gQSAnbWFrZSBkaXN0Y2xlYW4nIHdpbGwgYmUgbmVlZGVkIGJlZm9yZSBidWlsZGluZwogICAgICAgICAgICAgIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaWYgdGhlIGF1dG90b29scyAKICAgICAgICAgICAgICBoYXZlIGJlZW4gcnVuIGZyb20gdGhpcyB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHNvbWUgcG9pbnQsIGJ1dCAKICAgICAgICAgICAgICBhdXRvY29uZiB3aWxsIHRlbGwgeW91IHRoaXMuIE5vdGUgdGhhdCAnbWFrZSBjaGVjaycgb25seSB3b3JrcyBmcm9tIAogICAgICAgICAgICAgIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGF0IHRoZSBtb21lbnQuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzIzNDcxIF0gV3JhcHBlcl9wcmludCgpIGZhaWxzIHdpdGggcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMuCgowNC8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgY29uc3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBoYW5kbGluZyAKICAgICAgICAgICAgZGVzY3JpYmVkIGluIENIQU5HRVMgMDgvMTEvMjAwMi4gICBQcmV2aW91c2x5LCBTV0lHIG1lcmVseQogICAgICAgICAgICBjaGVja2VkIHRvIHNlZSBpZiB0aGVyZSB3YXMgYW4gaW5pdGlhbGl6ZXIgaW4gdGhlIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBOb3csIFNXSUcgYWRkaXRpb25hbGx5IGNoZWNrcyB0byBtYWtlIHN1cmUgdGhlIHN0YXRpYyBtZW1iZXIKICAgICAgICAgICAgaXMgY29uc3QuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSBraW5kIG9mIGxpbWl0ZWQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UsCiAgICAgICAgICAgIGFjdGl2YXRlZCB1c2luZyB0aGUgLW1pbmhlcml0IGNvbW1hbmQtbGluZSBvcHRpb24uIEkndmUgYWxzbyB1cGRhdGVkCiAgICAgICAgICAgIHRoZSAiQysrIEluaGVyaXRhbmNlIiBzZWN0aW9uIG9mIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24gdG8gZGlzY3VzcwogICAgICAgICAgICBob3cgdGhpcyB3b3JrcywgYW5kIGl0cyBsaW1pdGF0aW9ucy4gQWxzbyBhbHNvIG1vZGlmaWVkIHRoZSBtaW5oZXJpdC5pCiAgICAgICAgICAgIHRlc3QgY2FzZSB0byBydW4gYWdhaW5zdCB0aGlzLgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAtZ2xvYmFsbW9kdWxlIGNvbW1hbmQtbGluZSBvcHRpb24gZm9yIHRoZSBSdWJ5CiAgICAgICAgICAgIG1vZHVsZSwgZm9yIHdyYXBwaW5nIHN0dWZmIGludG8gdGhlIGdsb2JhbCBtb2R1bGUgKEtlcm5lbCkgaW5zdGVhZAogICAgICAgICAgICBvZiBhIG5lc3RlZCBtb2R1bGUuIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KCjA0LzIzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHN5bW5hbWUgZXJyb3IgaW4gZGlyZWN0b3IgY2FsbHMgdG8gUHl0aG9uIG1ldGhvZHMKCSAgICB0aGF0IGV4dGVuZCBDKysgb3BlcmF0b3JzLgoKCSAgICBTdG9wcGVkIGRpcmVjdG9yIGRlc3RydWN0b3Igd3JhcHBlcnMgZnJvbSBjYWxsaW5nIF9fc2V0X3VwLAoJICAgIHdoaWNoIHdhcyBsZWF2aW5nIHRoZSBkaXJlY3RvciBmbGFnIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4KCjA0LzIzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIG5hbWVzcGFjZSByZXNvbHV0aW9uIGFuZCBuZXN0ZWQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWxmcmVkIExvcmJlciAoYW5kIE1hcmNlbG8gTWF0dXMpLgoKMDQvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFBhdGNoIGZvciBKYXZhIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIHRvIHJ1biBvbiBNYWMgT1MgWC4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBJbmNvcnBvcmF0ZWQgTm9idSBOYWthZGEncyBwYXRjaGVzIGZvciBzdXBwb3J0aW5nIHRoZSBSdWJ5CiAgICAgICAgICAgIDEuOCBhbGxvY2F0aW9uIGZyYW1ld29yay4KCjA0LzE1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZXBsYWNlZCBhbGwgdXNlcyBvZiB0aGUgZGVwcmVjYXRlZCBTVFIyQ1NUUigpIG1hY3JvIHdpdGggdGhlCiAgICAgICAgICAgIHNhZmVyIFN0cmluZ1ZhbHVlUHRyKCkgbWFjcm8uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgcnVieS10YWxrOjY3MDU5CiAgICAgICAgICAgIGFuZCBmb2xsb3ctdXBzIHRvIHRoYXQgcG9zdC4KCjA0LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHByZXByb2Nlc3NvciBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgI2RlZmluZSBtaW4oeCx5KSAoKHgpIDwgKHkpKSA/ICh4KSA6ICh5KSAKICAgICAgICAgICAgICAgIGludCBmKGludCBtaW4pOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2ViYXN0aWVuIFJlY2lvLgoKMDQvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBhIHJ1bnRpbWUgY2hlY2sgdG8gdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSBsaWJyYXJ5IHRvIGNoZWNrIAogICAgICAgICAgICB0aGF0IHRoZSBKYXZhIGFycmF5IHBhc3NlZCBpbiBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBDIGFycmF5IGFuZCB0aHJvdyBhbiAKICAgICAgICAgICAgZXhjZXB0aW9uIGlmIG5vdC4KCiAgICAgICAgICAgIEFsc28gZml4IHRvIHVzZSBkZWxldGUgaW5zdGVhZCBvZiBmcmVlIGZvciBhcnJheXMgY3JlYXRlZCB1c2luZyBuZXcuCgowNC8wNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmVtb3ZlIEdDQzMgd2FybmluZyB3aGVuIGNvbXBpbGluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGU6CgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGNoYW5naW5nIHNlYXJjaCBvcmRlciBmb3Igc3lzdGVtIGRpcmVjdG9yeSAiL3Vzci9pbmNsdWRlIgogICAgICAgICAgICAgIGNjMXBsdXM6IHdhcm5pbmc6IGFzIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIGEgbm9uLXN5c3RlbSBkaXJlY3RvcnkgCgogICAgICAgICAgICBTZWUgU0YgcGF0Y2ggIzcxNTUzMSBzdWJtaXR0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zCgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXByb3ZlZCB3cmFwcGluZyBvZiBlbnVtcyBhbmQgY29uc3RhbnRzLiBUaGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICAgICAgICAgd3JhcHBlZCBhcyBDIyB2YXJpYWJsZXMgcmF0aGVyIHRoYW4gY29uc3RhbnRzLiBFaXRoZXIgdGhlc2UgYXJlIHdyYXBwZWQKICAgICAgICAgICAgYXMgcmVhZG9ubHkgKHJ1bnRpbWUpIGNvbnN0YW50cyBvciBjb21waWxlIHRpbWUgY29uc3RhbnRzLCBkZXBlbmRpbmcgb24KICAgICAgICAgICAgdGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIChUaGUgZGlyZWN0aXZlIGlzIGxpa2VseSB0byBjaGFuZ2UgbmFtZSBzb29uKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgd3JhcHBpbmc6CiAgICAgICAgICAgICAgJWphdmFjb25zdCgwKTsKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAyMgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgWFlaOwogICAgICAgICAgICAgICNkZWZpbmUgWFlaIDMzCiAgICAgICAgICAgIGlzIG5vdzoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGludCBBQkMgPSBleGFtcGxlUElOVk9LRS5nZXRfQUJDKCk7CiAgICAgICAgICAgICAgcHVibGljIGNvbnN0IGludCBYWVogPSAzMzsKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gR2xvYmFsIGNvbnN0YW50cyBhbmQgZW51bXMgYXJlIHB1dCBpbiB0aGVpciBvd24gaW50ZXJmYWNlIGNhbGxlZAogICAgICAgICAgICB4eHhDb25zdGFudHMsIHdoZXJlIHh4eCBpcyB0aGUgbW9kdWxlIG5hbWUuIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgYXMgCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIGRlcml2ZSAoaW1wbGVtZW50KSBhIEphdmEgY2xhc3MgZnJvbSB0aGUgeHh4Q29uc3RhbnRzCiAgICAgICAgICAgIGludGVyZmFjZSB0byBpbXByb3ZlIHRoZSBzeW50YXg7IG5hbWVseSB3aGVuIHdyYXBwaW5nOgogICAgICAgICAgICAgIGVudW0ge09ORT0xLCBUV08sIFRIUkVFfTsKICAgICAgICAgICAgYWNjZXNzaW5nIHRoZXNlIGZyb20gYSBKYXZhIGNsYXNzIGltcGxlbWVudGluZyB4eHhDb25zdGFudHMgaXMgbmVhdGVyOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSBPTkU7CiAgICAgICAgICAgIHRoYW4gdGhlIHByZXZpb3VzOgogICAgICAgICAgICAgIGludCBudW1iZXIgPSB4eHguT05FOwoKICAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IERhdmUgRHJpYmluLgoKMDQvMDIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGltcHJvdmVtZW50cyBmb3IgbXVsdGlwbGUgYnVpbGRzLiBUaGlzIGFsbG93cyBvbmUgdG8gYnVpbGQKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZSBhbmQgcnVudGltZSBsaWJyYXJpZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMvY29tcGlsZXJzIAogICAgICAgICAgICBldGMgYnkgcnVubmluZyBjb25maWd1cmUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBUaGlzIGlzbid0IDEwMCUganVzdCAKICAgICAgICAgICAgeWV0IGFuZCB3b24ndCBiZSB1bnRpbCBsaWJ0b29sIGlzIGJldHRlciBjb25maWd1cmVkLi4uIGEgJ2NvbmZpZ3VyZScgYW5kIAogICAgICAgICAgICAnbWFrZSBkaXN0Y2xlYW4nIG5lZWRzIHRvIGJlIHJ1biBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgYmVmb3JlIGl0IGFsbCB3b3Jrcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJCAuL2NvbmZpZ3VyZQogICAgICAgICAgICAgICQgbWFrZSBkaXN0Y2xlYW4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzE7IGNkIGNvbmZpZzE7IC4uL2NvbmZpZ3VyZSBDQz1nY2MgQ1hYPWcrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgICAkIG1rZGlyIGNvbmZpZzI7IGNkIGNvbmZpZzI7IC4uL2NvbmZpZ3VyZSBDQz1jYyBDWFg9YysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAKICAgICAgICAgICAgVG8gYmUgaW1wcm92ZWQuIEEgJ21ha2UgY2hlY2snIGRvZXMgbm90IHdvcmsgeWV0IGVpdGhlci4gCgowNC8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4KICAgICAgICAgICAgVGhpcyBzaG93ZWQgdXAgd2hlbiB0cnlpbmcgdG8gdXNlIHN0ZF92ZWN0b3IuaSB3aXRoIHZlY3RvcnMKICAgICAgICAgICAgb2YgcG9pbnRlcnMuCgowMy8zMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciBwYXJhbGxlbCBtYWtlIGJ1aWxkcyBvZiBTV0lHLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIG1ha2UgLWogNAogICAgICAgICAgICBCdWlsZCBmYWlsdXJlIHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlLgoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBSZWxlYXNlZCAxLjMuMTkuCgoKClZlcnNpb24gMS4zLjE5IChNYXJjaCAyOCwgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBWYXJpZXR5IG9mIG1pbm9yIGJ1ZyBmaXhlcyB0byB0aGUgMS4zLjE4IHJlbGVhc2UgaW5jbHVkaW5nOgoKICAgICAgICAgICAgICAgIC0gU2VnbWVudGF0aW9uIGZhdWx0IHdpdGggJWV4dGVuZCBkaXJlY3RpdmUuCiAgICAgICAgICAgICAgICAtIFR5cGVtYXAgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gRXhwcmVzc2lvbiBldmFsdWF0aW9uIGJ1Zy4KICAgICAgICAgICAgICAgIC0gTGFyZ2UgbWVtb3J5IGxlYWsgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24uCgpWZXJzaW9uIDEuMy4xOCAoTWFyY2ggMjMsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzIxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdHdvIHByb2JsZW1zIHdpdGggdGhlICVleHRlbmQgZGlyZWN0aXZlLCBvdmVybG9hZGluZywgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlIGV4cGFuc2lvbi4gIFNlZSB0aGUgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZCcgYW5kCiAgICAgICAgICAgICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWRfMicgdGVzdHMgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZSBmb3IKICAgICAgICAgICAgZGV0YWlscy4KCjAzLzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEFkZGVkIHNvbWUgdHlwZW1hcHMgYXMgc3VnZ2VzdGVkIGJ5IEFuZHJlYXMgU2Nob2VyayBmb3IgaGFuZGxpbmcKICAgICAgICAgICAgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgYXMgcG9pbnRlcnMgb3IgYnkgcmVmZXJlbmNlLiBUaGVzZSBoYXZlCiAgICAgICAgICAgIGJlZW4gcHV0IGluIHR5cGVtYXBzLmkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgQysrIHNjb3BpbmcgYnVnIHJlbGF0ZWQgdG8gY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IEZvbzo6YmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUHJldmlvdXNseSwgU1dJRyBqdXN0IHRvc3NlZCBvdXQgdGhlIEZvbzo6YmFyKCkgZGVjbGFyYXRpb24uIE5vdywKICAgICAgICAgICAgdGhlIGRlY2xhcmF0aW9uIGlzIHdyYXBwZWQgcHJvdmlkZWQgdGhhdCB0aGUgcHJlZml4IGlzIGV4YWN0bHkgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgdGhlIGN1cnJlbnQgc2NvcGUgKGluY2x1ZGluZyBhbnkgZW5jbG9zaW5nIG5hbWVzcGFjZXMpLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcnVjZSBMb3dlcnkuCgowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBbIDY5NjUxNiBdIEVuYWJsaW5nIGV4Y2VwdGlvbiBwcm9jZXNzaW5nIGZvciBkYXRhIG1lbWJlciBhY2Nlc3MuCiAgICAgICAgICAgIEluIHNvbWUgY29tcGlsZXJzLCBhdHRyaWJ1dGUgYWNjZXNzIGNhbiBnZW5lcmF0ZSBleGNlcHRpb25zLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBvcmRpbmFyaWx5IGFzc3VtZXMgdGhhdCBubyBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLiAgVG8gZGlzYWJsZSB0aGlzLAogICAgICAgICAgICB1c2UgdGhlICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKSBGb286Ong7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeDsgICAgIC8qIEV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFlha292IE1hcmtvdml0Y2guIAogCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFBhdGNoLiBbIDcwMTg2MCBdIEltcHJvdmUgUGVyZm9ybWFuY2UgKHB5dGhvbiBwcm94aWVzKS4KICAgICAgICAgICAgR2l2ZXMgYSBwZXJmb3JtYW5jZSBib29zdCB0byBwcm94eSBjbGFzcyBjb2RlIGFuZCB0aGUgbWFuYWdlbWVudCBvZiB0aGUKICAgICAgICAgICAgLnRoaXMgYW5kIC50aGlzb3duIGF0dHJpYnV0ZXMuICBDb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgowMy8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBBZGRlZCBtaXNzaW5nIHZhcmFyZyBzdXBwb3J0LgoKMDMvMTgvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgUmVtb3ZlZCBjb2RlIHJlbGF0ZWQgdG8gdGFnZ2luZyBpbmRpdmlkdWFsIG1ldGhvZHMgZm9yIGRpcmVjdG9ycy4KCSAgICBUaGUgY29uY2VwdCBvZiBoYXZpbmcgZGlyZWN0b3JzIGZvciBzb21lIGJ1dCBub3QgYWxsIHZpcnR1YWwgbWV0aG9kcwoJICAgIG9mIGEgY2xhc3MgaXMgZGVlcGx5IGZsYXdlZC4gIFRoZSAlZmVhdHVyZSgibm9kaXJlY3RvciIpIHRhZyBpcyBhbHNvCgkgICAgZ29uZS4gIAoJICAgIAoJICAgIERpcmVjdG9ycyBhcmUgb2ZmIGJ5IGRlZmF1bHQuICBUbyBlbmFibGUgdGhlbSBmb3IgYSBjbGFzcywgaXNzdWUKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBjbGFzc25hbWU7IHdoaWNoIHdpbGwgY3JlYXRlIGRpcmVjdG9yIG1ldGhvZHMKCSAgICBmb3IgZXZlcnkgdmlydHVhbCBtZXRob2QgaW4gdGhlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MuCgowMy8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCBwYXNzaW5nIGFyZ3VtZW50cyBvZiB0eXBlIGZ1bmN0aW9uLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCB4KGludCwgaW50KSk7CgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCB4KTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucywgdGhpcyB3b3VsZCBwcm9kdWNlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLiAgTm93LAogICAgICAgICAgICBTV0lHIG1lcmVseSBhZGRzIGFuIGV4dHJhIHBvaW50ZXIsIG1ha2luZyB0aGVzZSBkZWNsYXJhdGlvbnMgdGhlIHNhbWUKICAgICAgICAgICAgYXM6CgogICAgICAgICAgICAgICBpbnQgZm9vKGludCAoKngpKGludCwgaW50KSk7CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90ICp4KTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdhcnRoIEJ1c2hlbGwuCgowMy8xNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCB0aGUgcmV0dXJuIHN0YXRlbWVudCBmb3IgZGlyZWN0b3IgYmFzZSBjbGFzcyBjYWxscyB0aGF0IGhhdmUgbm8KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLgoKMDMvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb25zdCBzbWFydC1wb2ludGVyIHdyYXBwaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgb25seSAieCIgYW5kICJiYXIiIGFyZSB2aXNpYmxlIGZyb20gQmxhaCAoc2luY2UgYXBwbGljYXRpb24KICAgICAgICAgICAgb2Ygc3BhbSB2aW9sYXRlcyBjb25zdG5lc3MpLiAgTW9yZW92ZXIsIGFjY2VzcyB0byAieCIgaXMgcmVhZC1vbmx5LgogICAgICAgICAgIAowMy8xNS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDbGVhbmVkIHVwIHR3byBzaWduZWQgdmVyc3VzIHVuc2lnbmVkIGNvbXBhcmlzb25zIGluIHB5dGhvbi9zdGRfdmVjdG9yLmkuCgkgICAgCjAzLzE1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEdsb2JhbCB2YXJpYWJsZXMgYXJlIHdyYXBwZWQgdXNpbmcgcHJvcGVydGllcyBpbnN0ZWFkIG9mIGdldCBhbmQgc2V0IG1ldGhvZHMuCiAgICAgICAgICAgIE1lbWJlciB2YXJpYWJsZSB3cmFwcGluZyBidWcgZml4ZXMsIGZvciBleGFtcGxlIHdyYXBwaW5nIHBvaW50ZXJzIHdvcmsgbm93LgogICAgICAgICAgICBUeXBlbWFwcyBhcmUgdXNlZCBmb3IgYWxsIHZhcmlhYmxlIHdyYXBwaW5nIHRvIGdlbmVyYXRlIHRoZSBwcm9wZXJ0eSBjb2RlLgoKMDMvMTMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIHZpcnR1YWwgbWV0aG9kIHVucm9sbGluZyBmb3IgZGlyZWN0b3JzLiAKCSAgICBUaGUgb3JkZXIgb2YgdW5yb2xsaW5nIGlzIG5vdyBmcm9tIGJhc2UgdG8gZGVyaXZlZCwgdG8gZW5zdXJlCgkgICAgdGhhdCB0aGUgbW9zdCBkZXJpdmVkIGltcGxlbWVudGF0aW9uIG9mIGEgZGlyZWN0b3IgbWV0aG9kIGlzCgkgICAgZm91bmQuCgoJICAgIERpcmVjdG9yIG1ldGhvZHMgZm9yIHB1cmUgdmlydHVhbCBtZXRob2RzIG5vdyB0aHJvdwoJICAgIERJUkVDVE9SX1BVUkVfVklSVFVBTF9FWENFUFRJT04gaWYgX3VwIGlzIHNldC4KCjAzLzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIFBvbHltb3JwaGlzbSBmaXg6IHZpcnR1YWwgZnVuY3Rpb25zIG5vdyB1c2UgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgICAgIGtleXdvcmQgaW4gdGhlIEMjIHByb3h5IGNsYXNzLCB2aXJ0dWFsIG9yIG92ZXJyaWRlLgogICAgICAgICAgICBTb21lICd1c2luZyBTeXN0ZW07JyBzdGF0ZW1lbnQgZml4ZXMgbmVlZGVkIGJ5IHRoZSBNb25vIGNvbXBpbGVyLgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgYnVnIGluIHRoZSBhcHBsaWNhdGlvbiBvZiBTd2lnVmFsdWVXcmFwcGVyPD4gdG8KICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3NlcyB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJ1Y2UgTG93ZXJ5LgoKMDMvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBUaGUgJGRlc2NyaXB0b3IodHlwZSkgdmFyaWFibGUgaXMgbm93IGV4cGFuZGVkIGluIGNvZGUgc3VwcGxpZWQgdG8KICAgICAgICAgICAgJWV4dGVuZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBjZXJ0YWluIGtpbmRzIG9mIGFkdmFuY2VkIHdyYXBwaW5nIAogICAgICAgICAgICAoZXNwZWNpYWxseSBjb250YWluZXIgY2xhc3NlcykuCgowMy8xMS8yMDAzOiBsdWlnaQogICAgICAgICAgICBTdXBwb3J0IGZvciBzdGQ6Om1hcC4KICAgICAgICAgICAgKGEpIEludGVncmF0aW9uIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlIChhIGxhIHN0ZDo6dmVjdG9yKSBmb3IKICAgICAgICAgICAgICAgIFB5dGhvbiwgUnVieSwgTXpTY2hlbWUsIGFuZCBHdWlsZTsKICAgICAgICAgICAgKGIpIFNpbXBsZSB3cmFwcGVyIGZvciBvdGhlciBsYW5ndWFnZXMKCjAzLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgU1dJRwogICAgICAgICAgICB3YXNuJ3QgcGFyc2luZyBjZXJ0YWluIG9jdGFsIGNvZGVzIGNvcnJlY3RseS4KCjAzLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSB2YXJpZXR5IG9mIHN1YnRsZSBwcmVwcm9jZXNzb3IgcHJvYmxlbXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2ViYXN0aWVuIFJlY2lvLgoKICAgICAgICAgICAgKGEpIEVtcHR5IHByZXByb2Nlc3NvciB2YWx1ZXMgbm8gbG9uZ2VyIGdlbmVyYXRlICJiYWQgY29uc3RhbnQKICAgICAgICAgICAgdmFsdWUiIGVycm9ycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08KICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08gQkFSCgogICAgICAgICAgICAoYikgTWFjcm8gbmFtZXMgY2FuIG5vdyBzcGFuIG11bHRpcGxlIGxpbmVzICh0ZWNobmljYWxseSB2YWxpZCwKICAgICAgICAgICAgYWx0aG91Z2ggcXVlc3Rpb25hYmxlIHByYWN0aWNlKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBBX0xPTkdfTUFDUk9fXAogICAgICAgICAgICAgICAgICBOQU1FIDQyCgogICAgICAgICAgICAoYykgV2hpdGVzcGFjZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgYmVmb3JlIGNlcnRhaW4gbWFjcm8gdmFsdWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIkhlbGxvIgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEJBUlwKICAgICAgICAgICAgICAgICAgIkhlbGxvIgogCjAzLzA3LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVtYXBzCiAgICAgICAgICAgIGluIHRoZSBMaWIvcnVieS90eXBlbWFwcy5pIGxpYnJhcnkgZmlsZS4KCjAzLzA3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9jYWxsYmFjayB0byBkZW1vc3RyYXRlIGhvdyBkaXJlY3RvcnMgY2FuCgkgICAgYmUgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzIGluIFB5dGhvbgoJICAgIEFkZGVkIEV4YW1wbGVzL3B5dGhvbi9leHRlbmQgdG8gZGVtb25zdHJhdGUgdmlydHVhbCBtZXRob2QKCSAgICBjYWxscyBmcm9tIEMrKyB0byBQeXRob24gKHJlYWxseSB0aGUgc2FtZSBhcyB0aGUgY2FsbGJhY2sKCSAgICBleGFtcGxlLCBqdXN0IGEgZGlmZmVyZW50IGNvbnRleHQpLgoJICAgIEFkZGVkIGZvdXIgdGVzdHMgZm9yIHZlcnkgYmFzaWMgZGlyZWN0b3IgZnVuY3Rpb25hbGl0eS4gIFRoZXNlCgkgICAgaGF2ZSBydW50aW1lIHRlc3RzIHVuZGVyIHB5dGhvbi4KCSAgICBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW1pdHMgI2RlZmluZSBTV0lHX0RJUkVDVE9SUyBuZWFyIHRoZQoJICAgIHRvcCBvZiB0aGUgb3V0cHV0IGZpbGUgaWYgZGlyZWN0b3JzIGFyZSBlbmFibGVkLiAgVGhpcyBpcyB1c2VmdWwKCSAgICBmb3IgZGlzYWJsaW5nIHBhcnRzIG9mIHRlc3RzIGluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkb24ndAoJICAgIHN1cHBvcnQgZGlyZWN0b3JzLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgYSBzZWN0aW9uIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgb24gY3Jvc3MgbGFuZ3VhZ2UKCSAgICBwb2x5bW9ycGhpc20gKGRpcmVjdG9ycykuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBUaGUgc2hvcnQtbGl2ZWQgIi1mZGlyZWN0b3JzIiBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuCgkgICAgcmVtb3ZlZC4gIFRvIGVuYWJsZSBkaXJlY3RvcnMsIGluc3RlYWQgdXNlIHRoZSBleHRlbmRlZCAlbW9kdWxlIAoJICAgIGRpcmVjdGl2ZSBhcyBmb2xsb3dzOgoKCSAgICAgICAgJW1vZHVsZShkaXJlY3RvcnM9IjEiKSBtb2R1bGVuYW1lCgowMy8wNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIGxvbmcgbG9uZyB0eXBlbWFwcyBoYXZlIGJlZW4gcmV3cml0dGVuIHNvIHRoYXQgdGhleSBjYW4gYmUgbW9yZQogICAgICAgICAgICBlYXNpbHkgdXNlZCB3aXRoIG5vbiBJU08gY29tcGlsZXJzLCBsaWtlIFZpc3VhbCBDKysuIEZvciBleGFtcGxlCiAgICAgICAgICAgIGlmIHlvdSBhcmUgd3JhcHBpbmcgdGhlIFdpbmRvd3MgNjQgYml0IHR5cGUgX19pbnQ2NCB0aGUgbG9uZyBsb25nCiAgICAgICAgICAgIHR5cGVtYXBzIGNhbiBiZSB1c2VkIHdpdGggJWFwcGx5OgoKICAgICAgICAgICAgICAgICVhcHBseSBsb25nIGxvbmcgeyBfX2ludDY0IH07CiAgICAgICAgICAgICAgICBfX2ludDY0IHZhbHVlMShfX2ludDY0IHgpOwoKICAgICAgICAgICAgX19pbnQ2NCB3aWxsIG5vdyBhcHBlYXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgbG9uZyBsb25nLgogICAgICAgICAgICAKMDMvMDYvMjAwMzogYmVhemxleQogICAgICAgICAgICAqKiogREVWRUxPUEVSIENIQU5HRSAqKioKICAgICAgICAgICAgU3dpZyBtb2R1bGUgbXV0YXRpb24gaGFzIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIFdoZW4gYSBsYW5ndWFnZQogICAgICAgICAgICBjbGFzcyBtZXRob2Qgd2FudHMgdG8gc2F2ZSBub2RlIGF0dHJpYnV0ZXMsIGl0IG5vdyB1c2VzIG9uZSBvZiB0aGUKICAgICAgICAgICAgZm9sbG93aW5nIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpCiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgpCgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlc2UgZnVuY3Rpb25zIGlzIGEgbmFtZXNwYWNlIGluIHdoaWNoCiAgICAgICAgICAgIHNhdmVkIGF0dHJpYnV0ZXMgYXJlIHBsYWNlZC4gIEZvciBleGFtcGxlLHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICAgTm9kZSAqbjsKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCJjRGVjbGFyYXRpb24iLG4sInR5cGUiLCJwYXJtcyIsIm5hbWUiLE5JTCk7CgogICAgICAgICAgICBzYXZlcyB0aGUgYXR0cmlidXRlcyBhcyAiY0RlY2xhcmF0aW9uOnR5cGUiLCAiY0RlY2xhcmF0aW9uOnBhcm1zIiwKICAgICAgICAgICAgYW5kIHNvIGZvcnRoLiAgIElmIG5lY2Vzc2FyeSwgYSBsYW5ndWFnZSBtb2R1bGUgY2FuIHJlZmVyIHRvCiAgICAgICAgICAgIG9sZCB2YWx1ZXMgYnkgdXNpbmcgdGhpcyBzcGVjaWFsIG5hbWVzcGFjZSBxdWFsaWZpZXIuCgogICAgICAgICAgICBJbiBhZGRpdGlvbiB0byB0aGlzLCBhIHNwZWNpYWwgYXR0cmlidXRlICJ2aWV3IiBjb250YWlucyB0aGUgbmFtZQogICAgICAgICAgICBvZiB0aGUgbGFzdCBuYW1lc3BhY2UgdXNlZCB0byBzYXZlIGF0dHJpYnV0ZXMuICBJbiB0aGUgYWJvdmUgCiAgICAgICAgICAgIGV4YW1wbGUsICJ2aWV3IiB3b3VsZCBoYXZlIHRoZSB2YWx1ZSAiY0RlY2xhcmF0aW9uIi4gICBUaGUgdmFsdWUKICAgICAgICAgICAgb2YgImNEZWNsYXJhdGlvbjp2aWV3IiB3b3VsZCBoYXZlIHRoZSBwcmV2aW91cyB2aWV3IGFuZCBzbyBmb3J0aC4KCiAgICAgICAgICAgIFN3aWdfcmVzdG9yZShuKSByZXN0b3JlcyBhIG5vZGUgdG8gdGhlIHN0YXRlIGJlZm9yZSB0aGUgbGFzdAogICAgICAgICAgICBTd2lnX3JlcXVpcmUoKSBvciBTd2lnX3NhdmUoKSBjYWxsLgoKICAgICAgICAgICAgTm90ZTogIFRoaXMgY2hhbmdlIG1ha2VzIGl0IGVhc2llciBmb3IgbGFuZ3VhZ2UgbW9kdWxlcyB0byByZWZlcgogICAgICAgICAgICB0byBvbGQgdmFsdWVzIG9mIGF0dHJpYnV0ZXMuICAKCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNZXJnZWQgdGhlIGNyb3NzLWxhbmd1YWdlIHBvbHltb3JwaGlzbSBwYXRjaC4gIFdoZW4gZW5hYmxlZCwgQysrIAoJICAgICJwcm94eSIgY2xhc3NlcyAoY2FsbGVkIGRpcmVjdG9ycykgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBzcGVjaWZpZWQgCgkgICAgQysrIGNsYXNzLiAgRGlyZWN0b3JzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiwgc2ltaWxhciAKCSAgICB0byB0aGUgd2F5IHRoZSB1c3VhbCBwcm94eSAoc2hhZG93KSBjbGFzc2VzIHBhc3MgbWV0aG9kIGNhbGxzIGZyb20gCgkgICAgUHl0aG9uIHRvIEMrKy4gIFRvZ2V0aGVyLCB0aGVzZSB0d28gdHlwZXMgb2YgcHJveGllcyBhbGxvdyBDKysgCgkgICAgY2xhc3NlcyB0aGF0IGFyZSBleHRlbmRlZCBpbiBQeXRob24gdG8gYmVoYXZlIGp1c3QgbGlrZSBvcmRpbmFyeSAKCSAgICBDKysgY2xhc3NlcyBhbmQgYmUgdXNlZCBpbiBDKysgbGlrZSBuYXRpdmUgb2JqZWN0cy4gIAoJICAgIAoJICAgIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCB2ZXJ5IGV4cGVyaW1lbnRhbCBhbmQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KCSAgICBUbyBlbmFibGUgZGlyZWN0b3Igc3VwcG9ydCwgc3BlY2lmeSAnLWZkaXJlY3RvcnMnIG9uIHRoZSBTV0lHIGNvbW1hbmQKCSAgICBsaW5lIG9yIGluIHRoZSBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSW4gdGhlIGludGVyZmFjZQoJICAgIGZpbGUsIGFkZCAlZmVhdHVyZSgiZGlyZWN0b3IiKSB0byBnZW5lcmF0ZSBkaXJlY3RvcnMgZm9yIGFsbCBjbGFzc2VzCgkgICAgdGhhdCBoYXZlIHZpcnR1YWwgbWV0aG9kcy4gIAoJICAgIAoJICAgIFNlZSBodHRwOi8vc3RtLmxibC5nb3YvfnRtMi9zd2lnL1Byb3h5RG9jLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KCSAgICAKCjAzLzAzLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzbWFsbCBnbGl0Y2ggaW4gdHlwZW1hcCBsb2NhbCB2YXJpYWJsZSByZXBsYWNlbWVudC4gIElmIHlvdSBoYWQKICAgICAgICAgICAgYSB0eXBlbWFwIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgKCQxX3R5cGUgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gLi4uOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIG5vIG9jY3VycmVuY2Ugb2YgIiQxX3R5cGUiIGFwcGVhcmVkIGluIHRoZSBib2R5LCB0aGVuIHRoZSBsb2NhbAogICAgICAgICAgICB2YXJpYWJsZSB0eXBlIHdvdWxkbid0IGJlIHN1YnN0aXR1dGVkLgoKMDMvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IHZlcnNpb24gb2YgdGhlIENTaGFycCBtb2R1bGUgd2hpY2ggaXMgdHlwZW1hcCBiYXNlZC4KICAgICAgICAgICAgSXQgYWxzbyB1c2VzIEVDTUEgQyMgYW5kIG5vIGxvbmdlciB1c2VzIE1pY3Jvc29mdCBWaXN1YWwgQysrLk5FVCAKICAgICAgICAgICAgZ2x1ZS4gVGhpcyBtZWFucyB0aGF0IGl0IHdpbGwgd29yayBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IE5laWwgQ2F3c2UuCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUzNTQ4IF0gZXJyb3IgcGFyc2luZyBjYXN0aW5nIG9wZXJhdG9yIGRlZmluaXRpb24uCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgY2FzdGluZyBvcGVyYXRvcnMgZGVjbGFyZWQgb3V0c2lkZSBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbmxpbmUgQTo6b3BlcmF0b3IgY2hhciAqKCkgeyAuLi4gfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcnRpbiBDYXNhZG8uCgowMi8yNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGFub255bW91cyBiaXQtZmllbGRzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICAgaW50IHggOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50ICAgOiA0OwogICAgICAgICAgICAgICAgICAgICAgaW50IHkgOiA4OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbm9ueW1vdXMgYml0LWZpZWxkcyBhcmUgaWdub3JlZCBieSBTV0lHLiAgIFByb2JsZW0KICAgICAgICAgICAgcmVwb3J0ZWQgYnkgRnJhbnogSPZwZmluZ2VyLgoKMDIvMjYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgdHlwZW1hcHMgaW4gdGhlIEV4YW1wbGVzL2phdmEvdHlwZW1hcCBleGFtcGxlIGFuZCBhbHNvIAogICAgICAgICAgICBmaXhlcyBzdWJ0bGUgYnVnIHdoZW4gdXNpbmcgdGhlIFN0cmluZ0J1ZmZlciB0eXBlbWFwcyBtb3JlIHRoYW4gb25jZS4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDIxMTIgXSBDb25zdGFudHMgY2hhciBidWcuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1MzM3IF0gUGFydGlhbCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBub3QgZW50aXJlbHkgd29ya2luZy4KICAgICAgICAgICAgVGhlcmUgd2FzIGEgc3VidGxlIHByb2JsZW0gcmVsYXRlZCB0byB0aGUgbmFtaW5nIGFuZCBvcmRlcmluZyBvZgogICAgICAgICAgICB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50cy4gIE1hdGNoaW5nIHdvcmtlZCBva2F5LAogICAgICAgICAgICB0aGUgcmVzdWx0aW5nIHRlbXBsYXRlcyB3ZXJlbid0IGV4cGFuZGVkIGNvcnJlY3RseS4KCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHBhcnNpbmcgKGFuZCBnZW5lcmF0aW5nIGNvZGUpIGZvciAKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBhcnJheXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgZm9vKGludCAoJngpWzEwXSk7CiAgCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUzNDcgXSBDb21waWxhdGlvbiB3YXJuaW5nIGZyb20gbGlicHkuYy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGFuaWVsIEwuIFJhbGwuCiAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdmlydHVhbCBtZXRob2QgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgY2hlY2tpbmcgYW5kIHR5cGVkZWYuCgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICppbnRwdHI7CgogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAqZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnRwdHIgZm9vKCkgeyB9OwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cmVhdGluZyB0aGVzZSBkZWNsYXJhdGlvbnMgYXMgZGlmZmVyZW50IGV2ZW4gdGhvdWdoCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lICh2aWEgdHlwZWRlZikuCgowMi8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgcmFuZ2UgY2hlY2tpbmcgZm9yIHRoZSBOVU0yVVNIUlQgbWFjcm8sIHBlciBbIDY3NTM1MyBdLgoKMDIvMjQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggdGhlIGNvZGUgdGhhdCBkZXRlcm1pbmVkIGlmIGEgY2xhc3MgaXMgYWJzdHJhY3QKICAgICAgICAgICAgYW5kIGNhbiBiZSBpbnN0YW50aWF0ZWQuICAgIElmIHlvdSBoYWQgY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgc3RydWN0IEIgOiB2aXJ0dWFsIEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDIDogdmlydHVhbCBBIHsgCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAvKiBOb3RlIG9yZGVyIG9mIGJhc2UgY2xhc3NlcyAqLwkKICAgICAgICAgICAgICAgICAgc3RydWN0IEQgOiBCLCBDIHsgfTsgICAgLyogT2sgKi8KICAgICAgICAgICAgICAgICAgc3RydWN0IEUgOiBDLCBCIHsgfTsgICAgLyogQnJva2VuICovCgogICAgICAgICAgICB0aGVuIFNXSUcgZGV0ZXJtaW5lZCB0aGF0IGl0IGNvdWxkIGluc3RhbnRpYXRlIEQoKSwgYnV0IG5vdCBFKCkuCiAgICAgICAgICAgIFRoaXMgaW5jb25zaXN0ZW5jeSBhcm9zZSBmcm9tIHRoZSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlIAogICAgICAgICAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkgdG8gbG9jYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlydHVhbAogICAgICAgICAgICBtZXRob2RzLiAgIFRoaXMgcHJvYmxlbSBzaG91bGQgbm93IGJlIGZpeGVkLS0tU1dJRyB3aWxsIGF0dGVtcHQKICAgICAgICAgICAgdG8gbG9jYXRlIGFueSB2YWxpZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHZpcnR1YWwgbWV0aG9kIGJ5CiAgICAgICAgICAgIHRyYXZlcnNpbmcgb3ZlciB0aGUgZW50aXJlIGhpZXJhcmNoeS4KCjAyLzIyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB1c2luZyBlbnVtIHR5cGVtYXBzLiBUaGUgSmF2YSBmaW5hbCBzdGF0aWMgdmFyaWFibGUgdHlwZQogICAgICAgICAgICBjYW4gYmUgc2V0IHVzaW5nIHRoZSBqc3R5cGUgdHlwZW1hcCwgZW5hYmxpbmcgZW51bXMgdG8gYmUgbWFwcGVkIHRvIAogICAgICAgICAgICBzb21ldGhpbmcgb3RoZXIgdGhhbiBpbnQuIEJ1ZyByZXBvcnRlZCBieSBIZWluZXIgUGV0aXRoLgoKMDIvMjEvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCBDU2hhcnAgKEMjKSBtb2R1bGUgcHJvdG90eXBlCiAgICAgICAgICAgIGkuZS4gY3NoYXJwLmN4eCAmIGNzaGFycC5oIGF0IFNvdXJjZS9Nb2R1bGVzLy4KICAgICAgICAgICAgVGhleSBhcmUgZm9yIHRlc3QgdXNhZ2Ugb25seSBub3cgYW5kIG5lZWQgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgIFRoZSBpbnRlcmZhY2UgYWxzbyBuZWVkIHRvIGJlIG1vZGlmaWVkLgoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgIAowMi8yMC8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIHdpdGggLWZ2aXJ0dWFsLgogICAgICAgICAgICBTaW1pbGFyIGFzIGJlYXpsZXkncyBtb2RpZmljYXRpb24gdG9kYXkuCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGdjYy1zdHlsZSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgCiAgICAgICAgICAgIFBhdGNoIFsgNjIzMjU4IF0gR0NDLXN0eWxlIHZhcmFyZyBtYWNybyBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2UgTWFzb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IGNsYXNzZXMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhpbnQgeCkgPSAwOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbyhJbnRlZ2VyIHgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgZ2V0dGluZyBjb25mdXNlZCBhYm91dCB0aGUgbGF0dGVyIG1ldGhvZC0tLW1ha2luZyBCYXIKICAgICAgICAgICAgYWJzdHJhY3QuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlamF2YWNvbnN0KGZsYWcpIGNhbiBhbHNvIGJlIHVzZWQgb24gZW51bXMgYXMgd2VsbCBhcyBjb25zdGFudHMuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRydWUgSmF2YSBjb21waWxlciBjb25zdGFudHMgc28gdGhhdCB0aGV5IGNhbiBiZSAKICAgICAgICAgICAgdXNlZCBpbiBKYXZhIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGFua3MgdG8gSGVpbmVyIFBldGl0aCBmb3IgcGF0Y2hlcy4KCjAyLzE5LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgTW9kaWZpZWQgLWZjb21wYWN0IGZlYXR1cmUgdG8gZGVhbCB3aXRoIFBQIGxpbmVzCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg5MDQwIF0gTWlzc2luZyByZXR1cm4gdmFsdWUgaW4gc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2JlcnQgSC4gZGUgVnJpZXMuCgowMi8xOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgZmV3IGV2aWwgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHRlbXBsYXRlcywgbmFtZXNwYWNlcywgYW5kIHRoZQogICAgICAgICAgICAlZXh0ZW5kIGRpcmVjdGl2ZS4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoKMDIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtSdWJ5XSBJbXByb3ZlZCBzdXBwb3J0IGZvciBWaXN1YWwgQysrIGFuZCBvdGhlciBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuIAogICAgICAgICAgICBJdCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgIi9FWFBPUlQ6SW5pdF88bW9kdWxlPiIsIHdoZXJlIDxtb2R1bGU+IGlzIHRoZQogICAgICAgICAgICBzd2lnIG1vZHVsZSBuYW1lIHdoZW4gbGlua2luZyB1c2luZyB0aGVzZSBuYXRpdmUgV2luZG93cyBjb21waWxlcnMuCgowMi8xNS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1mdmlydHVhbCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyByZWRpZmluZWQgdmlydHVhbCBmdW5jdGlvbiBpbiBjaGlsZHJlbiBjbGFzc2VzLgoKICAgICAgICAgICAgTW9kaWZpZWQgLWNvbXBhY3Qgb3B0aW9uIHRvIC1mY29tcGFjdCBvcHRpb24KCiAgICAgICAgICAgIEFkZGVkIC1zbWFsbCBvcHRpb24uCiAgICAgICAgICAgIC1zbWFsbCA9IC1mdmlydHVhbCAtZmNvbXBhY3QKICAgICAgICAgICAgQW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBmdXR1cmUgZmVhdHVyZSBvcHRpb25zLAogICAgICAgICAgICB3aGljaCBhcmUgdXNlZCB0byByZWR1Y2Ugd3JhcHBlciBmaWxlIHN6aWUuCgogICAgICAgICAgICBBZGRlZCBTV0lHX0ZFQVRVUkVTIGVudmlyb25tZW50IHZhcmlhYmxlIGNoZWNrLgogICAgICAgICAgICBUbyBkeW5hbWljYWxseSBzZXQgdGhlIGZlYXR1cmUgb3B0aW9ucyBzdWNoIGFzIC1mY29tcGFjdCAmIC1mdmlydHVhbAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMi8xMy8yMDAzOiBsZW56CiAgICAgICAgICAgIFVwZGF0ZWQgRG9jL01hbnVhbC9QZXJsNS5odG1sIHRvIHRhbGsgYWJvdXQgQysrIGNvbXBpbGUgcHJvYmxlbXMKICAgICAgICAgICAgY29uZmlndXJlLmluIG5vdyBjaGVja3MgZm9yIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgUnVudGltZS9NYWtlZmlsZS5pbiBhbmQgRXhhbXBsZS9NYWtlZmlsZS5pbiBub3cgdXNlIFBFUkw1X0NDRkxBR1MKICAgICAgICAgICAgQWRkZWQgTGliL3Blcmw1L25vZW1iZWQuaCB3aGljaCBjb250YWlucyBhbGwgdGhlIGtub3duIG1hY3JvIGNvbmZsaWN0cwoKMDIvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4NTQxMCBdIEMrKyBFeHBsaWNpdCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGNhdXNlcyBTV0lHIHRvIGV4aXQuCiAgICAgICAgICAgIEZpeGVzIGEgc3ludGF4IGVycm9yIHdpdGggZGVjbGFyYXRpb25zIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3Mgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIGluc3RhbnRpYXRpb24gYW5kIGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZS4KICAgICAgICAgICAgV2UgbWlnaHQgZG8gbW9yZSBsYXRlci4gIFJlcG9ydGVkIGJ5IFRob21hcyBXaWxsaWFtc29uLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJld3JvdGUgYm9vbCB0eXBlbWFwcyB0byByZW1vdmUgcGVyZm9ybWFuY2Ugd2FybmluZyBmb3IgY29tcGlsaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIFZpc3VhbCBDKysuCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB3cmFwcGluZyByZWZlcmVuY2UgdmFyaWFibGVzIChjb25zdCBub24tcHJpbWl0aXZlIGFuZCBhbGwgbm9uLWNvbnN0IHR5cGVzKSAKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgaW50JiBpOwogICAgICAgICAgICAgIENsYXNzJiBjOwogICAgICAgICAgICAgIGNvbnN0IENsYXNzJiBjOwoKMDIvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBtb3JlIHZlcnkgc3VidGxlIHByZXByb2Nlc3NvciBjb3JuZXIgY2FzZXMgcmVsYXRlZCB0byByZWN1cnNpdmUKICAgICAgICAgICAgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBjYXQoeCx5KSB4ICMjIHkKCiAgICAgICAgICAgICAgICAgICBjYXQoY2F0KDEsMiksMykgICAgLy8gUHJvZHVjZXM6IGNhdCgxLDIpMwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIHhjYXQoeCx5KSBjYXQoeCx5KQoKICAgICAgICAgICAgICAgICAgIHhjYXQoeGNhdCgxLDIpLDMpICAvLyBQcm9kdWNlcyAxMjMKCiAgICAgICAgICAgIFNlZSBLJlIsIDJuZCBFZC4gcC4gMjMxLgoKMDIvMTAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNjgzODgyIF0gLSBwYXRjaCBzdWJtaXR0ZWQgYnkgRi4gUG9zdG1hIGZvciBTV0lHIHRvIGNvbXBpbGUgb24gSFAtVVguCgowMi8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXhwYW5zaW9uIGJ1Zy4gUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzEwLzIwMDM6IHNvbmd5YW5mCiAgICAgICAgICAgIEFkZGVkIC1jb21wYWN0IG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIGNvbW1lbnRzIGFuZCBjb21iaW5pbmcgc2hvcnQgbGluZXMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKIAowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjUxMzU1IF0gU3ludGF4IGVycm9yIHdpdGggY3N0cmluZy5pCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE9tcmkgQmFyZWwuCgowMi8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjYzNjMyIF0gaW5jb21wYXRpYmlsaXR5IHdpdGggc3RhbmRhcmQgY3BwLgogICAgICAgICAgICBUaGlzIGlzIGEgcmVmaW5lbWVudCB0aGF0IGZpeGVzIHRoaXMgcHJvYmxlbToKCiAgICAgICAgICAgICAgICAgLy8gU29tZSBtYWNybyB3aXRoIGFuIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08oeCkgICAgICAgeAoKICAgICAgICAgICAgICAgICBpbnQgRk9POyAgICAgICAgLyogTm90IGEgbWFjcm8tLS1ubyBhcmd1bWVudHMgKi8KIAowMi8wNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjc1NDkxIF0gcGFyc2UgZXJyb3Igd2l0aCBnbG9iYWwgbmFtZXNwYWNlIHF1YWxpZmljYXRpb24uCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBKZXJlbXkgWWFsbG9wLgoKMDIvMDQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdmFyYXJncyBwcm9jZXNzaW5nIGludHJvZHVjZWQgYnkgdGhlIG51bWlucHV0cyB0eXBlbWFwIHBhcmFtZXRlci4KCjAxLzA4LzIwMDM6IHR0bgoJICAgIFt4bWxdIEZpeCBzdHJpbmctcmVwbGFjZW1lbnQgb3JkZXJpbmcgYnVnbGV0LgoJICAgIFRoYW5rcyB0byBHYXJ5IEhlcnJvbi4KCjEyLzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGdXJ0aGVyIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gVGhlIFNXSUcgZXhlY3V0YWJsZSBpcyBub3cgYnVpbHQgdXNpbmcgYSBzaW5nbGUgTWFrZWZpbGUuCiAgICAgICAgICAgIC0gVGhpcyBtYWtlZmlsZSBpcyBnZW5lcmF0ZWQgYnkgQXV0b21ha2UgKFNvdXJjZS9NYWtlZmlsZS5hbSkuCiAgICAgICAgICAgIC0gRGVwZW5kZW5jeSB0cmFja2luZyBhbmQgdGFncyBzdXBwb3J0IGFyZSBpbiB0aGlzIG1ha2VmaWxlLgogICAgICAgICAgICAtIEF1dG9tYWtlIDEuNy4yIGFuZCBBdXRvY29uZiAyLjU0IG1pbmltdW0gdmVyc2lvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBTV0lHIGZyb20gQ1ZTLgogICAgICAgICAgICAtIFJ1bm5pbmcgLi9hdXRvZ2VuLnNoIG5vdyBpbnN0YWxscyBBdXRvY29uZi9BdXRvbWFrZSBzdXBwb3J0IGZpbGVzIGludG8KICAgICAgICAgICAgICBUb29scy9jb25maWcgYW5kIHRoZXNlIGZpbGVzIGFyZSBubyBsb25nZXIgc3RvcmVkIGluIENWUy4KICAgICAgICAgICAgLSBCdWcgZml4ZXMgaW4gJ21ha2UgaW5zdGFsbCcgZm9yIHN5c3RlbXMgdXNpbmcgLmV4ZSBleGVjdXRhYmxlIGV4dGVuc2lvbiBhbmQKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcmVsZWFzZS1zdWZmaXg9d2hhdGV2ZXIKCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb3JlIGJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gQXV0b2NvbmYncyBBQ19DQU5PTklDQUxfSE9TVCByZXBsYWNlcyBwcm9wcmlldGFyeSBhcHByb2FjaCBmb3IgZGV0ZWN0aW5nIGJ1aWxkIGhvc3QuCiAgICAgICAgICAgIC0gQXV0b2NvbmYgc3VwcG9ydCBmaWxlcyBtb3ZlZCB0byBUb29scy9jb25maWcuCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBydW4gb24gTWFjT1MsIHN1Ym1pdHRlZCBieSBCZXJuYXJkIERlc2dyYXVwZXMuCiAgICAgICAgICAgIE1haW5seSBlbnN1cmluZyBnZW5lcmF0ZWQgZmlsZXMgYXJlIG91dHB1dCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IGZvcgogICAgICAgICAgICBzb21lIG1vZHVsZXMuCgoxMi8xMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmFyaW91cyBidWlsZCBtb2RpZmljYXRpb25zIGFuZCBidWcgZml4ZXM6CiAgICAgICAgICAgIC0gU2ltcGxpZmljYXRpb24gb2YgdmVyc2lvbiBzdHJpbmcuIFVzZSBhdXRvY29uZidzIFBBQ0tBR0VfVkVSU0lPTiBpbnN0ZWFkLgogICAgICAgICAgICAtIEJ1aWxkIHRpbWUgcmVtb3ZlZCBmcm9tIFNXSUcgdmVyc2lvbi4KICAgICAgICAgICAgLSBVc2luZyBzdGFuZGFyZCBhdXRvY29uZiBjb25maWcgaGVhZGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIC0gVXBkYXRlZCBvbGQgYXV0b2NvbmYgbWFjcm9zIGFzIHJlcG9ydGVkIGJ5IGF1dG91cGRhdGUuCiAgICAgICAgICAgIC0gUmVtb3ZlZCAkcHJlZml4IGluIGF1dG9jb25mIGZyb20gc2VhcmNoIHBhdGhzIGFzIGF1dG9jb25mIHdvbid0IGV4cGFuZCB0aGVtLgogICAgICAgICAgICAtIFN1YnRsZSBidWcgZml4IHdoZXJlICdtYWtlIHByZWZpeD0vc29tZXdoZXJlOyBtYWtlIGNsZWFuOyBtYWtlIHByZWZpeD0vc29td2hlcmUvZWxzZScKICAgICAgICAgICAgICBwcm9kdWNlZCBhbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBpbmNvcnJlY3QgbGlicmFyeSBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSBBZGRlZCAtbGRmbGFncyBjb21tYW5kbGluZSBvcHRpb24gZm9yIE16U2NoZW1lLCBPY2FtbCwgUGlrZSBhbmQgUEhQLgogICAgICAgICAgICAtIEZpeGVkIHJlcG9ydGluZyBvZiBjb21waWxlciB1c2VkIHdoZW4gdXNpbmcgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICAtIFNXSUcgd2ViIGFkZHJlc3MgYWRkZWQgdG8gLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uLgoKMTIvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBmaXggdG8gVGNsIGR5bmFtaWMgY2FzdCB0eXBlbWFwcy4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgS3Jpc3RvcGhlciBCbG9tLgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdGVtcGxhdGUgYXJndW1lbnQgcmVwbGFjZSBidWcuICBSZXBvcnRlZCBieQogICAgICAgICAgICBDaHJpcyBGbGF0bGV5LgoKMTIvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXZlcnRlZCBDSEFOR0VTIDA5LzAzLzIwMDIsIHByZXByb2Nlc3NvciBhcmd1bWVudCBldmFsdWF0aW9uLiAgQXJndW1lbnRzCiAgICAgICAgICAgIGFyZSBub3QgZXZhbHVhdGVkIGR1cmluZyBjb2xsZWN0aW9uLCBLJlIsIHAuIDIzMC4KCjEyLzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NDkwMjIgXSBDb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIEtBSS9LQ0MKCjEyLzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyAncmVsLTEtMycgQ1ZTIGJyYW5jaCBtZXJnZWQgYmFjayBpbnRvIHRoZSBtYWluIGJyYW5jaC4KCgpWZXJzaW9uIDEuMy4xNyAoTm92ZW1iZXIgMjIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTM5MjIgXSBwcmVwcm9jZXNzb3IgZXJyb3JzIHdpdGggSEFWRV9MT05HX0xPTkcuCiAgICAgICAgICAgIAoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjE1NDgwIF0gbXpzY2hlbWUgU1dJR19NdXN0R2V0UHRyXy4KCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MzUxMTkgXSBTV0lHX2Nyb2FrIGNhdXNlcyBjb21waWxlciB3YXJuaW5nLgoKMTEvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgdG8gY2xhc3MgbWVtYmVycy4KCjExLzE1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogT3ZlcmxvYWRlZCBDKysgZnVuY3Rpb25zIHdoaWNoIGNhbm5vdCBiZSBvdmVybG9hZGVkIGluIEphdmEgCiAgICAgICAgICAgIG9uY2UgYWdhaW4gaXNzdWUgYSB3YXJuaW5nLgoKMTEvMTQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBIYW5kbGluZyBvZiBOVUxMIHBvaW50ZXJzIGlzIGltcHJvdmVkLiBBIGphdmEgbnVsbCBvYmplY3Qgd2lsbCBub3cKICAgICAgICAgICAgYmUgdHJhbnNsYXRlZCB0byBhbmQgZnJvbSBhIE5VTEwgQy9DKysgcG9pbnRlciBieSBkZWZhdWx0LiBQcmV2aW91c2x5IHdoZW4gCiAgICAgICAgICAgIHdyYXBwaW5nOgoKICAgICAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzcyB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyAqcyk7CgogICAgICAgICAgICBhbmQgaXQgd2FzIGNhbGxlZCBmcm9tIEphdmEgd2l0aCBudWxsOgoKICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKG51bGwpCgogICAgICAgICAgICBhIEphdmEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIHRocm93bi4gRXh0cmEgdHlwZW1hcHMgaGFkIHRvIGJlIHdyaXR0ZW4gaW4KICAgICAgICAgICAgb3JkZXIgdG8gb2J0YWluIGEgTlVMTCBwb2ludGVyIHRvIHBhc3MgdG8gZnVuY3Rpb25zIGxpa2UgdGhpcyBvbmUuIE5vdyB0aGUgCiAgICAgICAgICAgIGRlZmF1bHQgd3JhcHBpbmcgd2lsbCBkZXRlY3QgJ251bGwnIGFuZCB0cmFuc2xhdGUgaXQgaW50byBhIE5VTEwgcG9pbnRlci4KICAgICAgICAgICAgQWxzbyBpZiBhIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHBvaW50ZXIsIGVnOgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIFNvbWVDbGFzcyAqYmFyKCkgeyByZXR1cm4gTlVMTDsgfQogICAgICAgICAgICAKICAgICAgICAgICAgVGhlbiB0aGlzIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIGEgU29tZUNsYXNzIHByb3h5IGNsYXNzIGhvbGRpbmcgYSBOVUxMCiAgICAgICAgICAgIHBvaW50ZXIuIE5vdyBudWxsIGlzIHJldHVybmVkIGluc3RlYWQuIFRoZXNlIGNoYW5nZXMgYXJlIHN1YnRsZSBidXQgdXNlZnVsLgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBieSB1c2luZyB0aGUgb3JpZ2luYWwgdHlwZW1hcHM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJCZqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgJGphdmFjbGFzc25hbWUoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgoxMS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBtZXRob2RzIGFuZCBzaWduYXR1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICAgbWV0aChpbnQgbWV0aF9wYXJhbSkgPSAwOyAKICAgICAgICAgICAgfTsgCiAKIAogICAgICAgICAgICBjbGFzcyBhYnN0cmFjdF9iYXIgOiBwdWJsaWMgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICBpbnQgbWV0aChpbnQgbWV0aF9wYXJhbV8xLCBpbnQgbWV0aF9wYXJhbV8yKSB7IHJldHVybiAwOyB9CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFic3RyYWN0X2JhciBpcyBzdGlsbCBhYnN0cmFjdC4KCiAgICAgICAgICAgIEZpeGVzIFsgNjI4NDM4IF0gRGVyaXZlZCBhYnN0cmFjdCBjbGFzcyBub3QgYWJzdHJhY3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGFuZCBwYXRjaGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjExLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBtYXRjaGluZyBwcm9ibGVtIHdpdGggdHlwZW1hcHMgYW5kIGFycmF5IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgIGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyIGJsYWhbMjBdOwoKICAgICAgICAgICAgYW5kIGEgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gJDFfZGltMCAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiAkMV9kaW0qIHZhcmlhYmxlcyB3ZXJlbid0IGJlIGV4cGFuZGVkIHByb3Blcmx5LiAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBhbmthaiBLdW1hciBHb2VsLgogICAgICAgICAgICAgICAKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCBuZXcgbW9kdWxlIHRoYXQgZHVtcHMgU1dJRydzIHBhcnNlCgkgICAgdHJlZSBhcyAoQ29tbW9uKSBMaXNwIHMtZXhwcmVzc2lvbnMuICBUaGUgbW9kdWxlIGlzCgkgICAgaW52b2tlZCB3aXRoIFNXSUcncyAtc2V4cCBjb21tYW5kLWxpbmUgc3dpdGNoLiAgVGhlIG91dHB1dAoJICAgIGNhbiBiZSByZWFkIGludG8gQ29tbW9uIExpc3AuICBUaGVyZSBpcyAocHJvdG90eXBlKQoJICAgIGV4YW1wbGUgTGlzcCBjb2RlIHRoYXQgZ2VuZXJhdGVzIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNlCgkgICAgZGVmaW5pdGlvbnMgZm9yIHVzZSB3aXRoIEtldmluIFJvc2VuYmVyZydzIFVGRkkuCgoJICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgUmVtb3ZlZCBkdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgImNwcF90ZW1wbGF0ZV9kZWNsIiBpbgoJICAgIHBhcnNlci55OyBiaXNvbiAxLjc1IGNvbXBsYWluZWQuCgoxMS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlZmF1bHQgcHJpbWl0aXZlIGFycmF5IGhhbmRsaW5nIGhhcyBjaGFuZ2VkIGxpa2UgYXJyYXlzIG9mIGNsYXNzZXMuIAogICAgICAgICAgICBDIHByaW1pdGl2ZSBhcnJheXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGEgSmF2YSBhcnJheSBidXQgd2l0aCBhIHBvaW50ZXIgCiAgICAgICAgICAgICh0eXBlIHdyYXBwZXIgY2xhc3MpLiBBZ2FpbiB0aGUgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSBmb3IgZWZmaWNpZW5jeSByZWFzb25zLiAKICAgICAgICAgICAgVGhlIG9yaWdpbmFsIHR5cGVtYXBzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGFycmF5c19qYXZhLmksIHNvIHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgYmVoYXZpb3VyIGNhbiBiZSBvYnRhaW5lZCBtZXJlbHkgaW5jbHVkaW5nIHRoaXMgZmlsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKCiAgICAgICAgICAgIFRoZSBhcnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGV5IGFyZSBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGluY2x1ZGluZyB0aGlzIGZpbGUsIHRodXMgdGhpcyBvZnRlbiB1bnVzZWQgY29kZSBpcyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIHNwZWNpZmljYWxseSByZXF1aXJpbmcgdGhpcyB0eXBlIG9mIGFycmF5IHN1cHBvcnQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgbmVzdGVkIG1vZHVsZSBkZWNsYXJhdGlvbnMgKGFzIHdhcwogICAgICAgICAgICBwcmV2aW91c2x5IGFkZGVkIGZvciB0aGUgUGVybCBtb2R1bGUpLiBTbyBhICVtb2R1bGUgZGlyZWN0aXZlCiAgICAgICAgICAgIG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgICAgICVtb2R1bGUgIk91dGVyOjpJbm5lcjo6Rm9vIgoKICAgICAgICAgICAgd2lsbCBuZXN0IGV2ZXJ5dGhpbmcgYXMgKGluIFJ1YnkgY29kZSk6CgogICAgICAgICAgICAgICAgbW9kdWxlIE91dGVyCiAgICAgICAgICAgICAgICAgIG1vZHVsZSBJbm5lcgogICAgICAgICAgICAgICAgICAgIG1vZHVsZSBGb28KICAgICAgICAgICAgICAgICAgICAgICMgc3R1ZmYgZ29lcyBoZXJlCiAgICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZW5kCiAKMTEvMDUvMjAwMjogbWtvZXBwZSAKCSAgICBbTXpTY2hlbWVdIEFkZCBhbiBhcmd1bWVudCAoLWRlY2xhcmVtb2R1bGUpIHRoYXQgZ2VuZXJhdGVzCgkgICAgY29kZSB0byBjb3JyZWN0bHkgZGVjbGFyZSBhIHByaW1pdGl2ZSBtb2R1bGUgZXh0ZW5zaW9uLgoJICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBCcnVjZSBCdXR0ZXJmaWVsZC4KCjExLzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgcGF0Y2ggc3VibWl0dGVkIGJ5IE1pY2hhZWwgQ2FoaWxsIHRvIHJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyCiAgICAgICAgICAgIHdhcm5pbmdzIGZvciB0aGUgamVudiBhbmQgY2xzIHBhcmFtZXRlcnMuIFRoaXMgcGF0Y2ggYWxzbyBhbHNvIGFsbG93cyBvbmUKICAgICAgICAgICAgdG8gdXNlICJ2b2lkIiBpbiB0aGUgam5pIHR5cGVtYXAgZm9yIGFueSB0eXBlIHdpdGhvdXQgY29kZSBiZWluZyBnZW5lcmF0ZWQKICAgICAgICAgICAgYXR0ZW1wdGluZyB0byByZXR1cm4gYSB2YWx1ZS4KCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQXJyYXkgaGFuZGxpbmcgaXMgZGlmZmVyZW50LiBBcnJheXMgb2YgY2xhc3NlcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQKICAgICAgICAgICAgd2l0aCBwcm94eSBhcnJheXMsIGVnIHdyYXBwaW5nCgogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIHVzZWQgdG8gYmUgd3JhcHBlZCB3aXRoIHRoZXNlIEphdmEgZ2V0dGVycyBhbmQgc2V0dGVyczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFhbXSB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWFtdIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIHZlcnkgaW5lZmZpY2llbnQgYXMgdGhlIGVudGlyZSBhcnJheSBpcyBjb3BpZWQgbnVtZXJvdXMKICAgICAgICAgICAgdGltZXMgb24gZWFjaCBpbnZvY2F0aW9uIG9mIHRoZSBnZXR0ZXIgb3Igc2V0dGVyLiBUaGVzZSBhcnJheXMgYXJlIG5vdwogICAgICAgICAgICB3cmFwcGVkIHdpdGggYSBwb2ludGVyIHNvIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gYWNjZXNzIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IAogICAgICAgICAgICB1c2luZyBhIHByb3h5IGNsYXNzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWCB2YWx1ZSkgey4uLn0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgWCBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgQXJyYXlzIG9mIGVudW1zIGhhdmUgYWxzbyBiZWVuIHNpbWlsYXJseSBjaGFuZ2VkLiBUaGlzIGJlaGF2aW91ciBpcyBub3cgbGlrZSB0aGUgCiAgICAgICAgICAgIG90aGVyIFNXSUcgbGFuZ3VhZ2UncyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIGFycmF5IGxpYnJhcnkgc2hvdWxkIGJlIHVzZWQgdG8gCiAgICAgICAgICAgIGFjY2VzcyB0aGUgb3RoZXIgZWxlbWVudHMuIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIGFjaGlldmVkIHVzaW5nIHRoZSAKICAgICAgICAgICAgbWFjcm9zIGFuZCB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgIEpBVkFfQVJSQVlTT0ZDTEFTU0VTKFgpCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUd28gbmV3IHR5cGVtYXBzIGphdmFpbiBhbmQgamF2YW91dCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJveHkgY2xhc3MgCiAgICAgICAgICAgIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3MgbWV0aG9kIGNhbGxzIHRvIHRoZSBKTkkgY2xhc3MuIFRoZSBuZXcgdHlwZW1hcHMgYXJlIAogICAgICAgICAgICByZWFsbHkgdXNlZCBmb3IgdHJhbnNmb3JtaW5nIHRoZSBqc3R5cGUgKHVzZWQgaW4gcHJveHkgY2xhc3MgYW5kIHR5cGUgd3JhcHBlcgogICAgICAgICAgICBjbGFzc2VzKSB0byB0aGUganR5cGUgKHVzZWQgaW4gdGhlIEpOSSBjbGFzcykgYW5kIHZpc2EgdmVyc2EuIEEgamF2YWluIHR5cGVtYXAKICAgICAgICAgICAgaXMgcmVxdWlyZWQgd2hlbmV2ZXIgYW4gaW4gdHlwZW1hcCBpcyB3cml0dGVuIGFuZCBzaW1pbGFybHkgamF2YW91dCBmb3IgYW4gb3V0CiAgICAgICAgICAgIHR5cGVtYXAuIEFuIGV4YW1wbGUgaXMgcHJvYmFibHkgYmVzdCB0byBzaG93IHRoZW0gd29ya2luZzoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIENsYXNzICJDbGFzcy5nZXRDUHRyKCRqYXZhaW5wdXQpIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSB1bnNpZ25lZCBzaG9ydCAiJGphdmFpbnB1dCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIENsYXNzICogewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoJGpuaWNhbGwsICRvd25lcik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQ2xhc3Mge307CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgKiBiYXIoQ2xhc3MgY2xzLCB1bnNpZ25lZCBzaG9ydCB1c2gpIHsgcmV0dXJuIG5ldyBDbGFzcygpOyB9OwogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgcHJveHkgY29kZSBpcyB0aGVuOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3MgYmFyKENsYXNzIGNscywgaW50IHVzaCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKGV4YW1wbGVKTkkuYmFyKENsYXNzLmdldENQdHIoY2xzKSwgdXNoKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIFNvbWUgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIHVzZSB0aGVzZSB0eXBlbWFwcy4KICAgICAgICAgICAgSGVyZSAkamF2YWlucHV0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdjbHMnIGFuZCAndXNoJy4gJGpuaWNhbGwgaGFzIGJlZW4gcmVwbGFjZWQgYnkgCiAgICAgICAgICAgIHRoZSBuYXRpdmUgbWV0aG9kIGNhbGwsICdleGFtcGxlSk5JLmJhciguLi4pJyBhbmQgJG93bmVyIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICdmYWxzZScuCiAgICAgICAgICAgICRqYXZhaW5wdXQgaXMgYW5hbG9nb3VzIHRvIHRoZSAkaW5wdXQgc3BlY2lhbCB2YXJpYWJsZS4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAgICAgICAkam5pY2FsbCBpcyBhbmFsb2dvdXMgdG8gJGFjdGlvbiBpbiAlZXhjZXB0aW9uLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgY2FsbCB0byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICAkb3duZXIgaXMgcmVwbGFjZWQgYnkgZWl0aGVyIHRydWUgaWYgJW5ld29iamVjdCBoYXMgYmVlbiB1c2VkIG90aGVyd2lzZSBmYWxzZS4KCiAgICAgICAgICAgIFRoZSBqYXZhLnN3ZyBmaWxlIGNvbnRhaW5zIGRlZmF1bHQgamF2YWluIGFuZCBqYXZvdXQgdHlwZW1hcHMgd2hpY2ggd2lsbCBwcm9kdWNlIHRoZSBzYW1lIGNvZGUKICAgICAgICAgICAgYXMgcHJldmlvdXNseS4gVGhpcyBjaGFuZ2UgaXMgb25seSBvZiBjb25jZXJuIHRvIHRob3NlIHdobyBoYXZlIHdyaXR0ZW4gdGhlaXIgb3duIHR5cGVtYXBzIGFzCiAgICAgICAgICAgIHlvdSB3aWxsIHRoZW4gbW9zdCBsaWtlbHkgaGF2ZSB0byB3cml0ZSB5b3VyIG93biBqYXZhaW4gYW5kIGphdmFvdXQgdHlwZW1hcHMuCgogICAgICAgICAgICBUaGUgamF2YW91dCB0eXBlbWFwIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIGEgSmF2YSBkb3duY2FzdCB0byBiZSB1c2VkIG9uIGFic3RyYWN0IAogICAgICAgICAgICBwcm94eSBiYXNlIGNsYXNzZXMuIFNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIG9uIGR5bmFtaWNfY2FzdC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI0LzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gVXBnYWRlZCB0byBsaWJ0b29sIDEuNC4zLCBwcmVzdW1hYmx5IHcvIGJldHRlcgoJICAgIHN1cHBvcnQgZm9yIG5ld2lzaCBwbGF0Zm9ybXMgKGxpa2UgTWFjT1MgWCkuCgoxMC8yMS8yMDAyOiB0dG4KCSAgICBGaXhlZCBSdW50aW1lL01ha2VmaWxlLmluIGJ1ZyAtLSB0aGFua3MgdG8gUmljaGFyZCBDYWxtYmFjaC4KCjEwLzE4LzIwMDI6IHR0bgoJICAgIEZpeGVkIHR5cG8gaW4gZG9oLmggLS0gdGhhbmtzIHRvIE1heCBIb3JuLgoKVmVyc2lvbiAxLjMuMTYgKE9jdG9iZXIgMTQsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgJWZlYXR1cmUgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgV2lsbGlhbSBGdWx0b24uCgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIE9wZW5WTVMgYnVpbGQgZGlyZWN0b3J5ICh2bXMpLiAgQ29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIEplYW4tRnJhbudvaXMgUGllcm9ubmUuCgoxMC8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyBjbGF1c2UgdG8gdGhlIG5hdGl2ZSBmdW5jdGlvbnMgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgVGhlIHRocm93cyBjbGF1c2UgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGZ1bmN0aW9ucwogICAgICAgICAgICBhbmQgbW9kdWxlIGNsYXNzIGZ1bmN0aW9ucy4KCjA5LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSBhbmQgY2xhc3NlcyB0aGF0CiAgICAgICAgICAgIHdlcmUgZGVmaW5lZCBidXQgbm90IHdyYXBwZWQuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IExlc2xpZSBCcm9va3MsCiAgICAgICAgICAgIEdlcnJ5IFdvb2RzLCBhbmQgb3RoZXJzLgoKMDkvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb21lIGVycm9yIGNoZWNraW5nIGFkZGVkOgogICAgICAgICAgICAxKSBPdXRPZk1lbW9yeUV4Y2VwdGlvbiBjaGVjayBpbiB0aGUgY2hhciAqIHR5cGVtYXBzLiAKICAgICAgICAgICAgMikgQXMgU1dJRyB0cmVhdHMgcG9pbnRlcnMsIHJlZmVyZW5jZXMgYW5kIHBhc3NpbmcgYnkgdmFsdWUgYWxsIHRoZQogICAgICAgICAgICBzYW1lLCBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBleHBlY3RzCiAgICAgICAgICAgIGFuIG9iamVjdCBwYXNzZWQgYnkgdmFsdWUgb3IgYnkgcmVmZXJlbmNlLiBBIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIAogICAgICAgICAgICBub3cgdGhyb3duIHVuZGVyIHRoaXMgc2NlbmFyaW8uCgowOS8yMC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNsZWFuIiBhbmQgIm1ha2UgaW5zdGFsbCIKCQkJICB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRXhwbGFpbiBob3cgdG8gZXh0ZW5kICJtYWtlIGluc3RhbGwiIHcvIGV4dHJhLWluc3RhbGwubGlzdC4KCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRpb24gb2YgdGhlICJpZ25vcmUiIHR5cGVtYXAuICAgVGhlICJpZ25vcmUiIHR5cGVtYXAgaGFzCiAgICAgICAgICAgIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSAiaW4iIHR5cGVtYXAuCiAgICAgICAgICAgIFRvIGlnbm9yZSBhbiBhcmd1bWVudCwgdXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbixudW1pbnB1dHM9MCkgaW50ICpvdXRwdXQgKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgYnVncyByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbgogICAgICAgICAgICBvZiB0aGUgImluIiBhbmQgImlnbm9yZSIgdHlwZW1hcHMgKHdoaWNoIHdlcmUgc3VwcG9zZWQgdG8gYmUKICAgICAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlKS4KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgdGhlIG51bWlucHV0cyBhcmd1bWVudCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgQ3VycmVudGx5LCB2YWx1ZXMgPjEgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvci4gIEhvd2V2ZXIsIGZ1dHVyZQogICAgICAgICAgICByZWxlYXNlcyBvZiBTV0lHIG1heSB1dGlsaXplIHRoYXQgdG8gc3VwcG9ydCBtdWx0aS1pbnB1dCB0eXBlbWFwcy4KCiAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgc3RpbGwgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgYW5kIGlzCiAgICAgICAgICAgIHRyYW5zbGF0ZWQgdG8gJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA5LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IGZvciB1bm5hbWVkIHN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgfSAqYmxhaDsKCgogICAgICAgICAgICBSZXBvcnRlZCBieSBSb2dlciBHaWJzb24uCiAgICAgICAgICAgIE5vdGU6IHdlIG1pZ2h0IGJlIGFibGUgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgaW4gc3BlY2lhbCBjYXNlcy4KCjA5LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgbW9kaWZpY2F0aW9uIHRvIGdlbmVyYXRlZCB3cmFwcGVyIGZ1bmN0aW9ucy4gIFBvaW50ZXIgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgYWx3YXlzIHNldCB0byBhbiBpbml0aWFsIHZhbHVlIG9mIDAuICAgU2ltcGxpZmllcyB0eXBlbWFwIHdyaXRpbmcgYW5kIGNsZWFudXAKICAgICAgICAgICAgY29kZSAoc2luY2UgeW91IGNhbiByZWx5IG9uIHplcm8tdmFsdWUgaW5pdGlhbGl6YXRpb24pLiAgIFRoaXMgYWxzbyBncmVhdGx5CiAgICAgICAgICAgIHJlZHVjZXMgdGhlIG5lZWQgdG8gZXZlciB3cml0ZSBhbiAiYXJnaW5pdCIgdHlwZW1hcC4KCjA5LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gc21hcnQtcG9pbnRlciBzdXBwb3J0LiAgSWYgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIGlzIHBhcnQgb2YgYW4gaWdub3JlZCBiYXNlIGNsYXNzIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBCYXI7CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAgICAgICAgLyogSWdub3JlZCAqLwogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICB0aGVuIG1ldGhvZHMgZnJvbSBGb28gYXJlIHN0aWxsIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKQogICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgICBUaGUgb25seSBjYXRjaCBpcyB0aGF0IHRoZSBvcGVyYXRvci0+KCkgaXRzZWxmIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgIChzaW5jZSBpdCB3YXNuJ3Qgd3JhcHBlZCkuICAgVGhlcmVmb3JlLCB0aGVyZSB3b24ndCBiZSBhbnkKICAgICAgICAgICAgIF9fZGVyZWZfXygpIG9wZXJhdGlvbiB1bmxlc3MgaXQgaXMgZXhwbGljaXRseSBhZGRlZCB0byBTcGFtCiAgICAgICAgICAgICAoZWl0aGVyIHVzaW5nICVleHRlbmQgb3IganVzdCBwbGFjaW5nIG9wZXJhdG9yLT4oKSBpbiB0aGUKICAgICAgICAgICAgIGRlZmluaXRpb24gb2YgU3BhbSkuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFJld29ya2VkICJtYWtlIGNoZWNrIiB0byBiZSBtb3JlIHRhYmxlIGRyaXZlbi4KCSAgICBbRG9jc10gRG9jdWVtZW50ZWQgbWV0aG9kb2xvZ3kgaW4gTWFudWFsL0V4dGVuZGluZy5odG1sLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW0RvY3NdIFByZWZpeGVkIE1hbnVhbC8qLmh0bWwgd2l0aCAiPCFET0NUWVBFIGh0bWwgLi4uPiIgdG8KCSAgICBwYW5kZXIgZG90aW5nbHkgdG8gKG92ZXItKXNlbnNpdGl2ZSBlZGl0b3JzLgoKMDkvMTAvMjAwMjogdHRuCgkgICAgW0d1aWxlXSBDb252ZXJ0ZWQgRXhhbXBsZXMvZ3VpbGUvc2ltcGxlICJtYWtlIGNoZWNrIgoJICAgIGJlaGF2aW9yIHRvIGFjdHVhbGx5IGNoZWNrIGV4ZWN1dGlvbiByZXN1bHRzLiAgUmVkdWNlZAoJICAgIGl0ZXJhdGlvbiBjb3VudHMgc28gdGhhdCB0aGUgdGVzdCBkb2Vzbid0IHRha2UgdG9vIGxvbmcuCgowOS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUctMS4zLjE1IHJlbGVhc2VkLgoKClZlcnNpb24gMS4zLjE1IChTZXB0ZW1iZXIgOSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBuYXN0eSBydW50aW1lIHR5cGUgY2hlY2tpbmcgYnVnIHdpdGggc3VidHlwZXMgYW5kIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuIAoKMDkvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGV4Y2VwdGlvbiBjbGFzc2VzIGZvciBhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UgY2FuIGJlIGdlbmVyYXRlZCBieSAKICAgICAgICAgICAgc3BlY2lmeWluZyB0aGVtIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgaW4gdGhlIHRocm93cyBhdHRyaWJ1dGUgaW4gYW55IG9uZQogICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiBpbiwgb3V0LCBjaGVjaywgZnJlZWFyZywgYXJnb3V0IGFuZCB0aHJvd3MuIEEgY2xhc3NpYwogICAgICAgICAgICBleGFtcGxlIHdvdWxkIGJlIHRvIGNvbnZlcnQgQysrIGV4Y2VwdGlvbnMgaW50byBhIHN0YW5kYXJkIEphdmEgZXhjZXB0aW9uOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cywgdGhyb3dzPSJqYXZhLmlvLklPRXhjZXB0aW9uIikgZmlsZV9leGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgIGpjbGFzcyBleGNlcCA9IGplbnYtPkZpbmRDbGFzcygiamF2YS9pby9JT0V4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgIGlmIChleGNlcCkKICAgICAgICAgICAgICAgICAgICAgICAgamVudi0+VGhyb3dOZXcoZXhjZXAsICQxLndoYXQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOyAvLyBvciB1c2UgU1dJR19mYWlsCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgZmlsZV9leGNlcHRpb24gey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIHRocm93KGZpbGVfZXhjZXB0aW9uKTsKCiAgICAgICAgICAgIFRoZSBKYXZhIG1ldGhvZCB3aWxsIHRoZW4gYmUgZGVjbGFyZWQgd2l0aCBhIHRocm93cyBjbGF1c2U6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Li4ufQoKMDkvMDgvMjAwMjogbWtvZXBwZQoJICAqIFtHdWlsZV0gSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGFyZ2xpc3Qgbm8KCSAgICBsb25nZXIgZ2V0cyBjbHV0dGVyZWQgd2l0aCB0eXBlIHNwZWNpZmljYXRpb24sIG1ha2luZyBpdAoJICAgIG1vcmUgcmVhZGFibGUuICAoQWxzbyB0aGUgSUxJU1AgZnVuY3Rpb24gQy11IE0teAoJICAgIGBhcmdsaXN0LWxpc3AnIFJFVCB3b3JrcyBiZXR0ZXIgdGhpcyB3YXkuKSAgVGhlIHR5cGVzIG9mCgkgICAgYXJndW1lbnRzIGFyZSBleHBsYWluZWQgaW4gYW4gZXh0cmEgc2VudGVuY2UgYWZ0ZXIgdGhlCgkgICAgYXJnbGlzdC4gCgkgICAgCgkgICAgVGhlcmUgYXJlIG5vdyB0d28gZG9jdW1lbnRhdGlvbi1yZWxhdGVkIHR5cGVtYXAgYXJndW1lbnRzOgoKCSAgICAgICAgJXR5cGVtYXAoaW4sIGRvYz0iJE5BTUUgaXMgYSB2ZWN0b3Igb2YgaW50ZWdlcnMiLCAKCQkJIGFyZ2xpc3Q9IiRuYW1lIikgIGludCAqVkVDVE9SIHsgLi4uIH0KCQkJIAogICAgICAgICAgICBUaGUgImFyZ2xpc3QiIHRleHRzIG9mIGFsbCBhcmd1bWVudHMgb2YgYSBmdW5jdGlvbiBtYWtlIHVwCgkgICAgaXRzIGFyZ2xpc3QgaW4gdGhlIGRvY3VtZW50YXRpb24uICBUaGUgImRvYyIgdGV4dHMgb2YgYWxsCgkgICAgYXJndW1lbnRzIGFyZSBjb2xsZWN0ZWQgdG8gbWFrZSBhIHNlbnRlbmNlIHRoYXQgZGVzY3JpYmVzCgkgICAgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuICBSZWFzb25hYmxlIGRlZmF1bHRzIGFyZQoJICAgIHByb3ZpZGVkLiAKCgkgICAgQXMgdXN1YWwsICRuYW1lIGlzIHN1YnN0aXR1dGVkIGJ5IHRoZSBuYW1lIG9mIHRoZQoJICAgIGFyZ3VtZW50LiBUaGUgbmV3IHR5cGVtYXAgdmFyaWFibGUgJE5BTUUgaXMgbGlrZSAkbmFtZSwKCSAgICBidXQgbWFya2VkLXVwIGFzIGEgdmFyaWFibGUuICBUaGlzIG1lYW5zIHRoYXQgaXQgaXMKCSAgICB1cHBlci1jYXNlZDsgaW4gVGVYaW5mbyBtb2RlICgiLXByb2Nkb2Nmb3JtYXQgdGV4aW5mbyIpIGl0CgkgICAgY29tZXMgb3V0IGFzIEB2YXJ7bmFtZX0uIAoJICAgIAoJICAgIFRoZSBkaXJlY3RpdmVzICV2YWx1ZXNfYXNfbGlzdCwgJXZhbHVlc19hc192ZWN0b3IsCgkgICAgJW11bHRpcGxlX3ZhbHVlcyBub3cgYWxzbyBoYXZlIGFuIGVmZmVjdCBvbiB0aGUKCSAgICBkb2N1bWVudGF0aW9uLiAoVGhpcyBpcyBhY2hpZXZlZCB2aWEgdGhlIG5ldyBwcmFnbWFzCgkgICAgcmV0dXJuX25vdGhpbmdfZG9jLCByZXR1cm5fb25lX2RvYywgcmV0dXJuX211bHRpX2RvYy4pCgoJICAgIERvY3VtZW50YXRpb24gaGFzIGFsc28gaW1wcm92ZWQgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZQoJICAgIHdyYXBwZWQgYXMgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMgKGNvbW1hbmQtbGluZSBzd2l0Y2gKCSAgICAiLWVtaXQtc2V0dGVycyIpLgoKICAgICAgICAgICogW0d1aWxlXSBFbWl0IGNvbnN0YW50cyBhcyBfaW1tdXRhYmxlXyB2YXJpYWJsZXMuICAoVGhpcwogICAgICAgICAgICB3YXMgYnJva2VuIHJlY2VudGx5LikKCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFVwZGF0ZWQgdGhlIHR5cGVtYXBzIGluIGxpc3QtdmVjdG9yLmkuCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgU2hvcnQtY2lyY3VpdCB0aGUgdHlwZWNoZWNrcyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuCgkgICAgKFRoZSBjaGFuZ2VzIGluIGNvZGUgZ2VuZXJhdGlvbiBhcmUgdmlzaWJsZSBpbiB0aGUgbmV3CgkgICAgdGVzdGNhc2UgIm92ZXJsb2FkX2NvbXBsaWNhdGVkIi4pCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbHV0aW9uIGZvciBbIDU5NjQxMyBdCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgd3JhcHBlciBjb25zdHJ1Y3RvciBtb2RpZmllciBjYW4gYmUgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIAogICAgICAgICAgICBwcm90ZWN0ZWQuIE5vcm1hbGx5IFNXSUcgZ2VuZXJhdGVzIGEgY29uc3RydWN0b3IgbGlrZSB0aGlzIHdoaWNoIGNhbiBvbmx5IAogICAgICAgICAgICBiZSBhY2Nlc3NlZCB3aXRoaW4gb25lIHBhY2thZ2U6CgogICAgICAgICAgICAgIHByb3RlY3RlZCBCYXIobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBJZiB5b3UgYXJlIHVzaW5nIFNXSUcgYWNyb3NzIG11bHRpcGxlIHBhY2thZ2VzIG9yIHdhbnQgdG8gdXNlIHRoaXMgY29uc3RydWN0b3IKICAgICAgICAgICAgYW55d2F5LCBpdCBjYW4gbm93IGJlIGFjY2Vzc2VkIG91dHNpZGUgdGhlIHBhY2thZ2UuIFRvIG1vZGlmeSB1c2UgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUgInB1YmxpYyIKCiAgICAgICAgICAgIHRvIGNoYW5nZSB0byBwdWJsaWMgZm9yIGFsbCBwcm94eSBjbGFzc2VzIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gInB1YmxpYyIKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIHR5cGVtYXBzIGZvciB0aGUgSmF2YSBtb2R1bGUuIEMrKyBleGNlcHRpb25zIGdldCBjb252ZXJ0ZWQgaW50bwogICAgICAgICAgICBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiBKYXZhIGV4Y2VwdGlvbnMuIAogICAgICAgICAgICAKICAgICAgICAgICAgV2FybmluZzogVGhpcyBtYXkgY2hhbmdlIGZyb20gamF2YS5sYW5nLlJ1bnRpbWUgZXhjZXB0aW9uIGluIHRoZSBmdXR1cmUuCgowOS8wNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdmFyaWFibGVzIGRlY2xhcmVkIGFzIHJlZmVyZW5jZXMuCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjA1MTYyIF0gVHlwZW1hcCBsb2NhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbi4KCjA5LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb3JlIHVwZGF0ZXMgdG8gdGhlIFJ1YnkgbW9kdWxlIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZwoJICAgIGEgbmV3IHR5cGVtYXAgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gY29sbGVjdCBrZXktdmFsdWUKCSAgICBwYWlycyBmcm9tIGFuIGFyZ3VtZW50IGxpc3QgaW50byBhIEhhc2guCgowOS8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbiBhbmQgY29uc3RydWN0b3JzLgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgRm9vPFQ+KCkgeyB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGV4dHJhIDxUPiBpbiB0aGUgY29uc3RydWN0b3Igd2FzIGNhcnJpZWQgdGhyb3VnaCBpbiB0aGUKICAgICAgICAgICAgbmFtZS0tY2F1c2luZyBydW50aW1lIHByb2JsZW1zIGluIGdlbmVyYXRlZCBtb2R1bGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3JkaSBBcm5hYmF0IEJlbmVkaWN0by4KIAowOS8wNS8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBTdXBwb3J0IG92ZXJsb2FkaW5nLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZWQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nIHR5cGVzCgkgICAgdG8gdXNlIFJ1YnkgMS43IHN1cHBvcnQgZm9yIHRoZXNlIHR5cGVzIHdoZW4gYXZhaWxhYmxlLgoKMDkvMDQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG91dHB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlIHRvIHByaW1pdGl2ZQoJICAgIHR5cGVzLgoKMDkvMDQvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IHBhc3MtYnktdmFsdWUgdHlwZW1hcHMuICBSZXBvcnRlZCBieSBBcm5vCgkgICAgUGV0ZXJzIHZpYSBEZWJpYW4gYnVndHJhY2tpbmcgKCMxNTY5MDIpLCBwYXRjaCBieSBUb3JzdGVuCgkgICAgTGFuZHNjaG9mZiA8dG9yc3RlbkBkZWJpYW4ub3JnPi4KCjA5LzAzLzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKCSAgICBCZXR0ZXIgcmVmZXJlbmNlIHN1cHBvcnQuCgkgICAgRnVuY3Rpb25zIHRoYXQgd2FudCBhIHZvaWQqKiBjYW4gdGFrZSBhIE5VTEwgYnkgcmVmZXJlbmNlIGFuZAoJICAgIHRoZSB2b2lkKiB3aWxsIGJlIG1hZGUgZm9yIHlvdSBhbmQgdGhlbiBwYXNzZWQtYnktcmVmZXJlbmNlCgoJICAgIEFsc28gYWxsIGludGVnZXItY2xhc3MgbmF0aXZlIHR5cGVzIGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlCgkgICAgd2hlcmUgYW4gaW50KiBvciBpbnQmIGV0YyBpcyBuZWVkZWQKCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlZCB0aGUgZXZhbHVhdGlvbiBvcmRlciBvZiBwcmVwcm9jZXNzb3IgbWFjcm8gYXJndW1lbnRzLgogICAgICAgICAgICBBcmd1bWVudHMgYXJlIG5vdyBleHBhbmRlZCBieSB0aGUgcHJlcHJvY2Vzc29yICpiZWZvcmUqIHRoZXkKICAgICAgICAgICAgYXJlIHBhc3NlZCB0byBtYWNybyBleHBhbnNpb24uICBUaGlzIGZpeGVzIGEgc3VidGxlIGV4cGFuc2lvbgogICAgICAgICAgICBidWcgcmVwb3J0ZWQgYnkgQW50aG9ueSBIZWFkaW5nLgoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0aGUgZmlsZSBpbmNsdWRlIG9yZGVyIChhZ2FpbiwgYXBwYXJlbnRseSkuIFNlZSAyLzI3Lzk5LgoKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybF0gQmV0dGVyIGV4Y2VwdGlvbiBoYW5kbGluZyBzdXBwb3J0LiAgU2luY2UgUGVybCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICByZWxpZXMgb24gc2V0am1wL2xvbmdqbXAsIHdyYXBwZXIgZnVuY3Rpb25zIGhhdmUgYmVlbiBtb2RpZmllZCBzbGlnaHRseQogICAgICAgICAgICB0byBwcm92aWRlIGFuIGV4dHJhIGJsb2NrIHNjb3BlOgoKICAgICAgICAgICAgICAgIFhTKGZvbykgewogICAgICAgICAgICAgICAgICAgY2hhciBfc3dpZ21zZ1tTV0lHX01BWF9FUlJNU0ddID0gIiI7CiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpfc3dpZ2VyciA9IF9zd2lnbXNnOwogICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgLyogTm9ybWFsIHdyYXBwZXIgZnVuY3Rpb24gaGVyZSAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBTV0lHX2Nyb2FrKCJBbiBlcnJvciBvY2N1cnJlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFhTUkVUVVJOKGFyZ3ZpKTsgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiAqLwogICAgICAgICAgICAgICAgICAgICAgZmFpbDoKICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYW51cCBjb2RlICovCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICBjcm9hayhfc3dpZ19lcnIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG1hY3JvIFNXSUdfY3JvYWsoeCkgc2V0cyB0aGUgdmFsdWUgb2YgX3N3aWdlcnIgdG8geCBhbmQKICAgICAgICAgICAgZXhlY3V0ZXMgYSAiZ290byBmYWlsIi4gIFRoZSB3aG9sZSB3cmFwcGVyIGZ1bmN0aW9uIGlzIGVuY2xvc2VkCiAgICAgICAgICAgIGJsb2NrIHNjb3BlIHRvIHByb3ZpZGUgcHJvcGVyIGNsZWFudXAgb2YgQysrIG9iamVjdHMuICBTaW5jZQogICAgICAgICAgICBjcm9hayBleGVjdXRlcyBhIGxvbmdqbXAoKSwgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5IHJlY2xhaW0KICAgICAgICAgICAgcmVzb3VyY2VzIGlmIHRoaXMgZXhlY3V0ZXMgaW4gdGhlIHNhbWUgc2NvcGUgYXMgdGhlIHdyYXBwZXIKICAgICAgICAgICAgZnVuY3Rpb24uCgogICAgICAgICAgICBUaGUgX3N3aWdtc2dbXSB2YXJpYWJsZSBpcyBub3JtYWxseSB1bnVzZWQsIGJ1dCBjYW4gYmUgdXNlZAogICAgICAgICAgICB0byBzdG9yZSBzbWFsbCBlcnJvciBtZXNzYWdlcyB1c2luZyBzcHJpbnRmIG9yIHNucHJpbnRmLiBJdAogICAgICAgICAgICBoYXMgYSBjYXBhY2l0eSBvZiBhdCBsZWFzdCAyNTYgYnl0ZXMgKFNXSUdfTUFYX0VSUk1TRykuCiAgICAgICAgICAgIAowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIGJldHRlciBzdXBwb3J0IGZvciBleGNlcHRpb25zLiAgSW5zdGVhZCBvZiByZXR1cm5pbmcgVENMX0VSUk9SLAogICAgICAgICAgICB1c2UgdGhlIG1hY3JvIFNXSUdfZmFpbCB0byByZXR1cm4gd2l0aCBhbiBlcnJvci4gIFRoaXMgZW5zdXJlcyB0aGF0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcmUgcHJvcGVybHkgY2xlYW5lZCB1cC4gIEV4Y2VwdGlvbiBzcGVjaWZpZXJzIGFyZSBub3cKICAgICAgICAgICAgaGFuZGxlZCBieSBkZWZhdWx0LgoKMDkvMDIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFRoZSB0eXBlLWNoZWNraW5nIHN5c3RlbSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGhhcyBoYWQgYSBmbGF3CgkgICAgaW4gdGhhdCBzb21lIHR5cGVzIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQKCSAgICB3ZXJlbid0LiBUaGlzIGJ1ZyB3YXMgYmVzdCBkZW1vbnN0cmF0ZWQgYnkgdGhlIGluaGVyaXRfbWlzc2luZy5pCgkgICAgdGVzdCBzdWl0ZSBjYXNlLCB3aGljaCBkZWZpbmVzIGEgYmFzZSBjbGFzcyAiRm9vIiB0aGF0IGlzCgkgICAgc3ViY2xhc3NlZCBieSAiQmFyIi4gVGhlICJGb28iIGNsYXNzIGlzbid0IGFjdHVhbGx5IHdyYXBwZWQgKGkuZS4KCSAgICBpdCdzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gUnVieSkgYnV0IHdlJ2Qgc3RpbGwgbGlrZSB0byBiZQoJICAgIGFibGUgdG8gcGFzcyAiQmFyIiBpbnN0YW5jZXMgdG8gZnVuY3Rpb25zIGV4cGVjdGluZyBGb29zIGFuZCBoYXZlCgkgICAgdGhhdCB3b3JrOyBpdCB3YXNuJ3QuIFRoZSByZXZpc2VkIGltcGxlbWVudGF0aW9uIChzaW1pbGFyIHRvIHRoYXQKCSAgICB1c2VkIGZvciBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMpIGFkZHMgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKCSAgICAoX19zd2lndHlwZV9fKSB0byBlYWNoIG9iamVjdCB0aGF0IGluZGljYXRlcyBpdHMgU1dJRyB0eXBlOwoJICAgIHRoYXQgaXMsIGVhY2ggIkJhciIgaW5zdGFuY2Ugd2lsbCBub3cgaGF2ZSBhIHN0cmluZyBpbnN0YW5jZQoJICAgIHZhcmlhYmxlIGNhbGxlZCAiX19zd2lndHlwZV9fIiB3aG9zZSB2YWx1ZSBpcyAiX3BfQmFyIi4KCiAgICAgICAgICAgIFVubGVzcyBkZXZlbG9wZXJzIHdlcmUgdGFraW5nIGFkdmFudGFnZSBvZiB0aGlzIGxvdy1sZXZlbAoJICAgIGltcGxlbWVudGF0aW9uIGRldGFpbCwgdGhleSBzaG91bGRuJ3Qgbm90aWNlIGFueSBjb21wYXRpYmlsaXR5CgkgICAgcHJvYmxlbXM7IG5ldmVydGhlbGVzcywgSSdtIG1hcmtpbmcgaXQgYXMgYSAicG90ZW50aWFsCgkgICAgaW5jb21wYXRpYmlsaXR5Ii4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMDEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNGIEJ1ZyAjNjAzMTk5LgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBPVVRQVVQsIElOUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciBDKysgCiAgICAgICAgICAgIHJlZmVyZW5jZXMuCgowOC8yNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXhlZCBlcnJvciBpbiAibGliX3N0ZF92ZWN0b3IiIHRlc3RjYXNlIGFuZAoJICAgIGNvbXBpbGVyIHdhcm5pbmcgaW4gImxpYl9jZGF0YSIgdGVzdGNhc2UuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlICIlbWl4aW4iIGRpcmVjdGl2ZSwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCgkgICAgc3BlY2lmeSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0byBtaXgtaW4gdG8gYQoJICAgIGNsYXNzLiBTbywgZm9yIGV4YW1wbGUsIGlmIHlvdSdkIGxpa2UgdG8gc3BlY2lmeSB0aGF0IFJ1YnkncwoJICAgIEVudW1lcmFibGUgbW9kdWxlIHNob3VsZCBiZSBtaXhlZC1pbiB0byB5b3VyIGNsYXNzIEZvbywgeW91J2QKCSAgICB3cml0ZToKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRW51bWVyYWJsZSI7CgkJCiAgICAgICAgICAgIG9yIHRvIHNwZWNpZnkgdGhhdCB0aGUgbW9kdWxlcyBGZWUsIEZpZSBhbmQgRm8gc2hvdWxkIGJlIG1peGVkCgkgICAgaW4gdG8gRm9vOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJGZWUsRmllLEZvIjsKCQkKCSAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlICVhbGlhcyBkaXJlY3RpdmUgc28gdGhhdCBtdWx0aXBsZSBhbGlhc2VzCgkgICAgY2FuIGJlIHNwZWNpZmllZCBmb3IgYW4gaW5zdGFuY2UgbWV0aG9kIGJ5IHVzaW5nIGEgY29tbWEtc2VwYXJhdGVkCgkgICAgbGlzdCBvZiBhbGlhc2VzLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkICJ0aHJvdyIgdHlwZW1hcHMgZm9yIHRoZSBSdWJ5IG1vZHVsZS4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgcHJpbnRpbmcgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAnc3dpZyAtTScgbGlzdHMgYWxsIGZpbGUgZGVwZW5kZW5jaWVzLiAgJ3N3aWcgLU1NJyBsaXN0cwogICAgICAgICAgICBkZXBlbmRlbmNpZXMsIGJ1dCBleGNsdWRlcyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5LiAKICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgICUgc3dpZyAtTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9zd2lnLnN3ZyBcCiAgICAgICAgICAgICAgICAvdTAvYmVhemxleS9Qcm9qZWN0cy9saWIvc3dpZzEuMy9weXRob24vcHl0aG9uLnN3ZyBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgICAgJSBzd2lnIC1NTSAtcHl0aG9uIGV4YW1wbGUuaQogICAgICAgICAgICAgICBleGFtcGxlX3dyYXAuY3h4OiBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5oIAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NzU5OSBdIHVuaW9uIGluIGNsYXNzOiBpbmNvcnJlY3Qgc2NvcGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjAwMTMyIF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIG5hbWVzcGFjZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNoaWJ1a2F3YSBZb3NoaWtpLgogCjA4LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQXV0b21hdGljIEMrKyBleGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCBmb3IgYWxsIGxhbmd1YWdlIG1vZHVsZXMuICAgIFRoaXMgaXMKICAgICAgICAgICAgcHJldHR5IHNpbXBsZS4gIElmIHlvdSBoYXZlIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICB3cmFwX0Jhcl9ibGFoKCkgewogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEtPmJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGb28gJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJ0aHJvdyIgdHlwZW1hcCBjb2RlIGluc2VydGVkLiAkMSA9IF9lICovCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgIGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgVGhlICJ0aHJvdyIgdHlwZW1hcCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbiBlcnJvciBpbiB0aGUgdGFyZ2V0IAogICAgICAgICAgICBsYW5ndWFnZS4gIEl0IGNhbiBkbyBhbnl0aGluZy4gIEhlcmUgaXMgYSB2ZXJ5IHNpbXBsZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCgidGhyb3ciKSBGb28gewogICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiRm9vIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUbyBtYWtlIHRoaXMgd29yayBpbiBlYWNoIGxhbmd1YWdlIG1vZHVsZSwgc2ltcGx5IGRlZmluZSBhIGZldyBkZWZhdWx0CiAgICAgICAgICAgICJ0aHJvdyIgdHlwZW1hcHMgZm9yIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgYW5kIGEKICAgICAgICAgICAgZmV3IGNvbW1vbiBleGNlcHRpb24gdHlwZXMuICAgVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdC4KCiAgICAgICAgICAgIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgY2FuIGJlIGRpc2FibGVkIHVzaW5nIC1ub2V4Y2VwdCBvcgogICAgICAgICAgICBzZXR0aW5nIHRoZSBOb0V4Y2VwdCBnbG9iYWwgdmFyaWFibGUgdG8gMS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBbIFB5dGhvbiBdCiAgICAgICAgICAgIEF1dG9tYXRpYyB0cmFuc2xhdGlvbiBvZiBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGludG8gZXJyb3IgaGFuZGxpbmcgY29kZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhGb28pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBGb28gaXMgd3JhcHBlZCBhcyBhIGNsYXNzaWMtc3R5bGUgY2xhc3MgKGNvbXBhdGlibGUKICAgICAgICAgICAgd2l0aCBleGNlcHRpb24gaGFuZGxpbmcpLiAgRnVydGhlcm1vcmUsIHlvdSBjYW4gd3JpdGUgUHl0aG9uIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IEZvbyxlOiAgICAgIyBOb3RlIHVzZSBvZiBleGNlcHRpb24gY2xhc3MgaGVyZSEKICAgICAgICAgICAgICAgICAgICAjIEhhbmRsZSBGb28gZXJyb3IKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZSBvYmplY3QgImUiIGluIHRoZSBleGNlcHRpb24gaGFuZGxlciBpcyBqdXN0IGEgd3JhcHBlZCBGb28KICAgICAgICAgICAgb2JqZWN0LiAgQWNjZXNzIGl0IGxpa2UgYSBub3JtYWwgb2JqZWN0LgoKICAgICAgICAgICAgSWYgYW4gZXhjZXB0aW9uIGlzIG5vdCB3cmFwcGVkIGFzIGEgY2xhc3MsIGEgUnVudGltZUVycm9yCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBUaGUgYXJndW1lbnQgdG8gdGhpcyBleGNlcHRpb24gaXMKICAgICAgICAgICAgdGhlIGV4Y2VwdGlvbiBvYmplY3QuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSB0aHJvdyhpbnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGIgPSBCYXIoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLGU6CiAgICAgICAgICAgICAgICAgICBwcmludCBlLmFyZ3NbMF0gICAgICAgIyBJbnRlZ2VyIGV4Y2VwdGlvbiB2YWx1ZQoKICAgICAgICAgICAgQ29tbWVudHM6CgogICAgICAgICAgICAgICAgLSAgSWYgYSBjbGFzcyBpcyB1c2VkIGFzIGFuIGV4Y2VwdGlvbiwgaXQgKm11c3QqIGJlIHdyYXBwZWQKICAgICAgICAgICAgICAgICAgIGFzIGEgUHl0aG9uIGNsYXNzaWMtc3R5bGUgY2xhc3MgKG5ldyBjbGFzc2VzIGRvbid0IHdvcmspLgoKICAgICAgICAgICAgICAgIC0gIEF1dG9tYXRpYyBleGNlcHRpb24gaGFuZGxpbmcgaXMgY29tcGF0aWJsZSB3aXRoICVleGNlcHRpb24uCgogICAgICAgICAgICAgICAgLSAgVXNlIC1ub2V4Y2VwdCB0byB0dXJuIG9mZiB0aGlzIGZlYXR1cmUuCgogICAgICAgICAgICAgICAgLSAgVGhlIG5ld2x5IGludHJvZHVjZWQgInRocm93IiB0eXBlbWFwIGlzIHVzZWQgdG8gcmFpc2UKICAgICAgICAgICAgICAgICAgIFB5dGhvbiBlcnJvcnMgKG5hdHVyYWxseSkuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDgvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbmZvcm1hdGlvbiBmcm9tIHRocm93KCkgc3BlY2lmaWVycyBpcyBub3cgc3RvcmVkIGluIHRoZSBwYXJzZQogICAgICAgICAgICB0cmVlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB0aHJvdyhzcGFtLGJhcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgc3RvcmVkIGluZm9ybWF0aW9uIGlzIGZ1bGx5IGNvcnJlY3RlZCBmb3IgbmFtZXNwYWNlcyBhbmQgd29ya3MKICAgICAgICAgICAgd2l0aCB0ZW1wbGF0ZXMuICBVc2VzIHdpbGwgZm9sbG93LgogICAgICAgICAgICAKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBubyBsb25nZXIgYXBwbGllZCB0byBtZW1iZXIgYWNjZXNzCiAgICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGluIHRoaXMgY29kZQoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2god2hhdGV2ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm90IGFwcGxpZWQgdG8gYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICAgIGZvciBGb286OnguICAgVGhpcyBzaG91bGQgcmVkdWNlIHRoZSBhbW91bnQgb2YgZXh0cmEgY29kZQogICAgICAgICAgICBnZW5lcmF0ZWQuCgogICAgICAgICAgICBDYXZlYXQ6ICBFeGNlcHRpb24gaGFuZGxpbmcgY29kZSAqaXMqIHVzZWQgd2hlbiBhdHRyaWJ1dGVzIGFyZQogICAgICAgICAgICBhY2Nlc3NlZCB0aHJvdWdoIGEgc21hcnQtcG9pbnRlciBvciBhIHN5bnRoZXNpemVkIGF0dHJpYnV0ZWQKICAgICAgICAgICAgYWRkZWQgd2l0aCAlZXh0ZW5kIGlzIHVzZWQuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgbW9yZSBwYXRjaGVzIHRvIGhvcGVmdWxseSBlbGltaW5hdGUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgU1dJRyAKICAgICAgICAgICAgYXMgYSA2NC1iaXQgZXhlY3V0YWJsZS4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBjb25zdCByZWZlcmVuY2UgbWVtYmVycywgdmFyaWFibGVzLCBhbmQgc3RhdGljIG1lbWJlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgJnJlZjsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyeWluZyB0byBnZW5lcmF0ZSAic2V0IiBmdW5jdGlvbnMgd2hpY2ggd291bGRuJ3QgY29tcGlsZS4gCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1hZGUgdGhlIHdhcm5pbmcgbWVzc2FnZSBmb3IgIkNsYXNzIFggbWlnaHQgYWJzdHJhY3QiIG9mZiBieSBkZWZhdWx0LgogICAgICAgICAgICBFbmFibGUgd2l0aCAtV2FsbC4KCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lZCBoYW5kbGluZyBvZiBjb25zdCBhbmQgbm9uLWNvbnN0IG92ZXJsb2FkZWQgbWV0aG9kcy4gIElmCiAgICAgICAgICAgIGEgY2xhc3MgZGVmaW5lcyBhIG1ldGhvZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpIGNvbnN0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlbiB0aGUgbm9uLWNvbnN0IG1ldGhvZCBpcyAqYWx3YXlzKiBzZWxlY3RlZCBpbiBvdmVybG9hZGluZyBhbmQKICAgICAgICAgICAgdGhlIGNvbnN0IG1ldGhvZCBzaWxlbnRseSBkaXNjYXJkZWQuICBJZiBydW5uaW5nIHdpdGggLVdhbGwsIGEgd2FybmluZwogICAgICAgICAgICBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKMDgvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCBpbmhlcml0YW5jZS4gICBDb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYmxhaChkb3VibGUgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb0JhciA6IHB1YmxpYyBGb28sIHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmxhaChjaGFyICp4KTsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEJhcjo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgU1dJRyB3cmFwcyBGb29CYXI6OmJsYWggYXMgYW4gb3ZlcmxvYWRlZCBtZXRob2QgdGhhdCB1c2VzIGFsbAogICAgICAgICAgICBhY2Nlc3NpYmxlIHZlcnNpb25zIG9mIGJsYWgoKS4gIFNlZSBzZWN0aW9uIDE1LjIuMiBpbiBTdHJvdXN0cnVwLCAzcmQgRWQuCgogICAgICAgICAgICBTV0lHIGFsc28gc3VwcG9ydHMgYWNjZXNzIGNoYW5nZSB0aHJvdWdoIHVzaW5nIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaChpbnQgeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286Ong7CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6YmxhaDsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgQ2F2ZWF0OiAgIFNXSUcgZG9lcyBub3QgYWN0dWFsbHkgY2hlY2sgdG8gc2VlIGlmIGRlY2xhcmF0aW9ucyBpbXBvcnRlZAogICAgICAgICAgICB2aWEgJ3VzaW5nJyBhcmUgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gIElmIHRoaXMgb2NjdXJzLCB0aGUKICAgICAgICAgICAgd3JhcHBlciBjb2RlIHdvbid0IGNvbXBpbGUgYW55d2F5cy0tLW5vdCBzdXJlIGl0J3Mgd29ydGggd29ycnlpbmcgYWJvdXQuCiAgICAgICAgICAKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCBvdmVybG9hZGluZyBkaXNwYXRjaCB0byBub3QgaW5jbHVkZSBub2RlcyB3aXRoIGFuICJlcnJvciIgYXR0cmlidXRlLgogICAgICAgICAgICBBIGxhbmd1YWdlIG1vZHVsZSBjYW4gc2V0IHRoaXMgaWYgYSBub2RlIGNvdWxkbid0IGJlIHdyYXBwZWQgYW5kIHlvdSBkb24ndCB3YW50CiAgICAgICAgICAgIGl0IGluY2x1ZGVkIGluIHRoZSBkaXNwYXRjaCBmdW5jdGlvbi4KCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gb3ZlcmxvYWRlZCBmdW5jdGlvbiBkaXNwYXRjaC4gICBUaGUgZGlzcGF0Y2hlciBpcyBub3cgYXdhcmUgb2YKICAgICAgICAgICAgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICBjbGFzcyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oRm9vICpmKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShCYXIgKmIpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGlzcGF0Y2hlciByZS1vcmRlcnMgdGhlIGZ1bmN0aW9ucyBzbyB0aGF0IHNwYW0oQmFyICpiKSBpcwogICAgICAgICAgICBjaGVja2VkIGZpcnN0LS0taXQgaXMgbW9yZSBzcGVjaWZpYyB0aGFuIHNwYW0oRm9vICpmKS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLVdlcnJvciBjb21tYW5kIGxpbmUgb3B0aW9uLiAgIElmIHN1cHBsaWVkLCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSB0cmVhdGVkCiAgICAgICAgICAgIGFzIGVycm9ycyBhbmQgU1dJRyB3aWxsIHJldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZS4KCjA4LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTYxMzUgXSBUeXBlZGVmIG9mIHJlZmVyZW5jZSBjYW4ndCBjb21waWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICZJbnRSZWY7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oSW50UmVmIGkpOwoKICAgICAgICAgICAgU1dJRy0xLjMuMTQgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLgoKVmVyc2lvbiAxLjMuMTQgKEF1Z3VzdCAxMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFN0YXRpYyBjb25zdCBtZW1iZXJzIGluaXRpYWxpemVkIGR1cmluZyBkZWNsYXJhdGlvbiwgYW5kCgkgICAgb25seSB0aGVtLCBpZToKCgkgICAgc3RydWN0IEEKCSAgICB7CQkgCgkJc3RhdGljIGNvbnN0IGludCBhID0gMSA7ICAvLyB0aGlzIG9uZQoJCXN0YXRpYyBjb25zdCBpbnQgYjsgICAgICAgLy8gbm90IHRoaXMgb25lCiAgICAgICAgICAgIH07ICAgICAKCgkgICAgYXJlIGVtaXR0ZWQgbGlrZSBjb25zdGFudHMgKGVxdWl2YWxlbnQgdG8gZW51bXMgb3IKCSAgICBleHBsaWNpdCAlY29uc3RhbnQpLgoJICAgIAoJICAgIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGNhbm5vdCBiZSBhZGRlZCBkaXJlY3RseSB0byAnY3ZhcicKCSAgICBzaW5jZSB0aGV5IGxhY2sgdGhlIG5lZWRlZCByZWZlcmVuY2UgKHdlbGwsIHlvdSBjYW4gZm9yY2UKCSAgICB0aGVtIHRvIGhhdmUgYSByZWFsIHJlZmVyZW5jZSwgYnV0IGluIGFuIHVnbHkgd2F5IHdoaWNoCgkgICAgZ29lcyBjb21wbGV0ZWx5IGFnYWluIHRoZSBvcmlnaW5hbCBwdXJwb3NlIG9mIGluaXRpYWxpemUKCSAgICB0aGVtIGR1cmluZyBkZWNsYXJhdGlvbiwgeW91IGFsc28gaGF2ZSB0byBkZWFsIHdpdGggZXh0cmEKCSAgICBsaW5raW5nIG1hdHRlcnMsIGFuZCBpdCB0YWtlIGEgd2hpbGUgdG8gZmlndXJlIG91dCB3aGF0IGlzCgkgICAgdGhlIHByb2JsZW0gYW5kIGhvdyB0byBzb2x2ZSBpdCkuCgkgICAgCgkgICAgUGxlYXNlIHRlc3QgaXQgd2l0aCB5b3VyIHByZWZlcnJlZCB0YXJnZXQgbGFuZ3VhZ2UsIGFuZAoJICAgIG5vdCBvbmx5IHRoZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByZWFsbHkgcnVuIHRoZSBleGFtcGxlCgkgICAgaW4gdGhlIHRlc3Qtc3VpdGUgKHN0YXRpYy1jb25zdC1tZW1iZXItMi5pKSBiZWNhdXNlIHRoZQoJICAgIHByb2JsZW0gYW5kIHRoZSBzb2x1dGlvbiBjYW5ub3QgYmUgImZ1bGx5IiBhcHByZWNpYXRlZAoJICAgIHVudGlsIHlvdSB0cnkgdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBydW4gaXQuCgoJICAgIEluIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyAocHl0aG9uIHNwZWNpYWxseSksIHRoaXMgY2FuCgkgICAgcHJvZHVjZXMgYSBkaWZmZXJlbmNlIGluIHRoZSB3YXkgdGhhdCB0aGUgc3RhdGljIGNvbnN0YW50CgkgICAgbWVtYmVycyAnYScgYW5kICdiJyBhcmUgaW50ZXJuYWxseSB3cmFwcGVkLiBIb3BlZnVsbHksCgkgICAgdGhleSBzdGlsbCBjYW4gYmUgYWNjZXNzZWQgaW4gdGhlIHNhbWUgd2F5LgoKCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIE5vdyBzdGF0aWMgY29uc3QgbWVtYmVycyBjYW4gYmUgYWNjZXNzZWQgaW4gYSBtb3JlCgkgICAgbmF0dXJhbCB3YXksIGllLCBpZiB5b3UgaGF2ZQoKCSAgICBzdHJ1Y3QgQQogICAgICAgICAgICAgewkJIAoJCXR5cGVkZWYgdW5zaWduZWQgaW50IHZpZXdmbGFnczsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGZvcndhcmRfZmllbGQgPSAwOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgYmFja3dhcmRfZmllbGQ7CiAgICAgICAgICAgIH07ICAgICAKCSAgICAKCSAgICBub3cgeW91IGNhbiBkbzoKCgkJcHJpbnQgQS5iYWNrd2FyZF9maWVsZAoKCSAgICBhbmQgYWxzbwoKCSAgICAgICAgYSA9IEEoKQoJCXByaW50IGEuZm9yd2FyZF9maWVsZAoJCQoJICAgIE5vdGUgdGhhdCBpZiB0aGUgc3RhdGljIGNvbnN0IG1lbWJlcnMgZG9uJ3QgaGF2ZSBhbgoJICAgIGluaXRpYWxpemVyIChsaWtlIGJhY2t3YXJkX2ZpZWxkKSwgc3RpbGwgeW91IGNhbiBhY2Nlc3MKCSAgICB0aGVtIGluIHRoZSBzYW1lIHdheSBpbiB0aGUgcHl0aG9uIHNpZGUsIGJ1dCB0aGUKCSAgICBpbXBsZW1lbnRhdGlvbiBpcyBhIHF1aXRlIGRpZmZlcmVudDogYmFja3dhcmRfZmllbGQgd2lsbAoJICAgIHN0aWxsIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHksIGFuZCBhbHNvLCB5b3UgYXJlIAoJICAgIHJlc3BvbnNpYmxlIHRvIGluaXRpYWxpemUgaXQgaW4gc29tZSBjb2RlIHVuaXQsIGFuZCBsaW5rIGl0CgkgICAgcHJvcGVybHkuIGZvcndhcmRfZmllbGQsIGJ5IHRoZSBvdGhlciBoYW5kLCB3aWxsIG5vdAoJICAgIGFwcGVhciBpbiB0aGUgY3ZhciBlbnRpdHkgYnV0IG9ubHkgYXMgYSBBIG1lbWJlciwgc2ltaWxhcgoJICAgIHRvIHdoYXQgaGFwcGVuIHdpdGggZW51bSBvciAlY29uc3RhbnQgbWVtYmVycy4KCjA4LzExLzIwMDI6IG1tYXR1cwoJICAgIFtweXRob25dIENvbW1vbiBjb2RlIGluIHRoZSBfX3NldGF0dHJfXy9fX2dldGF0dHJfXyBub3cKCSAgICBnb2VzIHRvIHR3byAiZnJlZSIgbWV0aG9kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm94eQoJICAgIGZpbGUsIGZyb20gd2hlcmUgZWFjaCBjbGFzcyB1c2UgaXQuIFRoaXMgY2hhbmdlIHJlZHVjZXMKCSAgICB0aGUgc2l6ZSBvZiB0aGUgcHJveHkgZmlsZSwgc3BlY2lhbGx5IGlmIHlvdSB3cmFwIGEgbG90IG9mCgkgICAgc21hbGwgY2xhc3NlcyBpbiBvbmUgbW9kdWxlICh1cCB0byAzMyUgaW4gc29tZSBjYXNlcyksCgkgICAgbWFraW5nIGl0IGZhc3RlciB0byBsb2FkIHRvby4KCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJZiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBjaGFyICogcmV0dXJucyBOVUxMLAogICAgICAgICAgICB1bmRlZiBpcyByZXR1cm5lZCB0byB0aGUgUGVybCBpbnRlcnByZXRlci4KIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBjb252ZXJzaW9uIG9wZXJhdG9ycyBhbmQgbmFtZXNwYWNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IEJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyooKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhlIHdyYXBwZXIgY29kZSwgU1dJRyB3YXMgdXNpbmcgLT5vcGVyYXRvciBGb28qKCkKICAgICAgICAgICAgd2hlbiBpdCBzaG91bGQgaGF2ZSBiZWVuIHVzaW5nIC0+b3BlcmF0b3IgbnM6OkZvbyooKS4KCiAgICAgICAgICAgIE5vdGU6IGlmIHVzaW5nICVyZW5hbWUgd2l0aCBhIGNvbnZlcnNpb24gb3BlcmF0b3IsIHlvdQogICAgICAgICAgICBtaWdodCBoYXZlIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlcmVuYW1lKHRvRm9vUHRyKSBuczo6b3BlcmF0b3IgbnM6OkZvbyooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIF5eXl4gbm90ZSBleHRyYSBxdWFsaWZpZXIKICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIAowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIE1pbm9yIGVuaGFuY2VtZW50IHRvICdjb25zdCcgdmFyaWFibGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICAgTm9ybWFsbHkgY29uc3QgZGVjbGFyYXRpb25zIGFyZSB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMKICAgICAgICAgICAgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggdGhlIGN2YXIgYXR0cmlidXRlIChzZWUgU1dJRy5odG1sIGZvcgogICAgICAgICAgICBhIGRpc2N1c3Npb24gb2Ygd2h5KS4gIEhvd2V2ZXIsIGluIG1hbnkgcHJvZ3JhbXMsICJjb25zdCIgCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucyBtYXkganVzdCBiZSBjb25zdGFudHMtLS1tYWtpbmcgdGhlIGN2YXIuIGFjY2VzcwogICAgICAgICAgICBhd2t3YXJkLiAgVG8gZml4IHRoaXMsICJjb25zdCIgZGVjbGFyYXRpb25zIGFyZSBub3cgYXZhaWxhYmxlCiAgICAgICAgICAgIGJvdGggdGhyb3VnaCBjdmFyLiBhbmQgYXMgYSBzaW1wbGUgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgRk9PID0gNDI7CgogICAgICAgICAgICBJbiBQeXRob246CgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLmN2YXIuRk9PCiAgICAgICAgICAgICAgICAgNDIKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5GT08KICAgICAgICAgICAgICAgICA0MgoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSB2YWx1ZSBvZiBhICJjb25zdCIgdmFyaWFibGUKICAgICAgICAgICAgbWlnaHQgY2hhbmdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNoYXIgKmNvbnN0IEJBUiA9ICJIZWxsbyBXb3JsZCI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBwb2ludGVyIGl0c2VsZiBjYW4gbm90IGNoYW5nZSwgYnV0IHRoZSAKICAgICAgICAgICAgZGF0YSBiZWluZyBwb2ludGVkIHRvIGNvdWxkIGJlIG1vZGlmaWVkLiAgSW4gdGhlc2Ugc2l0dWF0aW9ucywKICAgICAgICAgICAgY3Zhci5CQVIgc2hvdWxkIGJlIGFjY2Vzc2VkIHRvIG9idGFpbmVkIHRoZSBjdXJyZW50IHZhbHVlLgoKMDgvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBnZW5lcmF0aW9uIG9mIHRoZSBwcm94eSBjb2RlICgucHkgZmlsZXMpIHRvIG1vcmUKICAgICAgICAgICAgY2xvc2VseSBmb2xsb3cgdGhlIG9yZGVyIG9mIGRlY2xhcmF0aW9ucyBhcyB0aGV5IGFwcGVhciBpbgogICAgICAgICAgICB0aGUgLmkgZmlsZS4gICBJbiB0aGUgcGFzdCwgYWxsIG9mIHRoZSBjbGFzcyB3cmFwcGVycyBhcHBlYXJlZAogICAgICAgICAgICBmaXJzdCwgZm9sbG93ZWQgYnkgZnVuY3Rpb24gc3R1YnMsIGluc2VydGVkIFB5dGhvbiBjb2RlLCBhbmQKICAgICAgICAgICAgb3RoZXIgZGV0YWlscy4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkgbWV0aG9kIF9kZWxldGUoKSBjaGFuZ2VkIHRvIGRlbGV0ZSgpLiBUaGVyZSBzaG91bGRuJ3QgZXZlcgogICAgICAgICAgICBiZSBhIHdyYXBwZWQgZnVuY3Rpb24gY2FsbGVkIGRlbGV0ZSgpIGFzIGl0IGlzIGEgQysrIGtleXdvcmQgYW5kIHRoZXJlCiAgICAgICAgICAgIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYSBtZW1iZXIgZnVuY3Rpb24gaW4gQy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhlIGZ1bmN0aW9uIGJhY2sgaW4KICAgICAgICAgICAgZm9yIGFsbCBwcm94eSBjbGFzc2VzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgSmF2YSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBzdW1tYXJ5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBpbiBpbXByb3ZpbmcgdGhlIEphdmEgbW9kdWxlIAogICAgICAgICAgICBmb3IgdmVyIDEuMy4xNC4gIElmIGF0IGFsbCBwb3NzaWJsZSBjaGFuZ2UgeW91ciBjb2RlIHRvIHRha2UgYWR2YW50YWdlcyBvZiB0aGUgCiAgICAgICAgICAgIGltcHJvdmVtZW50cy4gSWYgeW91IHdlcmUgdXNpbmcgcHJveHkgY2xhc3NlcyB5b3UgbWF5IG5vdCBub3RpY2UgYW55IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBpc3N1ZXMuIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGljaCB3aWxsIGhlbHAgd2l0aCBtb3N0IGJhY2t3YXJkcyAKICAgICAgICAgICAgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aGVyZSBpdCBpcyBub3QgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBjb2RlIHRoYXQgdXNlcwogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIG91dHB1dDoKCiAgICAgICAgICAgIFJlcGxhY2U6CiAgICAgICAgICAgICAgICAlbW9kdWxlIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIFdpdGg6CiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im1vZHVsZW5hbWUiKSBtb2R1bGVuYW1lOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJXByYWdtYShqYXZhKSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzPSJwdWJsaWMiOwoKICAgICAgICAgICAgVGhlIHByb3h5IGNvbnN0cnVjdG9ycyB0aGF0IHRvb2sgcGFyYW1ldGVycyAobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pCiAgICAgICAgICAgIHdlcmUgcHVibGljIGFuZCBhcmUgbm93IHByb3RlY3RlZC4gSWYgeW91IHdlcmUgbWFraW5nIHVzZSBvZiB0aGVzZSB0aGVuIHlvdSdsbCAKICAgICAgICAgICAgaGF2ZSB0byBtb2RpZnkgeW91ciBjb2RlIGFuZCB0aGUgYmVzdCBzb2x1dGlvbiB3b3VsZCBiZSB0byB1c2UgdGhlIG5ldyB0eXBlIAogICAgICAgICAgICB3cmFwcGVyIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgb3RoZXIgbWFpbiBhcmVhcyBhcmUgdGhlIHByYWdtYXMgYW5kIGdsb2JhbCB2YXJpYWJsZSB3cmFwcGluZy4gUmVwbGFjZSAKICAgICAgICAgICAgdGhlIHByYWdtYXMgd2l0aCBvbmUgb2YgdGhlIG5ldyBkaXJlY3RpdmVzIG9yIHR5cGVtYXBzIG1lbnRpb25lZCBiZWxvdyBhbmQgdXNlCiAgICAgICAgICAgICVyZW5hbWUgb24gdGhlIHZhcmlhYmxlcy4KCiAgICAgICAgICAgIElmIHlvdSB3ZXJlIG5vdCB1c2luZyBwcm94eSBjbGFzc2VzLCB5b3Ugd2lsbCBoYXZlIHRvIGRlZmluZSBhIGpzdHlwZSB0eXBlbWFwCiAgICAgICAgICAgIGFzIHdlbGwgYXMgYSBqdHlwZSB0eXBlbWFwLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHdyYXBwaW5nIHR3byBkaW1lbnNpb24gYXJyYXkgdmFyaWFibGVzLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbF0KICAgICAgICAgICAgT2JqZWN0IG1hbmFnZW1lbnQgbm93IGhhcyBhIG11Y2ggYmV0dGVyIHNlbnNlIG9mIG93bmVyc2hpcC4KICAgICAgICAgICAgT3duZXJzaGlwIGJpdHMgaXMgY2hhbmdlZCB3aGVuZXZlciBhbiBvYmplY3QgaXMgc3RvcmVkIGluIGEKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSBtZW1iZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgICAgIEZvbyAqbmV4dDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3cgaW4gUHl0aG9uCgogICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24KICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICA+Pj4gZyA9IEZvbygpCiAgICAgICAgICAgICAgID4+PiBnLm5leHQgPSBmICAgICAgICAgICMgQXNzaWduIGEgcG9pbnRlcgogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duICAgICAgICAgICAjIE5vdGljZSBvd25lcnNoaXAgY2hhbmdlCiAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICBUaGlzIHNjaGVtZSBpcyBtb3N0bHkgYSBjb25zZXJ2YXRpdmUgaGV1cmlzdGljIGRlc2lnbmVkIHRvIAogICAgICAgICAgICBwcm92aWRlIHNlZ21lbnRhdGlvbiBmYXVsdHMuICBJdCBjb3VsZCBjYXVzZSBhIG1lbW9yeSBsZWFrCiAgICAgICAgICAgIGlmIG93bmVyc2hpcCBpcyBjaGFuZ2VkIHVubmVjZXNzYXJpbHkuICBJbiB0aGlzIGNhc2UsIHlvdSBjYW4KICAgICAgICAgICAgZWl0aGVyIHdyaXRlIGEgdHlwZW1hcCAodGhhdCBkb2Vzbid0IGNoYW5nZSBvd25lcnNoaXApLCBvcgogICAgICAgICAgICBtYW51YWxseSBzZXQgdGhlIHRoaXNvd24gYXR0cmlidXRlIGJhY2sgdG8gMS4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gTWFqb3IgdXNhYmlsaXR5IGltcHJvdmVtZW50cyB0byB0aGUgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgICAgU3VwcG9zZSB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgCiAgICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHZvaWQgIGJsYWgoRm9vICpmKTsKCiAgICAgICAgICAgIEluIHBhc3QgdmVyc2lvbnMgb2YgU1dJRywgeW91IGNvdWxkIGNyZWF0ZSBvYmplY3RzIGFuZCB1c2UKICAgICAgICAgICAgdGhlbSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJSBGb28gZgogICAgICAgICAgICAgICAgJSBmIGNvbmZpZ3VyZSAteCAzCiAgICAgICAgICAgICAgICAlIGYgc3BhbQogICAgICAgICAgICAgICAgMzcKICAgIAogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIGlzIHRoYXQgaWYgeW91IHRyaWVkIHRvIGNhbGwgYmxhaCgpLCBpdCBkaWRuJ3QKICAgICAgICAgICAgd29yazoKCiAgICAgICAgICAgICAgICAlIGJsYWggZgogICAgICAgICAgICAgICAgVHlwZSBFcnJvci4gRXhwZWN0ZWQgX3BfRm9vCiAgICAgICAgICAgICAgICAlCgogICAgICAgICAgICBJbnN0ZWFkLCB5b3UgaGFkIHRvIGRvIHRoaXM6CgogICAgICAgICAgICAgICAgJSBibGFoIFtmIGNnZXQgLXRoaXNdCiAgCiAgICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZXh0cmFjdHMgdGhlIC10aGlzIHBvaW50ZXIsIGF2b2lkaW5nIHRoaXMKICAgICAgICAgICAgcHJvYmxlbS4gIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcgImJsYWggZiIgaXMgcGVyZmVjdGx5IGxlZ2FsIGFuZAogICAgICAgICAgICBldmVyeXRoaW5nIHdpbGwgc3RpbGwgd29yayBub3JtYWxseS4KCiAgICAgICAgICAgIENhdmVhdDogU2luY2UgcG9pbnRlciBzdHJpbmdzIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUgKF8pLAogICAgICAgICAgICBkb24ndCB1c2UgdGhpcyBpbiBvYmplY3QgbmFtZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlIEZvbyBfZiAKICAgICAgICAgICAgICAgICUgYmxhaCBfZiAgICAgICAgIyBQb3RlbnRpYWwgY3Jhc2gKCiAgICAgICAgICAgIE9iamVjdHMgbm93IGhhdmUgYSAtdGhpc293biBhdHRyaWJ1dGUgdGhhdCBzaG93cyB0aGUgb3duZXJzaGlwLgogICAgICAgICAgICBUaGlzIGJ1aWxkcyB1cG9uIHRoZSBDSEFOR0VTIDExLzI0LzIwMDEgZW50cnkuCgowOC8wNy8yMDAyOiBzYW1qYW0sIFNhbSBMaWRkaWNvdHQKICAgICAgICAgICAgUHJvcGVybHkgaW1wbGVtZW50ZWQgcG9pbnRlciBzeXN0ZW0gdXNpbmcgcGhwIHJlc291cmNlcy4KICAgICAgICAgICAgU3RpbGwgbmVlZCB0byB3b3JrIG91dCB3aGV0aGVyIG9yIG5vdCB0byBsZXQgc2NyaXB0LXVzZXJzIGNhbGwKICAgICAgICAgICAgZGVzdHJ1Y3RvcnMgZGlyZWN0bHkKCjA4LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXBncmFkZWQgbXpzY2hlbWUgbW9kdWxlIHRvIHN1cHBvcnQgdmVyc2lvbiAyMDEgYW5kIGFkZGVkCiAgICAgICAgICAgIG92ZXJsb2FkaW5nIHN1cHBvcnQuCgowOC8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgZXh0cmEgZ3JvdXBpbmcgKGluIHZlcnkgbGltaXRlZCBjYXNlcykuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAoRnVuY1B0cikoaW50LCBkb3VibGUpOwoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCAqKioKICAgICAgICAgICAgCjA4LzAzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVzIHRvIHR5cGVtYXBzLmkgYXMgdGhvc2UgZG9uZSBwcmV2aW91c2x5IGZvciBQZXJsLAogICAgICAgICAgICBQeXRob24gYW5kIFRjbCBtb2R1bGVzLiBOb3cgc3VwcG9ydHMgcmVmZXJlbmNlIHR5cGVzIHdpdGggSU5QVVQsCiAgICAgICAgICAgIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMuCgowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgY3N0cmluZy5pIGFkZGVkLiAgUHJvdmlkZXMgbWFjcm9zIGZvcgogICAgICAgICAgICBtYW5pcHVsYXRpbmcgY2hhciAqIGRhdGEuCiAKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gIFVzZSAlbmV3b2JqZWN0IGluc3RlYWQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVuZXdvYmplY3QgZm9vOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgY2hhciAqZm9vKCk7CgogICAgICAgICAgICAlbmV3b2JqZWN0IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsCiAgICAgICAgICAgIGV0Yy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgYXR0cmlidXRlICdqbmljbGFzc25hbWUnIGZvciB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBhbGxvd3MgYSB3YXkgb2YKICAgICAgICAgICAgY2hhbmdpbmcgdGhlIEpOSSBjbGFzcyBuYW1lIGZyb20gdGhlIGRlZmF1bHQgd2hpY2ggdXNlcyB0aGUgbW9kdWxlbmFtZSB3aXRoIEpOSQogICAgICAgICAgICBhcHBlbmRlZCBhZnRlciBpdC4KCiAgICAgICAgICAgICAgICAlbW9kdWxlIChqbmljbGFzc25hbWU9Im5hbWUiKSBtb2R1bGVuYW1lCgogICAgICAgICAgICBJZiAnbmFtZScgaXMgdGhlIHNhbWUgYXMgJ21vZHVsZW5hbWUnIHRoZW4gdGhlIG1vZHVsZSBjbGFzcyBuYW1lIGdldHMgY2hhbmdlZAogICAgICAgICAgICBmcm9tICdtb2R1bGVuYW1lJyB0byBtb2R1bGVuYW1lTW9kdWxlLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmlsZSBpbmNsdWRlIG9yZGVyLiAgTGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZGlyZWN0b3JpZXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIGdlbmVyaWMgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOiAgInN3aWdfbGliL3B5dGhvbi9mb28uaSIgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUKICAgICAgICAgICAgInN3aWdfbGliL2Zvby5pIi4gICAgSSB0aG91Z2h0IHRoaXMgd2FzIHRoZSBjYXNlIGFscmVhZHksIGJ1dAogICAgICAgICAgICBhcHBhcmVudGx5IGl0IGhhcyBiZWVuIGJyb2tlbiBmb3IgcXVpdGUgc29tZSB0aW1lLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdGRfZGVxdWUuaSBsaWJyYXJ5IGZpbGUuICBXb3JrIGluIHByb2dyZXNzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uLFRjbCxQZXJsXQogICAgICAgICAgICBJbXByb3ZlbWVudHMgdG8gdHlwZW1hcHMuaS4gIElOUFVUL0lOT1VUIHR5cGVtYXBzIHBlcmZvcm0gYmV0dGVyCiAgICAgICAgICAgIGVycm9yIGNoZWNraW5nLiAgVHlwZW1hcHMgYXJlIG5vdyBzdXBwbGllZCBmb3IgcmVmZXJlbmNlcyBsaWtlIAogICAgICAgICAgICBpbnQgJk9VVFBVVCwgZG91YmxlICZJTk9VVCwgZXRjLgogICAgICAgICAgCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRGVwcmVjYXRlZCB0aGUgVF8qIGFuZCBMXyogdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KICAgICAgICAgICAgTXVsdGlwbGUgcmV0dXJuIHZhbHVlcyBhcmUgYWx3YXlzIHBsYWNlZCBpbiBhIHR1cGxlLiBEZXByZWNhdGVkCiAgICAgICAgICAgIHRoZSBCT1RIIHR5cGVtYXBzLiAgVGhpcyBpcyBub3cgSU5PVVQgKGUuZy4sIGludCAqSU5PVVQpLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIGFycmF5LmksIGNhcnJheS5pLCBhbmQgdGltZXIuaSBsaWJyYXJ5IGZpbGVzLgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgVXNlIGNwb2ludGVyLmkgaW5zdGVhZC4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZvciBjb25zaXN0ZW5jeSB0aGUgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgdXNlIHRoZSBKYXZhQmVhbiAKICAgICAgICAgICAgcHJvcGVydHkgZGVzaWduIHBhdHRlcm4gbGlrZSBtZW1iZXIgdmFyaWFibGVzIGFsd2F5cyBoYXZlLiBUaGlzIG1lYW5zIGlmIHlvdSBhcmUgCiAgICAgICAgICAgIHdyYXBwaW5nIGEgdmFyaWFibGUgY2FsbGVkIGZvbywgdGhlIGdldHRlciBpcyBjYWxsZWQgZ2V0Rm9vKCkgYW5kIHRoZSBzZXR0ZXIgaXMgCiAgICAgICAgICAgIGNhbGxlZCBzZXRGb28oKS4gQmVmb3JlIHRoZSByZWNlbnQgY2hhbmdlcyB0byB0aGUgSmF2YSBtb2R1bGUgdGhlIGdldHRlcnMgYW5kIAogICAgICAgICAgICBzZXR0ZXJzIHdlcmUgY2FsbGVkIGdldF9mb28oKSBhbmQgc2V0X2ZvbygpLiBJZiB5b3UgcmVhbGx5IHdhbnQgdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBmdW5jdGlvbiBuYW1lcyB1c2UgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGxpa2UgdGhpczogJXJlbmFtZShfZm9vKSBGb287CgowNy8zMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNhc3RpbmcgcHJvYmxlbSB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgICAgY2xhc3MgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXIgOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBiYXogOiBwdWJsaWMgZm9vIHt9OwogICAgICAgICAgICAgICAgICBjbGFzcyBzcGFtIDogcHVibGljIGJhciwgcHVibGljIGJheiB7fTsKCiAgICAgICAgICAgIHRoZW4gdGhlIHdyYXBwZXJzIHdvdWxkbid0IGNvbXBpbGUgZHVlIHRvIGFuIGFtYmlndW91cyBjYXN0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEdWUgdG8gbmV3IHN0YXRpYyB0eXBlY2hlY2tpbmcgYWxsIHBvaW50ZXJzIGhlbGQgaW4gYSBKYXZhIGxvbmcgYXJlIHBhcnQgb2YgCiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBhbmQgdGhpcyBwb2ludGVyIHZhbHVlIGluIHRoZSBKYXZhIGxvbmcgaGFzIGJlY29tZSBhYnN0cmFjdGVkCiAgICAgICAgICAgIGRhdGEuIFRoZSB0eXBlIHdyYXBwZXIgY29uc3RydWN0b3IgYW5kIGdldENQdHIoKSBtZXRob2RzIGFyZSBhcyBzdWNoIHByb3RlY3RlZC4KICAgICAgICAgICAgSWYgeW91IG5lZWQgdG8gbWVzcyBhcm91bmQgd2l0aCBwb2ludGVycyBmcm9tIEphdmEgb3IgZm9yIGV4YW1wbGUgY3JlYXRlIGEgcHJveHkgCiAgICAgICAgICAgIGNsYXNzIG9yIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgYSBudWxsIHBvaW50ZXIsIGFkZCBhIGZ1bmN0aW9uL2NvbnN0cnVjdG9yIAogICAgICAgICAgICB0byBkbyBzbyB3aXRoIHRoZSAlamF2YWNvZGUgdHlwZW1hcC4gWW91IGNhbiBhbHNvIG1ha2UgZ2V0Q1B0cigpIHB1YmxpYyBhZ2FpbiB3aXRoCiAgICAgICAgICAgIHRoZSAlamF2YWdldGNwdHIgdHlwZW1hcC4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZXMgZm9yICV0eXBlbWFwKGlnbm9yZSkuIEluIHBhcnRpY3VsYXIgd2hlbiBpZ25vcmluZyB0aGUgbGFzdCBwYXJhbWV0ZXIKICAgICAgICAgICAgaW4gYSBmdW5jdGlvbi4gQWxzbyBmb3IgYWxsIHBhcmFtZXRlcnMgaW4gY29uc3RydWN0b3JzLiBUaGVzZSBtb2RzIGhhdmUgYWxzbyBmaXhlZAogICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcyBmb3IgcHJveHkgY2xhc3NlcyAtIFNGIDU4MTc5MS4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJW5ld29iamVjdCAocmVwbGFjZW1lbnQgZm9yICVuZXcpIG5vdyBpbXBsZW1lbnRlZCBmb3IgSmF2YS4gCgowNy8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlbWFwIGNvcGllcywgJWFwcGx5LCBhbmQgJWNsZWFyIGluc2lkZQogICAgICAgICAgICBDKysgbmFtZXNwYWNlcy4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpOSSBjbGFzcyBub3cgaGFzIHBhY2thZ2UgYWNjZXNzIGFzIHRoZSBjbGFzcyBtb2RpZmllcgogICAgICAgICAgICBoYXMgYmVlbiBjaGFuZ2VkIGZyb20gInB1YmxpYyIgdG8gbm90aGluZy4gVGhpcyBoYXMgYmVlbiBkb25lCiAgICAgICAgICAgIGFzIHRoaXMgY2xhc3MgaXMgbm93IG1vcmUgZm9yIHRoZSBpbnRlcm5hbCB3b3JraW5ncyBvZiBTV0lHIHNpbmNlIHRoZSBtb2R1bGUKICAgICAgICAgICAgY2xhc3MgaGFzIHN0YXRpYyB0eXBlIGNoZWNraW5nIGZvciBhbGwgdHlwZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlICVqbmljbGFzc2NsYXNzbW9kaWZpZXIgCiAgICAgICAgICAgIHByYWdtYSB0byBjaGFuZ2UgaXQgYmFjayB0byAicHVibGljIi4KCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUHJveHkvU2hhZG93IGNsYXNzZXMgYXJlIGdlbmVyYXRlZCBieSBkZWZhdWx0LiBUaGUgLXByb3h5IGFuZCAKICAgICAgICAgICAgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZSAKICAgICAgICAgICAgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRoZW4gdXNlIHRoZSBuZXcgLW5vcHJveHkgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZW1haW5pbmcgcHJhZ21hcyBzaGFrZXVwLiBUaGVzZSB3ZXJlIHRoZSByZW1haW5pbmcgcHJhZ21hcyBhbmQgdGhlaXIKICAgICAgICAgICAgbmV3IG5hbWVzIHdoZXJlIGNoYW5nZWQ6CgogICAgICAgICAgICBtb2R1bGViYXNlCiAgICAgICAgICAgIG1vZHVsZWNvZGUKICAgICAgICAgICAgbW9kdWxlY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgbW9kdWxlaW1wb3J0ID0+IG1vZHVsZWltcG9ydHMKICAgICAgICAgICAgbW9kdWxlaW50ZXJmYWNlID0+IG1vZHVsZWludGVyZmFjZXMKCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbXBvcnRzIHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IHRvIGhvdyB0aGUgbW9kdWxlaW1wb3J0IHByYWdtYSB3b3JrZWQuIAogICAgICAgICAgICBOb3cgaXQgYWN0dWFsbHkgdGFrZXMgY29kZSB3aGljaCBnZXRzIHBsYWNlZCBiZWZvcmUgdGhlIGNsYXNzIGRlZmluaXRpb24gc28gdGhlIAogICAgICAgICAgICB3aG9sZSBpbXBvcnQgc3RhdGVtZW50IGhhcyB0byBiZSBnaXZlbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWltcG9ydHM9JXsKICAgICAgICAgICAgaW1wb3J0IGphdmEuaW8uKjsKICAgICAgICAgICAgaW1wb3J0IGphdmEubWF0aC4qOwogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1vZHVsZWludGVyZmFjZXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvbGQgbW9kdWxlaW50ZXJmYWNlIGluIHRoYXQgaWYgCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlIGlzIHJlcXVpcmVkIHRoZXkgbXVzdCBiZSBjb21tYSBzZXBhcmF0ZWQgaW4gb25lIHVzZSBvZiAKICAgICAgICAgICAgdGhlIHByYWdtYSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIG1vZHVsZWludGVyZmFjZXM9IlNlcmlhbGl6YWJsZSwgTXlJbnRlcmZhY2UiCgogICAgICAgICAgICBUaGVzZSBsYXN0IHR3byBwcmFnbWFzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGphdmFpbnRlcmZhY2VzIGFuZCBqYXZhaW1wb3J0cyAKICAgICAgICAgICAgdHlwZW1hcC4KCiAgICAgICAgICAgIEEgc2ltaWxhciBzZXQgb2YgcHJhZ21hcyBoYXMgYmVlbiBpbnRyb2R1Y2VkLCBuYW1lbHk6CgogICAgICAgICAgICBqbmljbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnQKICAgICAgICAgICAgam5pY2xhc3NpbnRlcmZhY2UKCiAgICAgICAgICAgIFRoZXNlIHdvcmsgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIG1vZHVsZSBjb3VudGVycGFydHMuIE5vdGUgdGhhdCBwcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBtb2R1bGVYWFggcHJhZ21hcyB3b3JrZWQgb24gdGhlIG9sZCBtb2R1bGUgY2xhc3Mgd2hpY2ggaXMgbm93IGNhbGxlZCB0aGUKICAgICAgICAgICAgSk5JIGNsYXNzICh0aGUgY2xhc3Mgd2l0aCB0aGUgbmF0aXZlIGZ1bmN0aW9ucykuIFRoZSBqbmljbGFzc1hYWCBwcmFnbWFzIG5vdyAKICAgICAgICAgICAgd29yayBvbiB0aGUgbmV3IG1vZHVsZSBjbGFzcyAodGhlIGNsYXNzIHRoYXQgaGFzIGFsbCB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhbmQKICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlIGdldHRlcnMgYW5kIHNldHRlcnMgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzLCBwbHVzIGFsbCBvdGhlcgogICAgICAgICAgICByZW1haW5pbmcgZnVuY3Rpb25zIHdoZW4gdXNpbmcgdGhlIGxvdy1sZXZlbCBwcm9jZWR1cmFsIGludGVyZmFjZSkuCgogICAgICAgICAgICBJbiBzdW1tYXJ5IHRoZSBjb250ZW50cyBvZiB0aGUgcHJhZ21hcyBtYWtlIHVwIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgPGpuaWNsYXNzaW1wb3J0cz4KICAgICAgICAgICAgPGpuaWNsYXNzbW9kaWZpZXJzPiBjbGFzcyBtb2R1bGVuYW1lIGV4dGVuZHMgPGpuaWNsYXNzYmFzZT4gaW1wbGVtZW50cyA8am5pY2xhc3NpbnRlcmZhY2VzPiB7CiAgICAgICAgICAgICAgICA8am5pY2xhc3Njb2RlPgogICAgICAgICAgICAgICAgLi4uIFNXSUcgZ2VuZXJhdGVkIGZ1bmN0aW9ucyAuLi4KICAgICAgICAgICAgfQp9CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVwcmVjYXRlZCBtb2R1bGVtZXRob2Rtb2RpZmllcnMgcHJhZ21hIGFuZCByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBhIGJldHRlciAlZmVhdHVyZSBiYXNlZCBkaXJlY3RpdmUgY2FsbGVkICVqYXZhbWV0aG9kbW9kaWZpZXJzLgogICAgICAgICAgICBBIHVzZWZ1bCBleGFtcGxlIHdvdWxkIGJlIGZvciBzeW5jaHJvbmlzYXRpb24gaW4gbXVsdGktdGhyZWFkZWQgYXBwczoKCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIGZvbyhpbnQgYSkgInB1YmxpYyBzeW5jaHJvbml6ZWQiOwoKICAgICAgICAgICAgQ2hhbmdlcyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGRlZmF1bHQgKCJwdWJsaWMiKSB0byAicHVibGljIHN5bmNocm9uaXplZCIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNldmVyYWwgZGlyZWN0aXZlcyBub3cgYWxsb3cgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBUaGVzZSBpbmNsdWRlOgoKICAgICAgICAgICAgICAgICVtb2R1bGUobmFtZT0idmFsdWUiLCBuYW1lPSJ2YWx1ZSIsIC4uLikgbW9kdWxlbmFtZQogICAgICAgICAgICAgICAgJWltcG9ydChuYW1lPSJ2YWx1ZSIsIC4uLikgImZpbGVuYW1lLmkiCiAgICAgICAgICAgICAgICAlZXh0ZW5kKG5hbWU9InZhbHVlIiwgLi4uKSBjbGFzc25hbWUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVzZSBjdXJyZW50bHkgaGF2ZSBubyBlZmZlY3QgYW5kIGFyZSByZXNlcnZlZCBmb3IKICAgICAgICAgICAgZnV0dXJlIGV4cGFuc2lvbi4KICAgICAgICAgICAgICAgCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnRzIHRvIHNtYXJ0LXBvaW50ZXIgaGFuZGxpbmcuICBTV0lHIG9ubHkgcHJvdmlkZXMKICAgICAgICAgICAgZXh0cmEgc3VwcG9ydCBmb3IgYSBzbWFydC1wb2ludGVyIGlmIG9wZXJhdG9yLT4oKSByZXR1cm5zCiAgICAgICAgICAgIGEgcHJvcGVyIHBvaW50ZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CgogICAgICAgICAgICBJZiBvcGVyYXRvci0+KCkgcmV0dXJucyBhbiBvYmplY3QgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLAogICAgICAgICAgICB0aGVuIFNXSUcgZXhhbWluZXMgdGhlIHJldHVybmVkIG9iamVjdCB0byBzZWUgaWYgaXQgYWxzbwogICAgICAgICAgICBpbXBsZW1lbnRzIG9wZXJhdG9yLT4oKS4gIElmIHNvLCBTV0lHIGNoYXNlcyBvcGVyYXRvci0+KCkKICAgICAgICAgICAgdW50aWwgaXQgY2FuIGZpbmQgb25lIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cwogICAgICAgICAgICBjYXNlcyBsaWtlIHRoaXMgdG8gd29yazoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIEJhciBvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpICAgICAgIyBJbnZva2VzIEZvbzo6YmxhaCgpCgogICAgICAgICAgICBUaGUgcy5ibGFoKCkgY2FsbCBhY3R1YWxseSBpbnZva2VzOgoKICAgICAgICAgICAgICAgICAgKChzLm9wZXJhdG9yLT4oKSkub3BlcmF0b3ItPigpKS0+YmxhaCgpOwogCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCB0eXBlZGVmIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vICYgRm9vUmVmOwogICAgICAgICAgICAgICAgIEZvb1JlZiBibGFoKCk7CgogICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QKICAgICAgICAgICAgY29tcGlsZS4KCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgV3JhcHBpbmcgb2Ygc3RhdGljIG1ldGhvZHMgaGFzIGJlZW4gaW1wcm92ZWQgaW4gcHJveHkgY2xhc3Nlcy4gIEluIG9sZGVyCiAgICAgICAgICAgIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhpczoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgc3RhdGljIG1ldGhvZCB3YXMgb25seSBhdmFpbGFibGUgYXMgYSBmdW5jdGlvbiBGb29fYmFyKCkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgID4+PiBGb29fYmFyKCkKCiAgICAgICAgICAgIE5vdywgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGFsc28gYmUgaW52b2tlZCB0aHJvdWdoIGFuIGluc3RhbmNlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgICAgPj4+IGYuYmFyKCkgICAgICAgICMgSW52b2tlcyBzdGF0aWMgbWV0aG9kCgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYWxsIHZlcnNpb25zIG9mIFB5dGhvbi4gIEFkZGl0aW9uYWxseSwgZm9yIFB5dGhvbi0yLjIsCiAgICAgICAgICAgIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGFzOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvby5iYXIoKQoKICAgICAgICAgICAgVGhlIG9sZC1zdHlsZSBmdW5jdGlvbiBpcyBzdGlsbCBzdXBwb3J0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gSWYKICAgICAgICAgICAgeW91IGNhcmUgYWJvdXQgbWFraW5nIHlvdXIgY29kZSBhY3Jvc3MgZGlmZmVyZW50IHZlcnNpb25zIG9mIFB5dGhvbiwKICAgICAgICAgICAgZWl0aGVyIHVzZSBGb29fYmFyKCkgb3IgYWNjZXNzIHRoZSBtZXRob2QgdGhyb3VnaCBhbiBpbnN0YW5jZS4KIAowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUuICBQcm94eSBjbGFzc2VzIG5vdyB1dGlsaXplIG5ldyBQeXRob24tMi4yCiAgICAgICAgICAgIGZlYXR1cmVzIGluY2x1ZGluZyBwcm9wZXJ0aWVzIGFuZCBzdGF0aWMgbWV0aG9kcy4gIEhvd2V2ZXIsIHRoZXNlIGZlYXR1cmVzCiAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQgaW4gYSB3YXkgdGhhdCBwcm92aWRlcyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCiAgICAgICAgICAgIFB5dGhvbiB2ZXJzaW9ucy4gIEluIG90aGVyIHdvcmRzLCBwcm94eSBjbGFzc2VzIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uIGFuZCBvbmx5IHVzZSBuZXcgZmVhdHVyZXMgd2hlbiBydW5uaW5nIG9uIFB5dGhvbi0yLjIuCgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAlZXh0ZW5kIHNvIHRoYXQgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbiBiZSBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHgpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqcykgeyB9OwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBib3RoIEMrKyAqYW5kKiBDLgoKMDcvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBNb3JlIG5ldyB0eXBlbWFwcyBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIGNhbiBiZSBmdXJ0aGVyIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGVzZSBhcmUgdGhlIGRlZmF1bHQgY29kZSBmb3IgZ2VuZXJhdGluZyB0aGUgCiAgICAgICAgICAgIGZpbmFsaXplKCkgbWV0aG9kcyAocHJveHkgY2xhc3NlcyBvbmx5KSBhbmQgdGhlIGdldENQdHIoKSBtZXRob2RzIGZvciBwcm94eSAKICAgICAgICAgICAgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhZmluYWxpemUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB7CiAgICAgICAgICAgICAgICBfZGVsZXRlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgcmV0dXJuIG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgdHlwZW1hcCB3aWxsIGVuYWJsZSB1c2VycyB0byBoYW5kbGUgSmF2YSBudWxsIGJ5IG92ZXJyaWRpbmcKICAgICAgICAgICAgdGhpcyB0eXBlbWFwIC0gYSByZXF1ZXN0ZWQgZmVhdHVyZS4KCiAgICAgICAgICAgIFRoZSAtbm9maW5hbGl6ZSBjb21tYW5kbGluZSBvcHRpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVGhlIGphdmFmaW5hbGl6ZQogICAgICAgICAgICB0eXBlbWFwIGlzIG1vcmUgcG93ZXJmdWwgYXMgaXQgd2lsbCBhbGxvdyB0aGUgcmVtb3ZhbCBvZiB0aGUgZmluYWxpemUgbWV0aG9kcyAKICAgICAgICAgICAgZm9yIGFsbCBvciBhbnkgb25lIG9yIG1vcmUgcGFydGljdWxhciBwcm94eSBjbGFzcy4KCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGdldENQdHJYWFgoKSBmdW5jdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHRvIGEgc3RhdGljIGZ1bmN0aW9uIGFuZAogICAgICAgICAgICBpcyBub3cgb2YgdGhlIGZvcm06CgogICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cihYWFggb2JqKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBpcyBhIHJlcXVlc3RlZCBjaGFuZ2Ugd2hpY2ggd2lsbCBhbGxvdyBKYXZhIG51bGwgcG9pbnRlcnMgdG8gYmUgdXNlZCBhcyBudWxsCiAgICAgICAgICAgIGNhbiBiZSBwYXNzZWQgaW4gZm9yIG9iai4gSG93ZXZlciwgdG8gYWNoaWV2ZSB0aGlzIHRoZSBhcHByb3ByaWF0ZSBjb2RlIG11c3QgYmUKICAgICAgICAgICAgd3JpdHRlbiB1c2luZyB0aGUgbmV3IGphdmFnZXRjcHRyIHR5cGVtYXAgZGlyZWN0aXZlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGlzIGZ1bmN0aW9uIGJhY2sgaW4gdXNpbmcgdGhlCiAgICAgICAgICAgIG5ldyBqYXZhY29kZSB0eXBlbWFwOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CgogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjEyIGFuZCBTV0lHLTEuMy4xMwogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTEgYW5kIGVhcmxpZXIKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICV9CgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOZXcgZGlyZWN0aXZlIHRvIGNvbnRyb2wgY29uc3RhbnQgY29kZSBnZW5lcmF0aW9uIC0gJWphdmFjb25zdC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaGFuZGxpbmcgZm9yIGhhbmRsaW5nIGNvbnN0YW50cyBpcyB0byBnZXQgdGhlIHZhbHVlIHRocm91Z2gKICAgICAgICAgICAgYSBKTkkgY2FsbCwgZWcKCiAgICAgICAgICAgICNkZWZpbmUgWUVMTE9XIDUKICAgICAgICAgICAgI2RlZmluZSBCSUcgMTIzNExMCgogICAgICAgICAgICByZXN1bHRzIGluOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gbW9kdWxlbmFtZS5nZXRfWUVMTE9XKCk7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSBtb2R1bGVuYW1lLmdldF9CSUcoKTsKCiAgICAgICAgICAgIEVhcmxpZXIgdmVyc2lvbnMgb2YgdGhlIEphdmEgbW9kdWxlIGluaXRpYWxpc2VkIHRoZSB2YWx1ZSB1c2luZyB0aGUgQyB2YWx1ZToKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IDU7CiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBCSUcgPSAxMjM0TEw7CgogICAgICAgICAgICBUaGlzIHdvcmtzIGluIG1vc3QgY2FzZXMsIGJ1dCB0aGUgdmFsdWUgZm9yIEJJRyB3b24ndCBjb21waWxlIGFzIDEyMzRMTCBpcyBub3QKICAgICAgICAgICAgdmFsaWQgSmF2YSBjb2RlIGFuZCB0aGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyB3aHkgdGhlIGRlZmF1bHQgaXMgbm93IHRvIGdldCB0aGUgCiAgICAgICAgICAgIHZhbHVlcyB0aHJvdWdoIGEgSk5JIGNhbGwuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IHRoZXNlICdjb25zdGFudHMnIGNhbm5vdCBiZSB1c2VkIAogICAgICAgICAgICBpbiBzd2l0Y2ggc3RhdGVtZW50cy4gVGhlICVqYXZhY29uc3QgZGlyZWN0aXZlIGFsbG93cyBvbmUgdG8gc3BlY2lmeSB0aGUKICAgICAgICAgICAgd2F5IHRoZSBjb25zdGFudCB2YWx1ZSBpcyBpbml0aWFsaXNlZCBhbmQgd29ya3MgbGlrZSBvdGhlciAlZmVhdHVyZQogICAgICAgICAgICBkaXJlY3RpdmVzLCBlZwoKICAgICAgICAgICAgJWphdmFjb25zdCgwKTsgICAgIC8vIGFsbCBjb25zdGFudHMgZnJvbSB0aGlzIHBvaW50IG9uIGFyZSBpbml0aWFsaXNlZCB1c2luZyB0aGUgQyB2YWx1ZQogICAgICAgICAgICAlamF2YWNvbnN0KDEpIEJJRzsgLy8ganVzdCBCSUcgaW5pdGlhbGlzZWQgdXNpbmcgSk5JIGNhbGwgKG11c3QgYmUgcGFyc2VkIGJlZm9yZSBCSUcgaXMgZGVmaW5lZCkKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgKioqIElNUE9SVEFOVCBDSEFOR0VTIFRPIFRIRSBQWVRIT04gTU9EVUxFICoqKgoKICAgICAgICAgICAgKDEpIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbmFibGVzIHNoYWRvdy9wcm94eSBjbGFzc2VzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0d28gZmlsZXMgYXJlIGFsd2F5cyBjcmVhdGVkIGJ5IFNXSUcuICBGb3IKICAgICAgICAgICAgaW5zdGFuY2UsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgIC8vIGZpbGU6IGZvby5pCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBmb28KICAgICAgICAgICAgICAgICAuLi4KCiAgICAgICAgICAgIFRoZW4gc3dpZyBnZW5lcmF0ZXMgdHdvIGZpbGVzICJmb29fd3JhcC5jIiBhbmQgImZvby5weSIuCgogICAgICAgICAgICAoMikgVGhlIG5hbWUgb2YgdGhlIGxvdy1sZXZlbCBDIGV4dGVuc2lvbiBtb2R1bGUgaGFzIGJlZW4gY2hhbmdlZAogICAgICAgICAgICB0byBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZQogICAgICAgICAgICB0byBjb21waWxlIHRoZSBtb2R1bGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAkIGNjIC1jIC1JL3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjIuMiBmb29fd3JhcC5jCiAgICAgICAgICAgICAgICAkIGNjIC1zaGFyZWQgZm9vX3dyYXAubyAkKE9CSlMpIC1vIF9mb28uc28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RlIGV4dHJhIHVuZGVyc2NvcmUKCiAgICAgICAgICAgIFRoaXMgbmFtaW5nIHNjaGVtZSBpcyBjb25zaXN0ZW50IHdpdGggb3RoZXIgUHl0aG9uIG1vZHVsZXMgdGhhdAogICAgICAgICAgICB1dGlsaXplIGV4dGVuc2lvbiBjb2RlLiAgRm9yIGluc3RhbmNlLCB0aGUgc29ja2V0IG1vZHVsZSBjb25zaXN0cwogICAgICAgICAgICBvZiAiX3NvY2tldC5zbyIgYW5kICJzb2NrZXQucHkiLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywKICAgICAgICAgICAgdGhlIHNoYXJlZCBvYmplY3QgZmlsZSB3YXMgbmFtZWQgImZvb2Ntb2R1bGUuc28iLgoKICAgICAgICAgICAgKDMpIEEgbmV3IGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBpbnNlcnQgUHl0aG9uIGNvZGUgaW50bwogICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyAucHkgZmlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVweXRob25jb2RlICV7CiAgICAgICAgICAgICAgICBkZWYgZm9vKCk6CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkhlbGxvIFdvcmxkIgogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtb2R1bGVzIGFzIGEgbWl4IG9mIEMgYW5kIFB5dGhvbi4KICAgICAgICAgICAgIFB5dGhvbiBjb2RlIGlzIHNlYW1sZXNzbHkgYWRkZWQgdG8gdGhlIG1vZHVsZS4KCiAgICAgICAgICAgICg0KSBUaGUgLXNoYWRvdyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICBUaGlzIGlzIHR1cm5lZCBvbgogICAgICAgICAgICBieSBkZWZhdWx0LgoKICAgICAgICAgICAgKDUpIFRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGV4dHJhIHB5dGhvbiBmaWxlLCB1c2UgdGhlICItbm9wcm94eSIKICAgICAgICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGxpa2VseSBicmVhayB0aGUgYnVpbGQgZW52aXJvbm1lbnQgb2YgcHJvamVjdHMgdGhhdAogICAgICAgICAgICB1dGlsaXplIHNoYWRvdyBjbGFzc2VzLiAgIFRvIGZpeCB0aGlzLCB5b3UgcHJvYmFibHkgb25seSBuZWVkIHRvCiAgICAgICAgICAgIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IC5zbyBmaWxlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIE1ha2VmaWxlIGluZm9ybWF0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBleGFtcGxlY21vZHVsZS5zbwoKICAgICAgICAgICAgSnVzdCBjaGFuZ2UgaXQgdG86CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gX2V4YW1wbGUuc28KCiAgICAgICAgICAgICoqKiBET0NVTUVOVEFUSU9OIFVQREFURSAqKioKICAgICAgICAgICAgVGhlIGZpbGUgRG9jL01hbnVhbC9QeXRob24uaHRtbCBoYXMgYmVlbiB1cGRhdGVkIHRvIGRlc2NyaWJlIHRoZXNlIGNoYW5nZXMuCgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtbm9leHRlcm4gb3B0aW9uLiAgIElmIHN1cHBsaWVkLCBTV0lHIHdpbGwgbm90IGdlbmVyYXRlCiAgICAgICAgICAgIGV4dHJhIGV4dGVybiBkZWNsYXJhdGlvbnMuICBUaGlzIGlzIHNvbWV0aW1lcyBhbiBpc3N1ZSBvbiAKICAgICAgICAgICAgbm9uLXVuaXggcGxhdGZvcm1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIHdhcm5pbmcgZm9yIGlnbm9yZWQgZnJpZW5kIGZ1bmN0aW9ucy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzQ0OTggXSAtcHJveHkgYW5kICVpbmNsdWRlICJwb2ludGVyLmkiIGNsYXNoLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYXZpZCBDcmVhc3kuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc2MTAzIF0gZ2xvYmFsIGRlc3RydWN0aW9uIHdhcm5pbmcgd2l0aCBzaGFkb3cuCiAgICAgICAgICAgIFBlcmwgZXh0ZW5zaW9ucyBzaG91bGQgbm8gbG9uZ2VyIHJlcG9ydCB0aGUgd2FybmluZwoKICAgICAgICAgICAgICAgIlVzZSBvZiB1bmluaXRpYWxpemVkIHZhbHVlIGR1cmluZyBnbG9iYWwgZGVzdHJ1Y3Rpb24uIgogCiAgICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoICJwZXJsIC13Ii4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJyZXR0IFdpbGxpYW1zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbiBDKysgbW9kZSwgU1dJRyBub3cgYWx3YXlzIGRlZmluZXMgbmFtZXNwYWNlIHN0ZC4gIEJ5IGRlZmF1bHQsCiAgICAgICAgICAgIGl0J3MgZW1wdHkuICBIb3dldmVyLCB0aGlzIHdpbGwgc2lsZW5jZSBlcnJvcnMgZnJvbSBwcm9ncmFtcwogICAgICAgICAgICB0aGF0IGluY2x1ZGUgc3RhdGVtZW50cyBzdWNoIGFzICJ1c2luZyBuYW1lc3BhY2Ugc3RkOyIuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgQnVnIFsgNTg0MDE3IF0gdXNpbmcgbmFtZXNwYWNlIHN0ZCBnZW5lcmF0ZXMgZXJyb3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgoKMDcvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhIG5ldyB3YXJuaW5nIG1lc3NhZ2UgZm9yICVhcHBseS4gIElmIHlvdSB1c2UgJWFwcGx5IGJ1dCBubyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgZGVmaW5lZCwgeW91IHdpbGwgZ2V0IGEgd2FybmluZyBtZXNzYWdlLiAgVGhpcyBzaG91bGQgaGVscCB3aXRoCiAgICAgICAgICAgIHByb2JsZW1zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqT1VUUFVUIHsgLi4uIH07CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMgb2YgU1dJRywgdGhpcyBzaWxlbnRseSBkaWQgbm90aGluZy4gIE5vdyB5b3UgZ2V0IGFuIGVycm9yIGxpa2UgdGhpczoKICAKICAgICAgICAgICAgICAgICAgIGZpbGU6bGluZS4gV2FybmluZy4gQ2FuJ3QgYXBwbHkgKGNoYXIgKk9VVFBVVCkuIE5vIHR5cGVtYXBzIGFyZSBkZWZpbmVkLgoKMDcvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdGFydGVkIEphdmEgcHJhZ21hIGRlcHJlY2F0aW9uLiBSZXBsYWNlbWVudHMgdXNlICV0eXBlbWFwIGJhc2VkIAogICAgICAgICAgICBkaXJlY3RpdmVzIGFuZCBlbmFibGUgcHJveHkgY2xhc3NlcyBhbmQgdGhlIG5ldyB0eXBlIHdyYXBwZXIgY2xhc3NlcyB0byBiZSAKICAgICAgICAgICAgdGFpbG9yZWQgaW4gdmFyaW91cyB3YXlzLiBUaGVzZSBhcmUgdGhlIG5ldyB0eXBlbWFwczoKICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFiYXNlKSAgICAgICAgICAgLSBiYXNlIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIC0gY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgSmF2YSBjbGFzczogZGVmYXVsdCBpcyAicHVibGljIgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgICAgICAgICAgIC0gamF2YSBjb2RlIGlzIGNvcGllZCB2ZXJiYXRpbSB0byB0aGUgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgICAgICAgIC0gaW1wb3J0IHN0YXRlbWVudHMgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWludGVyZmFjZXMpICAgICAtIGludGVyZmFjZXMgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgIAogICAgICAgICAgICBBbmQgdGhlc2UgYXJlIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZXMgYmVpbmcgZGVwcmVjYXRlZDoKICAgICAgICAgICAgYWxsc2hhZG93YmFzZQogICAgICAgICAgICBhbGxzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBhbGxzaGFkb3djb2RlCiAgICAgICAgICAgIGFsbHNoYWRvd2ltcG9ydAogICAgICAgICAgICBhbGxzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgc2hhZG93YmFzZQogICAgICAgICAgICBzaGFkb3djbGFzc21vZGlmaWVycwogICAgICAgICAgICBzaGFkb3djb2RlCiAgICAgICAgICAgIHNoYWRvd2ltcG9ydAogICAgICAgICAgICBzaGFkb3dpbnRlcmZhY2UKICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0YXJnZXQgYSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgRm9vICJpbXBvcnQgamF2YS51dGlsLioiOwogICAgICAgICAgICBvciBhIHBhcnRpY3VsYXIgdHlwZSB3cmFwcGVyIGNsYXNzOgogICAgICAgICAgICAldHlwZW1hcChqYXZhaW1wb3J0cykgZG91YmxlKiAiaW1wb3J0IGphdmEubWF0aC4qIjsKICAgICAgICAgICAgTm90ZSB0aGF0ICRqYXZhY2xhc3NuYW1lIGluIHRoZXNlIHR5cGVtYXBzIGFyZSBzdWJzdGl0dXRlZCB3aXRoIGVpdGhlciB0aGUgcHJveHkgCiAgICAgICAgICAgIGNsYXNzbmFtZSB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMgb3IgdGhlIFNXSUdUWVBFIGNsYXNzIG5hbWUuCgowNy8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgbW9kdWxlIG92ZXJoYXVsIHRvIGltcGxlbWVudCBzdGF0aWMgdHlwZSBjaGVja2luZyBvZiBhbGwgCiAgICAgICAgICAgIHR5cGVzLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIDEpIENoYW5nZXMgd2hlbiB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgUHJldmlvdXNseSB3aGVuIHdyYXBwaW5nIGdsb2JhbCBmdW5jdGlvbnM6IAoKICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNze307CiAgICAgICAgICAgIHZvaWQgZm9vKFNvbWVDbGFzcyogcyk7CiAgICAgICAgICAgIFNvbWVDbGFzcyogYmFyKCk7CgogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZCBwcm90b3R5cGVzIHVzZWQgYSBsb25nIGZvciBwb2ludGVycyBhbmQgbG9va2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIHZvaWQgZm9vKGxvbmcgamFyZzEpOwogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgbG9uZyBiYXIoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYW5kIHVubGlrZSBtZW1iZXIgZnVuY3Rpb25zIG9mIGEgQysrIGNsYXNzIHRoZXJlIHdhcyBubyB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGNhbGxzIAogICAgICAgICAgICB0byBtYWtlIHRoZSB1c2Ugb2YgdGhlbSBtb3JlIHVzZXIgZnJpZW5kbHkuIFRoZXkgd291bGQgYmUgdXNlZCBmcm9tIEphdmEgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBuZXcgU29tZUNsYXNzKG1vZHVsZW5hbWUuYmFyKCksIGZhbHNlKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocy5nZXRDUHRyU29tZUNsYXNzKCkpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCwgYnV0IHRoZW4gaXQgd291bGQgbm90IGhhdmUgCiAgICAgICAgICAgIGJlZW4gcG9zc2libGUgdG8gY2FsbCBhbnkgcHJveHkgbWVtYmVyIGZ1bmN0aW9ucyBpbiBTb21lQ2xhc3M6CgogICAgICAgICAgICBsb25nIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdyB3cmFwcGVyIGZ1bmN0aW9ucyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb28oU29tZUNsYXNzIHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTb21lQ2xhc3MgYmFyKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hpY2ggbWVhbnMgdGhlc2UgZnVuY3Rpb25zIGNhbiBub3cgYmUgdXNlZCBtb3JlIG5hdHVyYWxseSB3aXRoIHByb3h5IGNsYXNzZXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgMikgQ2hhbmdlcyB3aGVuIG5vdCB1c2luZyBKYXZhIFByb3h5IGNsYXNzZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZSBzbyBjYWxsZWQgbG93LWxldmVsIGludGVyZmFjZSB3YXMgcmF0aGVyIGxvdy1sZXZlbCBpbmRlZWQuIFRoZSAKICAgICAgICAgICAgbmV3IHN0YXRpYyB0eXBlIGNoZWNraW5nIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGxlc3Mgc28gYnV0IGl0IHJlbWFpbnMgYQogICAgICAgICAgICBmdW5jdGlvbmFsIGludGVyZmFjZSB0byB0aGUgQy9DKysgd29ybGQuIFByb3h5IGNsYXNzZXMgYXJlIHRoZSBvYnZpb3VzIHdheSB0byB1c2UKICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgY29kZSwgYnV0IGZvciB0aG9zZSB3aG8gd2FudCBhIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIGFsbCBub24tcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIG5vdyBoYXZlIGEgc2ltcGxlIEphdmEgY2xhc3Mgd3JhcHBlciBhcm91bmQgdGhlIEMvQysrIHR5cGUuIFBvaW50ZXJzIGFuZAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBhcmUgYWxzbyB3cmFwcGVkIGJ5IHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgdHlwZQogICAgICAgICAgICB3cmFwcGVyIGNsYXNzbmFtZXMgYXJlIGJhc2VkIG9uIHRoZSBTV0lHIGRlc2NyaXB0b3JzIHVzZWQgYnkgdGhlIG90aGVyIGxhbmd1YWdlIAogICAgICAgICAgICBtb2R1bGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIEMvQysrIHR5cGUgICAgICBKYXZhIHR5cGUgd3JhcHBlciBjbGFzcyBuYW1lCiAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIGludCogICAgICAgICAgICBTV0lHVFlQRV9wX2ludAogICAgICAgICAgICBkb3VibGUqKiAgICAgICAgU1dJR1RZUEVfcF9wX2RvdWJsZQogICAgICAgICAgICBTb21lQ2xhc3MqICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzJiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwoKICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZXJ5dGhpbmcgd3JhcHBlZCBieSBTV0lHIGlzIGFjY2Vzc2VkIHZpYSBhIHBvaW50ZXIgZXZlbiB3aGVuIHdyYXBwaW5nIAogICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBwYXNzIGJ5IHZhbHVlIG9yIHJlZmVyZW5jZS4gU28gdGhlIHByZXZpb3VzIGV4YW1wbGUgd291bGQgbm93IGJlIAogICAgICAgICAgICB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzIHMgPSBleGFtcGxlLmJhcigpOwogICAgICAgICAgICBleGFtcGxlLmZvbyhzKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0eXBlZGVmcyB0aGF0IFNXSUcga25vd3MgYWJvdXQgYXJlIHJlc29sdmVkLCBzbyB0aGF0IGlmIG9uZSBoYXMgCgogICAgICAgICAgICBjbGFzcyBGb297fTsKICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgdGhlbiBhbnkgdXNlIG9mIEJhciB3aWxsIHJlcXVpcmUgb25lIHRvIHVzZSBTV0lHVFlQRV9wX0ZvbzsKCiAgICAgICAgICAgIFNvbWUgY29uc2lkZXJhdGlvbnM6CiAgICAgICAgICAgIE1ha2Ugc3VyZSB5b3UgbWFrZSBhIGZpcm0gZGVjaXNpb24gdG8gdXNlIGVpdGhlciBwcm94eSBjbGFzc2VzIG9yIHRoZSBmdW5jdGlvbmFsIAogICAgICAgICAgICBpbnRlcmZhY2UgZWFybHkgb24gYXMgdGhlIGNsYXNzbmFtZXMgYXJlIGRpZmZlcmVudC4KCiAgICAgICAgICAgIDMpIFBvaW50ZXJzIGFuZCBub24tcGFyc2VkIHR5cGVzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIFNvbWV0aW1lcyBTV0lHIGNhbm5vdCBnZW5lcmF0ZSBhIHByb3h5IGNsYXNzLiBUaGlzIG9jY3VycyB3aGVuIHRoZSBkZWZpbml0aW9uIG9mIAogICAgICAgICAgICBhIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHLCBidXQgaXMgdGhlbiB1c2VkIGFzIGEgdmFyaWFibGUgb3IgYSBwYXJhbWV0ZXIuIAogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgIHZvaWQgZm9vKFNuYXp6eSBzZHMpOwoKICAgICAgICAgICAgSWYgU1dJRyBoYXMgbm90IHBhcnNlZCBTbmF6enkgaXQgaGFuZGxlcyBpdCBzaW1wbHkgYXMgYSBwb2ludGVyIHRvIGEgU25henp5LgogICAgICAgICAgICBUaGUgSmF2YSBtb2R1bGUgZ2l2ZXMgaXQgYSB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIHRoZSBwb2ludGVyIGFuZCBjYWxscyBpdCAKICAgICAgICAgICAgU1dJR1RZUEVfcF9TbmF6enkuIEluIG90aGVyIHdvcmRzIGl0IGhhbmRsZXMgaXQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVzIGFyZSAKICAgICAgICAgICAgaGFuZGxlZCBpbiB0aGUgbG93LWxldmVsIGZ1bmN0aW9uYWwgaW50ZXJmYWNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZm9yIGFsbCAKICAgICAgICAgICAgbm9uLXByb3h5IGNsYXNzZXMsIGVnIGFsbCBwb2ludGVyIHRvIHBvaW50ZXJzIGFuZCBwb2ludGVycyB0byBwcmltaXRpdmUgdHlwZXMuCgogICAgICAgICAgICA0KSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaWYgeW91IGhhdmUgYmVlbiB1c2luZyBwcm94eSBjbGFzc2VzIGFuZCAKICAgICAgICAgICAgbm8gZ2xvYmFsIHZhcmlhYmxlcy9mdW5jdGlvbnMuIE90aGVyd2lzZSBzb21lIGNoYW5nZXMgd2lsbCBoYXZlIHRvIGJlIG1hZGUuIAogICAgICAgICAgICBUaGUgbmF0aXZlIG1ldGhvZHMgc3RpbGwgZXhpc3QgYnV0IHRoZXkgYXJlIG5vdyBpbiBhIEpOSSBjbGFzcywgd2hpY2ggaXMgY2FsbGVkIAogICAgICAgICAgICBtb2R1bGVuYW1lSk5JLiBBcyB0aGlzIGNsYXNzIGlzIHJlYWxseSBwYXJ0IG9mIHRoZSBpbnRlcm5hbCB3b3JraW5ncywKICAgICAgICAgICAgaXQgc2hvdWxkIG5vdCBiZSByZXF1aXJlZCBzbyB0aGUgY2xhc3MgaGFzIGJlY29tZSBwcm90ZWN0ZWQuIFNvbWUgcHJhZ21hcy9kaXJlY3RpdmVzCiAgICAgICAgICAgIHdpbGwgaG9wZWZ1bGx5IGJlIGFkZGVkIHRvIGhlbHAgd2l0aCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgd3JhcHBpbmcgb2YgdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzIHJldHVybmVkIGJ5CiAgICAgICAgICAgIHZhbHVlLiAgSnVzdCB0byBiZSBzYWZlLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSBTd2lnVmFsdWVXcmFwcGVyPD4KICAgICAgICAgICAganVzdCBpbiBjYXNlIHRoZXkgZG9uJ3QgZGVmaW5lIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIFRoaXMKICAgICAgICAgICAgd291bGQgYmUgdXNlZCBpZiB5b3UgaGFkIGNvZGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgIEZvbzxpbnQ+IGJsYWgoKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICBtb3JlYmxhaChGb288aW50PiB4KTsKCiAgICAgICAgICAgIGJ1dCB5b3UgZGlkbid0IGluc3RhbnRpYXRlIEZvbzxpbnQ+IHVzaW5nICV0ZW1wbGF0ZS4gIAogICAgICAgICAgICBXZSBzaG91bGQgcHJvYmFibHkgYWRkIGEgd2FybmluZyBmb3IgdGhpcy4KCjA3LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYW4gZXJyb3IgY2hlY2sgdG8gZGV0ZWN0IHNoYWRvd2VkIHRlbXBsYXRlIHBhcmFtYXRlcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICBpbnQgVDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhbiBlcnJvciwgbm90IGEgd2FybmluZy4gIFRoaXMgd2FybmluZyBpcwogICAgICAgICAgICBhbHNvIG5lZWRlZCB0byBmaXggc29tZSByYXRoZXIgaW5zaWRpb3VzIHByb2JsZW1zIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IFQgewogICAgICAgICAgICAgICAgICAgICAgaW50ICBibGFoOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBUIFRyYWl0czsgICAgLy8gV2hpY2ggVCBpcyB0aGlzPz8/PwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVCBzaGFkb3dzIHRoZSBvdXRlcgogICAgICAgICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGlzIHdoYXQgeW91IHdhbnQpLgoKMDcvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50cy4gIFNXSUcgaXMKICAgICAgICAgICAgbXVjaCBtb3JlIGF3YXJlIG9mIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGlzOgoKICAgICAgICAgICAgICAgIGNvbnN0IGludCBTaXplID0gMTAwOwoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28xMDApIEZvbzwxMDA+OwogICAgICAgICAgICAgICAgdm9pZCBiYXIoRm9vPFNpemU+ICp4KTsgICAvLyBLbm93cyB0aGF0IEZvbzxTaXplPiBpcyB0aGUgc2FtZSBhcyBGb288MTAwPjsKCjA3LzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWZlYXR1cmUvJWlnbm9yZS8lcmVuYW1lIGFuZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6QmFyCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDcvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGNvbnN0cnVjdG9ycyB0aGF0IHRyeSB0byBjYXRjaAogICAgICAgICAgICBleGNlcHRpb25zIGluIGluaXRpYWxpemVycy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBCYXIgYjsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgRm9vKGludCB4KSB0cnkgCiAgICAgICAgICAgICAgICAgICAgIDogYih4KSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgY2F0Y2goaW50KSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZCB3cmFwcGVycy4gIEhvd2V2ZXIsIHRoZSB0cnkgYW5kIGNhdGNoCiAgICAgICAgICAgIHBhcnRzIG9mIHRoZSBkZWNsYXJhdGlvbiBhcmUgaWdub3JlZC4gIFNlZSBTdHJvdXN0cnVwLCAzcmQgRWQsIHNlY3Rpb24gCiAgICAgICAgICAgIDE0LjQuNi4xIGZvciBkZXRhaWxzLgogICAgICAgICAgICAgICAgICAgCjA3LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHRlbXBsYXRlIHN5bWJvbCB0YWJsZSBtYW5hZ2VtZW50LiAgVGhpcyBmaXhlcwogICAgICAgICAgICB0d28gYnVncy4gIEZpcnN0LCBtaXhpbmcgYWJzdHJhY3QgbWV0aG9kcywgdGVtcGxhdGVzLCBhbmQgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uLgogCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQTxUPgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShBX2ludCkgQTxpbnQ+OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQl9pbnQpIEI8aW50PjsKCiAgICAgICAgICAgIFRoaXMgZml4IGFsc28gZml4ZXMgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBDPgogICAgICAgICAgICAgICBzdHJ1Y3QgQiB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCBzaXplX3R5cGU7CiAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdHlwZT4oLTEpOwogICAgICAgICAgICAgICAgICAgdm9pZCBmb28oc2l6ZV90eXBlIGluZGV4ID0gbmluZGV4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEJ1Z3MgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCgowNy8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQ2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgU1dJR19Db252ZXJ0UHRyKCkgZnVuY3Rpb24KCSAgICBmb3IgdGhlIFNXSUcvUnVieSBydW50aW1lIHN1cHBvcnQgc28gdGhhdCBpdCBsb29rcyBsaWtlIHRoZQoJICAgIFB5dGhvbiB2ZXJzaW9uLiBJZiB0aGUgbGFzdCBhcmd1bWVudCAoZmxhZ3MpIGlzIG5vbi16ZXJvLAoJICAgIFNXSUdfQ29udmVydFB0cigpIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB0eXBlIG1pc21hdGNoZXMKCSAgICBhcyBiZWZvcmUuIElmIGZsYWdzIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gLTEgZm9yCgkgICAgdHlwZSBtaXNtYXRjaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24uIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFJVQlkgTU9EVUxFICoqKgoKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBPdmVybG9hZGVkIGZ1bmN0aW9ucy9tZXRob2RzL2NvbnN0cnVjdG9ycyBub3cgd29yayBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMuICBUaGUgc3VwcG9ydCBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50LS1qdXN0IGNhbGwgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGx5IGFuZCBTV0lHIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIHZhcmlldHkgb2YgaXNzdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzLiAgUGxlYXNlIHJlZmVyCiAgICAgICAgICAgIHRvIHRoZSBvdmVybG9hZGluZyBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDcvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIG5hbWVzcGFjZXMsIGVudW1zLCBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBuYW1lc3BhY2UgaGVsbG8gewogICAgICAgICAgICAgICAgICBlbnVtIEhlbGxvIHsgSGksIEhvbGEgfTsKIAogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8SGVsbG8gSD4KICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSB2YWx1ZV90eXBlOwogICAgICAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIHRyYWl0czxIaT46OnZhbHVlX3R5cGUgc2F5X2hpKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWl0czxIaT46OnZhbHVlX3R5cGUoMSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNXSUcgd2Fzbid0IGdlbmVyYXRpbmcgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBxdWFsaWZpZWQgCiAgICAgICAgICAgIHRyYWl0czxIaT4uICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLiAgICAgICAgIAoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBhcnJheSB2YXJpYWJsZSB0eXBlbWFwcyBmb3IgVGNsIG1vZHVsZS4gICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgIHZhcmlhYmxlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBpbnQgZm9vWzEwXTsKCiAgICAgICAgICAgIHRoZW4gYSBzZXQgZnVuY3Rpb24gbGlrZSB0aGlzIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvb19zZXQoaW50ICp4KSB7CiAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGZvbyx4LDEwKnNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIH0KCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICVmcmFnbWVudCBkaXJlY3RpdmUuICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBpdCBjYW4gYmUgZWFzeSB0bwogICAgICAgICAgICBnZXQgY2FycmllZCBhd2F5IGFuZCB3cml0ZSBhIGxvdCBvZiBjb2RlLiAgSG93ZXZlciwgZG9pbmcgc28gY2F1c2VzCiAgICAgICAgICAgIHRyZW1lbmRvdXMgY29kZSBibG9hdC4gICBBIGNvbW1vbiB3YXkgdG8gc29sdmUgdGhpcyBpcyB0byB3cml0ZSAKICAgICAgICAgICAgaGVscGVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdGhlIHdyYXBwZXIgZmlsZSBnZXRzIHBvbGx1dGVkCiAgICAgICAgICAgIHdpdGggaGVscGVyIGZ1bmN0aW9ucyBldmVuIGlmIHRoZXkgYXJlbid0IHVzZWQuICAgIFRvIGZpeCB0aGlzLAogICAgICAgICAgICBhIG5ldyBmcmFnbWVudCBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAoY29ycmVjdGVkIHR5cG8gaW4gbGluZSBiZWxvdyAtIDA2LzI2LzIwMDgpCiAgICAgICAgICAgICAgICVmcmFnbWVudCgidHlwZV9oZWFkZXIiLCJoZWFkZXIiKSAlewogICAgICAgICAgICAgICAgICB2b2lkIHNvbWVfaGVscGVyX2Z1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluLCBmcmFnbWVudD0idHlwZV9oZWFkZXIiKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGNvZGUgZnJhZ21lbnQgaXMgb25seSBlbWl0dGVkIGlmIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFjdHVhbGx5IHVzZWQuICAgQSBzaW1pbGFyIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgZm9yIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIGFubm90YXRpb24gYW5kIHRoZSAlZmVhdHVyZSBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJmcmFnbWVudCIsInR5cGVfaGVhZGVyIikgIFNvbWVEZWNsYXJhdGlvbjsKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byAlZnJhZ21lbnQgaXMgdGhlIGZyYWdtZW50IG5hbWUuICBUaGUgc2Vjb25kIGFyZ3VtZW50CiAgICAgICAgICAgIGlzIHRoZSBmaWxlIHNlY3Rpb24gd2hlcmUgdGhlIGZyYWdtZW50IHNob3VsZCBiZSBlbWl0dGVkLiAgCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBkaXJlY3RpdmUgaXMgZm9yIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgICBhbmQgYWR2YW5jZWQgdXNlcnMgd2FudGluZyB0byBzdHJlYW1saW5lIHR5cGVtYXAgY29kZS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIG1lbWJlcmluIHR5cGVtYXBzIGZvciBhbGwgYXJyYXlzIGluIGFuIGF0dGVtcHQgdG8gZWxpbWluYXRlCiAgICAgICAgICAgIGNvbmZ1c2lvbiBhYm91dCB0aGVpciB1c2UuCgowNi8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBzbWFydC1wb2ludGVycy4gIFdoZW4gYSBjbGFzcyBkZWZpbmVzCiAgICAgICAgICAgIG9wZXJhdG9yLT4oKSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBCYXIgKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIGxvY2F0ZXMgY2xhc3MgQmFyIGFuZCB0cmllcyB0byB3cmFwIGl0cyBtZW1iZXIgdmFyaWFibGVzIGFuZAogICAgICAgICAgICBtZXRob2RzIGFzIHBhcnQgb2YgRm9vLiAgRm9yIGV4YW1wbGUsIGlmIEJhciB3YXMgZGVmaW5lZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFlvdSBjb3VsZCBkbyB0aGlzIChpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlKToKCiAgICAgICAgICAgICAgZiA9IEZvbygpCiAgICAgICAgICAgICAgZi54ID0gNCAgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjp4CiAgICAgICAgICAgICAgZi5zcGFtKCkgICAgICAgICAgICMgQWNjZXNzZXMgQmFyOjpzcGFtCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIEMrKwogICAgICAgICAgICBzbWFydC1wb2ludGVycy0tLXdoaWNoIGFsbG93IGF0dHJpYnV0ZXMgdG8gYWNjZXNzZWQgdHJhbnNwYXJlbnRseQogICAgICAgICAgICB0aHJvdWdoIG9wZXJhdG9yLT4uCgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGF1dG9tYXRpY2FsbHkgaW4gU1dJRy0tLW5vIHNwZWNpYWwgZGlyZWN0aXZlcwogICAgICAgICAgICBhcmUgbmVlZGVkLiAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4gIFVzZSAlaWdub3JlIHRvIGlnbm9yZSAKICAgICAgICAgICAgb3BlcmF0b3ItPi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDYvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSAlZXhjZXB0IGRpcmVjdGl2ZS4gICAlZXhjZXB0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCgowNi8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNsZWFudXAgb2YgdGhlIG1vZHVsZXMgZGlyZWN0b3J5LiAgRWxpbWluYXRlZCBtb3N0CiAgICAgICAgICAgIGhlYWRlciBmaWxlcywgY29uc29saWRhdGVkIG1vZHVsZSBjb2RlIGludG8gc2luZ2xlIGZpbGVzLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXdvcmtlZCB0aGUgaW5zdGFudGlhdGlvbiBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgQWxsIGxhbmd1YWdlCiAgICAgICAgICAgIG1vZHVsZXMgbXVzdCBub3cgZGVmaW5lIGEgZmFjdG9yeSBmdW5jdGlvbiBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqCiAgICAgICAgICAgICAgICBzd2lnX3B5dGhvbih2b2lkKSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBZVEhPTigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB0aGVuIHBsYWNlZCBpbiBhIHRhYmxlIGFuZCBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICAgYSBjb21tYW5kIGxpbmUgb3B0aW9uIGluIHN3aWdtYWluLmN4eC4gIAoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBoYXMgYSBudW1iZXIgb2YgYmVuZWZpdHMuICBJdCBkZWNvdXBsZXMgdGhlIAogICAgICAgICAgICBTV0lHIG1haW4gcHJvZ3JhbSBmcm9tIGhhdmluZyB0byBrbm93IGFib3V0IHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9ucyBmb3IgZWFjaCBtb2R1bGUuICBBbHNvLCBieSB1c2luZyBhIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24sIGl0IHdpbGwgYmUgZWFzaWVyIHRvIGltcGxlbWVudCBkeW5hbWljIGxvYWRpbmcKICAgICAgICAgICAgb2YgbW9kdWxlcyAoc2ltcGx5IGxvYWQgdGhlIGZpbGUgYW5kIGludm9rZSB0aGUgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbikuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3IgcmVmZXJlbmNlIGNvbnZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28gJigpOwoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIG9wZXJhdG9yIG5ld1tdIGFuZCBvcGVyYXRvciBkZWxldGVbXS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHByb2JsZW0gZm9yIGNvbnN0YW50cyBhbmQgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgaW52b2x2aW5nIHRlbXBsYXRlcy4KCjA2LzE5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBhIGJ1ZyBmb3IgdGhlICctZmVhdHVyZScgY29tbWFuZCBsaW5lIGFyZ3VtZW50OwogICAgICAgICAgICB0aGF0IHNldHRpbmcgd2FzIGVmZmVjdGl2ZWx5IGJlaW5nIGlnbm9yZWQgYW5kIHNvIHRoZSBmZWF0dXJlCiAgICAgICAgICAgIG5hbWUgd2FzIGFsd2F5cyBzZXQgZXF1YWwgdG8gdGhlIG1vZHVsZSBuYW1lLgoKMDYvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtcyB3aXRoIHN0YXRpYyBtZW1iZXJzIGFuZCBlbnVtcyBpbiB0ZW1wbGF0ZXMuCgpWZXJzaW9uIDEuMy4xMyAoSnVuZSAxNywgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggX19GSUxFX18gZXhwYW5zaW9uIGluIHRoZSBwcmVwcm9jZXNzb3IuICAgT24gV2luZG93cywKICAgICAgICAgICAgdGhlIGJhY2tzbGFzaCAoXCkgaXMgbm93IGNvbnZlcnRlZCB0byAoXFwpIGluIHRoZSBzdHJpbmcgbGl0ZXJhbAogICAgICAgICAgICB1c2VkIGZvciBfX0ZJTEVfXy4gIFJlcG9ydGVkIGJ5IFN0ZXZlIEdsYXNlci4KCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICduYW1lIHByaXZhdGUgaW4gdGhpcyBjb250ZXh0Jy4gIFRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGZvciBwdWJsaWMgbWV0aG9kcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNjb3R0IE1pY2hlbC4KIAowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIAogICAgICAgICAgICBhbmQgbmFtZXNwYWNlcy4gICBXaGVuIFNXSUcgZXhwYW5kcyBhIHRlbXBsYXRlLCBpdCBkb2VzCiAgICAgICAgICAgIHNvIHdpdGggZnVsbHkgcmVzb2x2ZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28geyB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgRG91YmxlOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvb19kKSBmb288RG91YmxlPjsKCiAgICAgICAgICAgIHRoZW4sIGl0IGlzIGhhbmRsZWQgYXMgZm9vPGRvdWJsZT4gaW4gdGhlIHR5cGVzeXN0ZW0uCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4KCjA2LzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBtaXNzaW5nIGJvb2wgdHlwZW1hcHMgZm9yIElOUFVULCBPVVRQVVQgYW5kCgkgICAgSU5PVVQgaW4gTGliL3J1YnkvdHlwZW1hcHMuaS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBhIGNvdXBsZSBvZiBicm9rZW4gcHJhZ21hcy4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHVubmVjZXNzYXJ5IGNhc3Qgd2hlbiB3cmFwcGluZyBnbG9iYWwgdmFyaWFibGUgd2hlcmUgCiAgICAgICAgICAgIHRoZSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRyAtIEphdmEgdmFyaWFibGVzIGV4YW1wbGUgCiAgICAgICAgICAgIGZhaWx1cmUgYXMgcmVwb3J0ZWQgYnkgTGFycnkgVmlyZGVuLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCAldGVtcGxhdGUgdG8gYWxsb3cgZm9yIGVtcHR5IGluc3RhbnRpYXRpb25zLgoKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgZm9vPGludCxpbnQ+OwoKICAgICAgICAgICAgVGhpcyByZWdpc3RlcnMgZm9vPGludCxpbnQ+IHdpdGggdGhlIHR5cGUgc3lzdGVtLCBidXQKICAgICAgICAgICAgZG9lc24ndCB3cmFwIGl0IChzYW1lIGFzICVpZ25vcmUpLiAgIFRoaXMgbWF5IG9ubHkgYmUgYQogICAgICAgICAgICB0ZW1wb3JhcnkgbWVhc3VyZS4gICBTV0lHIG1pZ2h0IGJlIGFibGUgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgaW4gY2VydGFpbiBjYXNlcy4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgZnVuY3Rpb24gcHJvdG90eXBlIHByb2JsZW1zIHdpdGggVGNsIDguNAoKMDYvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGVtcGxhdGVzIGFuZCBsb2NhdGlvbiBvZiBiYXNlIGNsYXNzZXMuICAKICAgICAgICAgICAgVGhpcyBvbmUgaXMgYSBsaXR0bGUgbWluZC1iZW5kaW5nLCBidXQgaGVyZSBpcyBhbiBleGFtcGxlCiAgICAgICAgICAgIHRoYXQgaWxsdXN0cmF0ZXM6CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICB0eXBlZGVmIEFyZ1R5cGUgYXJnX3R5cGU7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgUmVzVHlwZSByZXNfdHlwZTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBcmdUeXBlLCBjbGFzcyBSZXNUeXBlPgogICAgICAgICAgICAgc3RydWN0IEZ1bmN0aW9uCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQUYsIGNsYXNzIEFHPgogICAgICAgICAgICAgc3RydWN0IENsYXNzIDogRnVuY3Rpb248dHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OmFyZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgdHJhaXRzPEFGLCBBRz46OnJlc190eXBlPgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAldGVtcGxhdGUodHJhaXRzX2RkKSB0cmFpdHMgPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShGdW5jdGlvbl9kZCkgRnVuY3Rpb24gPGRvdWJsZSwgZG91YmxlPjsKICAgICAgICAgICAgICV0ZW1wbGF0ZShDbGFzc19kZCkgQ2xhc3MgPGRvdWJsZSwgZG91YmxlPjsKCgogICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBiYXNlIGNsYXNzIG9mICdDbGFzcycgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBGdW5jdGlvbiB0ZW1wbGF0ZSwgYnV0IHRoZSB0eXBlcyBhcmUgb2J0YWluZWQgdGhyb3VnaCB0eXBlZGVmcy4KICAgICAgICAgICAgQmVjYXVzZSBvZiB0aGlzLCBTV0lHIGNvdWxkIG5vdCBsb2NhdGUgdGhlIHdyYXBwZWQgYmFzZSBjbGFzcwogICAgICAgICAgICAoRnVuY3Rpb248ZG91YmxlLGRvdWJsZT4pLiAgIFNob3VsZCBiZSBmaXhlZCBpbiAxLjMuMTMgZXZlbgogICAgICAgICAgICB0aG91Z2ggSSBjYW4gdGhpbmsgb2YgYSBtaWxsaW9uIG90aGVyIHRoaW5ncyB0aGF0IG1pZ2h0CiAgICAgICAgICAgIGFsc28gYmUgYnJva2VuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHByb2JsZW0gd2l0aCBjb252ZXJzaW9uIG9wZXJhdG9ycy4gIElmIHlvdSBoYWQgYW4KICAgICAgICAgICAgb3BlcmF0b3IgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CgogICAgICAgICAgICBTV0lHIHdhcyBvbW1pdHRpbmcgdGhlICJjb25zdCIgcXVhbGlmaWVyLiAgVGhpcyBhZmZlY3RlZAogICAgICAgICAgICAlcmVuYW1lIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgUmVwb3J0ZWQgYnkgWmhvbmcgUmVuLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBMZXNzZW5lZCB0aGUgc3RyaWN0bmVzcyBvZiBhYnN0cmFjdCBjbGFzcyBjaGVja2luZy4gIElmCiAgICAgICAgICAgIHlvdSBoYXZlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBtZXRob2QoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBTV0lHIHdpbGwgZ28gYWhlYWQgYW5kIGdlbmVyYXRlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3JzCiAgICAgICAgICAgICBmb3IgQmFyLiAgSG93ZXZlciwgaXQgd2lsbCBhbHNvIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIAogICAgICAgICAgICAgdGhhdCAiQmFyIiBtaWdodCBiZSBhYnN0cmFjdCAoc2luY2UgbWV0aG9kKCkgaXNuJ3QgZGVmaW5lZCkuCiAgICAgICAgICAgICBJbiBTV0lHLTEuMy4xMiwgU1dJRyByZWZ1c2VkIHRvIGdlbmVyYXRlIGEgY29uc3RydWN0b3IgYXQgYWxsLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIElmIHlvdSBzcGVjaWZ5IHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgSXQgaXMgKmV4YWN0bHkqIHRoZSBzYW1lIGFzIHRoaXM6CiAKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBTV0lHLTEuMy4xMiB0cmllZCB0byBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb3V0c2lkZSBvZiB0aGUgbmFtZXNwYWNlCiAgICAgICAgICAgIHVzaW5nIHNvbWUgdHJpY2suICBIb3dldmVyLCB0aGlzIHdhcyBleHRyZW1lbHkgcHJvYmxlbWF0aWMgYW5kIGZ1bGwKICAgICAgICAgICAgaG9sZXMuICAgVGhpcyB2ZXJzaW9uIGlzIHNhZmVyLgoKMDYvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBzY29wZSBxdWFsaWZpY2F0aW9uIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgQTxCOjpDPjo6REQKCiAgICAgICAgICAgIEJlZm9yZSwgdGhpcyB3YXMgc2VwYXJhdGVkIGFzIHNjb3BlcyBBPEIsIEM+LCBhbmQgREQuICBGaXhlZCBub3cuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFsbG93IHRoZSBmb2xsb3dpbmcgc3ludGF4OiAKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIGNsYXNzIEEgeyB9OwogICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgeyAuLi4gfTsKCiAgICAgICAgICAgIEEgYmFzZSBjbGFzcyB3aXRob3V0IGEgc3BlY2lmaWVyIGlzIGFzc3VtZWQgdG8gYmUgcHVibGljIGZvciBhIHN0cnVjdC4KIAowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggZGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJvYmxlbXMgd2l0aCAlcmVuYW1lIGRpcmVjdGl2ZSBhbmQgdGVtcGxhdGUKICAgICAgICAgICAgZXhwYW5zaW9uLgoKICAgICAgICAgICAgQ29kZSBsaWtlIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoKSBmb288ZG91YmxlPjo6bWV0aG9kOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh3aGF0ZXZlcikgZm9vPGRvdWJsZT47CgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlc29sdmVkIHNvbWUgdHJpY2t5IGlzc3VlcyBvZiBtdWx0aS1wYXNzIGNvbXBpbGF0aW9uIGFuZCAKICAgICAgICAgICAgYW5kIGluaGVyaXRhbmNlLiAgVGhlIGZvbGxvd2luZyBzaXR1YXRpb24gbm93IGdlbmVyYXRlcwogICAgICAgICAgICBhbiBlcnJvcjoKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgaW5jb21wbGV0ZSBjbGFzc2VzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyOwogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGFuIHVuZGVmaW5lZCBjbGFzcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OyAgLy8gQmFyIHVuZGVmaW5lZAoKICAgICAgICAgICAgVGhpcyBmaXhlcyBhIGZhaWxlZCBhc3NlcnRpb24gYnVnIHJlcG9ydGVkIGJ5IEphc29uIFN0ZXdhcnQuCgowNi8wNS8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBSdWJ5IG1vZHVsZSBhYm91dCB0aGUgbGFjawogICAgICAgICAgICBvZiBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZS4gT25seSB0aGUgZmlyc3QgYmFzZSBjbGFzcwogICAgICAgICAgICBsaXN0ZWQgaXMgdXNlZCBhbmQgdGhlIG90aGVycyBhcmUgaWdub3JlZC4gKFJlcG9ydGVkIGJ5IENyYWlnCiAgICAgICAgICAgIEZpbGVzKS4KICAgICAgICAgICAgCjA2LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBzdHJ1Y3QgZGVjbGFyYXRpb25zIGFuZCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgRm9vIEZvbzsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQSBmZXcgb3RoZXIgc3VidGxlIHN0cnVjdCByZWxhdGVkIHR5cGluZyBwcm9ibGVtcyB3ZXJlCiAgICAgICAgICAgIGFsc28gcmVzb2x2ZWQuCgpWZXJzaW9uIDEuMy4xMiAoSnVuZSAyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHJlbGF0ZWQgdG8gZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIG5hbWVzcGFjZXMuICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgJ21ha2UgdW5pbnN0YWxsJyB0YXJnZXQuICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgYnVnIHdpdGggJXJlbmFtZSwgJWZlYXR1cmUgYW5kIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHZlY3Rvcjo6X19nZXRpdGVtX18gewogICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIEZpbmUKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBPb3BzLgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdywgdGhlICVleGNlcHRpb24gZGlyZWN0aXZlIChhbmQgb3RoZXIgZmVhdHVyZXMpIHNob3VsZCBjb3JyZWN0bHkgYXBwbHkgdG8KICAgICAgICAgICAgYm90aCB2ZWN0b3IgYW5kIHNwZWNpYWxpemF0aW9ucy4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZXMgdG8gJXRlbXBsYXRlKCkgZGlyZWN0aXZlLiAgIFRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIHJlZHVjZWQgdG8gcHJpbWl0aXZlIHR5cGVzIGluIHRlbXBsYXRlIG1hdGNoaW5nLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAuLi4gcGFydGlhbCBzcGVjaWFsaXphdGlvbiAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKkludFB0cjsgICAgIC8vIEdyb3NzIHR5cGVkZWYKCiAgICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFib3ZlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvckludFB0cikgdmVjdG9yPEludFB0cj47CgogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBleHRyZW1lbHkgc3VidGxlLCBidXQgaXQgZml4ZXMgYSBudW1iZXIgb2YgcG90ZW50aWFsCiAgICAgICAgICAgIGhvbGVzIGluIEx1aWdpJ3MgU1RMIGxpYnJhcnkgbW9kdWxlcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JpKSB2ZWN0b3I8aW50PjsKCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyB0eXBlbWFwIGJ1ZyByZWxhdGVkIHRvIGNvbnN0LiAgY29uc3QKICAgICAgICAgICAgd2FzIGJlaW5nIGRpc2NhcmRlZCB0aHJvdWdoIHR5cGVkZWZzLgoKMDUvMjkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGlucHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyAoaW4gTGliL3J1YnkvcnVieS5zd2cpLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgamF2YSBhcnJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIGVuY2xvc2VkIGJ5IAogICAgICAgICAgICBhIFNXSUdfTk9BUlJBWVMgI2RlZmluZS4gVXNlZnVsIGlmIG5vdCB1c2luZyBhcnJheXMgYW5kIAogICAgICAgICAgICBpdCBpcyBkZXNpcmFibGUgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBjb21waWxlZCBjb2RlLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBFbnVtcyB3ZXJlIG5vdCByZW5hbWVkIHdoZW4gdXNpbmcgJW5hbWUgb3IgJXJlbmFtZQogICAgICAgICAgICBmaXguCgowNS8yOC8yMDAyOiBsam9obnNvbgogICAgICAgICAgICBbUnVieV0gTW9kaWZpZWQgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUKCSAgICAibmV3IiBzaW5nbGV0b24gbWV0aG9kIGFuZCAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvcgoJICAgIGNvbnNpc3RlbmN5IHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMuIFRoZSB3cmFwcGVyIG5hbWUKCSAgICBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAibmV3IiBpcyBhbGxvY19jbGFzc25hbWUgYW5kCgkgICAgdGhlIHdyYXBwZXIgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyAiaW5pdGlhbGl6ZSIKCSAgICBpcyBuZXdfY2xhc3NuYW1lLgoKCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byBydW50aW1lLiAgUG9pbnRlciBjb252ZXJzaW9uL2NyZWF0aW9uIGZ1bmN0aW9ucwogICAgICAgICAgICBub3cgYWxtb3N0IGFsd2F5cyBoYXZlIGFuIGV4dHJhICJmbGFncyIgYXJndW1lbnQuICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19Db252ZXJ0UHRyKG9iaiwgdm9pZCAqKiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgZmxhZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXgogICAgICAgICAgICBUaGlzIGV4dHJhIHBhcmFtZXRlciBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbiBhbmQgd2lsbAogICAgICAgICAgICBiZSB1c2VkIGZvciBtb3JlIGNvbnRyb2wgb3ZlciBwb2ludGVycyBpbiBmdXR1cmUgdmVyc2lvbnMuCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCBmb3IgQysrIGNsYXNzZXMgd2l0aCBwcml2YXRlIGFzc2lnbm1lbnQgb3BlcmF0b3JzLiAgSXQKICAgICAgICAgICAgaXMgbm93IHBvc3NpYmxlIHRvIHNhZmVseSByZXR1cm4gb2JqZWN0cyBsaWtlIHRoaXMgYnkgdmFsdWUuCiAgICAgICAgICAgIENhdmVhdDogIHRoZSBjbGFzcyBtdXN0IHByb3ZpZGUgYSBjb3B5IGNvbnN0cnVjdG9yLgoJICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIC1wcm94eSBvcHRpb24gYWRkZWQgdG8gbWFueSBsYW5ndWFnZSBtb2R1bGVzLiAgVGhpcyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyAtc2hhZG93LiAgV2UgYXJlIG1lcmVseSBjaGFuZ2luZyB0ZXJtaW5vbG9neS4KICAgICAgICAgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIHNvbWUgaW5jb25zaXN0ZW5jaWVzIGluIHRoZSAtcGFja2FnZSBvcHRpb24uCiAgICAgICAgICAgIC1wYWNrYWdlIG1lcmVseSBzZXRzIHRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgdXNlZCBvbiB0aGUKICAgICAgICAgICAgd3JhcHBlcnMuICBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5CiAgICAgICAgICAgIGZpbGUgb3IgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCAucG0gZmlsZS4gIFRoaXMgd2FzCiAgICAgICAgICAgIGJyb2tlbiBhdCBzb21lIHBvaW50LCBidXQgd29ya3MgYWdhaW4gbm93LgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA0NzU0NTIgXSBtZW1vcnkgbGVhayBpbiByZXR1cm4tYnktdmFsdWUuCiAgICAgICAgICAgIFByb2JsZW0gcmVsYXRlZCB0byBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyByZXR1cm5pbmcgbmV3bHkKICAgICAgICAgICAgYWxsb2NhdGVkIG9iamVjdHMuIFJlcG9ydGVkIGJ5IFJveSBMZWNhdGVzLgogCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNTEzMTM0IF0gJUJMRVNTRURNRU1CRVJTIGlzbid0IGFsd2F5cyByaWdodC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxldXIgRGlhbmEgRHJhZ2FuLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDczNSBdIC1pbXBvcnRhbGwgYW5kIHRoZSAtSSBvcHRpb24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtndWlsZV0gRml4ZWQgWyA1MzI3MjMgXSBEZWZhdWx0IGFyZyBmb3IgY2hhciogY2FuIFNlZ1YuICAKICAgICAgICAgICAgRXJyb3IgaW4gZ3VpbGUgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gdHlwZW1hcCBhcHBsaWNhdGlvbiBjb2RlLiAgVGhlICJmcmVlYXJnIgogICAgICAgICAgICB0eXBlbWFwIG11c3QgZXhhY3RseSBtYXRjaCB1cCB3aXRoIHRoZSAiaW4iIG9yICJpZ25vcmUiCiAgICAgICAgICAgIHR5cGVtYXAuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChjaGFyICpkYXRhLCBpbnQgbGVuKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGNoYXIgKmRhdGEgeyAuLi4gfTsgCgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKmRhdGEsIGludCBsZW4pOwoKICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlICJpbiIgdHlwZW1hcCBpcyBhcHBsaWVkLCBidXQgdGhlCiAgICAgICAgICAgICBmcmVlYXJnIHR5cGVtYXAgaXMgbm90LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBmcmVlYXJnCiAgICAgICAgICAgICB0eXBlbWFwIGRvZXNuJ3QgbWF0Y2ggdXAgd2l0aCB0aGUgaW5wdXQgYXJndW1lbnQgc2VxdWVuY2UuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ4MjcyIF0gRGVmYXVsdCBhcmd1bWVudCBjb2RlIG1pc3NpbmcgYnJhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDc3MzAgXSBTd2lnVmFsdWVXcmFwcGVyIG5lZWRlZCBmb3IgY29uc3RydWN0b3JzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVW5kZWZpbmVkIGlkZW50aWZpZXJzIG5vdyBldmFsdWF0ZSB0byAwIHdoZW4gZXZhbHVhdGluZwogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNpZiAhRk9PCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgCiAgICAgICAgICAgIHdoZXJlIEZPTyBpcyB1bmRlZmluZWQgb3Igc2V0IHRvIHNvbWUgbm9uLW51bWVyaWMgdmFsdWUuCgogICAgICAgICAgICBGaXhlcyBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgoKIAowNS8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGlnbm9yZXMgdGhlIEMrKyAnZXhwb3J0JyBrZXl3b3JkLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIHJlZmluZW1lbnQgb2YgdHlwZS1uYW1lIG1hbmdsaW5nIHRvIGFjY291bnQgZm9yIHBvaW50ZXJzLCBhcnJheXMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMsIGFuZCBvdGhlciBlbWJlZGRlZCB0eXBlIGNvbnN0cnVjdHMuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluaXRpYWwgYXR0ZW1wdCBhdCBzdXBwb3J0aW5nIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBBdAogICAgICAgICAgICB0aGUgdmVyeSBsZWFzdCwgaXQgaXMgcGFyc2VkIGFuZCB0aGUgY2xhc3NlcyBhcmUgc3RvcmVkLiAgTWF0Y2hpbmcKICAgICAgICAgICAgb2YgaW5zdGFudGlhdGlvbnMgdG8gc3BlY2lhbGl6ZWQgdmVyc2lvbiBpcyBtb3JlIGxpbWl0ZWQgYW5kIGJhc2VkIG9uCiAgICAgICAgICAgIHRoZSBTV0lHIGRlZmF1bHQgdHlwZW1hcCBydWxlczoKCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgJgoKICAgICAgICAgICAgTm93LCB3aHkgaW4gdGhlIHdvcmxkIHdvdWxkIHlvdSB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmU/ICBPdGhlcgogICAgICAgICAgICB0aGFuIGFsbG93aW5nIGZvciBzbGlnaHRseSBtb2RpZmllZCBjbGFzcyBBUElzLCB0aGlzIGNhcGFiaWxpdHkgaXMKICAgICAgICAgICAgcHJpbWFyaWx5IHVzZWQgdG8gcHJvdmlkZSBhZHZhbmNlZCB3cmFwcGluZyBzdXBwb3J0IGZvciBTVEwtbGlrZQogICAgICAgICAgICBvYmplY3RzLiAgSXQgY2FuIGFsc28gYmUgbWl4ZWQgd2l0aCB0eXBlbWFwcy4gIEhlcmUgaXMgYW4gZXhhbXBsZToKCgogICAgICAgICAgICAgICAgLyogR2VuZXJpYyB2ZXJzaW9uICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIG9iamVjdHMgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFBhcnRpYWwgc3BlY2lhbGl6YXRpb24gKHBvaW50ZXJzKSAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8VD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIHBvaW50ZXJzIHRvIG9iamVjdHMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8qIFNwZWNpYWxpemF0aW9uIChpbnRlZ2VycykuICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29udGFpbmVyIG9mIGludGVnZXJzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gICBOb3JtYWxseSwgdHlwZW1hcCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgIHJlbmFtZWQgdG8gYXZvaWQgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICogKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGNvZGUgdGhhdCBjcmVhdGVzIGFuZCB1c2VzIHZhcmlhYmxlcyAidGVtcDEiLCJ0ZW1wMiIsIAogICAgICAgICAgICAidGVtcDMiIGFuZCBzbyBmb3J0aCBkZXBlbmRpbmcgb24gaG93IG1hbnkgdGltZXMgdGhlIHR5cGVtYXAgaXMgdXNlZC4KICAgICAgICAgICAgU29tZXRpbWVzIHlvdSB3YW50IGEgc2luZ2xlIHZhcmlhYmxlIGluc3RlYWQuICBUbyBkbyB0aGF0LCB1c2luZwogICAgICAgICAgICB0aGUgZm9sbG93aW5nIG5hbWluZyBzY2hlbWU6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqKGludCBfZ2xvYmFsX3RlbXApIHsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICBJcyB0aGlzIGNhc2UsIGEgc2luZ2xlIHZhcmlhYmxlIF9nbG9iYWxfdGVtcCBpcyBlbWl0dGVkIGluIHRoZQogICAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9ucy4gIEl0IGlzIHNoYXJlZCBhY3Jvc3MgYWxsIHR5cGVtYXBzLiAgUmVwZWF0ZWQKICAgICAgICAgICAgdHlwZW1hcHMgZG8gbm90IHJlcGxpY2F0ZSB0aGUgdmFyaWFibGUtLS10aGV5IHVzZSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgIGVtaXR0ZWQuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byB0eXBlbWFwcy4gIElmIHlvdSBoYXZlIHRoaXMgY29kZSwKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gKGludCBzb21ldmFyID0gMykgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHNvbWV2YXIgaXMgbm93IGVtaXR0ZWQgaW50byB0aGUgd3JhcHBlciBjb2RlLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCAlZXh0ZW5kIHRvIGJlIGJldHRlciBiZWhhdmVkIGluIG5hbWVzcGFjZXMuICBJZiB5b3UgaGF2ZSBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogIAogICAgICAgICAgICBTV0lHIG1hdGNoZXMgdGhlIGJsYWgoKSBtZXRob2QgdG8gYSBDIGZ1bmN0aW9uIG5hbWVkIAogICAgICAgICAgICB2b2lkIGZvb19iYXJfYmxhaChmb286OmJhciAqc2VsZikuCgogICAgICAgICAgICBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLW5hbWVzcGFjZSB2ZXJzaW9uLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZXM6IGNwb2ludGVyLmksIGNhcnJheXMuaSwgY21hbGxvYy5pLiAgVGhlc2UKICAgICAgICAgICAgcHJvdmlkZSBhY2Nlc3MgdG8gQyBwb2ludGVycyBhbmQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9MaWJyYXJ5Lmh0bWwgZm9yIGRldGFpbHMuCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEMgdHlwZSBjaGFyIG5vIGxvbmdlciBtYXBzIHRvIEphdmEgdHlwZSBieXRlLCBidXQgdG8gSmF2YSB0eXBlIGNoYXIuCiAgICAgICAgICAgIEl0IGlzIG5vdyB0cmVhdGVkIGFzIGEgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGEgc2lnbmVkIG51bWJlci4gVGhpcyBmaXRzIGluCiAgICAgICAgICAgIHdpdGggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgYW5kIGlzIGEgbW9yZSBuYXR1cmFsIG1hcHBpbmcgYXMgY2hhciogaXMgCiAgICAgICAgICAgIG1hcHBlZCBhcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiBOb3RlIHRoYXQgdGhlIEMgc2lnbmVkIGNoYXIgdHlwZSBpcyBzdGlsbAogICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGJ5dGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEltcHJvdmVkIGNvbnN0YW50cyB3cmFwcGluZy4gQ29uc3RhbnRzICgjZGVmaW5lIGFuZCAlY29uc3RhbnQpIHZhbHVlcyAKICAgICAgICAgICAgYXJlIG5vdyBvYnRhaW5lZCB0aHJvdWdoIGEgSk5JIGNhbGwuIFByZXZpb3VzbHkgdGhlIHZhbHVlIHdhcyBjb21waWxlZCBhcyAKICAgICAgICAgICAgSmF2YSBjb2RlLCBidXQgdGhpcyBkaWRuJ3Qgd29yayBmb3IgYWxsIGNhc2VzLCBlZyAjZGVmaW5lIDEyM1VMTC4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYm9ndXMgZXJyb3IgbWVzc2FnZSB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCBDKysKICAgICAgICAgICAgYWNjZXNzIHNwZWNpZmllcnMuICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOYW1lc3BhY2VzIGFuZCBlbnVtcyBub3cgd29yayBjb3JyZWN0bHkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBlbnVtIEJhciB7IEEsIEIgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXR5cGVzIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gc3BlY2lmeSBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzCiAgICAgICAgICAgIGluIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgJXR5cGVzKEZvbyA9IEJhcik7CgogICAgICAgICAgICBzcGVjaWZpZXMgdGhhdCBGb28gaXNhIEJhci4gICAgVXNpbmcgdGhpcyBpcyBwb3RlbnRpYWxseSBxdWl0ZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgaXMgdXNlZnVsIGluIGNlcnRhaW4gY2FzZXMgKGFuZCBpbiB0aGUgU1dJRyBsaWJyYXJ5KS4KICAgICAgICAgICAgCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJW5vZGVmYXVsdCBhbmQgJW1ha2VkZWZhdWx0IGRpcmVjdGl2ZXMgbm93IHJlcXVpcmUgYSB0cmFpbGluZyBzZW1pY29sb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQ7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdDsKCiAgICAgICAgICAgIEluIGFkZGl0aW9uIGJvdGggZGlyZWN0aXZlcyBjYW4gdGFrZSBhIGNsYXNzIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0IEZvbzsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28geyAgIC8qIE5vIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgLyogRGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCAqLwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJZiB5b3UgZG9uJ3QgdXNlIHRoZSB0cmFpbGluZyBzZW1pY29sb24sIHRoaW5ncyB3aWxsIG15c3RlcmlvdXNseSBicmVhay4KCjA1LzIwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9yZSBpbXByb3ZlbWVudHMgdG8gdHlwZSBzeXN0ZW0gaGFuZGxpbmcuICBTV0lHIG5vdyBjb3JyZWN0bHkgaGFuZGxlcwogICAgICAgICAgICB0ZW1wbGF0ZSBuYW1lcyBhbmQgcGFyYW1ldGVycyBpbiBhIG5hbWVzcGFjZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmFyIHsgfTsKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwoKICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyPEludGVnZXI+ICp4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFsbCBvZiB0aGUgdHlwZW5hbWVzIGFyZSBwcm9wZXJseSBxdWFsaWZpZWQuCgowNS8xNy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIGRlcHJlY2F0ZWQgYnJva2VuIC1qbmljIGFuZCAtam5pY3BwIGNvbW1hbmRsaW5lIG9wdGlvbnMuIFRoZSBDIG9yIEMrKyAKICAgICAgICAgICAgSk5JIGNhbGxpbmcgY29udmVudGlvbiBpcyBub3cgZGV0ZXJtaW5lZCBmcm9tIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjA1LzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIEpDQUxMIG1hY3JvcyB3aGljaCBleGlzdCBzbyB0aGF0IHRoZSBzYW1lIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgIGZvciBnZW5lcmF0aW5nIGJvdGggdGhlIEMgYW5kIEMrKyBKTkkgY2FsbGluZyBjb252ZW50aW9ucyBubyBsb25nZXIgYXBwZWFyCiAgICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRwdXQgaXMgbm93IHBhc3NlZCB0aHJvdWdoIHRoZSAKICAgICAgICAgICAgU1dJRyBwcmVwcm9jZXNzb3Igd2hpY2ggZG9lcyB0aGUgbWFjcm8gZXhwYW5zaW9uIGZvciBlaXRoZXIgQyBvciBDKysgKGRlcGVuZGluZwogICAgICAgICAgICBvbiB3aGV0aGVyIC1jKysgaXMgcGFzc2VkIG9uIHRoZSBTV0lHIGNvbW1hbmRsaW5lKS4KCiAgICAgICAgICAgIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkanVzdGVkIAogICAgICAgICAgICB0byB0YWtlIGFjY291bnQgb2YgdGhpcy4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYW55IHR5cGVtYXBzIHdoaWNoIGNvbnRhaW5lZCAKICAgICAgICAgICAgSkNBTEwgbWFjcm9zIHdpdGhpbiAleyAlfSBicmFja2V0cyB3aWxsIGhhdmUgdG8gYmUgbW92ZWQgd2l0aGluIHt9IGJyYWNrZXRzIAogICAgICAgICAgICBzbyB0aGF0IHRoZSBTV0lHIHByZXByb2Nlc3NvciBjYW4gZXhwYW5kIHRoZSBtYWNyb3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENsYXNzIHRlbXBsYXRlcyBtYXkgbm93IGJlIHVzZWQgYXMgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBULCB0ZW1wbGF0ZTxjbGFzcz4gY2xhc3MgQz4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vaSkgRm9vPGludCwgQmFyPjsKICAgICAKICAgICAgICAgICAgU1dJRyBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhpcy0tLWl0J3MganVzdAogICAgICAgICAgICBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiAgCiAgICAgICAgIAowNS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIHJlZmluZW1lbnQgb2YgdGVtcGxhdGUgc3VwcG9ydC4gIFRlbXBsYXRlIHBhcmFtZXRlciBuYW1lcyBhcmUgbm8gbG9uZ2VyCiAgICAgICAgICAgIHJlcXVpcmVkIGZvciB0eXBlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGJvb2w+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgT2J2aW91c2x5LCBuYW1lcyBhcmUgcmVxdWlyZWQgZm9yIHRlbXBsYXRlPGNsYXNzIFQ+OwoKMDUvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbWFjcm8gZXhwYW5zaW9uIGluIHR5cGVtYXBzLiAgVGhlIHNlcXVlbmNlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHR5cGUpCgogICAgICAgICAgICBXaWxsIGV4cGFuZCBpbnRvIHRoZSBTV0lHIHR5cGUgZGVzY3JpcHRvciBzdHJ1Y3RvciBmb3IKICAgICAgICAgICAgdGhlIGdpdmVuIHR5cGUuICBUeXBlIG1heSBiZSBhbnkgYWJzdHJhY3QgZGF0YXR5cGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAqKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICgqKShpbnQsZG91YmxlKSkKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKHZlY3RvcjxpbnQ+ICopCgogICAgICAgICAgICBDYXZlYXQ6IEl0IGlzICpOT1QqIGN1cnJlbnRseSBsZWdhbCB0byB1c2Ugb3RoZXIgdHlwZW1hcAogICAgICAgICAgICBzdWJzdGl0dXRpb24gdmFyaWFibGVzIGluIHRoZSBtYWNyby4gIEZvciBleGFtcGxlIAogICAgICAgICAgICAkZGVzY3JpcHRvcigkMV90eXBlKS4KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtb2RpZmljYXRpb24gaXMgdG8gYmV0dGVyCiAgICAgICAgICAgIHN1cHBvcnQgdHlwZW1hcHMgZm9yIGNvbnRhaW5lciBvYmplY3RzIG9yIHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgbWlnaHQgYmUgcGVyZm9ybWluZyB0eXBlIGNvbnZlcnNpb25zLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSB3cmFwcGluZyBvZiByZWZlcmVuY2VzIHRvIHByaW1pdGl2ZSB0eXBlcyBoYXMgYmVlbgogICAgICAgICAgICBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICBBcmd1bWVudHMgb2YgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSBub3cgcGFzc2VkCiAgICAgICAgICAgIGJ5IHZhbHVlIGFzIG9wcG9zZWQgdG8gcG9pbnRlcnMuICBSZXR1cm4gdmFsdWVzIG9mCiAgICAgICAgICAgIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgcmV0dXJuZWQgYXMgdmFsdWVzIGluc3RlYWQgb2YKICAgICAgICAgICAgcG9pbnRlcnMuCgogICAgICAgICAgICAncHJpbWl0aXZlJyBpcyBhbnkgb25lIG9mIGludCwgc2hvcnQsIGxvbmcsIGxvbmcgbG9uZywKICAgICAgICAgICAgY2hhciwgZmxvYXQsIGRvdWJsZSwgYm9vbCAoYXMgd2VsbCBhcyB1bnNpZ25lZCB2YXJpYW50cykuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIHRvIGJldHRlciBzdXBwb3J0IEMrKyB3cmFwcGluZy0tZXNwZWNpYWxseQogICAgICAgICAgICBjb2RlIHRoYXQgbWFrZXMgdXNlIG9mIHRlbXBsYXRlcyBhbmQgdGhlIFNUTC4KICAgICAgICAgICAgCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjY2VzcyB0ZW1wbGF0ZXMKICAgICAgICAgICAgaW4gYSBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBjb21wbGV4IHsKICAgICAgICAgICAgICAgICAgICAgICBUIHJlLCBpbTsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChUIF9yID0gVCgpLCBUIF9pID0gVCgpKSA6IHJlKF9yKSwgaW0oX2kpIHsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgcmVhbCgpIHsgcmV0dXJuIHJlOyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCBpbWFnKCkgeyByZXR1cm4gaW07IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShjb21wbGV4KSBzdGQ6OmNvbXBsZXg8ZG91YmxlPjsKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBzb21lIHZlcnkgc3VidGxlIG5hbWVzcGFjZS9zeW1ib2wgdGFibGUgCiAgICAgICAgICAgIG1hbmFnZW1lbnQgaXNzdWVzIGludm9sdmVkIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzLgogICAgICAgICAgICBJdCBtYXkgbm90IHdvcmsgaW4gY2VydGFpbiBjYXNlcy4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlIGNvbnN0cnVjdG9yIHN1cHBvcnQgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIF9UMSwgdHlwZW5hbWUgX1QyPiAKICAgICAgICAgICAgICAgc3RydWN0IHBhaXIgewogICAgICAgICAgICAgICAgIF9UMSBmaXJzdDsKICAgICAgICAgICAgICAgICBfVDIgc2Vjb25kOwogICAgICAgICAgICAgICAgIHBhaXIoKSA6IGZpcnN0KF9UMSgpKSwgc2Vjb25kKF9UMigpKSB7IH0KICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVTEsIGNsYXNzIF9VMj4gcGFpcihjb25zdCBwYWlyPF9VMSxfVTI+ICZ4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSwgdXNlICV0ZW1wbGF0ZSBhbmQgJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgZXhwYW5kcyB0aGUgY29uc3RydWN0b3IgaW50byBhIGRlZmF1bHQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcjoKCiAgICAgICAgICAgICAgICVleHRlbmQgcGFpciB7CiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShwYWlyKSBwYWlyPF9UMSxfVDI+OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsLiAgT3RoZXIgdXNlcyBtYXkgYmUgYnJva2VuLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWV4dGVuZCAoJWFkZG1ldGhvZHMpIGRpcmVjdGl2ZSBubyBsb25nZXIgd29ya3MgdW5sZXNzCiAgICAgICAgICAgIGl0IGFwcGVhcnMgaW4gdGhlIHB1YmxpYyBzZWN0aW9uIG9mIGEgY2xhc3MuICAgQW4gZXJyb3IKICAgICAgICAgICAgbWVzc2FnZSBpcyBub3cgZ2VuZXJhdGVkIChhcyBvcHBvc2VkIHRvIGEgc2VnbWVudGF0aW9uIGZhdWx0KS4KCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3ICV3YXJuZmlsdGVyKCkgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgYXR0YWNoZXMgYSB3YXJuaW5nCiAgICAgICAgICAgIGZpbHRlciB0byBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgYW5kIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKICAgICAgICAgICAgJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBmb287ICAgLy8gU3VwcHJlc3Mgb3ZlcmxvYWRlZCB3YXJuaW5nCiAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOyAKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIE9iamVjdDo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIGNsYXNzIE9iamVjdCB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgb25seSBzdXBwcmVzc2VzIHdhcm5pbmdzIGluIGxhdGVyIHN0YWdlcyBvZiBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRpb24uICBJdCBkb2VzIG5vdCBzdXBwcmVzcyB3YXJuaW5ncyByZWxhdGVkIHRvIHByZXByb2Nlc3NpbmcKICAgICAgICAgICAgb3IgcGFyc2luZy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBzdXBwb3J0cyBDOTkgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LF9fVkFfQVJHU19fKQoKICAgICAgICAgICAgVGhlIGFyZ3VtZW50ICIuLi4iIGlzIHVzZWQgdG8gaW5kaWNhdGUgdmFyaWFibGUgYXJndW1lbnRzIHdoaWNoCiAgICAgICAgICAgIGFyZSBhbGwgcGxhY2VkIGludG8gdGhlIHNwZWNpYWwgYXJndW1lbnQgbmFtZSBfX1ZBX0FSR1NfXyBpbgogICAgICAgICAgICB0aGUgbWFjcm8gZXhwYW5zaW9uLiAgCgogICAgICAgICAgICBTV0lHIGFsc28gaW1wbGVtZW50cyB0aGUgR05VICgjIykgZXh0ZW5zaW9uIGZvciBzd2FsbG93aW5nIHRoZQogICAgICAgICAgICBwcmVjZWRpbmcgY29tbWEgd2hlbiBfX1ZBX0FSR1NfXyBpcyBlbXB0eS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsICMjX19WQV9BUkdTX18pCgogICAgICAgICAgICBIZXJlIGlzIGhvdyB0aGlzIGlzIGV4cGFuZGVkOgoKICAgICAgICAgICAgICAgZGVidWdmKCIlZCIsIDMpICAtLT4gZnByaW50ZihzdGRlcnIsIiVkIiwzKQogICAgICAgICAgICAgICBkZWJ1Z2YoIkhlbGxvIikgIC0tPiBmcHJpbnRmKHN0ZGVyciwiSGVsbG8iICkKCiAgICAgICAgICAgIChub3RpY2UgdGhlIGRlbGV0ZWQgY29tbWEpLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOC8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCiAgICAgICAgICAgIE1hbnkgY2hhbmdlcyB0byBwaHAgbW9kdWxlLiAgU2hhZG93IGNsYXNzZXMgYXJlIG5vdyBpbXBsZW1lbnRlZAogICAgICAgICAgICBlbnRpcmVseSBpbiBuYXRpdmUgQyBhbmQgbm8gbmVlZCBmb3IgcGhwLWNvZGUgc2hhZG93IHdyYXBwZXJzCiAgICAgICAgICAgIFBvcHVsYXRlZCB0ZW1wbGF0ZSBjb25maWcubTQgYW5kIE1ha2VmaWxlLmluIGFzIG5lZWRlZCBieQogICAgICAgICAgICBwaHBpemUgYXJlIGdlbmVyYXRlZC4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBIGNvcHkgY29uc3RydWN0b3IgaXMgbm93IHR1cm5lZCBpbnRvIGEgImNsb25lIgogICAgICAgICAgICBpbnN0YW5jZSBtZXRob2QgKHNlZSBEYXZlJ3MgY2hhbmdlIGZvciBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgICBkYXRlZCA0LzcvMjAwMikuIFRoaXMgc2VlbXMgbGlrZSB0aGUgYXBwcm9wcmlhdGUgdGhpbmcKICAgICAgICAgICAgdG8gZG8gZm9yIFJ1YnkgY29kZS4KCjA1LzA4LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBbIDU1Mzg2NCBdIElubGluZSBkZXN0cnVjdG9yIGNvZGUgbm90IHdyaXR0ZW4uCgowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVpZ25vcmUgYmVoYXZlcyBiZXR0ZXIgd2l0aCBjb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzLCBhbmQgdGhlCiAgICAgICAgICAgIHR5cGUgc3lzdGVtIGluIGdlbmVyYWwuICAgRm9yIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMsCiAgICAgICAgICAgICVpZ25vcmUgbm93IHN1cHByZXNzZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICBvciBkZXN0cnVjdG9yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVpZ25vcmUgfkZvbzsKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIH5Gb28oKSBzaW1wbHkgImRpc2FwcGVhcmVkIiBhbmQgdGhlIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICAgIGNyZWF0ZWQgYSB3cmFwcGVyIGZvciBhIGRlZmF1bHQgZGVzdHJ1Y3RvciAoYXMgaWYgaXQgd2FzIG5ldmVyCiAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBpbnRlcmZhY2UpLiAgSW4gU1dJRy0xLjMuMTIsICVpZ25vcmUgc3VwcHJlc3NlcwogICAgICAgICAgICB0aGUgY3JlYXRpb24gb2YgYSBkZXN0cnVjdG9yIGlmIG9uZSBpcyBhY3R1YWxseSBkZWZpbmVkLiAKCiAgICAgICAgICAgIFNpbWlsYXJseSwgZXZlbiB0aG91Z2ggYSBkZWNsYXJhdGlvbiBpcyBpZ25vcmVkLCBpbmZvcm1hdGlvbgogICAgICAgICAgICBtYXkgc3RpbGwgYmUgbmVlZGVkIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUKICAgICAgICAgICAgaXMgYSB2ZXJ5IHN1YnRsZSBlcnJvciB0aGF0IGlzIGZpeGVkIGJ5IHRoaXMgY2hhbmdlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgc3RkOjpzdHJpbmc7ICAgICAgICAgLy8gUHJldmVudCBjbGFzcyB3cmFwcGluZwogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBzdHJpbmcgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgc3RyaW5nICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdm9pZCBmb28oc3RkOjpzdHJpbmcgKnMpOyAgIC8vIEJyb2tlbi4KCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIGZpeCwgJWlnbm9yZSB3b3VsZCBjYXVzZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiB0byBkaXNhcHBlYXIuCiAgICAgICAgICAgIFRoaXMsIGluIHR1cm4sIHdvdWxkIGNhdXNlIHRoZSB0eXBlbWFwIHRvIGJlIG1pc2FwcGxpZWQuIAogCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgYmV0dGVyIHN1cHBvcnQgb2YgZGVzdHJ1Y3RvcnMuICBEZXN0cnVjdG9ycyBjYW4gbm93IGJlIHByZWNpc2VseQogICAgICAgICAgICB0YWdnZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjp+Rm9vOwogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgfkJhciB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICpEZXZlbG9wZXIgd2FybmluZyogCiAgICAgICAgICAgIE9wZXJhdGlvbnMgc3VjaCBhcyByZW5hbWluZyBhbmQgZmVhdHVyZSBhdHRhY2htZW50IGZvciBjbGFzc2VzIHVzZWQgdG8KICAgICAgICAgICAgYmUgYXBwbGllZCB0byBkZXN0cnVjdG9ycyBhcyB3ZWxsLiAgRm9yIGluc3RhbmNlLCBpZiB5b3UgZGlkIHRoaXM6CiAKICAgICAgICAgICAgICAgICAlcmVuYW1lKEJhcikgRm9vOwoKICAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwgYW5kCiAgICAgICAgICAgIHRoZSBkZXN0cnVjdG9yLiAgIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLiAgTm93IHN1Y2ggb3BlcmF0aW9ucwogICAgICAgICAgICB3aWxsIG9ubHkgYXBwbHkgdG8gdGhlIGNsYXNzIGFuZCB0aGUgY29uc3RydWN0b3IuICBOb3RlOiBpZiB5b3UKICAgICAgICAgICAgd2VyZSByZWx5aW5nIG9uIHRoaXMgZm9yIGNsYXNzIHJlbmFtaW5nLCBiZSBhd2FyZSB0aGF0IHJlbmFtZWQKICAgICAgICAgICAgY2xhc3NlcyBzaG91bGQgcmVhbGx5IG9ubHkgYmUgaGFuZGxlZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGNsYXNzIGl0c2VsZgogICAgICAgICAgICBhbmQgbm90IHRoZSBsZXZlbCBvZiBpbmRpdmlkdWFsIGRlY2xhcmF0aW9ucyBpbiB0aGUgY2xhc3MgKGFsdGhvdWdoCiAgICAgICAgICAgIHRoZXkgY2FuIGJlIHJlbmFtZWQgaW5kaXZpZHVhbGx5IGlmIG5lZWRlZCkuICBBcyBmYXIgYXMgSSBrbm93LAogICAgICAgICAgICB0aGUgTGFuZ3VhZ2UgY2xhc3MgaXMgYWxyZWFkeSB0YWtpbmcgY2FyZSBvZiB0aGlzIGNhc2UgY29ycmVjdGx5LgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgc2V0IG9mIHRlc3RzLiAgVGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvZXJyb3JzIGRpcmVjdG9yeSBjb250YWlucwogICAgICAgICAgICB0ZXN0cyB0aGF0IHRyeSB0byBleGVyY2lzZSBhbGwgb2YgU1dJRydzIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdGFydCBvZiBhIHdhcm5pbmcgZnJhbWV3b3JrLiAgV2FybmluZyBtZXNzYWdlcyBhcmUgbm93IGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgIHRoYXQgYXJlIHNob3duIGluIHdhcm5pbmcgbWVzc2FnZXMuICAgVGhlc2UgY2FuIGJlIHN1cHByZXNzZWQgdXNpbmcgdGhlCiAgICAgICAgICAgIC13IG9wdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIsMzA1IGV4YW1wbGUuaQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlICNwcmFnbWEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIHRoaXM6CgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIsMzA1CgogICAgICAgICAgICBOb3RlOiBTaW5jZSBTV0lHIGlzIGEgbXVsdGktcGFzcyBjb21waWxlciwgdGhpcyBwcmFnbWEgc2hvdWxkCiAgICAgICAgICAgIG9ubHkgYmUgdXNlZCB0byBjaGFuZ2UgZ2xvYmFsIHNldHRpbmdzIG9mIHRoZSB3YXJuaW5nIGZpbHRlci4gIEl0IHNob3VsZAogICAgICAgICAgICBub3QgYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUvZGlzYWJsZSB3YXJuaW5ncyBpbiBhbiBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICAgVGhlIGhhbmRsaW5nIG9mICNwcmFnbWEgb2NjdXJzIGluIHRoZSBDKysgcHJlcHJvY29lc3NvciBhbmQgYWZmZWN0cyBhbGwgCiAgICAgICAgICAgIHN1YnNlcXVlbnQgc3RhZ2VzIG9mIGNvbXBpbGF0aW9uLgoKICAgICAgICAgICAgVGhlIC1XYWxsIG9wdGlvbiB0dXJucyBvbiBhbGwgd2FybmluZ3MgYW5kIG92ZXJyaWRlcyBhbnkgZmlsdGVycyB0aGF0CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgYmVlbiBzZXQuCgogICAgICAgICAgICBXYXJuaW5ncyBjYW4gYmUgaXNzdWVkIGZyb20gYW4gaW50ZXJmYWNlIHVzaW5nICV3YXJuLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV3YXJuICIxMTA6JXNlY3Rpb24gaXMgZGVwcmVjYXRlZCIKCiAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIGEgd2FybmluZyBtZXNzYWdlIGlzIGFuIG9wdGlvbmFsIHdhcm5pbmcgbnVtYmVyLgogICAgICAgICAgICBBIGNvbXBsZXRlIHNldCBvZiB3YXJuaW5nIG51bWJlcnMgaXMgZm91bmQgaW4gU291cmNlL0luY2x1ZGUvc3dpZ3dhcm4uaC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBwYXJzaW5nIGNoYW5nZS4gICBEaXJlY3RpdmVzIHRvIGluY2x1ZGUgZmlsZXMgbm93IHVzZSBicmFja2V0cyBbIC4uLiBdCiAgICAgICAgICAgIGluc3RlYWQgb2YgeyAuLi4gfS4gICAKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlZmlsZSAiZm9vLmkiIFsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIF0KCiAgICAgICAgICAgIFRoZSB1c2Ugb2YgeyAuLi4gfSB3YXMgYSBiYWQgY2hvaWNlIGJlY2F1c2UgdGhleSB3ZXJlIGluY2x1ZGVkIGltcGxpY2l0bHkgYnkKICAgICAgICAgICAgdGhlIHByZXByb2Nlc3NvciBhbmQgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHByb3Blcmx5IGRldGVjdCBsZWdpdGltYXRlIG1pc3NpbmcgJ30nIAogICAgICAgICAgICBlcnJvcnMuCgowNC8xNi8yMDAyLQowNS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgRXVyb3BlYW4gVG91cjogUGFyaXMtQW1zdGVyZGFtLUJhdGguCgowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgaGFzIGJlZW4gcmVuYW1lZCB0byAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVleHRlbmQgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIGludCBiYXIoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW90aXZhdGlvbjogdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBmb3IgbWFueQogICAgICAgICAgICBvdGhlciB0YXNrcyBpbmNsdWRpbmcgYWRkaW5nIHN5bnRoZXNpemVkIGF0dHJpYnV0ZXMsIGNvbnN0cnVjdG9ycywKICAgICAgICAgICAgYW5kIHR5cGVtYXBzLiBCZWNhdXNlIG9mIHRoaXMsICJhZGRtZXRob2RzIiBpcyBzb21ld2hhdCBtaXNsZWFkaW5nLgogICAgICAgICAgICAlZXh0ZW5kIG1vcmUgcHJlY2lzZWx5IGRlc2NyaWJlcyB0aGlzIG9wZXJhdGlvbi0tLWV4dGVuc2lvbiBvZiBhCiAgICAgICAgICAgIGNsYXNzIG9yIHN0cnVjdHVyZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlYWRkbWV0aG9kcyBzdGlsbCB3b3JrcyB2aWEgYSBtYWNybyBkZWZpbml0aW9uLiAgIEhvd2V2ZXIsCiAgICAgICAgICAgIGEgd2FybmluZyBtZXNzYWdlIG1heSBiZSBnZW5lcmF0ZWQuICAgRXJyb3JzIGludm9sdmluZyAlYWRkbWV0aG9kcwogICAgICAgICAgICB3aWxsIGFjdHVhbGx5IHJlZmVyIHRvIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZS4gIAogICAgICAgICAgICAKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIHR5cGUgc3lzdGVtLiAgVHlwZWRlZiBub3cKICAgICAgICAgICAgcHJvcGFnYXRlcyB0aHJvdWdoIGZ1bmN0aW9ucywgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLAogICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKCp4KShpbnQpLCBJbnRlZ2VyICgqeSkoSW50ZWdlcikpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgJ3gnIGFuZCAneScgaGF2ZSBleGFjdGx5CiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUgKGFuZCB3b3VsZCBvYnZpb3VzbHkgYWNjZXB0IG9iamVjdHMKICAgICAgICAgICAgb2YgZWl0aGVyIHR5cGUpLgoKICAgICAgICAgICAgU2ltaWxhcmx5LCBjb25zaWRlciB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IChGb286Oip4KShpbnQpLCBpbnQgKEJhcjo6KnkpKGludCkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhcmd1bWVudHMgeCBhbmQgeSBhcmUgdGhlIHNhbWUgCiAgICAgICAgICAgIHR5cGUgKHZpYSB0eXBlZGVmKS4KICAgICAgICAgICAgCjA0LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGlmIGFueSBwYXJ0IG9mCiAgICAgICAgICAgIGFuIGV4cHJlc3Npb24gaW52b2x2ZXMgdmFsdWVzIGZyb20gYSBwcml2YXRlIHBhcnQgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBYOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gWCk7ICAgLy8gV2FybmluZwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoZXJlCiAgICAgICAgICAgIGFyZSB3b3JrYXJvdW5kcywgYnV0IHRoZXkgYXJlIHJhdGhlciBjbHVtc3kuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAlZmVhdHVyZSgiYWN0aW9uIikgYmxhaChpbnQsaW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuYXJncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSAwKTsKCgowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVzZSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmUgaW5zaWRlIGEgbmFtZXNwYWNlIGlzCiAgICAgICAgICAgIGZvcmJpZGRlbiBhbmQgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlLiAgIFRoaXMgaXMKICAgICAgICAgICAgbm90IGFsbG93ZWQgc2luY2UgdGhlIGlubGluZWQgY29kZSB0aGF0IGlzIGVtaXR0ZWQgaXMKICAgICAgICAgICAgbm90IHBsYWNlZCBpbnNpZGUgYSBuYW1lc3BhY2UuICBUaGlzIGNvbmZ1c2VzIG90aGVyCiAgICAgICAgICAgIHN0YWdlcyBvZiBwYXJzaW5nLgogICAgICAgICAgICAgICAgICAgIAowNC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgYnVnIGZpeGVzIHRvIGNhc3Rpbmcgb3BlcmF0aW9ucyBhbmQgZXhwcmVzc2lvbgogICAgICAgICAgICBwYXJzaW5nLiAgIER1ZSB0byBzb21lIHBhcnNpbmcgaXNzdWVzLCBpdCBpcyBub3QgCiAgICAgICAgICAgIGN1cnJlbnRseSBwb3NzaWJsZSB0byB1c2UgY2FzdHMgZm9yIGFsbCBwb3NzaWJsZQogICAgICAgICAgICBkYXRhdHlwZXMuICAgSG93ZXZlciwgdGhlIGNvbW1vbiBjYXNlcyB3b3JrLgoKMDQvMjAvMjAwMjogYmVhemxleSAoQW1zdGVyZGFtKQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGVzIG5vdyB3b3JrLiAgU2ltcGx5IHVzZSB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBpbnNpZGUgYSBjbGFzcyBvciAlYWRkbWV0aG9kcyB0byBjcmVhdGUKICAgICAgICAgICAgaW5zdGFudGlhdGlvbnMgKHNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwpLiAgU3VwcG9ydGluZwogICAgICAgICAgICB0aGlzIHdhcyBlYXN5LS0tZWFybGllciBjaGFuZ2VzIHRvIHRlbXBsYXRlcyBtYWRlIGl0CiAgICAgICAgICAgIHBvc3NpYmxlIHVzaW5nIG9ubHkgYSB0d28tbGluZSBtb2RpZmljYXRpb24gdG8gdGhlIHBhcnNlcgogICAgICAgICAgICBhbmQgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyBlbHNld2hlcmUuICBIbW1tLCBjb21lIHRvIAogICAgICAgICAgICB0aGluayBvZiBpdCwgdGhlIHNtb2tlIHdhcyByYXRoZXIgdGhpY2sgaW4gdGhhdCBJbnRlcm5ldCAiY2FmZSIuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA0LzE5LzIwMDI6IGJlYXpsZXkgKFRHVikKICAgICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygbm9uLXR5cGUgdGVtcGxhdGUgcGFyYW1ldGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBTaW1wbGUgbnVtYmVycyBhbmQgc3RyaW5ncyBjYW4gYmUgdXNlZCB3aXRoIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGFzIHdlbGwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludDEwMCkgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgTm90ZTogQXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgbm90IGN1cnJlbnRseSBhbGxvd2VkLgogICAgICAgICAgICAKICAgICAgICAgICAgRGVmYXVsdCB0ZW1wbGF0ZSBhcmd1bWVudHMgbm93IHdvcmsgYW5kIGRvIG5vdCBoYXZlIHRvCiAgICAgICAgICAgIGJlIGdpdmVuIHRvICV0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA0LzE4LzIwMDI6IGJlYXpsZXkgKFBhcmlzKQogICAgICAgICAgICBDaGFuZ2UgaW4gaW50ZXJuYWwgdGVtcGxhdGUgaGFuZGxpbmcuICBUZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3cgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSBhbmQgYXJlIGF3YXJlIG9mIHR5cGVkZWZzLCBldGMuICBUaGlzIGJ1aWxkcwogICAgICAgICAgICB1cG9uIHRoZSBjaGFuZ2UgYmVsb3cuICAgCgogICAgICAgICAgICAqKiogREVWRUxPUEVSIFdBUk5JTkcgKioqCiAgICAgICAgICAgIFdvcmQgb2YgY2F1dGlvbiB0byBsYW5ndWFnZSBtb2R1bGUgd3JpdGVycy4gIFRoZSAibmFtZSIKICAgICAgICAgICAgcGFyYW1ldGVyIG9mIGNlcnRhaW4gcGFyc2UgdHJlZSBub2RlcyAoY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKQogICAgICAgICAgICBtYXkgYmUgcGFyYW1ldGVyaXplZCB3aXRoIHR5cGVzLiAgIFRoaXMgcGFyYW1ldGVyaXphdGlvbiBpcwogICAgICAgICAgICBkb25lIHVzaW5nIFNXSUcgdHlwZS1zdHJpbmdzIGFuZCBub3QgdGhlIHVuZGVybHlpbmcgQyB2ZXJzaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgIGludCBtYXg8aW50ICo+KGludCAqLGludCAqKSAgCgogICAgICAgICAgICBoYXMgYSBuYW1lIG9mICJtYXg8KHAuaW50KT4iLiAgSWYgeW91IHVzZSB0aGUgbmFtZSBkaXJlY3RseSwKICAgICAgICAgICAgeW91IG1heSBnZXQgc3ludGF4IGVycm9ycyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuICBUbyBmaXggdGhpcywKICAgICAgICAgICAgdXNlIFN3aWdUeXBlX25hbWVzdHIobmFtZSkgdG8gY29udmVydCBhIHBhcmFtZXRlcml6ZWQgbmFtZSAKICAgICAgICAgICAgdG8gYSBDIG5hbWUgd2l0aCB2YWxpZCBzeW50YXguICBUaGUgaW50ZXJuYWwgdmVyc2lvbiBpcwogICAgICAgICAgICB1c2VkIHRvIHJlZHVjZSB0ZW1wbGF0ZSB0eXBlcyB0byBhIGNvbW1vbiByZXByZXNlbnRhdGlvbiAKICAgICAgICAgICAgYW5kIHRvIGhhbmRsZSBpc3N1ZXMgb2YgdHlwZWRlZi4KICAgICAgICAgICAgCjA0LzE2LzIwMDI6IGJlYXpsZXkgKHNvbWV3aGVyZSBvdmVyIHRoZSBBdGxhbnRpYykKICAgICAgICAgICAgRW5oYW5jZW1lbnQgb2YgdHlwZWRlZiByZXNvbHV0aW9uLiAgVGhlIHR5cGUgc3lzdGVtIGlzIG5vdwogICAgICAgICAgICBhd2FyZSBvZiB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZvbyh2ZWN0b3I8aW50PiAqeCwgdmVjdG9yPEludGVnZXI+ICp5KTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdmVjdG9yPGludD4gYW5kIHZlY3RvcjxJbnRlZ2VyPiBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZS4gICBUaGVyZSBpcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhpcwogICAgICAgICAgICBtZWNoYW5pc20gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0eXBlbWFwcy4gIEZvciBleGFtcGxlLAogICAgICAgICAgICBhIHR5cGVtYXAgZGVmaW5lZCBmb3IgdmVjdG9yPGludD4gKiB3b3VsZCBhcHBseSB0byBlaXRoZXIgdHlwZS4KICAgICAgICAgICAgSG93ZXZlciwgYSB0eXBlbWFwIGZvciB2ZWN0b3I8SW50ZWdlcj4gKiB3b3VsZCBvbmx5IGFwcGx5IHRvCiAgICAgICAgICAgIHRoYXQgdHlwZS4KCiAgICAgICAgICAgIFR5cGVkZWZzIGFuZCB0eXBlbWFwcyBhbmQgbWF0Y2hlZCBieSBsZWZ0LW1vc3QgZXhwYW5zaW9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdmVjdG9yPEludGVnZXIsSW50ZWdlcj4gLS0+IAogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIEludGVnZXI+IC0tPgogICAgICAgICAgICAgIHZlY3RvcjxpbnQsIGludD4KCgowNC8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIENoYW5nZXMgdG8gSmF2YSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgICAgT3ZlcmNvbWVzIGEgYnVnIHdoZXJlIHRoZSBtb2R1bGUgYXNzdW1lZCB0aGF0IGEgcG9pbnRlciB0byBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgY291bGQgYmUgdXNlZCBpbiBwbGFjZSBvZiBhIHBvaW50ZXIgdG8gYSBiYXNlIGNsYXNzLiBUaGFua3MgCiAgICAgICAgICAgIHRvIFN0ZXBoZW4gTWNDYXVsIGZvciBhbmFseXNpbmcgdGhlIGJ1ZyBhbmQgc3VibWl0dGluZyBwYXRjaGVzLgoKICAgICAgICAgICAgQSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZSBnZXRDUHRyKCkgbWV0aG9kIGluIGVhY2ggc2hhZG93IGNsYXNzIGhhcwogICAgICAgICAgICBkaXNhcHBlYXJlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIGdldENQdHJYWFgoKSwgd2hlcmUgWFhYIGlzIHRoZSAKICAgICAgICAgICAgc2hhZG93IGNsYXNzIG5hbWUuIElmIHlvdSBoYXZlIGNvZGUgdGhhdCBwcmV2aW91c2x5IHVzZWQgZ2V0Q1B0cigpLCAKICAgICAgICAgICAgYW5kIHRoZSBhc3NvY2lhdGVkIGNsYXNzIGlzIHdyYXBwaW5nIGEgQyBzdHJ1Y3Qgb3IgYSBDKysgY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBub3QgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIGp1c3QgdXNlIHRoZSBuZXcgbWV0aG9kLiBJZgogICAgICAgICAgICBob3dldmVyLCB0aGUgY2xhc3MgaXMgaW52b2x2ZWQgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW4sIHlvdSdsbCBoYXZlCiAgICAgICAgICAgIHRvIGNob29zZSB3aGljaCBwb2ludGVyIHlvdSByZWFsbHkgd2FudC4gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgCiAgICAgICAgICAgIGhhcyBiZWVuIGJyb2tlbiBhcyBub3QgdXNpbmcgdGhlIGNvcnJlY3QgcG9pbnRlciBjYW4gbGVhZCB0byB3ZWlyZCBidWdzCiAgICAgICAgICAgIHRocm91Z2ggaWxsLWRlZmluZWQgYmVoYXZpb3VyLiBJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdGhlIG9sZCBtZXRob2RzLCAKICAgICAgICAgICAgeW91IGNvdWxkIGFkZCB0aGVtIGJhY2sgaW50byBhbGwgc2hhZG93IGNsYXNzZXMgYnkgYWRkaW5nIHRoaXMgYXQgdGhlIAogICAgICAgICAgICBiZWdpbm5pbmcgb2YgeW91ciBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgYWxsc2hhZG93Y29kZT0lewogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKXsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBQbGVhc2Ugc2VlIGVudHJ5IGRhdGVkIDA3LzIzLzIwMDIgdG8gc2VlIGhvdyB0byBkbyB0aGlzIGFmdGVyIHRoZSBkZXByZWNhdGlvbgogICAgICAgICAgICBvZiB0aGUgYWxsc2hhZG93Y29kZSBwcmFnbWEuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgcmVmZXJlbmNlcy4gICBEZWNsYXJhdGlvbnMgc3VjaCAKICAgICAgICAgICAgYXMgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oY29uc3Qgc3RyaW5nICZ4ID0gIkhlbGxvIik7CgowNC8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHR5cGVtYXAgJCogc3Vic3RpdHV0aW9ucyBmb3IgdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cy4KICAgICAgICAgICAgUmVxdWVzdGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBpcyBub3cgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBXaGVuIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIHVzZWQsIGl0IHdpbGwgdXNlIGEgc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgaWYgb25lIGlzIGRlZmluZWQuICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgbGltaXRhdGlvbnMuIFBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZC4gIEEgdGVtcGxhdGUgb2YgdHlwZSA8dm9pZCAqPiBkb2VzCiAgICAgICAgICAgIG5vdCBtYXRjaCBhbGwgcG9pbnRlcnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2hhbmdlIHRvIHRlbXBsYXRlIHdyYXBwaW5nIGludGVybmFscy4gVGVtcGxhdGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcHJvY2Vzc2VkIGFzIG1hY3JvcyBidXQgbm93IHJlc3VsdCBpbiByZWFsIHBhcnNlLXRyZWUKICAgICAgICAgICAgbm9kZXMuICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBleHBhbmRzIHRoZXNlIG5vZGVzIGludG8gYQogICAgICAgICAgICBzcGVjaWZpYyBpbnN0YW50aWF0aW9uLiAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgYSBudW1iZXIgb2YKICAgICAgICAgICAgbmV3IGFuZCBpbnRlcmVzdGluZyBjYXBhYmlsaXRpZXM6CgogICAgICAgICAgICBEaXJlY3RpdmVzIHN1Y2ggYXMgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCAlYWRkbWV0aG9kcyBjYW4KICAgICAgICAgICAgbm93IGJlIGFwcGxpZWQgdG8gdW5pbnN0YW50aWF0ZWQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyc2l6ZSkgdmVjdG9yOjpiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYpOwogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7ICAgLy8gUmVuYW1lZAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWN0b3IpIHZlY3RvcjxpbnQ+OyAgIC8vIFJlbmFtaW5nIGNhcnJpZXMgdGhyb3VnaAoKICAgICAgICAgICAgCiAgICAgICAgICAgIEJ5IHBhcnNpbmcgdGVtcGxhdGVzIGludG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUsIGl0IHdpbGwKICAgICAgICAgICAgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBzcGVjaWFsaXphdGlvbiAoYW5kIG1heWJlIHBhcnRpYWwKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24pLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBpcyBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBhIHdvcmsgaW4gcHJvZ3Jlc3MuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTEsIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB3ZXJlIHNpbXBseSBwcm9jZXNzZWQKICAgICAgICAgICAgYXMgd2VpcmQgbWFjcm9zLiAgTm8gb3RoZXIgaW5mb3JtYXRpb24gd2FzIHJldGFpbmVkLiAgIFRoaXMgCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgYW5kIAogICAgICAgICAgICBjb21wbGljYXRlZCBtYW55IG90aGVyIHBhcnRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KCjA0LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvIHRlbXBsYXRlIGNsYXNzIHdyYXBwaW5nLiAgIFRoZXJlIHdlcmUgYSB2YXJpZXR5IG9mCiAgICAgICAgICAgICJpc3N1ZXMiIHdpdGggdGhlIG9sZCBhcHByb2FjaCByZWxhdGVkIHRvIHBhcnNpbmcsIHRoZSB0eXBlCiAgICAgICAgICAgIHN5c3RlbSwgYW5kIG5hbWVzcGFjZXMuICAgVGhlc2UgY2hhbmdlcyBhcmUgbWVhbnQgdG8gcmVjdGlmeQogICAgICAgICAgICBzb21lIG9mIHRoZXNlIHByb2JsZW1zOgoKICAgICAgICAgICAgQSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgY2FuIG5vdyBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgaW5jbHVkaW5nIHRoZSBjbGFzcyBpbmxpbmUgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgfnZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KCSAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIGlzIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uLCBidXQgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcwogICAgICAgICAgICBub3QgeWV0IGltcGxlbWVudGVkLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXhwYW5kIHJvdWdobHkgYXMKICAgICAgICAgICAgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgICVyZW5hbWUodmVjaW50PiB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHNpbXBseSBidWlsZHMgdXBvbiB0aGUgY29kZSBhYm92ZSAodGVtcGxhdGVzCiAgICAgICAgICAgIGluY2x1ZGVkIGlubGluZSkuCgogICAgICAgICAgICBUaGlzIG1vZGlmaWVkIGFwcHJvYWNoIHRvIHdyYXBwaW5nIGZpeGVzIHNvbWUgc3VidGxlIHR5cGUKICAgICAgICAgICAgaXNzdWVzLiAgRm9yIGluc3RhbmNlLCB5b3UgY2FuIG5vdyBkZWZpbmUgdHlwZW1hcHMgYW5kIHR5cGVkZWZzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlY3RvcjsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50dmVjdG9yICp2KTsgICAvLyBHZXRzIHRoZSBhYm92ZSB0eXBlbWFwCgogICAgICAgICAgICBUaGlzIGRpZCBub3Qgd29yayBpbiBTV0lHLTEuMy4xMSBkdWUgdG8gYSBwZWN1bGlhcml0eSBvZgogICAgICAgICAgICB0aGUgdGVtcGxhdGUgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAldGVtcGxhdGUobmFtZSkgbm8gbG9uZ2VyIGluc3RhbGxzIHRoZSB0ZW1wbGF0ZSBhcyBhIGNsYXNzCiAgICAgICAgICAgIHdpdGggbmFtZSAibmFtZSIuICAgVGhpcyBtaWdodCBicmVhayAlYWRkbWV0aG9kcyBhcyBkZXNjcmliZWQKICAgICAgICAgICAgaW4gdGhlIG1hbnVhbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWNpbnQgeyAgICAvLyBGYWlscy4gdmVjaW50IG5vdCBhIGNsYXNzCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgIAogICAgICAgICAgICBUbyBmaXggdGhpcywganVzdCB1c2UgdGhlIHRlbXBsYXRlIG5hbWUgaW5zdGVhZDoKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiBUaGlzIHRlY2huaXF1ZSBtaWdodCBiZSBhIHdheSB0byBpbXBsZW1lbnQgc29tZSBiaXphcnJlCiAgICAgICAgICAgIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRlY2huaXF1ZXMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhcHBsaWVkIGlmIHZlY3RvcjxpbnQ+IGluc3RhbnRpYXRlZCBsYXRlcgogICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgIAowNC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLiAgU1dJRyBzaG91bGQKICAgICAgICAgICAgbm93IGNvcnJlY3RseSBoYW5kbGUgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgCiAgICAgICAgICAgIE5vdGU6IHdhcyBpbXBsZW1lbnRlZCBwcmV2aW91c2x5LCBidXQgdGhlcmUgd2FzIGEgbWlub3IgYnVnLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCiAgICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgYXJlIGRlcHJlY2F0ZWQgZHVlIHRvIGEgY2hhbmdlIGluIHRoZSAKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICBJbnN0ZWFkIG9mIGJlaW5nIHByYWdtYXMsIG11dGFiaWxpdHkgaXMgbm93CiAgICAgICAgICAgIGNvbnRyb2xsZWQgYXMgYSAiZmVhdHVyZSIgdXNpbmcgdGhlIGZvbGxvd2luZyB0d28gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgICAgJWltbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgeDsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgIGludCB5OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgJW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHo7ICAgICAgICAgICAvLyBNb2RpZmlhYmxlCgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBhcmUgbXVjaCBtb3JlIHBvd2VyZnVsIHRoYW4gdGhlaXIgb2xkZXIKICAgICAgICAgICAgY291bnRlcnBhcnRzLiAgVGhleSBjYW4gbm93IHBpbnBvaW50IGEgc3BlY2lmaWMgZGVjbGFyYXRpb24gbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgeDsgICAgICAgICAvKiBBbnkgeCAqLwogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7ICAgIC8qIHggaW4gY2xhc3MgRm9vICovCgogICAgICAgICAgICBJbiBmYWN0LCB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHRoZSBzYW1lIGFzIGZvciAlcmVuYW1lLCAKICAgICAgICAgICAgJWlnbm9yZSwgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICAgVGhpcyBtZWFucyB0aGF0IHRoZSBkZWNsYXJhdGlvbgogICAgICAKICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OwoKICAgICAgICAgICAgd291bGQgbm90IG9ubHkgYXBwbHkgdG8gY2xhc3MgRm9vIGJ1dCB0byBhbGwgZGVyaXZlZCBjbGFzc2VzCiAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2VtaS1jb2xvbi4gIFRoaXMKICAgICAgICAgICAgZGlmZmVycyBzbGlnaHRseSBmcm9tIHRoZSBvbGRlciAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgZGlyZWN0aXZlcy4KICAgICAgICAgICAgU2luY2UgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgY2FuIGJlIGFwcGxpZWQgdG8gZGVjbGFyYXRpb25zIHRoZQogICAgICAgICAgICBzZW1pY29sb24gaXMgbmVlZGVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZmVhdHVyZSBhbmQgCiAgICAgICAgICAgIG9uZSB0YXJnZXRlZCB0byBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIE5vdGU6IHRoaXMgaW5jb21wYXRpYmlsaXR5IGlzIHRoZQogICAgICAgICAgICBwcmltYXJ5IHJlYXNvbiBmb3IgY2hhbmdpbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdGl2ZS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGhhbmRsaW5nIG9mIGNvcHkgY29uc3RydWN0b3JzLiAgSWYgYSBjbGFzcyBkZWZpbmVzIAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICAgIEZvbyhjb25zdCBGb28gJik7ICAgICAgIC8vIENvcHkgY29uc3RydWN0b3IKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIGZ1bmN0aW9uIGNvcHlfRm9vKCkgZm9yIHRoZSBjb3B5CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyaW9ucywgdGhpcyBnZW5lcmF0ZWQgYSBuYW1lLWNsYXNoIGFuZCBhbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlLiAgIFRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBTV0lHCiAgICAgICAgICAgIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3IgaWYgJXJlbmFtZSBpcyB1c2VkIHRvIHJlc29sdmUKICAgICAgICAgICAgdGhlIG5hbWUgY29uZmxpY3QuICAgSG93ZXZlciwgaWYgbm8gbmFtZSByZXNvbHV0aW9uIGlzIG1hZGUsCiAgICAgICAgICAgIHRoaXMgbmV3IGFwcHJvYWNoIGlzIHVzZWQuCgogICAgICAgICAgICBDb3B5IGNvbnN0cnVjdG9ycyBtYXkgYmUgaGFuZGxlZCBhcyBhIHNwZWNpYWwgY2FzZSBpbiB0aGUKICAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgdGhpcyBpcyB1cCB0byB0aGUgbGFuZ3VhZ2UgbW9kdWxlCiAgICAgICAgICAgIGl0c2VsZi4KICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgbm93IG5hbWVzcGFjZSBhd2FyZS4gICBUaGlzIGFsbG93cwogICAgICAgICAgICBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBtYXgoVCBhLCBUIGIpIHsgcmV0dXJuIGEgPiBiID8gYSA6IGI7IH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgZm9vOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgICAgLy8gT2sKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgYmFyIHsKICAgICAgICAgICAgICAgICAgIHVzaW5nIGZvbzo6bWF4OwogICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47ICAgLy8gT2sKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENhdmVhdDogdGhlIHRlbXBsYXRlIG5hbWUgc3VwcGxpZWQgdG8gJXRlbXBsYXRlIG11c3QgYmUgZGVmaW5lZCBpbiB0aGUKICAgICAgICAgICAgc2FtZSBzY29wZSBpbiB3aGljaCB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcHBlYXJzLiAgIFRoaXMgY29kZSBpcwogICAgICAgICAgICBpbGxlZ2FsOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIGZvbzo6bWF4PGludD47CgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHByZXByb2Nlc3Nvci4gICBUaGUgcHJlcHJvY2Vzc29yIGNhbiBub3cgcGVyZm9ybQogICAgICAgICAgICBzdHJpbmcgY29tcGFyaXNvbi4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgQSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjaWYgQSA9PSAiaGVsbG8iCiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGlzIGluIFNXSUcgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVkZWZpbmUgRk9PKHgpIAogICAgICAgICAgICAgICNpZiAjeCA9PSAiaW50IgogICAgICAgICAgICAgIC8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGludCAqLwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgIE5vcm1hbCB1c2VycyBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzIGZlYXR1cmUuICBIb3dldmVyLCBpdCBtYXkKICAgICAgICAgICAgYmUgdXNlZCBpbiBwYXJ0cyBvZiB0aGUgU1dJRyBsaWJyYXJ5LgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGdXJ0aGVyIHJlZmluZW1lbnQgb2YgZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIHdyYXBwZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgU1dJRyBpcyBub3cgbXVjaCBtb3JlIGF3YXJlIG9mIHB1cmUgdmlydHVhbCBtZXRob2RzLiBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIGNsYXNzIEEgeyAgICAgICAgICAgICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpID0gMDsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpID0gMDsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7ICAvKiBBYnN0cmFjdCAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMSgpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBjbGFzcyBDIDogcHVibGljIEIgeyAgLyogT2sgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgU1dJRyB3aWxsIG9ubHkgZ2VuZXJhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIEMuCiAgICAgICAgICAgIEV2ZW4gdGhvdWdoIEIgbG9va3MgZmluZSwgaXQncyBtaXNzaW5nIGEgcmVxdWlyZWQgbWV0aG9kIGFuZCBpcyBhYnN0cmFjdC4KCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byBzdHJ1Y3R1cmUgZGF0YSBtZW1iZXIgYWNjZXNzLiAgSWYgeW91CiAgICAgICAgICAgIGhhdmUgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIEJhciAgIGI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgYiBhcmUgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAoMSkgSWYgYiBpcyAqbm90KiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciBGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICgyKSBJZiBiICppcyogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgKkZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJnNlbGYtPmI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2b2lkIEZvb19iX3NldChGb28gKnNlbGYsIEJhciAqdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gKnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTZWUgdGhlICJTdHJ1Y3R1cmUgZGF0YSBtZW1iZXJzIiBzZWN0aW9uIG9mIERvYy9NYW51YWwvU1dJRy5odG1sCiAgICAgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbGllZCBvbiBhIGxvdCBvZiBhIHVuZGVjbGFyZWQKICAgICAgICAgICAgc3RydWN0dXJlIGFuZCBjbGFzcyBuYW1lcy4gICAgVG8gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIHNpbXBseQogICAgICAgICAgICB1c2UgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIHN1Y2ggYXMgInN0cnVjdCBCYXI7IgogICAgICAgICAgICAKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKysgbmFtZXNwYWNlIHN1cHBvcnQgYWRkZWQuICBTV0lHIHN1cHBvcnRzIGFsbCBhc3BlY3RzIG9mCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW5jbHVkaW5nIG5hbWVzcGFjZSwgdXNpbmcsIGFuZCBuYW1lc3BhY2UgYWxpYXMKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBvZiBTV0lHIGlzIHRvIGZsYXR0ZW4KICAgICAgICAgICAgbmFtZXNwYWNlcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiAgSG93ZXZlciwgbmFtZXNwYWNlcyBhcmUKICAgICAgICAgICAgZnVsbHkgc3VwcG9ydGVkIGF0IHRoZSBDKysgbGV2ZWwgYW5kIGluIHRoZSB0eXBlIHN5c3RlbS4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCBmb3IgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgCjA0LzAyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3VuIGhhcyBtb2RpZmllZCBqYXZhYyBpbiBqZGsxLjQgdG8gbm8gbG9uZ2VyIGNvbXBpbGUKICAgICAgICAgICAgYW4gaW1wb3J0IG9mIGFuIHVubmFtZWQgbmFtZXNwYWNlLiBUbyBmaXggdGhpcyBTV0lHIG5vIGxvbmdlciAKICAgICAgICAgICAgZ2VuZXJhdGVzIHRoZSBpbXBvcnQgZm9yIHBhY2thZ2VsZXNzIGNsYXNzZXMuCiAgICAgICAgICAgIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80MzYxNTc1Lmh0bWwKICAgICAgICAgICAgQXMgcmVwb3J0ZWQgU0YgIzUzODQxNS4KCjAzLzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBwb2ludGVyLXRvLW1lbWJlciwgc2ltaWxhciB0byB0aGF0CiAgICAgICAgICAgIGZvciB0aGUgUHl0aG9uIG1vZHVsZS4gUmVtYXJrYWJseSBzaW1pbGFyLiBBbHNvIGFkZGVkIGEgbmV3CiAgICAgICAgICAgIGV4YW1wbGUgZm9yIHRoaXMgKEV4YW1wbGVzL3J1YnkvbXBvaW50ZXIpLCB3aGljaCBpcyByZW1hcmthYmx5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gdGhlIFB5dGhvbiBleGFtcGxlIG9mIHRoZSBzYW1lIG5hbWUuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZldyBtaW5vciBlZGl0cyB0byB0aGUgIkFkdmFuY2VkIFRvcGljcyIKICAgICAgICAgICAgY2hhcHRlciBvZiB0aGUgU1dJRyBtYW51YWwgYW5kIGFkZGVkIGEgbmV3IG1ham9yIHNlY3Rpb24KICAgICAgICAgICAgYWJvdXQgaG93IHRvIGNyZWF0ZSBtdWx0aS1tb2R1bGUgUnVieSBwYWNrYWdlcyB3aXRoIFNXSUcuCgowMy8yNi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVtb3ZlZCBhbGwgb2YgdGhlIG9sZCBSdWJ5IHByYWdtYXMuIElmIGFueSBvZiB0aGlzCiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgdHJ1bHkgbWlzc2VkIHdlIGNhbiByZXN1cnJlY3QgaXQsIHByZWZlcmFibHkKICAgICAgICAgICAgd2l0aCBzb21lIGtpbmQgb2YgZmVhdHVyZS1iYXNlZCBkaXJlY3RpdmUuCiAgICAgICAgICAgIAowMy8yNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU1dJRyBleGNlcHRpb24gbGlicmFyeSBzdXBwb3J0IGZvciBSdWJ5LCB3aGljaAogICAgICAgICAgICBoYXMgYXBwYXJlbnRseSBiZWVuIGJyb2tlbiBmb3Igc29tZSB0aW1lLiBMdWNraWx5LCBubyBvbmUgc2VlbXMKICAgICAgICAgICAgdG8gaGF2ZSBub3RpY2VkLgoKMDMvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDKystbmFtZXNwYWNlIHN1cHBvcnQgaW4gU1dJRyBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgJWFkZG1ldGhvZHM6IAoKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBub3cgYWNjZXB0cyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUKICAgICAgICAgICAgYW5kIGNhbiBiZSB1c2VkIGluc2lkZSBDKysgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgRm9vOjpCYXIgYmVsb3cKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBGb286OkJhciB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzb21lbWV0aG9kKCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBCYXIgYWJvdmUKICAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAgaW50IG90aGVybWV0aG9kKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJWZlYXR1cmUsICVyZW5hbWUsICVpZ25vcmUsICVleGNlcHRpb24sIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICBOYW1lc3BhY2VzIGFyZSBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHRoZSByZW5hbWluZyBhbmQgZGVjbGFyYXRpb24KICAgICAgICAgICAgbWF0Y2hlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIEZvbzo6cHJpbnQ7ICAgICAgICAgIC8vIFJlbmFtZSBpbiBuYW1lc3BhY2UgRm9vCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcjo6YmxhaDsgICAgICAgICAgICAgICAvLyBJZ25vcmUgYSBkZWNsYXJhdGlvbgoKICAgICAgICAgICAgJXJlbmFtZSBkaXJlY3RpdmVzIGNhbiBiZSBwbGFjZWQgaW5zaWRlIG5hbWVzcGFjZSBibG9ja3MgYXMgd2VsbC4gRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIHByaW50OyAgICAgICAgIC8vIEFwcGxpZXMgdG8gcHJpbnQgYmVsb3cKCiAgICAgICAgICAgICAgICAgICB2b2lkIHByaW50KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW9zdCBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgc2hvdWxkIHdvcmsgcHJvcGVybHkgaW5zaWRlIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIE5vIG90aGVyIGNoYW5nZXMgYXJlIG5lZWRlZC4KICAgICAgCjAzLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIGludGVybmFsIHN5bWJvbCB0YWJsZSBoYW5kbGluZy4gICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgICBtYW5hZ2VzIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBpbiBhIHNlcGFyYXRlIG5hbWVzcGFjZSB0aGFuIG5vcm1hbAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSBBTlNJIEMuICBUaGlzIG1lYW5zIHlvdSBjYW4ndCBoYXZlIGEgc3RydWN0dXJlCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBGb28oKSB7IC4uLiB9CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIG1vcmUgbGlrZSBDKysuICAgSXQncyBub3QgY2xlYXIgdGhhdCBTV0lHIGV2ZXIKICAgICAgICAgICAgcmVhbGx5IHN1cHBvcnRlZCB0aGUgQU5TSSBDIGFueXdheXMtLS11c2luZyB0aGUgc2FtZSBuYW1lIHdvdWxkCiAgICAgICAgICAgIGFsbW9zdCBjZXJ0YWlubHkgZ2VuZXJhdGUgYSBuYW1lLWNsYXNoIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgowMy8yMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1MTczMDIgXSBmb3IgaGFuZGxpbmcgb2YgcmVuYW1lZCBvdmVybG9hZGVkCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycy4gTm93LCByZW5hbWVkIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIGFyZSBjb252ZXJ0ZWQKICAgICAgICAgICAgaW50byBjbGFzcyBzaW5nbGV0b24gbWV0aG9kcyAoYmFzaWNhbGx5IGFjdGluZyBhcyAiZmFjdG9yeSIKICAgICAgICAgICAgbWV0aG9kcykuCgowMy8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTMyOTU3IF0gJWlnbm9yZSBwYXJzZSBlcnJvciBhbmQgY2FzdGluZyBvcGVyYXRvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowMy8xOC8yMDAyOiBiZWF6bGV5ICgqKiBBRFZBTkNFRCBVU0VSUyBPTkxZICoqKQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIGNhc3RpbmcgaW4gcmV0dXJuIHZhbHVlcy4gIEEgc29tZXdoYXQKICAgICAgICAgICAgY29tbW9uIHByb2JsZW0gaW4gY2VydGFpbiBDKysgcHJvZ3JhbXMgaXMgZnVuY3Rpb25zIHRoYXQgaGlkZQogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdW5kZXJseWluZyBvYmplY3RzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgCiAgICAgICAgICAgIGZyb20gbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGEgcHJvZ3JhbSBtaWdodCBpbmNsdWRlCiAgICAgICAgICAgIHNvbWUgZ2VuZXJpYyBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKmdldE5vZGUoKTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIE5vZGUgKiBtYXkganVzdCBiZSBiYXNlIGNsYXNzIHRvIGEgd2hvbGUgaGllcmFyY2h5CiAgICAgICAgICAgIG9mIGRpZmZlcmVudCBvYmplY3RzLiAgIEluc3RlYWQgb2YgcmV0dXJuaW5nIHRoaXMgZ2VuZXJpYyBOb2RlICosCiAgICAgICAgICAgIGl0IG1pZ2h0IGJlIG5pY2UgdG8gYXV0b21hdGljYWxseSBkb3duY2FzdCB0aGUgb2JqZWN0IGludG8gdGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUgdXNpbmcgc29tZSBraW5kIGR5bmFtaWMgY2FzdC4KCiAgICAgICAgICAgIEFzc3VtaW5nIHlvdSB1bmRlcnN0YW5kIHRoZSBwZXJpbCBpbnZvbHZlZCwgYSBkb3duY2FzdCBjYW4gbm93CiAgICAgICAgICAgIGJlIHBlcmZvcm1lZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGluIHRoZSBydW4tdGltZSB0eXBlCiAgICAgICAgICAgIGNoZWNrZXI6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICpTV0lHX1R5cGVEeW5hbWljQ2FzdChzd2lnX3R5cGVfaW5mbyAqLCB2b2lkICoqcHRyKTsKCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIGFub3RoZXIKICAgICAgICAgICAgdHlwZS4gIElmIHNvLCBhIGRpZmZlcmVudCB0eXBlIGRlc2NyaXB0b3IgKGZvciB0aGUgY29udmVydGVkIHR5cGUpCiAgICAgICAgICAgIGlzIHJldHVybmVkLiAgIFRoaXMgdHlwZSBkZXNjcmlwdG9yIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUKICAgICAgICAgICAgYSBwb2ludGVyIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgogICAgICAgICAgICBUbyB1c2UgdGhpcywgeW91IHdvdWxkIHdyaXRlIGEgdHlwZW1hcCBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqIHsKICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFNXSUdfVHlwZUR5bmFtaWNDYXN0KCQxX2Rlc2NyaXB0b3IsICh2b2lkICoqKSAmJDEpOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IFNXSUdfTmV3UG9pbnRlck9iaigkMSwgdHkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksCgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqID0gU1dJR1RZUEUgKkRZTkFNSUM7CgogICAgICAgICAgICBUbyBtYWtlIHRoZSB0eXBlbWFwIGhhdmUgYW55IGVmZmVjdCwgeW91IGhhdmUgdG8gd3JpdGUgYSBzdXBwb3J0aW5nIAogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBwZXJmb3JtIGRvd25jYXN0aW5nLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICBzdGF0aWMgc3dpZ190eXBlX2luZm8gKgogICAgICAgICAgICAgIE5vZGVfZHluYW1pY19jYXN0KHZvaWQgKipwdHIpIHsKICAgICAgICAgICAgICAgICBOb2RlICoqbnB0ciA9IChOb2RlICoqKSBwdHI7CiAgICAgICAgICAgICAgICAgRWxlbWVudCAqZSA9IGR5bmFtaWNfY2FzdDxFbGVtZW50ICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERhdGEgKmQgPSBkeW5hbWljX2Nhc3Q8RGF0YSAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9EYXRhOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIGhvdyB0eXBlcyBhcmUgZGV0ZXJtaW5lZC4gZHluYW1pY19jYXN0PD4KICAgICAgICAgICAgdXNlcyBDKysgUlRUSS4gIEhvd2V2ZXIsIGlmIHlvdSBoYWQgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIGRldGVybWluaW5nCiAgICAgICAgICAgIHRoZSB0eXBlLCB5b3UgY291bGQgdXNlIHRoYXQgaGVyZS4gIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0byBzYXZlCiAgICAgICAgICAgIHRoZSBuZXcgcG9pbnRlciB2YWx1ZSBiYWNrIGludG8gdGhlIGFyZ3VtZW50IGFzIHNob3duLiAgV2hlbiBkb3duY2FzdGluZywKICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGNvdWxkIGNoYW5nZS4gCgogICAgICAgICAgICBGaW5hbGx5LCB0byBtYWtlIHRoZSBjYXN0aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSwgeW91IGhhdmUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgaXQgd2l0aCB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyLiBQdXQgdGhpcyBtYWNybyBpbiB5b3VyIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAgICAgRFlOQU1JQ19DQVNUKFNXSUdUWVBFX3BfTm9kZSwgTm9kZV9keW5hbWljX2Nhc3QpOwoKICAgICAgICAgICAgTm90ZTogdGhpcyBmZWF0dXJlIGRvZXMgbm90IGludHJvZHVjZSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gCiAgICAgICAgICAgIG5vcm1hbCBTV0lHIG9wZXJhdGlvbi4gIFRoZSBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBieSB3cml0aW5nCiAgICAgICAgICAgIGEgbmV3IHR5cGVtYXAgdGhhdCBleHBsaWNpdGx5IGNhbGxzIFNXSUdfVHlwZUR5bmFtaWNDYXN0KCkgdG8KICAgICAgICAgICAgbWFrZSBhIGNvbnZlcnNpb24uIAogIAogICAgICAgICAgICBFeGFtcGxlcy90ZXN0LXN1aXRlL2R5bmFtaWNfY2FzdC5pIGNvbnRhaW5zIGEgc2ltcGxlIGV4YW1wbGUuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBKYXZhIG1vZHVsZSBkdWUgdG8gZGlmZmVyZW5jZXMKICAgICAgICAgICAgaW4gdGhlIHR5cGUtY2hlY2tpbmcgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgowMy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNtYWxsIGNoYW5nZSB0byB0eXBlLW5hbWUgaGFuZGxpbmcgb2YgdW5uYW1lZCBzdHJ1Y3R1cmVzIGFuZAogICAgICAgICAgICB0eXBlZGVmLiAgSWYgYSBzdHJ1Y3R1cmUgb2YgdGhpcyBmb3JtIGFwcGVhcnM6CgogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgVGhlbiAnRm9vJyBpcyB1c2VkIGFzIHRoZSBwcm9wZXIgdHlwZW5hbWUgZm9yIHRoZSBzdHJ1Y3R1cmUuCiAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCBGb28gY2FuIG5vdyBiZSB1c2VkIGFzIGEgbmFtZSBpbiBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIFNXSUcgd2FzIGFscmVhZHkga2luZCBvZiBkb2luZyB0aGlzLCBidXQgdGhpcyBtb2RpZmljYXRpb24gcmVmaW5lcwogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdG8gbW9yZSBjbG9zZWx5IGZvbGxvdyB0aGUgQysrIEFSTSwgc2VjdGlvbgogICAgICAgICAgICA3LjEuMywgcC4gMTA2LiAgVGhpcyBmaXhlcyBhIGNvdXBsZSBvZiBvYnNjdXJlIGNvcm5lciBjYXNlcy4KCjAzLzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgQysrIGluaGVyaXRhbmNlIHdpdGggYSBmZXcgZW5oYW5jZW1lbnRzLiAgRmlyc3QsIHR5cGUgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmVlZGVkIGZvciBjYXN0aW5nIGFuZCB0eXBlLWVxdWl2YWxlbmNlIGlzIGdlbmVyYXRlZCBldmVuIHdoZW4gYmFzZS1jbGFzc2VzCiAgICAgICAgICAgIGFyZW4ndCBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyICB7ICAgIC8qIEJhciB1bnNwZWNpZmllZCAqLwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB2b2lkIGJsYWgoQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJsYWgoKSBmdW5jdGlvbiBzdGlsbCBhY2NlcHRzIEZvbyAqIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICAgICAgICAgICAgaXMgcmVhbGx5IGtub3duIGFib3V0IEJhci4gICBQcmV2aW91cyBTV0lHIHZlcnNpb25zIHdvdWxkIGp1c3QgZ2VuZXJhdGUKICAgICAgICAgICAgYSB0eXBlIGVycm9yLgoKICAgICAgICAgICAgSW5oZXJpdGFuY2UgaGFzIGFsc28gYmVlbiBtb2RpZmllZCB0byB3b3JrIHRocm91Z2ggdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgQmFyIE90aGVyQmFyOwogICAgICAgICAgICAgICBjbGFzcyBGb286IHB1YmxpYyBPdGhlckJhciB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJhc2UgY2xhc3Mgb2YgT3RoZXJCYXIgaXMgY29ycmVjdGx5IHJlc29sdmVkIGJhY2sgdG8KICAgICAgICAgICAgQmFyLiAgIFRoZSB1c2Ugb2YgdGhlIG5hbWUgT3RoZXJCYXIgaXMgbG9zdCBpbiB0aGlzIHJlc29sdXRpb24gKHRoZSB3cmFwcGVycwogICAgICAgICAgICB3aWxsIHNpbXBseSB1c2UgQmFyIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBPdGhlckJhcikuCiAgICAgICAgICAgCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXR5cGVtYXAsICVhcHBseSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBjYW4gbm93IGFwcGVhciBpbnNpZGUKICAgICAgICAgICAgY2xhc3MgZGVmaW5pdGlvbnMuICAgCgowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIGNvbXBpbGluZyBTV0lHIG9uIDY0LWJpdAogICAgICAgICAgICBwbGF0Zm9ybXMuCgowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCAiaWdub3JlIiBhbmQgImluIiB0eXBlbWFwcy4gIExvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggImluIiB3ZXJlIGJlaW5nIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIHRoZXkgd2VyZSBuZXZlciB1c2VkLiAgIE1vc3RseSBoYXJtbGVzcywgYnV0IGl0IHdvdWxkIGxlYWQKICAgICAgICAgICAgdG8gYSB2YXJpZXR5IG9mIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgogIAowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWwgdHlwZSBzeXN0ZW0gYW5kIGhhbmRsaW5nIG9mIG5lc3RlZCBDKysKICAgICAgICAgICAgdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzb21lbWV0aG9kKEJsYWggeCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3b3VsZCBpbXBsaWNpdGx5IGJlIHNldCB0byBCYXI6OkJsYWguCiAgICAgICAgICAgIEFsdGhvdWdoIHRoaXMgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCwgaXQgYnJlYWtzIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb286OkJsYWggeyAuLi4gfQoKICAgICAgICAgICAgZG9lc24ndCBtYXRjaCBsaWtlIHlvdSBleHBlY3QuICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGluIFNXSUctMS4zLjEyLgogICAgICAgICAgICBOb3csIHR5cGVzIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY2xhc3MgaW4gd2hpY2ggdGhleSB3ZXJlIGRlZmluZWQuCiAgICAgICAgICAgIFNvLCB0aGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd2lsbCBiZSBGb286OkJsYWgtLS1zaW5jZSB0aGUKICAgICAgICAgICAgdHlwZSBCbGFoIHdhcyBkZWZpbmVkIGluIEZvby4KIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgc3VidGxlIHR5cGUgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHR5cGVkZWYgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgQmxhaDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhCbGFoIHgsIDo6QmxhaCB5KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsIGNoYW5nZSB0byBoYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KICAgICAgICAgICAgRmlyc3QsIHRoZXJlIGlzIG5vIHBvcnRhYmxlIG9yIHJlbGlhYmxlIHdheSB0byB3cmFwCiAgICAgICAgICAgIGEgdmFyYXJncyBmdW5jdGlvbiBpbiBmdWxsIGdlbmVyYWxpdHkuICBIb3dldmVyLCB5b3UgKmNhbiogY2hhbmdlCiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgdXNpbmcgJXZhcmFyZ3MuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICopIGZwcmludGY7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCAuLi4pOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlciAiLi4uIiBpcwogICAgICAgICAgICBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gJXZhcmFyZ3MuIFRoaXMKICAgICAgICAgICAgcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIGNoYXIgKnMpOwoKICAgICAgICAgICAgTW9yZSB0aGFuIG9uZSBhcmd1bWVudCBjYW4gYmUgdXNlZCBhbmQgZGVmYXVsdCB2YWx1ZXMKICAgICAgICAgICAgY2FuIGJlIGRlZmluZWQuICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIHNwZWNpZmllcyBhCiAgICAgICAgICAgIG1heGltdW0gb2YgZm91ciBhcmd1bWVudHMuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICp4MSA9IDAsIGNoYXIgKngyID0gMCwgY2hhciAqeDMgPSAwLCBjaGFyICp4NCA9IDApIGZwcmludGY7CiAKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byBoYW5kbGluZyBvZiB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLiAgdmFyYXJncwogICAgICAgICAgICBpcyBub3cgaGFuZGxlZCBhcyBhIHByb3BlciBwYXJhbWV0ZXIgYW5kIGlzIHBhc3NlZCB0byB0aGUKICAgICAgICAgICAgY29kZSBnZW5lcmF0b3IuICBIb3dldmVyLCBpdCBzdGlsbCBjYW4ndCBiZSBoYW5kbGVkIGNvcnJlY3RseQogICAgICAgICAgICAoYW5kIHdpbGwgZ2VuZXJhdGUgYSB0eXBlbWFwIHdhcm5pbmcpLiAgIFRoaXMgY2hhbmdlIGhhcyBiZWVuCiAgICAgICAgICAgIG1hZGUgdG8gYmV0dGVyIGluY29ycG9yYXRlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgd2l0aCBvdGhlcgogICAgICAgICAgICBkaXJlY3RpdmVzIHN1Y2ggYXMgJWlnbm9yZSwgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MjI1NTUgXSBTeW50YXggZXJyb3IgcGFyc2luZyAiZGVmaW5lIiBjb25zdHJ1Y3QuIFNXSUcKICAgICAgICAgICAgaXMgYSBsaXR0bGUgbW9yZSByZXN0cmljdGl2ZSBpbiBkZXRlcm1pbmluZyAjZGVmaW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYXMgY29uc3RhbnRzLiAgQWxzbyBhZGRlZCBhIGJldHRlciBwYXJzZXIKICAgICAgICAgICAgZXJyb3IgcnVsZSBmb3IgaGFuZGxpbmcgYmFkIGNvbnN0YW50cy4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogQ2xhc3NlcyByZW5hbWVkIHdpdGggJXJlbmFtZSB0aGF0IGFyZSBkZXJpdmVkIGZyb20gCiAgICAgICAgICAgIGFub3RoZXIgY2xhc3MgZ2VuZXJhdGUgbW9yZSBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgY29kZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgU0YgWyAjNTIzNjMyIF0gYW5kIFsgIzUxMzMzNSBdIGJvdGggcmVwb3J0ZWQgYnkgSXNyYWVsIAogICAgICAgICAgICBUYW5uZXIuIFN1cHBvcnQgZm9yIHR5cGVzIHRoYXQgYXJlIHVzZWQgd2hpY2ggYXJlIGluIGEgdHlwZWRlZi4gVGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBuYW1lIGlzIGdlbmVyYXRlZC4gQWxzbyBnZW5lcmF0ZWQgY29ycmVjdAogICAgICAgICAgICBzaGFkb3cgY2xhc3NuYW1lIHdoZW4gYSB0ZW1wbGF0ZWQgY2xhc3MgaXMgdXNlZCB3aXRoaW4gYW5vdGhlciAKICAgICAgICAgICAgdGVtcGxhdGVkIGNsYXNzLiBTZWUgdGhlIGNwcF90eXBlZGVmLmkgdGVzdGNhc2UuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIHR5cGUgd2FzIGdlbmVyYXRlZCBpbiBzaGFkb3cgY2xhc3NlcyBmb3IgdHlwZXMgCiAgICAgICAgICAgIHRoYXQgd2VyZW4ndCB3cmFwcGVkIGJ5IFNXSUcuICBUaGUgdHlwZSBpcyB0cmVhdGVkIGFzIGEgcmF3IAogICAgICAgICAgICBwb2ludGVyLCBpZSBubyBzaGFkb3cgY2xhc3MuCgowMi8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSB1c2VkIGJ5ICVyZW5hbWUsICVpZ25vcmUsIGFuZAogICAgICAgICAgICAlZmVhdHVyZS4gICBJZiBhIHR5cGUgc2lnbmF0dXJlIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGV4YWN0bHkKICAgICAgICAgICAgbWF0Y2ggdGhhdCB1c2VkIGluIHRoZSBkZWNsYXJhdGlvbi0tLWluY2x1ZGluZyBhbnkgdXNlIG9mCiAgICAgICAgICAgIGNvbnN0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb28xKSAgIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgJXJlbmFtZShiYXIxKSAgIGJhcihpbnQpIGNvbnN0OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsgICAgICAgLy8gTWF0Y2hlZCAtLT4gZm9vMQogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KSBjb25zdDsgLy8gTm90IG1hdGNoZWQgCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOyAgICAgICAvLyBOb3QgbWF0Y2hlZAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KSBjb25zdDsgLy8gTWF0Y2hlZCAtLT4gYmFyMQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgbm9uLWNvbnN0IHNwZWNpZmljYXRpb24gd291bGQgbWF0Y2gKICAgICAgICAgICAgYm90aCB0aGUgbm9uLWNvbnN0IGFuZCBjb25zdCBkZWNsYXJhdGlvbnMuICBIb3dldmVyLCB0aGUgd2hvbGUKICAgICAgICAgICAgcG9pbnQgb2YgJXJlbmFtZSBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGlzIHRoYXQgdGhleSBiZSBhYmxlCiAgICAgICAgICAgIHRvIHByZWNpc2VseSBwaW5wb2ludCBleGFjdCBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgVGhpcwogICAgICAgICAgICBmaXhlcyB0aGUgcHJvYmxlbS4KCjAyLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzLgogICAgICAgICAgICBTV0lHIG5vdyBtYWtlcyBhIHByZWxpbWluYXJ5IHBhc3Mgb3ZlciB0aGUgcGFyc2UgdHJlZSB0byBkaXNjb3ZlcgogICAgICAgICAgICB3aGljaCBjbGFzc2VzIHN1cHBvcnQgZGVmYXVsdCBhbGxvY2F0aW9uLiAgIFRoaXMgZml4ZXMgYSBudW1iZXIKICAgICAgICAgICAgb2YgdmVyeSBzdWJ0bGUgaXNzdWVzIGluIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY2FsbC9yZXR1cm4gYnkgdmFsdWUuCgowMi8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBvbiBDeWd3aW46IFBlcmwsIFB5dGhvbiwgVGNsLCBSdWJ5IGFuZCBKYXZhIHNob3VsZAogICAgICAgICAgICB3b3JrIG91dCBvZiB0aGUgYm94LCBiYXJyaW5nIHRoZSBydW50aW1lIGxpYnJhcnkuIFJlbW92ZWQgZGxsd3JhcCAKICAgICAgICAgICAgYW5kIHJlcGxhY2VkIHdpdGggbmV3bHkgd29ya2luZyBnY2MgLXNoYXJlZCBpbnN0ZWFkIGZvciBDeWd3aW4uIAogICAgICAgICAgICBBbGwgdGhpcyB3aWxsIHJlcXVpcmUgdGhlIG5ldyBpbXByb3ZlZCBiaW51dGlscyAyMDAxMDgwMiBhbmQgbGF0ZXIsCiAgICAgICAgICAgIGJ1dCB0aGUgbGF0ZXN0IEN5Z3dpbiBpcyB1c3VhbGx5IHRoZSBiZXN0IHJlY29tbWVuZGF0aW9uLgoKMDIvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICBhbmQgUGVybCBzaGFkb3cgY2xhc3Nlcy4gUmVwb3J0ZWQgYnkgQ2hpYS1saWFuZyBLYW8uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZpeCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciBDKysgY2xhc3MKICAgICAgICAgICAgY29uc3RydWN0b3JzIHNvIHRoYXQgd2UgZ2V0IGJvdGggYSAibmV3IiBzaW5nbGV0b24gbWV0aG9kCiAgICAgICAgICAgIGFuZCBhbiAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvciBlYWNoIGNsYXNzLiBUaGlzCiAgICAgICAgICAgIGNoYW5nZSBlbmFibGVzIGRldmVsb3BlcnMgdG8gZGVyaXZlIG5ldyBSdWJ5IGNsYXNzZXMgZnJvbQogICAgICAgICAgICBTV0lHLXdyYXBwZWQgQysrIGNsYXNzZXMgYW5kIHRoZW4gb3ZlcnJpZGUgdGhlaXIgaW5pdGlhbGl6ZQogICAgICAgICAgICBtZXRob2RzIHRvIHByb3ZpZGUgc3ViY2xhc3Mtc3BlY2lmaWMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFzc2l2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBmb3IgdGhlIFJ1YnkgbW9kdWxlLAogICAgICAgICAgICBjb250cmlidXRlZCBieSBDcmFpZyBGaWxlcy4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBBbiBlcnJvciBpbiB0aGUgU1dJRyBydW50aW1lIHN1cHBvcnQgZm9yIFJ1YnkKICAgICAgICAgICAgd2FzIGNhdXNpbmcgc2V2ZXJhbCBvZiB0aGUgZXhhbXBsZXMgdG8gZmFpbC4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogRW51bWVyYXRpb25zIGRlZmluZWQgd2l0aGluIGEgY2xhc3MgKHN1Y2gKICAgICAgICAgICAgYXMgdGhvc2Ugc2VlbiBpbiB0aGUgRXhhbXBsZXMvcnVieS9lbnVtIGV4YW1wbGUpIHdlcmUgbm90CiAgICAgICAgICAgIGJlaW5nIGV4cG9ydGVkIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMuIFJlcG9ydGVkIGJ5IFdpbGxpYW0KICAgICAgICAgICAgRnVsdG9uLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIHdoZW4gd2UgcnVuIGFjcm9zcyBvdmVybG9hZGVkCiAgICAgICAgICAgIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgQysrIGNvZGUsIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgbm90CiAgICAgICAgICAgIHN1cHBvcnRlZCAoZXZlbiBpZiB0aGUgb3ZlcmxvYWRzIGhhdmUgYmVlbiAlcmVuYW1lZCkuIEZvciBhbgogICAgICAgICAgICBleGFtcGxlIG9mIHdoZXJlIHRoaXMgZG9lc24ndCB3b3JrLCBzZWUgRXhhbXBsZXMvcnVieS9vcGVyYXRvci4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhbiAiaWdub3JlZCIgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlIHBhcnNlciBydW5zCiAgICAgICAgICAgIGFjcm9zcyBhbiBvcGVyYXRvciE9KCkgZGVjbGFyYXRpb24gZm9yIEMrKyBjb2RlLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiaW1wb3J0IiwgImltcG9ydF90ZW1wbGF0ZSIsICJvcGVyYXRvciIgYW5kCiAgICAgICAgICAgICJ0ZW1wbGF0ZSIgZXhhbXBsZXMuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbXVsdGktbW9kdWxlIHN1cHBvcnQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIG1pc3NpbmcgIiNkZWZpbmUgU1dJR19OT0lOQ0xVREUiIGF0IHRoZSB0b3Agb2YKICAgICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3aGVuIHRoZSAnLWMnIG9wdGlvbiBpcyB1c2VkLgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgQ29ycmVjdGVkIGEgbWlub3Igb2ZmLWJ5LW9uZSBlcnJvciBmb3IgdGhlIHNpemUgb2YgdGhlCiAgICAgICAgICAgIHN3aWdfdHlwZXNbXSBhcnJheSB0aGF0J3MgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyIGNvZGUuCgowMi8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFNGIFsgIzUxNTA1OCBdIFdyb25nIGNvZGUgZm9yIEMrKyB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgpWZXJzaW9uIDEuMy4xMSAoSmFudWFyeSAzMSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBwYXNzL3JldHVybiBieSB2YWx1ZSBmb3IgQysrIG9iamVjdHMgdGhhdCBkZWZpbmUKICAgICAgICAgICAgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgdG8gdGhlIHR5cGVtYXAgc3lzdGVtCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB3cmFwIEMrKyBvYmplY3RzIHdpdGggbm8gZGVmYXVsdAogICAgICAgICAgICBjb25zdHJ1Y3Rvci4gICBUaGlzIGhhcyBiZWVuIGZpeGVkLCBidXQgdGhlIHNvbHV0aW9uIAogICAgICAgICAgICBpbnZvbHZlcyBzb21lIGNsZXZlciB0ZW1wbGF0ZSBtYWdpYyBjb250cmlidXRlZCBieSAKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uICBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiB0aGUgZmlsZQogICAgICAgICAgICBMaWIvc3dpZy5zd2cgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoaXMgc29sdXRpb24gaXMKICAgICAgICAgICAgZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmVmaW5lZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBHbG9iYWwgdmFyaWFibGVzIGFuZCBtZW1iZXIgZGF0YSBvZiB0eXBlICJjb25zdCBjaGFyICoiCiAgICAgICAgICAgIGNhbiBiZSBzZXQsIGJ1dCB0aGUgb2xkIHZhbHVlIGlzIHNpbGVudGx5IGRpc2NhcmRlZCB3aXRob3V0CiAgICAgICAgICAgIGFueSBnYXJiYWdlIGNvbGxlY3Rpb24uICAgVGhpcyBtYXkgZ2VuZXJhdGUgYSBtZW1vcnkgbGVhay4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIHRvIG1vcmUgc2FmZWx5IGhhbmRsZSB2YXJpYWJsZXMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvbyA9ICJIZWxsbyBXb3JsZFxuIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQncyBub3Qgc2FmZSB0byBmcmVlIHRoZSBvbGQgdmFsdWUuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIGNhbiBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG5ldyB2YWx1ZSBhbmQgbWFrZSBmb28gcG9pbnQKICAgICAgICAgICAgdG8gaXQuICAgVG8gZml4IHRoaXMgbWVtb3J5IGxlYWssIHlvdSBjYW4gcHJvYmFibHkgZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjbGVhciBjb25zdCBjaGFyICpmb287CiAgICAgICAgICAgICAgICVhcHBseSBjaGFyICoge2NvbnN0IGNoYXIgKmZvb307CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG1pbm9yIHR5cGVtYXAgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4gIEZpcnN0LAogICAgICAgICAgICB0eXBlbWFwcyBjYW4gaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgaW5jbHVkaW5nIGEgc3BlY2lhbAogICAgICAgICAgICB3YXJuaW5nIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoaW4sd2FybmluZz0iSSdtIGdvaW5nIHRvIGRvIHNvbWV0aGluZyBkYW5nZXJvdXMiKSAuLi4KCiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBzaG93IHVwIHdoZW5ldmVyIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFwcGxpZWQuCgogICAgICAgICAgICBTZWNvbmQsIGEgdHlwZW1hcCBjYW4gZm9yY2UgYSBuby1tYXRjaCBieSBkZWZpbmluZwoKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzb21ldHlwZSAicGFzcyI7CgogICAgICAgICAgICBJZiB0aGlzIGlzIHVzZWQsIHRoZSB0eXBlbWFwIHN5c3RlbSB3aWxsICpub3QqIHJlY29yZCBhCiAgICAgICAgICAgIHR5cGVtYXAgbWF0Y2ggZm9yICJzb21ldHlwZSIuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBibG9jawogICAgICAgICAgICBzZWxlY3RlZCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGRpc2FibGUKICAgICAgICAgICAgYSB0eXBlbWFwIGZlYXR1cmUgZm9yIHNvbWUgdHlwZSwgeW91IGNvdWxkIGRvIHRoaXMuCgogICAgICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0eXBlICdjb25zdCBjaGFyIConIHRvIGJlIHNldC4KICAgICAgICAgICAgICAgJXR5cGVtYXAodmFyaW4pIGNvbnN0IGNoYXIgKiAicGFzcyI7CgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pICAgICBjb25zdCBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgaW5wdXQgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgKFRoaXMgcG90ZW50aWFsIGFwcGxpY2F0aW9ucyBvZiB0eXBlbWFwcyBzdWdnZXN0ZWQgYnkgR3JlZyBTdGVpbikuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzI5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyBlbnVtZXJhdGlvbnMgd2VyZSB3cmFwcGVkIHdoZW4gdGhlIC1zaGFkb3cgCiAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLiBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKMDEvMjgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEdsb2JhbCBhcnJheXMgYXJlIHN1Y2Nlc3NmdWxseSB3cmFwcGVkLiBJbiBmYWN0IHRoZXkgc3RhcnRlZAogICAgICAgICAgIG1vc3RseSB3b3JraW5nIGluIFNXSUctMS4zLjEwLgoKMDEvMjgvMjAwMjpyaWNoYXJkcAoJICAgQWRkZWQgZmlyc3QgYXR0ZW1wdCBhdCBDKysgYW5kIC1zaGFkb3cgc3VwcG9ydCBmb3IgUEhQNCBtb2R1bGUsCgkgICBwbGVhc2UgdGVzdCBhbmQgbWFpbCBtZSBpZiBhbnkgcHJvYmxlbXMvaWRlYXMgb24gaW1wcm92aW5nIGl0LgoKCSAgIFRoZXJlIGlzIGEga25vd24gcHJvYmxlbSB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtYmVyIHZhcmlhYmxlcywKCSAgIHBsZWFzZSBzZWUgRXhhbXBsZXMvcGhwNC9zeW5jL1JFQURNRSBmb3IgZGV0YWlscy4KCgkgICBBbHNvIG1vcmUgUEhQIGRvY3VtZW50YXRpb24gYWRkZWQgdG8gRG9jL01hbnVhbC9QaHAuaHRtbAoKMDEvMjcvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgVGhlIEFOU0kgQyBzaXplX3QgdHlwZSBpcyBub3cgcmVjb2duaXplZCBhcyBhbiBpbnRlZ2VyIGJ5IGRlZmF1bHQuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyBzdXBwb3J0IGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICBUaGlzIGlzIG5vdCBhIHBvcnRhYmxlIGZlYXR1cmUgYW5kIHdpbGwgcmVxdWlyZSBjb21waWxlciBzdXBwb3J0CiAgICAgICAgICAgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gIEluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgICAgICAgIGxvbmcgbG9uZyAoZS5nLiwgVGNsIGFuZCBQZXJsKSwgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nCiAgICAgICAgICAgb2YgZGlnaXRzLiAgVGhpcyBwcmV2ZW50cyB0aGVpciB1c2UgaW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMsIGJ1dAogICAgICAgICAgIHN0aWxsIGFsbG93cyB2YWx1ZXMgdG8gYmUgc2V0IGZyb20gYSBzdHJpbmcuICAKCiAgICAgICAgICAgbG9uZyBsb25nIHN1cHBvcnQgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgc3RydG9sbCgpIGFuZCBzdHJ0b3VsbCgpCiAgICAgICAgICAgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlICdsbGQnIGFuZCAnbGx1JyBmb3JtYXQgc3BlY2lmaWVycwogICAgICAgICAgIG9mIHNwcmludGYoKS4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzUwMTgyNyBdIERlbGV0ZSBtZXRob2QgaXMgbm90IGNhbGxlZC4gICBUaGUgVGNsCiAgICAgICAgICAgbW9kdWxlIHdhc24ndCBjb3JyZWN0bHkgY2FsbGluZyBkZXN0cnVjdG9ycyB3aGVuIHRoZXkKICAgICAgICAgICB3ZXJlIGRlZmluZWQgdXNpbmcgJWFkZG1ldGhvZHMuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFJlaW5oYXJkIEZvYmJlLgoKMDEvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4gIFR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIGEgbnVtYmVyIG9mIG1vZHVsZXMgZm9yIGhhbmRsaW5nIHRoZXNlIHR5cGVzLgogICAgICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcGFyc2VyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFjY2VwdCBsb25nIGxvbmcKICAgICAgICAgICBsaXRlcmFscyBzdWNoIGFzIDEyMzRMTCBhbmQgMTIzNFVMTC4KCjAxLzI3LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBBIEMgY2hhcltdIGlzIG1hcHBlZCB0byBhIEphdmEgU3RyaW5nIHdoaWNoIGlzIHRoZSBkZWZhdWx0IAogICAgICAgICAgIFNXSUcgaGFuZGxpbmcgb2YgY2hhcltdIGFuZCBjaGFyKi4gSXQgdXNlZCB0byBiZSBtYXBwZWQgdG8gYnl0ZVtdLiAKICAgICAgICAgICBOb3RlIHRoYXQgYSBDIHNpZ25lZCBjaGFyW10gYXJyYXkgaXMgbWFwcGVkIHRvIGJ5dGVbXS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowMS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggcmV0dXJuLWJ5LXZhbHVlLCBDKyssIGFuZAogICAgICAgICAgIG9iamVjdHMgdGhhdCBkZWZpbmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2VsIFJlZWQuCgowMS8yNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gT3ZlcmhhdWwgb2YgdGhlIEphdmEgbW9kdWxlLiBUaGUgQyBjb2RlIGdlbmVyYXRpb24gaXMgbm93IAogICAgICAgICAgIGRvbmUgZnJvbSB0eXBlbWFwcy4KCjAxLzI0LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBTdXBwb3J0IGZvciBhcnJheXMgb2YgZW51bSBwb2ludGVycwoKMDEvMjAvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEVycm9yIGNoZWNraW5nIGZvciBudWxsIEphdmEgb2JqZWN0cyBiZWluZyBwYXNzZWQgdG8gbmF0aXZlIAogICAgICAgICAgIGZ1bmN0aW9ucy4gIEV4Y2VwdGlvbiB0aHJvd24gbm93IHdoZXJlYXMgYmVmb3JlIHRoZSBKVk0gY3Jhc2hlZC4KCjAxLzE4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDb3JyZWN0ZWQgYmVoYXZpb3VyIGZvciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFycmF5cy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIHdoZW4gdGhpcyBjIGZ1bmN0aW9uOiAKCiAgICAgICAgICAgdm9pZCBhcnJheWZuKGludCBhcnJheVtdKTsKICAgICAgICAgICAKICAgICAgICAgICBpcyB3cmFwcGVkIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBmdW5jdGlvbgoKICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGFycmF5Zm4oaW50W10gYXJyYXkpOwoKICAgICAgICAgICBpcyBwcm9kdWNlZC4gUHJldmlvdXNseSBpZiB0aGUgQyBmdW5jdGlvbiBtYWRlIGFueSBjaGFuZ2VzIHRvIHRoZSAKICAgICAgICAgICBhcnJheSBlbGVtZW50cywgdGhlc2Ugd2VyZSBub3QgcmVmbGVjdGVkIGJhY2sgaW50byB0aGUgSmF2YSBhcnJheS4gCiAgICAgICAgICAgVGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkIHNvIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHByb3BvZ2F0ZWQgYmFjawogICAgICAgICAgIHRvIEphdmEgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgc2VlIHRoZXNlIGNoYW5nZXMuIFRoaXMgaXMgCiAgICAgICAgICAgaG93IHB1cmUgSmF2YSBmdW5jdGlvbnMgd29yaywgaWUgYXJyYXlzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgoKMDEvMTUvMjAwMjpta29lcHBlCiAgICAgICAgICAgW0d1aWxlXSBOZXcgZmlsZSBjcGx1c3BsdXMuaSB3aXRoIEMrKyB0eXBlbWFwcyBjb250cmlidXRlZAogICAgICAgICAgIGJ5IE1hcmNpbyBMdWlzIFRlaXhlaXJhIDxtYXJjaW90QGhvbGx5LmNvbG9zdGF0ZS5lZHU+LgoKMDEvMTEvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENoYW5nZWQgbWFwcGluZyBvZiBDIGxvbmcgdG8gSmF2YSB0eXBlLiBXYXMgbWFwcGVkIHRvIEphdmEKICAgICAgICAgICBsb25nLCBub3cgbWFwcGVkIHRvIEphdmEgaW50LiBJZiB5b3Ugd2FudCB0aGUgcHJldmlvdXMgbWFwcGluZyB0byAKICAgICAgICAgICBKYXZhIGxvbmcgdXNlIHRoaXMgYXBwcm9hY2ggaW4geW91ciBpbnRlcmZhY2UgZmlsZToKICAgICAgICAgICAKICAgICAgICAgICAgICVjbGVhciBsb25nOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nICAgICAgICAgICAgICJqbG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nICAgICAgICAgICAibG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZyAgICAgICAgICAibG9uZyIKCiAgICAgICAgICAgICAlY2xlYXIgbG9uZ1tBTlldOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nW0FOWV0gICAgICAgICJqbG9uZ0FycmF5IgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmdbQU5ZXSAgICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmdbQU5ZXSAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBsb25nW0FOWV0gICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGxvbmdbQU5ZXSAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBsb25nW0FOWV0gICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGxvbmdbQU5ZXSAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBUaGlzIG5ldyBtYXBwaW5nIGlzIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiBpbnRlcmZhY2luZyB0byAzMiBiaXQgCiAgICAgICAgICAgYXBwbGljYXRpb25zIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBjdXJyZW50IDMyLWJpdCBKVk1zLiBGb3IgZnV0dXJlIAogICAgICAgICAgIDY0LWJpdCBKVk1zIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlc2UgbWFwcGluZ3MgLSBlZyBvbiBVbml4IExQNjQgCiAgICAgICAgICAgc3lzdGVtcywgYnV0IG5vdCBvbiBNaWNyb3NvZnQgNjRiaXQgV2luZG93cyB3aGljaCB3aWxsIGJlIHVzaW5nIGEgCiAgICAgICAgICAgUDY0IElMMzIgbW9kZWwuIFRoaXMgbWF5IGJlIGF1dG9tYXRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNXSUcuCgowMS8xMC8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbIDUwMTY3NyBdICVpbml0IGJsb2NrIGluIHdyb25nIHBsYWNlLiBSZXBvcnRlZAogICAgICAgICAgIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDEvMDkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIERlZmF1bHQgc3VwcG9ydCBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiBzaWduZWQgbG9uZyBsb25nIGlzIAogICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgbG9uZy4gdW5zaWduZWQgbG9uZyBsb25nIGlzIG1hcHBlZCB0byBCaWdJbnRlZ2VyLgoKMDEvMDkvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRXhwZXJpbWVudGFsIGNoYW5nZSB0byBwYXJzZXIgdG8gYmV0dGVyIHN1cHBvcnQgbWl4aW5nIG9mCiAgICAgICAgICAgaW50LCBsb25nLCBzaG9ydCwgdW5zaWduZWQsIGZsb2F0LCBhbmQgZG91YmxlLiAgIFRoZSBwYXJzZXIKICAgICAgICAgICBzaG91bGQgbm93IHN1cHBvcnQgdHlwZXMgbGlrZSB0aGlzOgogICAgCiAgICAgICAgICAgICAgICBzaG9ydCB1bnNpZ25lZCBpbnQKICAgICAgICAgICAgICAgIGludCAgIHVuc2lnbmVkIHNob3J0CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaG9ydAoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmFibGVzIGEgdHlwZSBvZiAnbG9uZyBkb3VibGUnIChwcmV2aW91c2x5CiAgICAgICAgICAgIHVuc3VwcG9ydGVkKSB0byBiZSB1c2VkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2FzdGluZyBmaXggZm9yIHdoZW4gZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSBwb2ludGVyIGFzIAogICAgICAgICAgIHJlcG9ydGVkIGJ5IEdhcnkgUGVubmluZ3RvbiAyMDAyLTAxLTA1LiBUaGUgdXBwZXIgMzJiaXRzIG9mIHRoZSAKICAgICAgICAgICA2NCBiaXQgamxvbmcgd2lsbCBoYXZlIGNvbnRhaW5lZCBqdW5rIGZvciAzMmJpdCBwb2ludGVycy4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgcG9pbnRlciBoYW5kbGluZyBpbiBKYXZhIGlzIHBvc3NpYmxlIGFzIHRoZSAKICAgICAgICAgICBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBoYXZlIGJlZW4gYWRkZWQgaW50byB0eXBlbWFwcy5pLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdICRudWxsIGNhbiBiZSB1c2VkIGluIGlucHV0IHR5cGVtYXBzIHRvIHJldHVybiBlYXJseSBmcm9tIEpOSSAKICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBoYXZlIGVpdGhlciB2b2lkIG9yIGEgbm9uLXZvaWQgcmV0dXJuIHR5cGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2spIGludCAqICV7IAogICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAlfQoKICAgICAgICAgICBJZiB0aGUgdHlwZW1hcCBnZXRzIHB1dCBpbnRvIGEgZnVuY3Rpb24gd2l0aCB2b2lkIGFzIHJldHVybiwgJG51bGwgCiAgICAgICAgICAgd2lsbCBleHBhbmQgdG8gbm90aGluZzoKCiAgICAgICAgICAgICB2b2lkIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3RoZXJ3aXNlICRudWxsIGV4cGFuZHMgdG8gemVybywgd2hlcmUgamF2YXJldHVybnR5cGUgaXMgZWl0aGVyIGEgCiAgICAgICAgICAgcG9pbnRlciBvciBhIHByaW1pdGl2ZSB0eXBlOgoKICAgICAgICAgICAgIGphdmFyZXR1cm50eXBlIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgowMS8wMi8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gVGhlIEphdmEgbW9kdWxlIGluY29ycmVjdGx5IHVzZWQgYXJnb3V0IHR5cGVtYXBzIGZvciAKICAgICAgICAgICBzdHJpbmdzLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQgYW5kIHRoZSBjb2RlIG5vdyByZXNpZGVzCiAgICAgICAgICAgaW4gdGhlIGZyZWVhcmcgdHlwZW1hcC4gVGhlIGFyZ291dCBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gc3BsaXQgaW50byAKICAgICAgICAgICBhcmdvdXQgYW5kIGZyZWVhcmcgdHlwZW1hcHMuIFRoaXMgY29ycmVjdGlvbiBtYXkgcmVxdWlyZSBzb21lIHVzZXIgCiAgICAgICAgICAgd3JpdHRlbiB0eXBlbWFwcyB0byBiZSBtb2RpZmllZC4gCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gTXVsdGkgdHlwZW1hcHMgbm93IHdvcmtpbmcgZm9yIEphdmEgc2VlIG11bHRpbWFwIGV4YW1wbGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgLSBmcmVlYXJnIHR5cGVtYXAgY29kZSB3YXMgYXBwZWFyaW5nCiAgICAgICAgICAgYmVmb3JlIHRoZSBmdW5jdGlvbiBjYWxsLgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEpDQUxMIG1hY3JvIGZvciBKTkkgY2FsbHMgdGhhdCB3b3JrIGluIGJvdGggQyBhbmQgQysrIHR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggSkNBTEwwLCBKQ0FMTDEsIEpDQUxMMiwgSkNBTEwzIGFuZCBKQ0FMTDQgCiAgICAgICAgICAgbWFjcm9zLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUmVzb2x2ZWQgc29tZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCAlcmVuYW1lIGFuZCBjbGFzcyByZW5hbWluZy4KICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAgQmFyOwoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGVuIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwKICAgICAgICAgICBhbmQgdGhlIGRlc3RydWN0b3IgKGFsbCB3aWxsIGJlIHJlbmFtZWQgdG8gRm9vKS4KCiAgICAgICAgICAgSWYgYSBjbGFzcyBkZWZpbmVzIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IsIHRoZSBvdmVybG9hZGVkIHZhcmlhbnRzCiAgICAgICAgICAgY2FuIHN0aWxsIGJlIHJlbmFtZWQgYnkgc3BlY2lmeWluZyBwYXJhbWV0ZXJzIHRvICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVyZW5hbWUoQmFyX2NvcHkpIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGVyZSBhcmUgc3RpbGwgc29tZSBvZGQgY29ybmVyIGNhc2VzLiAgSWYgeW91IHNwZWNpZnkKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSA6OkJhcjsKCiAgICAgICAgICAgdGhlbiBvbmx5IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBjaGFuZ2VkIGFuZCB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgogICAgICAgICAgIG5hbWVzIGFyZSBsZWZ0IHVubW9kaWZpZWQuICBJZiB5b3Ugc3BlY2lmeSAKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAqOjpCYXI7CgogICAgICAgICAgIHRoZW4gdGhlIG5hbWVzIG9mIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZ1bmN0aW9ucyBhcmUgbW9kaWZpZWQgYnV0CiAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdC4KCjEyLzIxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBqbmksIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMgbm8gbG9uZ2VyIGhhcmRjb2RlZCBidXQgcmVhbCAKICAgICAgICAgICB0eXBlbWFwcy4gTmV3IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiwgJGphdmFjbGFzc25hbWUsIGNhbiBiZSB1c2VkIGluCiAgICAgICAgICAgdGhlIGpzdHlwZSB0eXBlbWFwcy4gSXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgSmF2YSBzaGFkb3cgY2xhc3MgbmFtZQogICAgICAgICAgIHdoZXJlIGFwcGxpY2FibGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgdG8gZG8gd2l0aCBpbmhlcml0YW5jZSB3aGVuIAogICAgICAgICAgIHVzaW5nICVpbXBvcnQuCiAgICAgICAgICAgW0phdmFdIEEgZmV3IG1vcmUgYnVnIGZpeGVzLCB0b2RvIHdpdGggJXJlbmFtZSBhbmQgdXNpbmcgdGhlIGtpbmQKICAgICAgICAgICB3aXRoIHRoZSB0eXBlLCBlZyAKICAgICAgICAgICB2b2lkIGZuKHVuaW9uIHVuaSBteXVuaSwgc3RydWN0IHN0ciBteXN0ciwgY2xhc3MgY2wgbXljbCk7CgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0OTQ1MjQgXSBQcmVwcm9jZXNzb3IgYnVnIC0gYXBvc3Ryb3BoZSBhbmQgI3N1YnN0LgoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgU1dJR19WRVJTSU9OIHByZXByb2Nlc3NvciBzeW1ib2wuICAgVGhpcyBpcyBhIGhleGFkZWNpbWFsCiAgICAgICAgICAgaW50ZWdlciBzdWNoIGFzIDB4MDEwMzExIChjb3JyZXNwb25kaW5nIHRvIFNXSUctMS4zLjExKS4gIFRoaXMgY2FuCiAgICAgICAgICAgYmUgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAjaWYgU1dJR19WRVJTSU9OID49IDB4MDEwMzExCiAgICAgICAgICAgICAgIC8qIFVzZSBzb21lIGZhbmN5IG5ldyBmZWF0dXJlICovCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICBOb3RlOiBUaGUgdmVyc2lvbiBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBTV0lHCiAgICAgICAgICAgd3JhcHBlciBmaWxlLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMi8yMC8yMDAxOm1rb2VwcGUKCSAgIFtNelNjaGVtZV06IFJlbmFtZWQgbXpzd2lnX21ha2VfYm9vbGVhbiB0bwoJICAgc3dpZ19tYWtlX2Jvb2xlYW4sIGFzIHRoZSBsYXR0ZXIgaXMgdXNlZCBpbiB0aGUgdHlwZW1hcHMuCgkgICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjEyLzE3LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogUmV3cm90ZSBsaXN0LXZlY3Rvci5pIHVzaW5nIG11bHRpLWRpc3BhdGNoCgkgICB0eXBlbWFwcy4gIFVwZGF0ZWQgcG9pbnRlci1pbi1vdXQuaS4gIE1ha2UgdGhlCgkgICBkZXByZWNhdGVkIHR5cGVtYXAtc3Vic3RpdHV0aW9uIG9mICIkc291cmNlIiBpbiAiYXJnb3V0IgoJICAgd29yayBhcyBiZWZvcmUuCgoxMi8xNi8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIG1hY3JvcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgJW11bHRpcGxlX3ZhbHVlcyB0byB1c2UgdGhlIHByb3BlciAlcHJhZ21hIHN5bnRheC4gIE5ldwoJICAgR3VpbGUgZXhhbXBsZS90ZXN0ICJtdWx0aXZhbHVlIjsgbmV3IEd1aWxlIHJ1bi10ZXN0IGZvcgoJICAgdGVzdC1zdWl0ZSBpdGVtICJsaXN0LXZlY3RvciIgKGN1cnJlbnRseSBicm9rZW4pLgoKMTIvMTQvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCB0eXBlbWFwLXN1YnN0aXRpb24gYnVnIGZvciAidmFyaW4iLiAgUmVsYXhlZAoJICAgdmFsaWQtaWRlbnRpZmllciBjaGVjayB0byBhbGxvdyBhbGwgUjVSUyBpZGVudGlmaWVycy4KCgpWZXJzaW9uIDEuMy4xMCAoRGVjZW1iZXIgMTAsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkICV0eXBlbWFwIHNvIHRoYXQgJXsgLi4uICV9IGNhbiBhbHNvIGJlIHVzZWQgYXMgYQogICAgICAgICAgIGNvZGUgYmxvY2sgKG1vc3RseSBmb3IgY29tcGxldGVuZXNzKS4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggJXsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGlzIGZvcm0gZG9lcyBub3QgaW50cm9kdWNlIGEgbmV3IGJsb2NrIHNjb3BlLiAgQWxzbywgdGhlCiAgICAgICAgICAgY29kZSBlbmNsb3NlZCBpbiAleyAuLi4gJX0gaXMgbm90IHByb2Nlc3NlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDU5NjE0IF0gU1dJRyB3aXRoIG11bHRpcGxlIFRDTCBpbnRlcnByZXRlcnMuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTcxNDEgXSBydWJ5ZGVjLnN3ZyBpcyB3cm9uZwogICAgICAgICAgIFJlcG9ydGVkIGJ5IFBhdWwgQnJhbm5hbi4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxMDU1NyBdIFByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyBvbiBOVC4KICAgICAgICAgICBSZXBvcnRlZCBieSBNYWdudXMgTGp1bmcuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NDUyMzMgXSBFbmhhbmNlbWVudDogaGFuZGxlIGFjY2VzcyBjaGFuZ2UuCiAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIChidXQgaWdub3JlcykgQysrIGFjY2VzcyBjaGFuZ2VzIGZvciB0aGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoKSB7IH0KICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEEoKSB7fQogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBjbGFzcyBCIDogcHJpdmF0ZSBBIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IH0KICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIEE6OnNvbWV0aGluZzsgICAgPC0tLS0gUGFyc2VkLCBidXQgaWdub3JlZAogICAgICAgICAgICAgfTsKIAogICAgICAgICAgIFN1Z2dlc3RlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMTIvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgRml4IGZvciBSdWJ5IHRvIHdvcmsgdXNpbmcgVmlzdWFsIEMrKy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ2NTY4NyBdIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlcnMgZmFpbC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODk1OTQgXSBQeVN0cmluZ19Gcm9tU3RyaW5nIGNhbid0IHRha2UgTlVMTCBhcmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9obiBNZXJyaXR0LiAgIFNXSUcgbm93IGNvbnZlcnRzIHN0cmluZyB2YWx1ZXMKICAgICAgICAgICB0byBQeXRob24gdXNpbmcgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgIHJlc3VsdG9iaiA9IHJlc3VsdCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0KSA6IFB5X0J1aWxkVmFsdWUoIiIpOwoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDYzNTYxIF0gVHlwZSBjb252ZXJzaW9ucyBub3QgZ2VuZXJhdGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCQoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzAyMTcgXSBUY2wgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MjA4OCBdIGRlZmluZWQoTUFDUk8pIGV4cGFuZGVkIGV2ZXJ5d2hlcmUuCiAgICAgICAgICAgRW1iZWRkZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc3VjaCBhcwoKICAgICAgICAgICAgICAlI2lmIGRlZmluZWQoRk9PKQoKICAgICAgICAgICBhcmUgbm90IGV4cGFuZGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzY0NjcgXSBQcm9ibGVtcyB3aXRoICNkZWZpbmUgJiBjb21tYXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0Nzc1NDcgXSB3cm9uZyBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBCYWQgcHJvdG90eXBlcyBpbiBMaWIvdGNsL3B0cmxhbmcuaS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4MzE4MiBdIENvbnN0YW50cyBjYW4gdGFrZSBhcmdzIGJ5IG1pc3Rha2UuIAogICAgICAgICAgIFdoZW4gc3dpZyAtcGVybDUgLWNvbnN0IGlzIHVzZWQsIGNvbnN0YW50cyBhcmUgZGVjbGFyZWQKICAgICAgICAgICB3aXRoIGEgdm9pZCBwcm90b3R5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdWIgSUNPTlNUICgpIHsgJGV4YW1wbGVjOjpJQ09OU1QgfQoKICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgUmljaCBXYWxlcy4KCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIE5ldyAlZXhjZXB0aW9uIGRpcmVjdGl2ZS4gICBUaGlzIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgJWV4Y2VwdC4KICAgICAgICAgICBJdCB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IGEgCiAgICAgICAgICAgbGFuZ3VhZ2Ugc3BlY2lmaWVyLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICBjYXRjaChTb21lRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICBlcnJvcgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICVleGNlcHRpb24gaXMgYWxzbyBuYW1lIGF3YXJlLS0tYWxsb3dpbmcgaXQgdG8gYmUgYXBwbGllZCB0bwogICAgICAgICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBhbnkgZnVuY3Rpb24vbWV0aG9kIGZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyKGRvdWJsZSkgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyKGRvdWJsZSkgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIHNlbWFudGljcyBvZiB0aGlzIG5hbWUgbWF0Y2hpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnN0YW50aWFsIGNsZWFudXAgb2YgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZS4gIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgdXNlZCB0byBiZSBjcmVhdGVkIGluIHRoaXMgcmF0aGVyIGNvbXBsaWNhdGVkIG1hbm5lciBpbnZvbHZpbmcgYWJvdXQKICAgICAgICAgICBhIGhhbGYtZG96ZW4gc3RyaW5ncyBjcmVhdGVkIGluIGJpdHMgYW5kIHBpZWNlcy4gICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkIGluIGEgbW9yZSBzdHJhaWdodGZvcndhcmQgbWFubmVyLS1pbiB0aGUgc2FtZQogICAgICAgICAgIG9yZGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXBwZWFyIGluIHRoZSBzaGFkb3cgZmlsZSBtYXkgZGlmZmVyLgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJWluc2VydCBkaXJlY3RpdmUgKCV7IC4uLiAlfSwgJXJ1bnRpbWUsICVoZWFkZXIsICV3cmFwcGVyLCBldGMuKQogICAgICAgICAgIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiAgIFRoaXMgaGFzIHBvdGVudGlhbAogICAgICAgICAgIHVzZXMgd2hlbiBnZW5lcmF0aW5nIHNoYWRvdyBjbGFzcyBjb2RlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICVpbnNlcnQoInNoYWRvdyIpICV7CiAgICAgICAgICAgICAgICAgIyBTb21lIHB5dGhvbiBjb2RlCiAgICAgICAgICAgICAgICAgZGVmIGJsYWgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICBwcmludCAiSSdtIGJsYWghIgogICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBzdXBwb3J0IGZvciBjbGFzcyBjb2RlIGluc2VydGlvbiBkZXBlbmRzIG9uIHRoZSBsYW5ndWFnZSBtb2R1bGUuCiAgICAgICAgICAgSG93ZXZlciwgdGhlIGludGVudCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gc2ltcGxpZnkgdGhlIHRhc2sgb2YgZXh0ZW5kaW5nCiAgICAgICAgICAgc2hhZG93IGNsYXNzIGNvZGUuICAgSW4gdGhlIFB5dGhvbiBtb2R1bGUsIHRoaXMgaW5zZXJ0cyBjb2RlIHdpdGggdGhlCiAgICAgICAgICAgcHJvcGVyIGxldmVsIG9mIGluZGVuZGF0aW9uIChyZWdhcmRsZXNzIG9mIHdoYXQgd2FzIHVzZWQgaW4gdGhlIFNXSUcKICAgICAgICAgICBpbnRlcmZhY2UpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIEphdmEgYW5kIFB5dGhvbiBtb2R1bGVzIHRvIHdvcmsgb24gY3lnd2luLgogICAgICAgICAgIFVuZm9ydHVuYXRlbHkgYSBsb3Qgb2YgdGhlIHB5dGhvbiBtb2R1bGUgaGFzIHN0YXJ0ZWQgdG8gcHJvZHVjZXMgY29kZSAKICAgICAgICAgICB3aGljaCBjYW5ub3QgYmUgYXV0by1pbXBvcnRlZCB1c2luZyBjeWd3aW4gbGlidG9vbHMgc28gbW9zdCBvZiBpdCBpcyAKICAgICAgICAgICBzdGlsbCBicm9rZW4uCgoxMS8yOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJXJlbmFtZSBhbmQgJWZlYXR1cmUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUKICAgICAgICAgICBvZiBhIGNsYXNzIGRlZmluaXRpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29faSkgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgb25seSBhcHBsaWVzCiAgICAgICAgICAgdG8gbWVtYmVycyBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggaXQgYXBwZWFycyBhcyB3ZWxsIGFzIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3Nlcy4gIEluIGZhY3QsIHRoaXMgaXMgcmVhbGx5IGp1c3QgdGhlIHNhbWUKICAgICAgICAgICBhcyBzYXlpbmc6CgogICAgICAgICAgICAgJXJlbmFtZShmb29faSkgRm9vOjpmb28oaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIEZvbzo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCB0aGUgZXhwZXJpbWVudGFsICVmZWF0dXJlIGRpcmVjdGl2ZS4gICVmZWF0dXJlIGNhbiBiZQogICAgICAgICAgIHVzZWQgdG8gYXR0YWNoIGFyYml0cmFyeSBzdHJpbmcgYXR0cmlidXRlcyB0byBwYXJzZSB0cmVlIG5vZGVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGJsYWggewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ZXZlcjsgICAgICAKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2V0IikgKjo6eF9zZXQgIngiOwoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYmxhaCIpIEZvbzo6YmFyKGludCxkb3VibGUpIGNvbnN0ICJzcGFtIjsKCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBib3Jyb3dlZCBmcm9tIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4gIEluIGZhY3QsIHRoZQogICAgICAgICAgIGV4YWN0IHNhbWUgc2VtYW50aWNzIGFwcGx5IChpbmhlcml0YW5jZSwgbWF0Y2hpbmcsIGV0Yy4pLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBhIHZlcnkgcG93ZXJmdWwgbG93LWxldmVsIHByaW1pdGl2ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgY3VzdG9taXplIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgdG8gcHJvdmlkZSBoaW50cyB0byAKICAgICAgICAgICBhbnkgc3RhZ2Ugb2YgY29kZSBnZW5lcmF0aW9uLiAgIEZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0bwogICAgICAgICAgIHBhcnNlIHRyZWUgbm9kZXMgYXMgYXR0cmlidXRlcyB3aXRoIG5hbWVzIGxpa2UgImZlYXR1cmU6KiIgd2hlcmUgKiAKICAgICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZmVhdHVyZSBuYW1lIChlLmcuLCAiZmVhdHVyZTpleGNlcHQiLCAiZmVhdHVyZTpzZXQiLCAKICAgICAgICAgICBldGMuKS4gICBMYW5ndWFnZSBtb2R1bGVzIGNhbiB0aGVuIGxvb2sgZm9yIHRoZSBmZWF0dXJlcyB1c2luZyAKICAgICAgICAgICBhIHNpbXBsZSBhdHRyaWJ1dGUgbG9va3VwLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciBhIG51bWJlciBvZgogICAgICAgICAgIG9sZGVyIFNXSUcgZGlyZWN0aXZlcyBpbmNsdWRpbmcgJWV4Y2VwdCBhbmQgc3BlY2lhbGl6ZWQKICAgICAgICAgICBwcmFnbWFzLiBJdCBpcyBtb3JlIHBvd2VyZnVsIChkdWUgdG8gaXRzIHBhcmFtZXRlcml6ZWQKICAgICAgICAgICBuYW1lIG1hdGNoaW5nKSBhbmQgaXQgcHJvdmlkZXMgdmVyeSBwcmVjaXNlIGNvbnRyb2wgb3ZlcgogICAgICAgICAgIGhvdyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0byBpbmRpdmlkdWFsCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgIFRoZXJlIGFyZSBmdXR1cmUgZXhwYW5zaW9uIHBsYW5zIHRoYXQgd2lsbAogICAgICAgICAgIGJ1aWxkIHVwb24gdGhpcyBjYXBhYmlsaXR5IGFzIHdlbGwuCgogICAgICAgICAgIEl0J3Mgbm90IGNlcnRhaW4gdGhhdCAlZmVhdHVyZSB3aWxsIGV2ZXIgYmUgdXNlZCBkaXJlY3RseQogICAgICAgICAgIGJ5IFNXSUcgdXNlcnMuICBJbnN0ZWFkLCBpdCBtYXkgYmUgYSBsb3ctbGV2ZWwgcHJpbWl0aXZlCiAgICAgICAgICAgdGhhdCBpcyB1c2VkIGluIGhpZ2gtbGV2ZWwgbWFjcm8gZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgdG8gc3VwcG9ydCBwcm9wZXJ0aWVzLCB5b3UgbWlnaHQgZGVmaW5lIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAlZGVmaW5lICVwcm9wZXJ0eShuYW1lLCBzZXRmLCBnZXRmKQogICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSBzZXRmICNuYW1lOwogICAgICAgICAgICVmZWF0dXJlKCJnZXQiKSBnZXRmICNuYW1lOwogICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgV2hpY2ggYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICVwcm9wZXJ0eShwLCBnZXRfcCwgc2V0X3ApOwoKICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgaW50ICBnZXRfcCgpOwogICAgICAgICAgICAgIHZvaWQgc2V0X3AoaW50KTsKICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogIAoxMS8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgVGNsIG1vZHVsZSBoYXMgYmVlbiBleHBhbmRlZCB3aXRoIHNvbWUgbmV3IGZlYXR1cmVzIGZvcgogICAgICAgICAgIG1hbmFnaW5nIG9iamVjdCBvd25lcnNoaXAuICBGb3IgZXhhbXBsZToKICAgICAgICAgCiAgICAgICAgICAgICAgICBzZXQgYyBbQ2lyY2xlIC1hcmdzIDIwXQogICAgICAgICAgICAgICAgJGMgYXJlYSAgICAgICAgICAgICAjIEludm9rZSBhIG1ldGhvZAogICAgICAgICAgICAgICAgJGMgLWRpc293biAgICAgICAgICAjIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CiAgICAgICAgICAgICAgICAkYyAtYWNxdWlyZSAgICAgICAgICMgQWNxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKCiAgICAgICAgICAgSWYgVGNsIG93bnMgdGhlIG9iamVjdCwgaXRzIGRlc3RydWN0b3IgaXMgaW52b2tlZCB3aGVuIHRoZSAKICAgICAgICAgICBjb3JyZXNwb25kaW5nIG9iamVjdCBjb21tYW5kIGlzIGRlbGV0ZWQgaW4gVGNsLiAgCgogICAgICAgICAgIFRvIHNpbXBsaWZ5IHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLCB0aGUgZm9sbG93aW5nIHN5bnRheAogICAgICAgICAgIGNhbiBiZSB1c2VkOgoKICAgICAgICAgICAgICAgICRjIC1kZWxldGUgICAgICAgICAjIERlbGV0ZSBhbiBvYmplY3QKCiAgICAgICAgICAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIG1vcmUgb2JzY3VyZSB2YXJpYW50IG9mIAoKICAgICAgICAgICAgICAgIHJlbmFtZSAkYyB7fQoKICAgICAgICAgICBUaGVzZSBmZWF0dXJlcyBhbHNvIGFkZCBmdW5jdGlvbmFsaXR5IGF0IHRoZSBDIEFQSSBsZXZlbC4KICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5hZ2Ugb3duZXJzaGlwIGZyb20gQyBhbmQKICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4KCiAgICAgICAgICAgICAgICBTV0lHX0FjcXVpcmUodm9pZCAqcHRyKTsKICAgICAgICAgICAgICAgIFNXSUdfRGlzb3duKHZvaWQgKnB0cik7CgogICAgICAgICAgIEEgbmV3IGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgaW5zdGFuY2VzIGlzIGFsc28gYXZhaWxhYmxlOgoKICAgICAgICAgICAgICAgIFRjbF9PYmogKgogICAgICAgICAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaihUY2xfSW50ZXJwICppbnRlcnAsIHZvaWQgKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5cGUsIGludCBvd24pOwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gYSB0eXBlbWFwLCB0aGlzIGNyZWF0ZXMgYSBwb2ludGVyIG9iamVjdCBhbmQKICAgICAgICAgICBhbiBpbnRlcnByZXRlciBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXNzdWUgbWV0aG9kcyBhbmQKICAgICAgICAgICBhY2Nlc3MgYXR0cmlidXRlcyBhcyBzaG93biBhYm92ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFsbCBQeXRob24tcmVsYXRlZCAlcHJhZ21hIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCiAgICAgICAgICAgTW9zdCBvZiB0aGVzZSB3ZXJlIHdyaXR0ZW4gZm9yIG9sZGVyIFNXSUcgdmVyc2lvbnMgaW4gb3JkZXIgdG8KICAgICAgICAgICBjb21wZW5zYXRlIGZvciBsaW1pdGF0aW9ucyBpbiBlYXJsaWVyIHJlbGVhc2VzLiAgSW4gYW4gZWZmb3J0CiAgICAgICAgICAgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY29kZS1jbHV0dGVyIGFuZCBwb3RlbnRpYWwgZm9yIGVycm9ycywKICAgICAgICAgICBpdCBpcyBlYXNpZXIgdG8gc2ltcGx5IGVsaW1pbmF0ZSB0aGUgcHJhZ21hcyBhbmQgdG8gc3RhcnQgb3ZlcgogICAgICAgICAgIChpZiBuZWVkZWQpLiAgVG8gYmUgaG9uZXN0LCBJJ20gbm90IGV2ZW4gc3VyZSB0aGUgcHJhZ21hcwogICAgICAgICAgIHdvcmtlZCBpbiAxLjMuOSBhbmQgcmVjZW50IHJlbGVhc2VzLgoKICAgICAgICAgICBOb3RlOiBJZiB5b3UgbmVlZCB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBzaGFkb3cgY2xhc3MgZmlsZQogICAgICAgICAgIGNyZWF0ZWQgYnkgU1dJRywgc2ltcGx5IHVzZSB0aGUgJXNoYWRvdyBkaXJlY3RpdmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlc2hhZG93ICV7CiAgICAgICAgICAgICAgZGVmIHNvbWVfcHl0aG9uX2NvZGUoKTogICAgICAgICAKICAgICAgICAgICAgICAgICAgcHJpbnQgImJsYWghIgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3dlZXBpbmcgY2hhbmdlcyB0byB0aGUgd2F5IGluIHdoaWNoIHRoZSBQeXRob24gbW9kdWxlIGhhbmRsZXMKICAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4gICBJbiBlYXJseSBpbXBsZW1lbnRhdGlvbnMsIHNoYWRvdyBjbGFzc2VzIHdlcmUKICAgICAgICAgICBtZXJlbHkgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0eXBlZCBwb2ludGVyIG9iamVjdHMuIEhvd2V2ZXIsIAogICAgICAgICAgIHNvbWUgdXNlcnMgYWN0dWFsbHkgd2FudGVkIHRvIHJlY2VpdmUgdGhlIHNoYWRvdyBjbGFzcyBvYmplY3QgaW4gQy4KICAgICAgICAgICBUbyBhY2NvbW9kYXRlIHRoaXMsIHRoZSBkZXJlZmVyZW5jaW5nIG9mIHRoZSAidGhpcyIgcG9pbnRlciBpbgogICAgICAgICAgIGEgc2hhZG93IGNsYXNzIHdhcyBtb3ZlZCB0byBDIGFzIGRlc2NyaWJlZCBpbiBDSEFOR0VTIFs4LzgvOTldLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwcm9jZXNzIG9mIHJldHVybmluZyBwb2ludGVycyB0byBQeXRob24gd2FzIHN0aWxsCiAgICAgICAgICAgc29tZXdoYXQgcHJvYmxlbWF0aWMuICBTcGVjaWZpY2FsbHksIHNoYWRvdyBjbGFzc2VzIG5ldmVyIHdvcmtlZAogICAgICAgICAgIGluIHNpdHVhdGlvbnMgc3VjaCBhcyB0aGVzZToKCiAgICAgICAgICAgICAtICAgVXNlIG9mIGFueSBraW5kIG9mIG91dHB1dCB0eXBlbWFwICgnb3V0JyBvciAnYXJnb3V0JykKICAgICAgICAgICAgIC0gICBHbG9iYWwgdmFyaWFibGVzIChicm9rZW4gYXMgZmFyIGFzIEkgY2FuIHRlbGwpLgoKICAgICAgICAgICBJbiB0aGUgcGFzdCwgc29tZSB1c2VycyBoYXZlIGRlYWx0IHdpdGggdGhpcyBieSBtYW51YWxseSB0cnlpbmcKICAgICAgICAgICB0byBjcmVhdGUgc2hhZG93IGNsYXNzIG9iamVjdHMgdGhlbXNlbHZlcyBmcm9tIEMvQysrLiAgSG93ZXZlciwKICAgICAgICAgICB0aGlzIHdhcyBkaWZmaWN1bHQgYmVjYXVzZSB0aGUgQyB3cmFwcGVycyBkb24ndCByZWFsbHkga25vdyBob3cKICAgICAgICAgICB0byBnZXQgYWNjZXNzIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiBjbGFzcy4KCiAgICAgICAgICAgVGhlIFB5dGhvbiBtb2R1bGUgaGFzIG5vdyBiZWVuIG1vZGlmaWVkIHRvIGF1dG9tYXRpY2FsbHkgYXR0YWNoCiAgICAgICAgICAgc2hhZG93IGNsYXNzIG9iamVjdHMgdG8gcG9pbnRlcnMgd2hlbiB0aGV5IGFyZSByZXR1cm5lZCB0byAKICAgICAgICAgICBQeXRob24uICAgVGhpcyBwcm9jZXNzIG9jY3VycyBpbiB0aGUgZnVuY3Rpb24gU1dJR19OZXdQb2ludGVyT2JqKCkKICAgICAgICAgICBzbyB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHVzZXJzLiAgICBBcyBhIHJlc3VsdCwKICAgICAgICAgICBzaGFkb3cgY2xhc3NlcyBhcmUgbm93IG1vcmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIHdpdGggdHlwZW1hcHMKICAgICAgICAgICBhbmQgb3RoZXIgZmVhdHVyZXMgb2YgU1dJRy4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGludHJvZHVjZSBhIG51bWJlciBvZiBpbmNvbXBhdGliaWxpdGllcy4gIFRoZQogICAgICAgICAgIFNXSUdfTmV3UG9pbnRlck9iaigpIG5vdyB0YWtlcyBhbiBleHRyYSBwYXJhbWV0ZXIgIm93biIgdG8gCiAgICAgICAgICAgaW5kaWNhdGUgb2JqZWN0IG93bmVyc2hpcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJldHVybiBhIHBvaW50ZXIKICAgICAgICAgICB0byBQeXRob24gdGhhdCBQeXRob24gc2hvdWxkIGRlc3Ryb3kuICAgSW4gYWRkaXRpb24sIG9sZGVyIGNvZGUKICAgICAgICAgICB0aGF0IHRyaWVzIHRvIG1hbnVhbGx5IGNvbnN0cnVjdCBzaGFkb3cgY2xhc3Mgb2JqZWN0cyBvciB3aGljaAogICAgICAgICAgIGV4cGVjdHMgYmFyZSBwb2ludGVycyBtYXkgYnJlYWstLS1zdWNoIHBvaW50ZXJzIG1heSBhbHJlYWR5IGJlCiAgICAgICAgICAgZW5jYXBzdWxhdGVkIGJ5IGEgc2hhZG93IGNsYXNzLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVpbnNlcnQgZGlyZWN0aXZlIHRvIGFjY2VwdCBzaW5nbGUgYnJhY2VzIHsgLi4uIH0uCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluc2VydCgiaGVhZGVyIikgewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJXsgLi4uICV9IGV4Y2VwdCB0aGF0IHRoZSBjb2RlIGluIHRoZQogICAgICAgICAgIGJyYWNlcyBpcyBwcm9jZXNzZWQgdXNpbmcgdGhlIHByZXByb2Nlc3Nvci4gICBUaGlzIGNhbiBiZSB1c2VmdWwKICAgICAgICAgICBpbiBjZXJ0YWluIGNvbnRleHRzIHN1Y2ggYXMgbG93LWxldmVsIGNvZGUgZ2VuZXJhdGlvbiBpbiAKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIG5vdyB0cmFuc2xhdGVkIGludG8gcHJlcHJvY2Vzc29yCiAgICAgICAgICAgc3ltYm9scy4gIEZvciBleGFtcGxlOgoJCiAgICAgICAgICAgICAgLi9zd2lnIC1weXRob24gLXNoYWRvdyAtbW9kdWxlIGJsYWggaW50ZXJmYWNlLmkKCiAgICAgICAgICAgQ3JlYXRlcyB0aGUgc3ltYm9sczoKCiAgICAgICAgICAgICAgU1dJR09QVF9QWVRIT04gMQogICAgICAgICAgICAgIFNXSUdPUFRfU0hBRE9XIDEKICAgICAgICAgICAgICBTV0lHT1BUX01PRFVMRSBibGFoCiAgICAgICAgICAgICAgCiAgICAgICAgICAgTW9kdWxlcyBjYW4gbG9vayBmb3IgdGhlc2Ugc3ltYm9scyB0byBhbHRlciB0aGVpciBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBpZiBuZWVkZWQuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIFBlcmw1IG1vZHVsZS4gIEEgbG90IG9mIGNvZGUgZ2VuZXJhdGlvbiBpcwogICAgICAgICAgIG5vdyBkcml2ZW4gYnkgdGFibGVzIGFuZCB0eXBlbWFwcy4gICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSAKICAgICAgICAgICBhbHNvIG1ha2VzIHVzZSBvZiB0YWJsZXMgdG8gaW5zdGFsbCBjb25zdGFudHMsIHZhcmlhYmxlcywgYW5kCiAgICAgICAgICAgZnVuY3Rpb25zIGluc3RlYWQgb2YgaW5saW5pbmcgYSBidW5jaCBvZiBwcm9jZWR1cmUgY2FsbHMuICBUaGUKICAgICAgICAgICBzZXBhcmF0ZSB2YXJpYWJsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBnb25lLiAgIE1vc3QKICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24gaXMgY29udHJvbGxlZCB2aWEgdGhlIHBlcmw1LnN3ZyBmaWxlIGluIHRoZQogICAgICAgICAgIGxpYnJhcnkuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgCjExLzEzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlIEMrKyB0eXBlbmFtZSBrZXl3b3JkLiAgUHJpbWFyaWx5IHRoaXMKICAgICAgICAgICBpcyBhZGRlZCB0byBiZXR0ZXIgc3VwcG9ydCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkICBibGFoKEMmIHYpIHsKICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDOjppdGVyYXRvciBpID0gdi5iZWdpbigpOwogICAgICAgICAgICAgfQoKICAgICAgICAgICBOb3RlOiB0eXBlbmFtZSBpcyBzdXBwb3J0ZWQgaW4gdGhlIHBhcnNlciBpbiB0aGUgc2FtZSB3YXkgYXMgJ3N0cnVjdCcKICAgICAgICAgICBvciAnY2xhc3MnLiAgWW91IHByb2JhYmx5IHNob3VsZG4ndCB1c2UgaXQgYW55d2hlcmUgZXhjZXB0IGluIHRlbXBsYXRlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGUgQVBJLiAgIE1vc3QgZnVuY3Rpb25zIG5vdwogICAgICAgICAgIHVzZSBhIGNvbW1vbiwgdmVyeSBzaW1wbGUsICBBUEkuICAgVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YKICAgICAgICAgICBpbnRlcmVzdGluZyBzZW1hbnRpYyBzaWRlLWVmZmVjdHMgb2YgaG93IGNvZGUgaXMgYWN0dWFsbHkgZ2VuZXJhdGVkLgogICAgICAgICAgIERldGFpbHMgd2lsbCBiZSBmb3J0aGNvbWluZyBpbiBEb2MvTWFudWFsL0V4dGVuZGluZy5odG1sLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogTGFuZ3VhZ2UgbW9kdWxlcyB3cml0dGVuIGZvcgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgd2lsbCBubyBsb25nZXIgd29yaywKCjExLzEwLzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgdmVyeSBzdWJ0bGUgYnVnIGR1ZSB0byB1bm5hbWVkIGNsYXNzIHdyYXBwaW5nLiBGb3IgZXhhbXBsZSwgaWYKICAgICAgICAgICB5b3UgZGlkIHRoaXMKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgeCx5OwogICAgICAgICAgICAgIH0gZ2RQb2ludCwgKmdkUG9pbnRQdHI7CgogICAgICAgICAgICAgIHZvaWQgZm9vKGdkUG9pbnRQdHIgeCk7CgogICAgICAgICAgIFRoZW4gdGhlIGZvbyBmdW5jdGlvbiB3b3VsZCBnZXQgYSB0eXBlLWVycm9yLiAgIFRoZSBwcm9ibGVtIGhhcwogICAgICAgICAgIHRvIGRvIHdpdGggaW50ZXJuYWwgdHlwZWRlZiBoYW5kbGluZyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgdHlwZWRlZgogICAgICAgICAgIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgc3RydWN0IGFwcGVhciBsYXRlciBpbiB0aGUgcGFyc2UgdHJlZS4KICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZpbiBKb3Zhbm92aWMuCgoxMS8wOS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvICJvdXQiIHR5cGVtYXBzIChhbmQgcmVsYXRlZCB2YXJpYXRpb25zKS4gIFRoZSBuYW1lCiAgICAgICAgICAgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgdHlwZW1hcCBpcyBub3cgdGhlIHJhdyBDIGlkZW50aWZpZXIgdGhhdAogICAgICAgICAgIGFwcGVhcnMgb24gYSBkZWNsYXJhdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vKCk7ICAgIC8vIHR5cGVtYXAgZ2V0cyBhcHBsaWVkCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgbmV2ZXIgcmVhbGx5IHNwZWNpZmllZCBob3cgdGhpcyB3YXMgc3VwcG9zZWQgdG8KICAgICAgICAgICB3b3JrLiAgSW4gU1dJRzEuMSwgeW91IGNvdWxkIHByb2JhYmx5IHdyaXRlIGEgdHlwZW1hcCBmb3IgdGhlCiAgICAgICAgICAgd3JhcHBlciBuYW1lIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCBCbGFoX2ZvbyB7IC4uLiB9CgogICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgb2xkIGJlaGF2aW9yIGlzIG5vdyB3aXRoZHJhd24gYW5kIG5vdCBzdXBwb3J0ZWQuIAogICAgICAgICAgIEp1c3QgdXNlIHRoZSBtZW1iZXIgbmFtZSB3aXRob3V0IGFueSBzb3J0IG9mIHNwZWNpYWwgcHJlZml4LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBUY2wgbW9kdWxlIGluaXRpYWxpemF0aW9uOgoKICAgICAgICAgICAoMSkgU1dJRyBub3cgYXV0b21hdGljYWxseSBpbmNsdWRlcyB0aGUgY29kZSBuZWVkZWQgdG8gd29yayB3aXRoCiAgICAgICAgICAgICAgICBUY2wgc3R1YnMuICBTaW1wbHkgY29tcGlsZSB3aXRoIC1EVVNFX1RDTF9TVFVCUy4KCiAgICAgICAgICAgKDIpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgY2FsbHMgVGNsX1BrZ1Byb3ZpZGUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgICAgYSBwYWNrYWdlIG5hbWUuICBUaGUgcGFja2FnZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lCiAgICAgICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4gIFRoZSB2ZXJzaW9uIG51bWJlciBpcwogICAgICAgICAgICAgICBzZXQgdG8gIjAuMCIgYnkgZGVmYXVsdC4gIFRvIGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIsIHVzZQogICAgICAgICAgICAgICBzd2lnIC1wa2d2ZXJzaW9uIDEuMiBpbnRlcmZhY2UuaS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgTW9kdWxlcyB0aGF0IHByb3ZpZGVkIHN0dWJzIGFuZCBUY2xfUGtnUHJvdmlkZSBvbiB0aGVpciBvd24gbWlnaHQKICAgICAgICAgICBicmVhay4gIFNpbXBseSByZW1vdmUgdGhhdCBjb2RlLgoKMTEvMDUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCBjb2RlIGdlbmVyYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBUY2wgbW9kdWxlLiAgQ29uc3RhbnRzCiAgICAgICAgICAgYXJlIG5vdyBzdG9yZWQgaW4gYSBsYXJnZSB0YWJsZSB0aGF0IGdldCBpbnN0YWxsZWQgYXQgbW9kdWxlIHN0YXJ0dXAuCiAgICAgICAgICAgVGhlcmUgYXJlIGFsc28gbm8gbG9uZ2VyIGFueSBzdGF0aWMgdmFyaWFibGVzIHNvIGl0IHNob3VsZCBnZW5lcmF0ZQogICAgICAgICAgIHNvbWV3aGF0IGxlc3MgY29kZS4KCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSAiY29uc3QiIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byAiY29uc3RhbnQiIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzLiAgImNvbnN0IiBpcyBhIEMga2V5d29yZCB3aGljaCBtYWRlIHRoZSBoYW5kbGluZyBvZiB0aGUgdHlwZW1hcAogICAgICAgICAgIGRpcmVjdGl2ZSBzb21ld2hhdCBhd2t3YXJkIGluIHRoZSBwYXJzZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICAldHlwZW1hcCBkaXJlY3RpdmUgY2FuIG5vdyBhY2NlcHQgbmVhcmx5IGFyYml0cmFyeSBrZXl3b3JkIHBhcmFtZXRlcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluLHBhcnNlPSJpIixkb2M9ImludGVnZXIiKSBpbnQgIi4uLiI7CgogICAgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBrZXl3b3JkIHBhcmFtZXRlcnMgaXMgdG8gc3VwcGx5IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGhpbnRzIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbW9kdWxlLiAgIFRoZSBpbnRlcHJldGF0aW9uIG9mIHRoZQogICAgICAgICAgIHBhcmFtZXRlcnMgaXMgbGFuZ3VhZ2Ugc3BlY2lmaWMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IHNlbWFudGljIGNoYW5nZSB0byBpbnRlcm5hbCBjYWxsL3JldHVybiBieSB2YWx1ZSBoYW5kbGluZy4KICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBjYWxsLWJ5LXZhbHVlIHdhcyB0cmFuc2xhdGVkCiAgICAgICAgICAgaW50byBwb2ludGVycy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgZG91YmxlIGRvdF9wcm9kdWN0KFZlY3RvciBhLCBWZWN0b3IgYik7CgogICAgICAgICAgIHR1cm5lZCBpbnRvIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoKmEsKmIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgdHJhbnNsYXRpb24gd2FzIG5vcm1hbGx5IHBlcmZvcm1lZCBieSB0aGUgU1dJRyBjb3JlLCBvdXRzaWRlCiAgICAgICAgICAgb2YgdGhlIGNvbnRyb2wgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEhvd2V2ZXIsIGEgc2lkZSBlZmZlY3QKICAgICAgICAgICBvZiB0aGlzIHdhcyBhIGxvdCBvZiBiaXphcnJlIHR5cGVtYXAgYmVoYXZpb3IuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgaWYgeW91IGRpZCBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFlvdSB3b3VsZCBmaW5kIHRoYXQgaW50MzIgd2FzIHRyYW5zZm9ybWVkIGludG8gYSBwb2ludGVyIGV2ZXJ5d2hlcmUhCiAgICAgICAgICAgKG5lZWRsZXNzIHRvIHNheSwgc3VjaCBiZWhhdmlvciBpcyB1bmV4cGVjdGVkIGFuZCBxdWl0ZSBhd2t3YXJkIHRvCiAgICAgICAgICAgZGVhbCB3aXRoKS4gIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgaWYgYSB0eXBlZGVmIHdhcyBhbHNvIHVzZWQsCiAgICAgICAgICAgdGhlIHBvaW50ZXIgYmVoYXZpb3Igc3VkZGVubHkgZGlzYXBwZWFyZWQuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgcG9pbnRlciB0cmFuc2Zvcm1hdGlvbiBpcyBub3cgcHVzaGVkIHRvIHRoZQogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuICAgVGhpcyBwcm9kdWNlcyB3cmFwcGVycyB0aGF0IGxvb2sgcm91Z2hseQogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcxID0gKmE7CiAgICAgICAgICAgICAgICAgIFZlY3RvciBhcmcyID0gKmI7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUgdHlwZW1hcHMgZm9yCiAgICAgICAgICAgYXJiaXRyYXJ5IHVuZGVmaW5lZCB0eXBlcy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIGRvIHRoaXMgKGFuZCBpdAogICAgICAgICAgIHdpbGwgd29yayByZWdhcmRsZXNzIHdoYXQgaW50MzIgaXMpOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgJDEgPSAoaW50MzIpIFB5SW50X0FzTG9uZygkaW5wdXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU1DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjYWxsL3JldHVybiBieSB2YWx1ZSBjb2RlIGdlbmVyYXRpb24gaW4KICAgICAgICAgICBzb21lIGxhbmd1YWdlIG1vZHVsZXMuCgoxMS8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHR5cGVtYXBzIHRvIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICB7IAogICAgICAgICAgICAgICAgICAgLi4uIGFuIG9iamVjdCAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICogewogICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFICYgewogICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgW10gewogICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgZW51bSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgIC4uLiBhbiBlbnVtIHZhbHVlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKENMQVNTOjoqKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gcG9pbnRlciB0byBtZW1iZXIgLi4uCiAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgIFRoZXNlIHR5cGVzIGFyZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgdHlwZXMgdGhhdCBkb24ndCBtYXRjaAogICAgICAgICAgIGFueXRoaW5nIGVsc2UuICBTZWUgQ0hBTkdFUyBsb2cgZW50cnkgZm9yIDgvMjcvMjAwMCBmb3IgdGhlCiAgICAgICAgICAgb2xkIGJlaGF2aW9yLiAgVGhlIHJvbGUgb2YgdGhlc2UgdHlwZXMgaXMgYWxzbyBkZXNjcmliZWQgaW4gCiAgICAgICAgICAgRG9jL01hbnVhbC9UeXBlbWFwcy5odG1sCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgCjEwLzI1LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIEd1aWxlIGFuZCBNenNjaGVtZSBtb2R1bGVzIHRvIHN1cHBvcnQKICAgICAgICAgICBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBGaXggdG8gaGFuZGxlIHBvaW50ZXJzIHRvIGFycmF5cy4KCjEwLzI0LzIwMDE6YmVhemxleQogICAgICAgICAgIERlZmluaW5nIGEgdHlwZW1hcCBydWxlIGZvciBlbnVtIFNXSUdFTlVNIGNhbiBub3cgYmUgdXNlZAogICAgICAgICAgIHRvIGRlZmluZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlbnVtIHZhcmlhYmxlcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJ1YnkgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgUnVieSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZnVuY3Rpb25zIHdpdGggYW4gYXJiaXRyYXJ5CiAgICAgICAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFByZXZpb3VzIHZlcnNpb25zIHdlcmUgbGltaXRlZCB0byAKICAgICAgICAgICB0byBmdW5jdGlvbnMgd2l0aCBvbmx5IDkgb3IgMTYgYXJndW1lbnRzIGRlcGVuZGluZyBvbgogICAgICAgICAgIHRoZSB1c2Ugb2YgZGVmYXVsdCBhcmd1bWVudHMuICAgTm90ZTogZnJvbSBzb21lIGluc3BlY3Rpb24KICAgICAgICAgICBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBzb3VyY2UsIHRoZSBuZXcgYXBwcm9hY2ggbWlnaHQgYmUKICAgICAgICAgICBhIGxpdHRsZSBmYXN0ZXIgYXMgd2VsbC4KCjEwLzE4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgdGVtcGxhdGVzLgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gPFMsVD47CgogICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBJcmluYSBLb3Rsb3ZhLgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMgYWRkZWQuICBUaGUgdHlwZW1hcHMKICAgICAgICAgICBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBzeW50YXggYmVsb3cuICAgV2l0aGluIGVhY2gKICAgICAgICAgICB0eXBlbWFwLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgJGFyZzsgIC8vIFRoZSBpbnB1dCBvYmplY3QgaW4gdGhlIHRhcmdldCBsYW5ndWFnZQogICAgICAgICAgICAgICAgICAkMTsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3IgZmlyc3QgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDI7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIHNlY29uZCBhcmd1bWVudAoKICAgICAgICAgICAgICAgICAgLy8gVGhlc2UgdmFyaWFibGVzIHJlZmVyIHRvIGVpdGhlciBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMV90eXBlLCAkMV9sdHlwZSwgJDFfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ2MpCiAgICAgICAgICAgICAgICAgICQyX3R5cGUsICQyX2x0eXBlLCAkMl9iYXNldHlwZSwgZXRjLi4uICAoYXJndltdKQoKICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgZGltZW5zaW9uIG9mIGFyZ3YKICAgICAgICAgICAgICAgICAgJDJfZGltMAogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgQmFzaWNhbGx5IGFueSB2YXJpYWJsZSB0aGF0IHdhcyBhdmFpbGFibGUgaW4gbm9ybWFsIHR5cGVtYXBzCiAgICAgICAgICAgaXMgYXZhaWxhYmxlIGZvciBlaXRoZXIgYXJndW1lbnQgYnkgcHJlZmFjaW5nIHRoZSB2YXJpYWJsZQogICAgICAgICAgIG5hbWUgYnkgJyRuXycgd2hlcmUgbiBpcyB0aGUgYXJndW1lbnQgcG9zaXRpb24uCgogICAgICAgICAgIE5vdGVzOiAgCiAgICAgICAgICAgKDEpIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGEgc2luZ2xlCiAgICAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgICAgeW91IGNhbiBzcGxpdCBhIHN0cmluZyBpbnRvIGEgKGNoYXIgKiwgaW50KSBwYWlyIG9yCiAgICAgICAgICAgICAgIHNwbGl0IGEgbGlzdCBpbnRvIGEgKGludCwgY2hhciBbXSkgcGFpci4gIEl0IGlzIG5vdAogICAgICAgICAgICAgICBwb3NzaWJsZSB0byBtYXAgbXVsdGlwbGUgb2JqZWN0cyB0byBtdWx0aXBsZSBhcmd1bWVudHMuCgogICAgICAgICAgICgyKSBUbyBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgU1dJRyB2ZXJzaW9ucywgdGhlCiAgICAgICAgICAgICAgIHZhcmlhYmxlcyBzdWNoIGFzICR0YXJnZXQgYW5kICR0eXBlIGFyZSBwcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgIGFyZSBtYXBwZWQgb250byB0aGUgZmlyc3QgYXJndW1lbnQgb25seS4KCiAgICAgICAgICAgKDMpIFRoaXMgc2hvdWxkIG5vdCBhZmZlY3QgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUuCiAgICAgICAgICAgICAgIE11bHRpLXZhbHVlZCB0eXBlbWFwcyBhcmUgYW4gZXh0ZW5zaW9uIHRvIHR5cGVtYXAgaGFuZGxpbmcuCiAgICAgICAgICAgICAgIFNpbmdsZSB2YWx1ZWQgdHlwZW1hcHMgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgdXN1YWwKICAgICAgICAgICAgICAgd2F5LgoKICAgICAgICAgICBUaGUgb2xkICRzb3VyY2UgYW5kICR0YXJnZXQgdmFyaWFibGVzIGFyZSBvZmZpY2lhbGx5CiAgICAgICAgICAgZGVwcmVjYXRlZC4gIElucHV0IHZhcmlhYmxlcyBhcmUgcmVmZXJlbmNlZCB0aHJvdWdoCiAgICAgICAgICAgJGFyZyQgYW5kIG91dHB1dCB2YWx1ZXMgYXJlIHJlZmVyZW5jZSB0aHJvdWdoICRyZXN1bHQkLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzLiAgVGhlIHN5bnRheAogICAgICAgICAgIGlzIGEgbGl0dGxlIGZ1bmt5LCBidXQgaGVyZSBnb2VzOgoKICAgICAgICAgICAgICAvLyBEZWZpbmUgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIE11bHRpdmFsdWVkIHR5cGVtYXAgd2l0aCBsb2NhbHMKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pKGludCB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHR5cGVtYXAgY29kZSAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgLy8gQ29weSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpID0gKGludCBhcmdjLCBjaGFyICphcmd2W10pOwoKICAgICAgICAgICAgICAvLyBBcHBseSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAlYXBwbHkgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsgKGludCBhcmdjb3VudCwgY2hhciAqKmFyZ3YpIH07CgogICAgICAgICAgIE5vdGU6IHRoaXMgZXh0cmEgcGFyc2luZyBzdXBwb3J0IGlzIGFkZGVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uLgogICAgICAgICAgIE5vIGxhbmd1YWdlIG1vZHVsZXMgY3VycmVudGx5IHN1cHBvcnQgbXVsdGktdmFsdWVkIHR5cGVtYXBzLgoKMTAvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWF0Y2hpbmcgY29kZSB0byBkaXNjYXJkIHF1YWxpZmllcnMgd2hlbgogICAgICAgICAgIGNoZWNraW5nIGZvciBhIG1hdGNoLiAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgY2hhciAqeCk7CgogICAgICAgICAgIFRoZSB0eXBlbWFwIGNoZWNrZXIgY2hlY2tzIGZvciBhIG1hdGNoIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CgogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIElmIHR5cGVkZWYncyBhcmUgaW52b2x2ZWQsIHF1YWxpZmllciBzdHJpcHBpbmcgb2NjdXJzIGJlZm9yZQogICAgICAgICAgIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFNvIGlmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgKnN0cmluZzsKICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBzdHJpbmcgeCk7CgogICAgICAgICAgIHR5cGVtYXAgY2hlY2tpbmcgd291bGQgYmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgeAogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nCiAgICAgICAgICAgICAgICBzdHJpbmcgeAogICAgICAgICAgICAgICAgc3RyaW5nCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoKICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBUaGUgcHJpbWFyeSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIHRvIHNpbXBsaWZ5IHRoZSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXaXRob3V0IHF1YWxpZmllciBzdHJpcHBpbmcsIG9uZSBoYXMgdG8gd3JpdGUKICAgICAgICAgICBzZXBlcmF0ZSB0eXBlbWFwcyBmb3IgYWxsIHZhcmlhdGlvbnMgb2YgY29uc3QgYW5kIHZvbGF0aWxlICh3aGljaAogICAgICAgICAgIGlzIGEgcGFpbikuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVHlwZW1hcHMgbWlnaHQgYmUgYXBwbGllZCBpbgogICAgICAgICAgIHBsYWNlcyB3aGVyZSB0aGV5IHdlcmVuJ3QgYmVmb3JlLgoKCjEwLzkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IGRpc2FtYmlndWF0ZQogICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IG9ubHkgdmFyeSBpbiBjb25zdG5lc3MuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpOwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIGhhbmRsZSB0aGlzLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgbm9ybWFsbHkuCiAgICAgICAgICAgCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaF9jb25zdCkgYmxhaCgpIGNvbnN0OwoKICAgICAgICAgICBJbiB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZSwgbWV0aG9kIGNhbGxzIGxpa2UgdGhpcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgKG9iaiktPmJsYWgoKSAgICAgICAgICAgICAgIC8vIE5vbi1jb25zdCB2ZXJzaW9uCiAgICAgICAgICAgICAgICgoRm9vIGNvbnN0ICopb2JqKS0+YmxhaCgpICAvLyBjb25zdCB2ZXJzaW9uCgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZvcmNlIHRoZSByaWdodCBtZXRob2QgdG8gYmUgaW52b2tlZC4KICAgICAgICAgICBBZG1pdHRlZGx5LCB0aGlzIGlzIHByb2JhYmx5IG9ic2N1cmUsIGJ1dCB3ZSBtaWdodAogICAgICAgICAgIGFzIHdlbGwgZ2V0IGl0IHJpZ2h0LgoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciBub3cgaWdub3JlcyAnXHInIGluIHRoZSBpbnB1dC4KICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggdGhlIGZvbGxvd2luZyBidWc6CiAgICAgICAgICAgWyAjNDY4NDE2IF0gU1dJRyB0aGlua3MgbWFjcm8gZGVmcyBhcmUgZGVjbGFyYXRpb25zPwoKMTAvOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgfHwsICYmLCBhbmQgISBpbiBjb25zdGFudHMuICBUaGlzCiAgICAgICAgICAgZml4ZXMgU0YgWyAjNDY4OTg4IF0gTG9naWNhbCBvcHMgYnJlYWsgcHJlcHJvY2Vzc29yLgogICAgICAgICAgIEhvd2V2ZXIsIGF0IHRoaXMgdGltZSwgY29uc3RhbnRzIHVzaW5nIHRoZXNlIG9wZXJhdG9ycwogICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkICh0aGUgcGFyc2VyIHdpbGwgaXNzdWUgYSB3YXJuaW5nKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIC1zaG93X3RlbXBsYXRlcyBjb21tYW5kIGxpbmUgb3B0aW9uLiAgVGhpcyBtYWtlcwogICAgICAgICAgIFNXSUcgZGlzcGxheSB0aGUgY29kZSBpdCBhY3R1YWxseSBwYXJzZXMgdG8gZ2VuZXJhdGUKICAgICAgICAgICB0ZW1wbGF0ZSB3cmFwcGVycy4gIE1vc3RseSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gc2VtYW50aWNzIG9mICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBXaGVuCiAgICAgICAgICAgdXNpbmcgJXRlbXBsYXRlLCB0aGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkCiAgICAgICAgICAgYXMgdHlwZXMgYnkgZGVmYXVsdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGRvdWJsZT47CgogICAgICAgICAgIFRvIHNwZWNpZnkgYSB0ZW1wbGF0ZSBhcmd1bWVudCB0aGF0IGlzICpub3QqIGEgdHlwZSwgeW91CiAgICAgICAgICAgbmVlZCB0byB1c2UgZGVmYXVsdC12YWx1ZSBzeW50YXguIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQsaW50PTUwPjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3RvcjxpbnQsc2l6ZT0xMDA+OwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIG5hbWUgZG9lc24ndCByZWFsbHkgbWF0dGVyLS1vbmx5CiAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgKGUuZy4sIDUwLCAxMDApIGlzIHVzZWQgZHVyaW5nCiAgICAgICAgICAgZXhwYW5zaW9uLiAgVGhpcyBkaWZmZXJzIGZyb20gbm9ybWFsIEMrKywgYnV0IEkgY291bGRuJ3QKICAgICAgICAgICBmaWd1cmUgb3V0IGEgYmV0dGVyIHdheSB0byBkbyBpdCBpbiB0aGUgcGFyc2VyLiAgTWlnaHQKICAgICAgICAgICBpbXBsZW1lbnQgYW4gYWx0ZXJuYXRpdmUgbGF0ZXIuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFqb3IgY2hhbmdlcyB0byB0ZW1wbGF0ZSBoYW5kbGluZyBpbiBvcmRlciB0byBwcm92aWRlCiAgICAgICAgICAgYmV0dGVyIGludGVncmF0aW9uIHdpdGggdGhlIEMrKyB0eXBlLXN5c3RlbS4gVGhlIG1haW4KICAgICAgICAgICBwcm9ibGVtIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgIFN1cHBvc2UgeW91IGhhdmUgYSB0ZW1wbGF0ZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgYmxhaChjb25zdCBUIHgpIHsgc3R1ZmYgfTsKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIE5vdyBzdXBwb3NlLCB0aGF0IHlvdSBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgb24gYQogICAgICAgICAgIHR5cGUgbGlrZSB0aGlzIGluIFNXSUc6CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPGludCAqPjsKCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzICpzdXBwb3NlZCogdG8gZ2VuZXJhdGUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgSG93ZXZlciwgaW4gU1dJRy0xLjMuOSwgdGhlIHRlbXBsYXRlIHN1YnN0aXR1dGlvbiBnZXRzIGl0IHdyb25nCiAgICAgICAgICAgYW5kIHByb2R1Y2VzCgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBpbnQgKngpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgKG5vdGljZSB0aGUgYmFkIHBsYWNlbWVudCBvZiB0aGUgJ2NvbnN0JyBxdWFsaWZpZXIpLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIFNXSUcgcGFyc2VyIG5vdyBnZW5lcmF0ZXMgaW1wbGljaXQgdHlwZWRlZnMKICAgICAgICAgICBmb3IgdGVtcGxhdGUgdHlwZSBhcmd1bWVudHMgdGhhdCBwcm9kdWNlcyBjb2RlIHJvdWdobHkKICAgICAgICAgICBlcXVpdmFsZW50IHRvIGRvaW5nIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpfX3N3aWd0bXBsMTsKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxfX3N3aWd0bXBsMT47CgogICAgICAgICAgIHdoaWNoIGdlbmVyYXRlcyBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgU2luY2UgdGhpcyBpcyBjb3JyZWN0IGluIGJvdGggQysrIGFuZCBTV0lHLCBpdCBwcm92aWRlcyB0aGUgcmlnaHQKICAgICAgICAgICBzZW1hbnRpY3MgYW5kIGFsbG93cyBldmVyeXRoaW5nIHRvIGNvbXBpbGUgcHJvcGVybHkuICBIb3dldmVyLAogICAgICAgICAgIHRvIGNsZWFuIHVwIHRoZSBnZW5lcmF0ZWQgY29kZSBhIGxpdHRsZSBiaXQsIHRoZSBwYXJzZXIga2VlcHMKICAgICAgICAgICB0cmFjayBvZiB0aGUgdGVtcGxhdGUgdHlwZXMgYW5kIHBlcmZvcm1zIGJhY2stc3Vic3RpdHV0aW9uIHRvCiAgICAgICAgICAgdGhlIG9yaWdpbmFsIHR5cGUgd2hlbiBidWlsZGluZyB0aGUgcGFyc2UgdHJlZS4gIFRodXMsIGV2ZW4KICAgICAgICAgICB0aG91Z2ggdGhlIGltcGxpY2l0IHR5cGVkZWYgaXMgdXNlZCBpbiB0aGUgaW5wdXQgYW5kIG1heSBhcHBlYXIKICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgZmlsZSAoZm9yIHByb3BlciBjb21waWxhdGlvbiksIHRoZSBwYXJzZQogICAgICAgICAgIHRyZWUgd2lsbCBoaWRlIGEgbG90IG9mIHRoZXNlIGRldGFpbHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIHdpbGwgbG9vayBsaWtlIGl0IHdhcyBkZWNsYXJlZCBhcyBmb2xsb3dzICh3aGljaCBpcyB3aGF0CiAgICAgICAgICAgeW91IHdhbnQpOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH0KCiAgICAgICAgICAgVGhlIG9ubHkgcGxhY2UgeW91IGFyZSBsaWtlbHkgdG8gbm90aWNlIHRoZSB0eXBlZGVmIGhhY2sKICAgICAgICAgICBpcyBpbiBib2RpZXMgb2YgdGVtcGxhdGUgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIGRpZCB0aGlzLAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBibGFoIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgewogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBUICB0ZW1wdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgeW91IHdpbGwgZmluZCB0aGF0ICdUIHRlbXB2YWx1ZScgZ290IGV4cGFuZGVkIGludG8gc29tZQogICAgICAgICAgIHN0cmFuZ2UgdHlwZWRlZiB0eXBlLiAgVGhpcyAqc3RpbGwqIGNvbXBpbGVzIGNvcnJlY3RseSAKICAgICAgICAgICBzbyBpdCdzIG5vdCBhIGJpZyBkZWFsIChvdGhlciB0aGFuIGxvb2tpbmcga2luZCBvZiB1Z2x5CiAgICAgICAgICAgaW4gdGhlIHdyYXBwZXIgZmlsZSkuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBzb21lIGluaGVyaXRhbmNlIHByb2JsZW1zIGluIFRjbCBPYmplY3QgaW50ZXJmYWNlLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGNsIG1vZHVsZSBoYXMgY2hhbmdlZCB0byB1c2UgYnl0ZS1iYWNrZWQgcG9pbnRlciBzdHJpbmdzLiAgVGhpcwogICAgICAgICAgIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMuICBIb3dldmVyLAogICAgICAgICAgIHRoZSBvcmRlciBpbiB3aGljaCBkaWdpdHMgYXBwZWFyIGluIHBvaW50ZXIgdmFsdWVzIG5vIGxvbmdlcgogICAgICAgICAgIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBhY3R1YWwgbnVtZXJpY2FsIHZhbHVlIG9mIGEKICAgICAgICAgICBwb2ludGVyIChvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLCBwYWlycyBvZiBkaWdpdHMgYXBwZWFyCiAgICAgICAgICAgaW4gcmV2ZXJzZSBvcmRlcikuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQZXJsNSBtb2R1bGUgaXMgbm93IGRyaXZlbiBieSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAncGVybDUuc3dnJwogICAgICAgICAgIGluIHRoZSBTV0lHIGxpYnJhcnkuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcGVybDUgbW9kdWxlIG5vIGxvbmdlciB0cmllcyB0byBhcHBseSB0aGUgIm91dCIgdHlwZW1hcAogICAgICAgICAgIGluIGNvZGUgZ2VuZXJhdGVkIGZvciBtYWdpYyB2YXJpYWJsZXMuICBJJ20gc3VycHJpc2VkIHRoYXQKICAgICAgICAgICB0aGlzIGV2ZXIgd29ya2VkIGF0IGFsbCAoc2luY2UgYWxsIG9mIHRoZSBjb2RlIHRoYXQgd2FzIHRoZXJlCiAgICAgICAgICAgd2FzIHdyb25nIGFueXdheXMpLiAgIFVzZSB0aGUgInZhcm91dCIgdHlwZW1hcCB0byBoYW5kbGUKICAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgcmVsYXRlZCB0byBjaGFyYWN0ZXIgYXJyYXkgbWVtYmVycyBvZiBzdHJ1Y3R1cmVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgaXMgbm9ybWFsbHkgc3VwcG9zZWQgdG8gcmV0dXJuIGEgc3RyaW5nLCBidXQgdGhpcyB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjkuICAgVGhlIHJlYXNvbiBpdCB3YXMgYnJva2VuIHdhcyBhY3R1YWxseQogICAgICAgICAgIGR1ZSB0byBhIHN1YnRsZSBuZXcgZmVhdHVyZSBvZiB0eXBlbWFwcy4gIFdoZW4gYSBkYXRhIG1lbWJlcgogICAgICAgICAgIGlzIHNldCB0byBhbiBhcnJheSBsaWtlIHRoaXMsIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgcmVsYXRlZAogICAgICAgICAgIGFjY2Vzc29yIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IHNldCB0byBhbiBhcnJheS4gIFRoaXMgbWVhbnMKICAgICAgICAgICB0aGF0IHlvdSBjYW4gbm93IHdyaXRlIHR5cGVtYXBzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLG91dCkgY2hhciBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgJHRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCRzb3VyY2UsJGRpbTApOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZnVuY3QKICAgICAgICAgICBtZW1iZXJvdXQgdHlwZW1hcCBpbiBhIG1vcmUgZWxlZ2FudCBtYW5uZXIuCgo5LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTb21lIGZ1cnRoZXIgcmVmaW5lbWVudCBvZiBxdWFsaWZpZWQgQysrIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIChpKSBUaGUgU1dJRyBwYXJzZXIgd2FzIGV4dGVuZGVkIHNsaWdodGx5IHRvIGFsbG93ICd2b2xhdGlsZScKICAgICAgICAgICBhbmQgY29tYmluYXRpb25zIG9mICdjb25zdCcgYW5kICd2b2xhdGlsZScgdG8gYmUgdXNlZC4gIFRoaXMKICAgICAgICAgICBpcyBwcm9iYWJseSByYXJlLCBidXQgdGVjaG5pY2FsbHkgbGVnYWwuICBPbmx5IGFkZGVkIGZvcgogICAgICAgICAgIGNvbXBsZXRlbmVzcy4KCiAgICAgICAgICAgKGlpKSBGb3IgdGhlIHB1cnBvc2VzIG9mIG92ZXJsb2FkaW5nLCBxdWFsaWZpZWQgYW5kIG5vbi1xdWFsaWZpZWQKICAgICAgICAgICBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudC4gIFRodXMsIHdoZW4gYSBjbGFzcyBoYXMgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKSBjb25zdDsKCiAgICAgICAgICAgVHdvIGRpc3RpbmN0IG1ldGhvZHMgYXJlIGRlY2xhcmVkLiAgVG8gZGVhbCB3aXRoIHRoaXMsICVyZW5hbWUKICAgICAgICAgICBhbmQgc2ltaWxhciBkaXJlY3RpdmVzIGhhdmUgYmVlbiBleHRlbmRlZCB0byByZWNvZ25pemUgY29uc3QuCiAgICAgICAgICAgVGh1cywgb25lIGNhbiBkaXNhbWJpZ3VhdGUgdGhlIHR3byBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vY29uc3QpIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIG9yIHNpbXBseSBpZ25vcmUgdGhlIGNvbnN0IHZhcmlhbnQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgTm90ZTogU1dJRyBjdXJyZW50bHkgaGFzIG5vIHdheSB0byBhY3R1YWxseSBpbnZva2UgdGhlIGNvbnN0CiAgICAgICAgICAgbWVtYmVyIHNpbmNlIHRoZSAnY29uc3QnIGlzIGRpc2NhcmRlZCB3aGVuIGdlbmVyYXRpbmcgd3JhcHBlcnMKICAgICAgICAgICBmb3Igb2JqZWN0cy4gIAoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTmV3IGRpcmVjdGl2ZS4gJW5hbWV3YXJuIGNhbiBiZSB1c2VkIHRvIGlzc3VlIHdhcm5pbmcKICAgICAgICAgICBtZXNzYWdlcyBmb3IgY2VydGFpbiBkZWNsYXJhdGlvbiBuYW1lcy4gICBUaGUgbmFtZQogICAgICAgICAgIG1hdGNoaW5nIGlzIHRoZSBzYW1lIGFzIGZvciB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuCiAgICAgICAgICAgVGhlIGludGVudCBvZiB0aGlzIGRpcmVjdGl2ZSBpcyB0byBpc3N1ZSB3YXJuaW5ncyBmb3IKICAgICAgICAgICBwb3NzaWJsZSBuYW1lc3BhY2UgY29uZmxpY3RzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVuYW1ld2FybigicHJpbnQgaXMgYSBweXRob24ga2V5d29yZCIpIHByaW50OwoKICAgICAgICAgICBUaGUgbmFtZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgcGVyZm9ybWVkIGFmdGVyIGEgbmFtZQogICAgICAgICAgIGhhcyBiZWVuIHJlc29sdmVkIHVzaW5nICVyZW5hbWUuICBUaGVyZWZvcmUsIGEKICAgICAgICAgICBkZWNsYXJhdGlvbiBsaWtlIHRoaXMgd2lsbCBub3QgZ2VuZXJhdGUgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCJQcmludCIpIHByaW50OwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHZvaWQgcHJpbnQoKTsgICAgLyogTm8gd2FybmluZyBnZW5lcmF0ZWQgKi8KCiAgICAgICAgICAgU2luY2UgdGhlIHdhcm5pbmcgbWVjaGFuaXNtIGZvbGxvd3MgJXJlbmFtZSBzZW1hbnRpY3MsIGl0IGlzCiAgICAgICAgICAgYWxzbyB0byBpc3N1ZSB3YXJuaW5ncyBmb3Igc3BlY2lmaWMgY2xhc3NlcyBvciBqdXN0IGZvcgogICAgICAgICAgIGNlcnRhaW4gbWVtYmVyIGZ1bmN0aW9uIG5hbWVzLgoKICAgICAgICAgICAoRGF2ZSAtIEkndmUgYmVlbiB0aGlua2luZyBhYm91dCBhZGRpbmcgc29tZXRoaW5nIGxpa2UgdGhpcwogICAgICAgICAgIGZvciBxdWl0ZSBzb21lIHRpbWUuICBKdXN0IG5ldmVyIGdvdCBhcm91bmQgdG8gaXQpCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIEVuaGFuY2VkIHRoZSAlaWdub3JlIGRpcmVjdGl2ZSBzbyB0aGF0IHdhcm5pbmcgbWVzc2FnZXMKICAgICAgICAgICBjYW4gYmUgaXNzdWVkIHRvIHVzZXJzLiAgIFRoaXMgaXMgZG9uZSB1c2luZyAlaWdub3Jld2FybgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlaWdub3Jld2Fybigib3BlcmF0b3IgbmV3IGlnbm9yZWQiKSBvcGVyYXRvciBuZXc7CgogICAgICAgICAgIFRoZSBuYW1lcyBhbmQgc2VtYW50aWNzIG9mICVpZ25vcmV3YXJuIGlzIGV4YWN0bHkgdGhlIAogICAgICAgICAgIHNhbWUgYXMgJWlnbm9yZS4gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAgIGlzIGZvciBtb2R1bGUgd3JpdGVycyB3aG8gd2FudCB0byBpZ25vcmUgY2VydGFpbiB0eXBlcwogICAgICAgICAgIG9mIGRlY2xhcmF0aW9ucywgYnV0IHdobyBhbHNvIHdhbnQgdG8gYWxlcnQgdXNlcnMgYWJvdXQgaXQuCiAgICAgICAgICAgQSB1c2VyIG1pZ2h0IGFsc28gdXNlIHRoaXMgZm9yIGRlYnVnZ2luZyAoc2luY2UgbWVzc2FnZXMKICAgICAgICAgICB3aWxsIGFwcGVhciB3aGVuZXZlciBhbiBpZ25vcmVkIGRlY2xhcmF0aW9uIGFwcGVhcnMpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMjYvMjAwMTogYmVhemxleQogICAgICAgICAgIFN1cGVyLWV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBvdmVybG9hZGVkIG9wZXJhdG9ycy4gCiAgICAgICAgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25zaXN0cyBvZiBhIGZldyBkaWZmZXJlbnQgcGFydHMuCgogICAgICAgICAgIChpKSBPcGVyYXRvciBuYW1lcyBzdWNoIGFzICdvcGVyYXRvcisnIGFyZSBub3cgYWxsb3dlZAogICAgICAgICAgIGFzIHZhbGlkIGRlY2xhcmF0b3IgbmFtZXMuICBUaHVzIHRoZSAnb3BlcmF0b3InIHN5bnRheAogICAgICAgICAgIGNhbiBhcHBlYXIgKmFueXBsYWNlKiBhIG5vcm1hbCBkZWNsYXJhdG9yIG5hbWUgd2FzIHVzZWQKICAgICAgICAgICBiZWZvcmUuICBPbiB0aGUgc3VyZmFjZSwgdGhpcyBtZWFucyB0aGF0IG9wZXJhdG9ycyBjYW4KICAgICAgICAgICBiZSBwYXJzZWQganVzdCBsaWtlIG5vcm1hbCBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuIAogICAgICAgICAgIEhvd2V2ZXIsIGl0IGFsc28gbWVhbnMgdGhhdCBvcGVyYXRvciBuYW1lcyBjYW4gYmUgdXNlZAogICAgICAgICAgIGluIG1hbnkgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXJlbmFtZShfX2FkZF9fKSBDb21wbGV4OjpvcGVyYXRvcisoY29uc3QgQ29tcGxleCAmKTsKCiAgICAgICAgICAgKGlpKSBPcGVyYXRvcnMgYXJlIHdyYXBwZWQgKmV4YWN0bHkqIGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBtZXRob2RzLiAgSW50ZXJuYWxseSwgdGhlIG9wZXJhdG9yIG5hbWUgaXMgdXNlZCAKICAgICAgICAgICBkaXJlY3RseSBtZWFuaW5nIHRoYXQgdGhlIHdyYXBwZXIgY29kZSBtaWdodCBjb250YWluCiAgICAgICAgICAgc3RhdGVtZW50cyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYXJnMC0+b3BlcmF0b3IqKChDb21wbGV4IGNvbnN0ICYpKmFyZzEpOwoKICAgICAgICAgICBUaGlzIGFsbCBzZWVtcyB0byBwYXJzZSBhbmQgY29tcGlsZSBjb3JyZWN0bHkgKGF0IGxlYXN0CiAgICAgICAgICAgb24gbXkgbWFjaGluZSkuCgogICAgICAgICAgIChpaWkpIFNXSUcgd2lsbCBubyBsb25nZXIgd3JhcCBhIGRlY2xhcmF0aW9uIGlmIGl0cyBzeW1ib2wKICAgICAgICAgICB0YWJsZSBuYW1lIGNvbnRhaW5zIGlsbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzLiAgSWYKICAgICAgICAgICBpbGxlZ2FsIGNoYXJhY3RlcnMgYXJlIGRldGVjdGVkLCB5b3Ugd2lsbCBzZWUgYW4gZXJyb3IKICAgICAgICAgICBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgIFdhcm5pbmcuIENhbid0IHdyYXAgb3BlcmF0b3IqIHVubGVzcyByZW5hbWVkIHRvIGEgdmFsaWQgaWRlbnRpZmllci4KCiAgICAgICAgICAgVGhlIG9ubHkgd2F5IHRvIGZpeCB0aGlzIGlzIHRvIHVzZSAlcmVuYW1lIG9yICVuYW1lIHRvIGJpbmQKICAgICAgICAgICB0aGUgb3BlcmF0b3IgdG8gYSBuaWNlIG5hbWUgbGlrZSAiYWRkIiBvciBzb21ldGhpbmcuIE5vdGU6CiAgICAgICAgICAgdGhlIGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0CiAgICAgICAgICAgbGFuZ3VhZ2UuCgogICAgICAgICAgIFRoZXJlIGFyZSBjZXJ0YWluIGlzc3VlcyB3aXRoIGZyaWVuZCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycy4KICAgICAgICAgICBTb21ldGltZXMsIGZyaWVuZHMgYXJlIHVzZWQgdG8gZGVmaW5lIG1peGVkIG9wZXJhdG9ycyBzdWNoCiAgICAgICAgICAgYXMgYWRkaW5nIGEgQ29tcGxleCBhbmQgYSBkb3VibGUgdG9nZXRoZXIuICBDdXJyZW50bHksIFNXSUcKICAgICAgICAgICBpZ25vcmVzIGFsbCBmcmllbmQgZGVjbGFyYXRpb25zIGluIGEgY2xhc3MuICBBIGdsb2JhbCBvcGVyYXRvcgogICAgICAgICAgIGRlY2xhcmF0aW9uIGNhbiBwcm9iYWJseSBiZSBtYWRlIHRvIHdvcmssIGJ1dCB5b3UnbGwgaGF2ZSB0bwogICAgICAgICAgIHJlbmFtZSBpdCBhbmQgaXQgcHJvYmFibHkgd29uJ3Qgd29yayB2ZXJ5IGNsZWFubHkgaW4gdGhlCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHNpbmNlIGl0J3Mgbm90IGEgY2xhc3MgbWVtYmVyLgoKICAgICAgICAgICBTV0lHIGRvZXNuJ3Qga25vdyBob3cgdG8gaGFuZGxlIG9wZXJhdG9yIHNwZWNpZmljYXRpb25zIAogICAgICAgICAgIHNvbWV0aW1lcyB1c2VkIGZvciBhdXRvbWF0aWMgdHlwZSBjb252ZXJzaW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgU3RyaW5nIHsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyKigpOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH07CgogICAgICAgICAgICh0aGlzIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5IGFuZCBnZW5lcmF0ZXMgYSBzeW50YXggZXJyb3IpLgoKICAgICAgICAgICBBbHNvOiBvcGVyYXRvcnMgbm8gbG9uZ2VyIHNob3cgdXAgYXMgc2VwYXJhdGUgcGFyc2UtdHJlZQogICAgICAgICAgIG5vZGVzIChpbnN0ZWFkIHRoZXkgYXJlIG5vcm1hbCAnY2RlY2wnIG5vZGVzKS4gIEkgbWF5CiAgICAgICAgICAgc2VwYXJhdGUgdGhlbSBhcyBhIHNwZWNpYWwgY2FzZSBsYXRlci4KCiAgICAgICAgICAgU2VlIEV4YW1wbGVzL3B5dGhvbi9vcGVyYXRvciBmb3IgYW4gZXhhbXBsZS4KCiAgICAgICAgICAgKioqIFNVUEVSLUVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKClZlcnNpb24gMS4zLjkgKFNlcHRlbWJlciAyNSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZSBkZWNsYXJhdGlvbnMgbGlrZSAKICAgICAgICAgICAnY2hhciAqKiBjb25zdCcuICBTV0lHIHBhcnNlZCB0aGlzIGNvcnJlY3RseSwgYnV0IHRoZQogICAgICAgICAgIGludGVybmFsIHR5cGUgd2FzIHJlcHJlc2VudGVkIGluY29ycmVjdGx5ICh0aGUgcG9pbnRlcnMKICAgICAgICAgICBhbmQgcXVhbGlmaWVycyB3ZXJlIGluIHRoZSB3cm9uZyBvcmRlcikuCgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBXaXRoZHJldyBleHBlcmltZW50YWwgZmVhdHVyZSAobm90ZWQgYmVsb3cpIHRoYXQgd2FzCiAgICAgICAgICAgY2F1c2luZyBzZXJpb3VzIHBhcnNpbmcgcHJvYmxlbXMuCgpWZXJzaW9uIDEuMy44IChTZXB0ZW1iZXIgMjMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIGltcHJvdmVkIGRpc3R1dGlscyBzZXR1cC5weSBmaWxlIGluIHRoZSBUb29scyAKICAgICAgICAgICBkaXJlY3RvcnkgKGxvb2sgZm9yIHRoZSBzZXR1cC5weS50bXBsIGZpbGUpLiAgQ29udHJpYnV0ZWQgYnkKICAgICAgICAgICBUb255IFNld2FyZC4KCjkvMjMvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY2x1ZGVkIHR3byBuZXcgUlBNIHNwZWMgZmlsZXMgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4gQ29udHJpYnV0ZWQKICAgICAgICAgICBieSBUb255IFNld2FyZCBhbmQgVXdlIFN0ZWlubWFubi4KICAKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MzYzNSBdIFBlcmw1LnN3ZyBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBDKysKCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIFR3byBuZXcgZGlyZWN0aXZlcyBjb250cm9sIHRoZSBjcmVhdGlvbiBvZiBkZWZhdWx0CiAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9yczoKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0CiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQKCiAgICAgICAgICAgVGhlc2UgcmVwbGFjZSAlcHJhZ21hIG5vZGVmYXVsdCBhbmQgJXByYWdtYSBtYWtlZGVmYXVsdC4KICAgICAgICAgICAob2xkIGNvZGUgd2lsbCBzdGlsbCB3b3JrLCBidXQgZG9jdW1lbnRhdGlvbiB3aWxsIG9ubHkKICAgICAgICAgICBkZXNjcmliZSB0aGUgbmV3IGRpcmVjdGl2ZXMpLgoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgQnVnIFsgIzQ2MjM1NCBdICVpbXBvcnQgYnJva2VuIGluIDEuMy43LgoKOS8yMC8yMDAxOiBiZWF6bGV5CgogICAgICAgICAgIFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgb3V0LW9mLWNsYXNzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3IgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjpGb28oKSA6CiAgICAgICAgICAgICAgICAgICAgQmFyKCJmb28iKQogICAgICAgICAgICAgICB7IAogICAgICAgICAgICAgICB9IAoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6fkZvbygpIHsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgSmFzb24gU3Rld2FydC4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIGlnbm9yZSBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBWLCBsb25nIFM+IGNsYXNzIE1hcEl0ZXI7CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBhbiBlbWFpbCBleGFtcGxlIGZyb20gSXJpbmEgS290bG92YS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB1bmRlY2xhcmVkIHRjbF9yZXN1bHQgdmFyaWFibGUgaW4gCiAgICAgICAgICAgdGhlICJvdXQiIHR5cGVtYXAgZm9yIFRjbC4gIFJlcG9ydGVkIGJ5IFNoYXVuIExvd3J5LgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBBY3RpdmVQZXJsLiAgCiAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2luZyBvZiBDKysgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIEZvbygpIDogQmFyKC4uLikgey4uLn0KICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIG5vdyBkaXNjYXJkcyB0aGUgY29udGVudHMgb2YgdGhlICguLi4pIHJlZ2FyZGxlc3Mgb2YgCiAgICAgICAgICAgd2hhdCBtaWdodCBlbmNsb3NlZCAoZXZlbiBpZiBzeW50YWN0aWNhbGx5IHdyb25nKS4gIFNXSUcKICAgICAgICAgICBkb2Vzbid0IG5lZWQgdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlcmUgaXMgbm8gcmVhc29uIHRvCiAgICAgICAgICAgbmVlZGxlc3MgYWRkIHN5bnRheCBydWxlcyB0byBoYW5kbGUgYWxsIG9mIHRoZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgaGVyZS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0eXBlbWFwcyBmb3Igc3RydWN0dXJlIG1lbWJlcnMuICBJZiB5b3UgaGF2ZSBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICBpbnQgKmJhcjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgbWVtYmVyIG5hbWUgJ2JhcicgaXMgbm93IHVzZWQgaW4gYW55IGFjY2Vzc29yIGZ1bmN0aW9ucy4KICAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgImluIiB0eXBlbWFwIHRvIGJlIHVzZWQgd2hlbiBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyB0eXBlbWFwCgogICAgICAgICAgICAgICAldHlwZW1hcChweXRob24saW4pIGludCAqYmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIG5vdyBtYXRjaGVzIFZlY3Rvcjo6YmFyLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyB3aWxsIGFsc28KICAgICAgICAgICBtYXRjaCBhbnkgZnVuY3Rpb24gd2l0aCBhbiBhcmd1bWVudCBvZiAiaW50ICpiYXIiIChzbyB5b3Ugc2hvdWxkCiAgICAgICAgICAgYmUgY2FyZWZ1bCkuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFLiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI2NDIgc2V0dGluZyBzdHJpbmcgdmFsdWVzIGluIHN0cnVjdHVyZXMKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyMzk4IHByb2JsZW0gd2l0aCBuZXN0ZWQgdGVtcGxhdGVzLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjE2MjYgcHJvYmxlbSB3aXRoIGZvcm1hdHRpbmcgYW5kIEMrKyBjb21tZW50cy4KICAgICAgICAgICAgCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyODQ1IFdyb25nIG93bmVyc2hpcCBvZiByZXR1cm5lZCBvYmplY3RzLgogICAgICAgICAgIAo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ1OTM2Ny4gIERlZmF1bHQgY29uc3RydWN0b3JzIGZvciBjbGFzc2VzCiAgICAgICAgICAgd2l0aCBwdXJlIHZpcnR1YWwgbWV0aG9kcy4KCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgY2xhc3Mgc2NvcGUuICBGb3IKICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBlbnVtIGJhciB7IEZPTywgQkFSIH07CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXIgYiA9IEZPTyk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFNXSUcgbm93IGNvcnJlY3RseSBnZW5lcmF0ZXMgYSBkZWZhdWx0IHZhbHVlIG9mICJGb286OkZPTyIgZm9yCiAgICAgICAgICAgdGhlIGJsYWgoKSBtZXRob2QgYWJvdmUuICBUaGlzIHVzZWQgdG8gd29yayBpbiAxLjEsIGJ1dCB3YXMKICAgICAgICAgICBicm9rZW4gaW4gMS4zLjcuICAgQnVnIHJlcG9ydGVkIGJ5IE1pa2UgUm9tYmVyZy4KClZlcnNpb24gMS4zLjcgIChTZXB0ZW1iZXIgMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3BlY2lhbCAlaWdub3JlIGRpcmVjdGl2ZSB0byBpZ25vcmUgZGVjbGFyYXRpb25zLiAgVGhpcwogICAgICAgICAgIGZlYXR1cmUgd29ya3MgZXhhY3RseSBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlICBmb287ICAgICAgICAvLyBJZ25vcmUgYWxsIGRlY2xhcmF0aW9ucyBmb28KICAgICAgICAgICAgICVpZ25vcmUgIDo6Zm9vOyAgICAgIC8vIE9ubHkgaWdub3JlIGZvbyBpbiBnbG9iYWwgc2NvcGUKICAgICAgICAgICAgICVpZ25vcmUgIFNwYW06OmZvbzsgIC8vIE9ubHkgaWdub3JlIGluIGNsYXNzIFNwYW0KICAgICAgICAgICAgICVpZ25vcmUgICo6OmZvbzsgICAgIC8vIElnbm9yZSBpbiBhbGwgY2xhc3NlcwoKICAgICAgICAgICAlaWdub3JlIGNhbiBhbHNvIGJlIHBhcmFtZXRlcml6ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSA6OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSBTcGFtOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgKjo6Zm9vKGludCk7CgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCgo5LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBzaGFkb3djb2RlIHByYWdtYSBtb2RpZmllZCBzbyB0aGF0IHRoZSBjb2RlIHRoYXQgaXMgb3V0cHV0IAogICAgICAgICAgIGluIHRoZSBzaGFkb3cgZmlsZSBpcyBwbGFjZWQgcmVsYXRpdmUgdG8gd2hlcmUgaXQgaXMgcGxhY2VkIGluIHRoZSAKICAgICAgICAgICBjL2MrKyBjb2RlLiBUaGlzIGFsbG93cyBzdXBwb3J0IGZvciBKYXZhRG9jIGZ1bmN0aW9uIGNvbW1lbnRzLiAKCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFBhdGNoIFsgIzQ0Nzc5MSBdIEZpeCBmb3IgcHl0aG9uIC1pbnRlcmZhY2Ugb3B0aW9uLgogICAgICAgICAgIFN1Ym1pdHRlZCBieSBUYXJuIFdlaXNuZXIgQnVydG9uLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzCiAgICAgICAgICAgZm9yIGEgY2xhc3MgaWYgaXQgb25seSBkZWZpbmVzIGEgcHJpdmF0ZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IKICAgICAgICAgICBvciBkZXN0cnVjdG9yIG9yIGlmIGFueSBvbmUgb2YgaXRzIGJhc2UgY2xhc3NlcyBvbmx5IGhhcwogICAgICAgICAgIHByaXZhdGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLiAgVGhpcyB3YXMgcmVwb3J0ZWQgaW4KICAgICAgICAgICBTRiBQYXRjaCBbICM0NDQyODEgXSBub25wdWJsaWMvZGVmYXVsdC9pbmhlcmV0ZWQgY3Rvci9kdG9yCiAgICAgICAgICAgYnkgTWFyY2VsbyBNYXR1cy4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhdGNoIHRvIFBlcmw1IG1vZHVsZSB0aGF0IGFsbG93cyBjb25zdGFudHMgdG8gYmUKICAgICAgICAgICB3cmFwcGVkIGFzIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgdGhlIGxlYWRpbmcgJC4KICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCB1c2luZyB0aGUgLWNvbnN0IG9wdGlvbi4KICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBSaWNoIFdhbGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgdGhlICd2b2xhdGlsZScgdHlwZSBxdWFsaWZpZXIuCiAgICAgICAgICAgdm9sYXRpbGUgZG9lc24ndCBtZWFuIGFueXRoaW5nIHRvIFNXSUcsIGJ1dCBpdCBpcwogICAgICAgICAgIG5lZWRlZCB0byBwcm9wZXJseSBnZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBkZWNsYXJhdGlvbnMKICAgICAgICAgICB0aGF0IHVzZSBpdC4gIEl0J3MgYWxzbyBiZWVuIGFkZGVkIHRvIG1ha2UgdGhlIFNXSUcgdHlwZQogICAgICAgICAgIHN5c3RlbSBtb3JlIGNvbXBsZXRlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgJXJlbmFtZSBkaXJlY3RpdmUuICAqKiogVGhpcwogICAgICAgICAgIG5ldyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIGdyZWF0bHkgc2ltcGxpZnkgdGhlIHRhc2sgb2YKICAgICAgICAgICByZXNvbHZpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuICoqKgogICAgICAgICAgIAogICAgICAgICAgIEluIHByaW9yIHZlcnNpb25zIG9mIFNXSUcsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSB3YXMKICAgICAgICAgICB1c2VkIHRvIGNvbnNpc3RlbnRseSBhcHBseSBhbiBpZGVudGlmaWVyIHJlbmFtaW5nLiBGb3IgCiAgICAgICAgICAgZXhhbXBsZSwgaWYgeW91IHNhaWQgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lIGZvbyBiYXI7CgogICAgICAgICAgIEV2ZXJ5IG9jY3VycmVuY2Ugb2YgJ2Zvbycgd291bGQgYmUgcmVuYW1lZCB0byAnYmFyJy4gCiAgICAgICAgICAgQWx0aG91Z2ggdGhpcyB3b3JrcyBmaW5lIGZvciByZXNvbHZpbmcgYSBjb25mbGljdCB3aXRoIGEKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZCwgaXQgaXMgdXNlbGVzcyBmb3IKICAgICAgICAgICBmb3IgZGVhbGluZyB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcy4gICAgVGhpcyBpcyBiZWNhdXNlCiAgICAgICAgICAgYWxsIG1ldGhvZHMgYXJlIHNpbXBseSByZW5hbWVkIHRvIHRoZSBzYW1lIHRoaW5nIAogICAgICAgICAgIChnZW5lcmF0aW5nIHRoZSBzYW1lIGNvbmZsaWN0IGFzIGJlZm9yZSkuCgogICAgICAgICAgIFRoZXJlZm9yZSwgdGhlIG9ubHkgd2F5IHRvIGRlYWwgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMKICAgICAgICAgICB3YXMgdG8gZ28gdGhyb3VnaCBhbmQgaW5kaXZpZHVhbGx5IHJlbmFtZSB0aGVtIGFsbCB1c2luZwogICAgICAgICAgICVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIHlvdSBoYWQgdG8gZG8gdGhpcyBmb3IgYWxsCiAgICAgICAgICAgZGVyaXZlZCBjbGFzc2VzIHRvby4KCiAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5LCB0aGlzIG1ha2VzIGl0IGV4dHJlbWVseSBoYXJkIHRvIHJlc29sdmUKICAgICAgICAgICBvdmVybG9hZGluZyB3aXRob3V0IGEgbG90IG9mIHdvcmsgYW5kIG1ha2VzIGl0IGFsbW9zdAogICAgICAgICAgIGltcG9zc2libGUgdG8gdXNlIFNXSUcgb24gcmF3IEMrKyAuaCBmaWxlcy4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsICVyZW5hbWUgbm93IGFjY2VwdHMgcGFyYW1ldGVyIGRlY2xhcmF0b3JzLgogICAgICAgICAgIFRoZSBzeW50YXggaGFzIGFsc28gYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbiByZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyKGludCknCiAgICAgICAgICAgdG8gJ2Jhcl9pJywgbGVhdmluZyBhbnkgb3RoZXIgb2NjdXJyZW5jZSBvZiAnYmFyJyBhbG9uZS4KCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKCiAgICAgICAgICAgVXNpbmcgdGhpcyBmZWF0dXJlLCB5b3UgY2FuIG5vdyBzZWxlY3RpdmVseSByZW5hbWUgCiAgICAgICAgICAgY2VydGFpbiBkZWNsYXJhdGlvbnMgaW4gYWR2YW5jZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwogICAgICAgICAgICAgJXJlbmFtZShiYXJfZCkgYmFyKGRvdWJsZSk7CgogICAgICAgICAgICAgLy8gSW5jbHVkZSByYXcgQysrIGhlYWRlciAgICAKICAgICAgICAgICAgICVpbmNsdWRlICJoZWFkZXIuaCIKCiAgICAgICAgICAgV2hlbiAlcmVuYW1lIGlzIHVzZWQgaW4gdGhpcyBtYW5uZXIsIGFsbCBvY2N1cnJlbmNlIG9mIGJhcihpbnQpCiAgICAgICAgICAgYXJlIHJlbmFtZWQgd2hlcmV2ZXIgdGhleSBtaWdodCBvY2N1ci4gIE1vcmUgY29udHJvbCBpcyBvYnRhaW5lZAogICAgICAgICAgIHRocm91Z2ggZXhwbGljaXQgcXVhbGlmaWNhdGlvbi4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIDo6YmFyKGludCk7CgogICAgICAgICAgIG9ubHkgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAgICAgIFRoZSBkZWNsYXJhdGlvbiwKICAgICAKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBGb286OmJhcihpbnQpOwoKICAgICAgICAgICBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIGEgY2xhc3MgRm9vLgogICAgICAgICAgIFRoaXMgbGF0dGVyIGZvcm0gYWxzbyBzdXBwb3J0cyBpbmhlcml0YW5jZS4gIFRoZXJlZm9yZSwgaWYgeW91CiAgICAgICAgICAgaGFkIGEgY2xhc3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBTcGFtOjpiYXIoaW50KSBtZXRob2Qgd291bGQgYWxzbyBiZSByZW5hbWVkIChzaW5jZSBTcGFtIAogICAgICAgICAgIGlzIGEgc3ViY2xhc3Mgb2YgRm9vKS4gICBUaGlzIGxhdHRlciBmZWF0dXJlIG1ha2VzIGl0IGVhc3kKICAgICAgICAgICBmb3IgU1dJRyB0byBhcHBseSBhIGNvbnNpc3RlbnQgcmVuYW1pbmcgYWNyb3NzIGFuIGVudGlyZQogICAgICAgICAgIGNsYXNzIGhpZXJhcmNoeSBzaW1wbHkgYnkgc3BlY2lmeWluZyByZW5hbWluZyBydWxlcyBmb3IKICAgICAgICAgICB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgQSBjbGFzcyB3aWxkY2FyZCBvZiAqIGNhbiBiZSB1c2VkIGlmIHlvdSB3YW50IHRvIHJlbmFtaW5nCiAgICAgICAgICAgYWxsIG1hdGNoaW5nIG1lbWJlcnMgb2YgYWxsIGNsYXNzZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgKjo6YmFyKGludCk7CgogICAgICAgICAgIHdpbGwgcmVuYW1lIGFsbCBtZW1iZXJzIGJhcihpbnQpIHRoYXQgYXJlIGRlZmluZWQgaW4gY2xhc3Nlcy4KICAgICAgICAgICBJdCB3aWxsIG5vdCByZW5hbWVkIGRlZmluaXRpb25zIG9mIGJhcihpbnQpIGluIHRoZSBnbG9iYWwKICAgICAgICAgICBzY29wZS4KCiAgICAgICAgICAgVGhlIG9sZCB1c2Ugb2YgJXJlbmFtZSBpcyBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBpcyBzb21ld2hhdAogICAgICAgICAgIGVuaGFuY2VkLiAgCgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBiYXI7ICAgICAgLy8gUmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcicuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIDo6YmFyOyAgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGdsb2JhbCBzY29wZSBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSAqOjpiYXI7ICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBjbGFzc2VzIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIEZvbzo6YmFyOyAvLyBSZW5hbWUgYWxsICdiYXInIGRlZmluZWQgaW4gY2xhc3MgRm9vLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkYXRhLW1lbWJlciB0byBtZW1iZXItZnVuY3Rpb24gCiAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGFkIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOb3cgc3VwcG9zZSB0aGF0IHlvdSB3YW50ZWQgdG8gYWNjZXNzIHggYW5kIHkgCiAgICAgICAgICAgdGhyb3VnaCBhIG1lbWJlciBmdW5jdGlvbiBpbnRlcmZhY2UgaW5zdGVhZCAKICAgICAgICAgICBvZiB0aGUgdXN1YWwgU1dJRyBiZWhhdmlvci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGYuc2V0X3goMy40KSAgICAgICMgaW5zdGVhZCBvZiBmLnggPSAzLjQKICAgICAgICAgICAgICB4ID0gZi5nZXRfeCgpICAgICAjIGluc3RlYWQgb2YgeCA9IGYueAoKICAgICAgICAgICBUbyBkbyB0aGlzLCBzaW1wbHkgdXNlIHRoZSBuZXcgJWF0dHJpYnV0ZWZ1bmMKICAgICAgICAgICBkaXJlY3RpdmUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0XyVzLHNldF8lcykKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJW5vYXR0cmlidXRlZnVuYwoKICAgICAgICAgICBUaGUgYXJndW1lbnRzIHRvICVhdHRyaWJ1dGVmdW5jIGFyZSBDLXN0eWxlIHByaW50ZgogICAgICAgICAgIGZvcm1hdCBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHRoZSBuYW1pbmcgY29udmVudGlvbgogICAgICAgICAgIHRvIHVzZS4gICVzIGlzIHJlcGxhY2VkIHdpdGggdGhlIGFjdHVhbCBuYW1lIG9mIHRoZQogICAgICAgICAgIGRhdGEgbWVtYmVyLiBTV0lHIHByb3ZpZGVzIGEgbnVtYmVyIG9mIHByaW50ZgogICAgICAgICAgIGV4dGVuc2lvbnMgdGhhdCBtaWdodCBoZWxwLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgIHdhbnRlZCB0byB0aXRsZSBjYXNlIGFsbCBvZiB0aGUgYXR0cmlidXRlcywgeW91CiAgICAgICAgICAgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZWZ1bmMoZ2V0JSh0aXRsZSlzLHNldCUodGl0bGUpcyk7CgogICAgICAgICAgIFRoaXMgd2lsbCB0dXJuIGFuIGF0dHJpYnV0ZSAnYmFyJyB0byAnZ2V0QmFyKCknIGFuZCAnc2V0QmFyKCknLgoKICAgICAgICAgICAoc29tZW9uZSByZXF1ZXN0ZWQgdGhpcyBsb25nIGFnbywgYnV0IEkgZmluYWxseSBmaWd1cmVkCiAgICAgICAgICAgaG93IHRvIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXIpLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGlmIG5vbmUgYXJlIGRlZmluZWQuICBUaGlzIHVzZWQgdG8gYmUKICAgICAgICAgICBlbmFibGVkIHdpdGggYSBjb21tYW5kIGxpbmUgc3dpdGNoIC1tYWtlX2RlZmF1bHQsIGJ1dAogICAgICAgICAgIG1vc3QgcGVvcGxlIHdhbnQgdGhlc2UgZnVuY3Rpb25zIGFueXdheXMuICBUbyB0dXJuCiAgICAgICAgICAgb2ZmIHRoaXMgYmVoYXZpb3IgdXNlIHRoZSAtbm9fZGVmYXVsdCBvcHRpb24gb3IgaW5jbHVkZQogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJhZ21hIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKIAogICAgICAgICAgICAgICAgICVwcmFnbWEgbm9fZGVmYXVsdDsKICAKICAgICAgICAgICBUaGlzIG1heSBicmVhayBjZXJ0YWluIGludGVyZmFjZXMgdGhhdCBkZWZpbmVkIHRoZWlyCiAgICAgICAgICAgb3duIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycyB1c2luZyB0aGUgc2FtZSBuYW1pbmcKICAgICAgICAgICBjb252ZW50aW9uIGFzIFNXSUcuICBJZiBzbywgeW91IHdpbGwgZ2V0IGR1cGxpY2F0ZQogICAgICAgICAgIHN5bWJvbHMgd2hlbiBjb21waWxpbmcgdGhlIFNXSUcgd3JhcHBlciBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgSXRlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgKEZJUlNUS0VZLCBORVhUS0VZKS4gIEFsc28sIGF0dHJpYnV0ZQogICAgICAgICAgIGFjY2VzcyBoYXMgYmVlbiBjaGFuZ2VkIHRvIHJlbHkgb24gaW5oZXJpdGFuY2UgaW4gb3JkZXIKICAgICAgICAgICB0byBwcm92aWRlIGJldHRlciBiZWhhdmlvciBhY3Jvc3MgbW9kdWxlcy4gIAoKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVmFyaW91cyBvYnNjdXJlIGltcHJvdmVtZW50cyB0byB0aGUgdHlwZSBzeXN0ZW0gYW5kIGNsYXNzZXMuCiAgICAgICAgICAgU3RyYW5nZSBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzIGFyZSBub3cgd3JhcHBlZCBjb3JyZWN0bHkKICAgICAgICAgICAoaS5lLiwgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgZG9lc24ndCBjYXVzZSB0aGUgQysrCiAgICAgICAgICAgIGNvbXBpbGVyIHRvIGRpZSB3aXRoIGEgdHlwZSBlcnJvcikuCgogICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgUmVhbDsKICAgICAgICAgICAgICAgICBSZWFsIGZvbyhSZWFsICgqb3ApKFJlYWwsUmVhbCksIFJlYWwgeCwgUmVhbCB5KTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgSW5oZXJpdGFuY2Ugb2YgdHlwZXMgaXMgYWxzbyBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgICAKOC8yOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlcyB0byBjbGFzcyB3cmFwcGVycy4gICBXaGVuIFNXSUcgc2VlcyB0d28gY2xhc3NlcyBsaWtlIHRoaXMsCiAKICAgICAgICAgICBjbGFzcyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgY2xhc3MgWSA6IHB1YmxpYyBYIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICB2b2lkIGJhcigpOwogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfQogCiAgICAgICAgICAgaXQgbm93IG9ubHkgZ2VuZXJhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9uczoKIAogICAgICAgICAgICAgWF9mb28oWCAqeCkgeyB4LT5mb28oKTsgfQogICAgICAgICAgICAgWV9iYXIoWSAqeSkgeyB5LT5iYXIoKTsgfQogCiAgICAgICAgICAgVW5saWtlIFNXSUcxLjE1LCB0aGUgZm9vKCkgbWV0aG9kIGRvZXMgKm5vdCogcHJvcGFnYXRlIHRvIGEgd3JhcHBlcgogICAgICAgICAgIGZ1bmN0aW9uIFlfZm9vKCkuIEluc3RlYWQsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCBYX2ZvbygpIG11c3QgYmUKICAgICAgICAgICB1c2VkLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBtb2R1bGVzIHRoYXQgdXNlIHNoYWRvdyBjbGFzc2VzLCBidXQKICAgICAgICAgICBpdCBtaWdodCBicmVhayBtb2R1bGVzIHRoYXQgZGlyZWN0bHkgdXNlIHRoZSBsb3ctbGV2ZWwgQyB3cmFwcGVycy4KICAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBiZWluZyBtYWRlIGZvciBhIG51bWJlciBvZiByZWFzb25zOgoKICAgICAgICAgICAgICAgLSAgSXQgZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBTV0lHLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIHdpdGggYW50aWNpcGF0ZWQgZnV0dXJlIGNoYW5nZXMgc3VjaCBhcyBvdmVybG9hZGVkIG1ldGhvZHMuCgogICAgICAgICAgICAgICAtICBJdCByZXN1bHRzIGluIHN1YnN0YW50aWFsbHkgbGVzcyB3cmFwcGVyIGNvZGUtLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgZm9yIGJpZyBDKysgY2xhc3MgaGllcmFyY2hpZXMgKGluaGVyaXRlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgICAgYXJlIG5vIGxvbmdlciBjb3BpZWQgaW50byBldmVyeSBzaW5nbGUgZGVyaXZlZCBjbGFzcykuCgogICAgICAgICAgICAgICAtICBJdCBhbGxvd3MgZm9yIGJldHRlciBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIG11bHRpcGxlCiAgICAgICAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMgKGNvZGUgaXNuJ3QgcmVwbGljYXRlZCBpbgogICAgICAgICAgICAgICAgICBldmVyeSBzaW5nbGUgbW9kdWxlKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFByb3ZpZGVkIHNvbWUgV2luZG93cyBkb2N1bWVudGF0aW9uIGluIHRoZSBXaW4gZGlyZWN0b3J5IGFuZCBzb21lCiAgICAgICAgICAgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzIGZvciBydW5uaW5nIGV4YW1wbGVzIG9uIFdpbmRvd3MuCgo4LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHJlbmFtZWQgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgcHJvcGVybHk7CgkgICB0aGFua3MgdG8gTWFyYyBab256b24gPE1hcmMuWm9uem9uQHVuaXYtcmVubmVzMS5mcj4gZm9yIHRoZQoJICAgcGF0Y2guICBTZWUgdGhlIG5ldyB0ZXN0IGNhc2UgbmFtZV9jeHguCgo4LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtUY2xdIFJlbW92ZWQgbG90cyBvZiB3YXJuaW5ncyBpc3N1ZWQgYnkgdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLCB3aGljaCB3ZXJlIGNhdXNlZCBieSBtaXhpbmcgZnVuY3Rpb24gcG9pbnRlcnMKCSAgIG9mIGRpZmZlcmVudCBsaW5rYWdlcyAoQysrL0MpLiAKCjgvMjMvMjAwMTogbWtvZXBwZQoJICAgSW1wcm92ZWQgdGhlIE16U2NoZW1lIG1vZHVsZSBieSBwb3J0aW5nIEd1aWxlJ3MgcG9pbnRlcgoJICAgdHlwZSBjaGVja2luZyBzeXN0ZW0gYW5kIG1ha2luZyB0eXBlIGRpc3BhdGNoCgkgICB0eXBlbWFwLWRyaXZlbi4gCgo4LzIyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbnRpcmVseSBuZXcgc3ltYm9sIHRhYmxlIHByb2Nlc3NpbmcuICAgU1dJRyBzaG91bGQgYmUgYWJsZSB0bwogICAgICAgICAgIHJlcG9ydCBtdWNoIGJldHRlciBlcnJvciBtZXNzYWdlcyBmb3IgbXVsdGlwbGUgZGVjbGFyYXRpb25zLiAKICAgICAgICAgICBBbHNvLCB0aGUgbmV3IHN5bWJvbCB0YWJsZSBhbGxvd3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zCiAgICAgICAgICAgKGFsdGhvdWdoIG92ZXJsb2FkaW5nIGlzbid0IHF1aXRlIHN1cHBvcnRlZCBpbiB0aGUgbGFuZ3VhZ2UKICAgICAgICAgICBtb2R1bGVzIHlldCkuCgo4LzIyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdICVuZXcgc3VwcG9ydCBhZGRlZC4KICAgICAgICAgICAqIFtKYXZhXSBQYWNrYWdlIEpOSSBuYW1lIHJlZml4ZWQhCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBQeXRob24gbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgcG9pbnRlcnMgdG8gQysrIG1lbWJlcnMuICBUaGlzCiAgICAgICAgICAgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgIAo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBsaW1pdGVkIHBhcnNpbmcgYW5kIGZ1bGwgdHlwZS1zeXN0ZW0gc3VwcG9ydCBmb3IgcG9pbnRlcnMgdG8KICAgICAgICAgICBtZW1iZXJzLiBOb25lIG9mIFNXSUcncyBsYW5ndWFnZSBtb2R1bGVzIHJlYWxseSBrbm93IGhvdyB0byBkZWFsIHdpdGgKICAgICAgICAgICB0aGlzIHNvIHRoaXMgaXMgcmVhbGx5IG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcyBhbmQgZnV0dXJlCiAgICAgICAgICAgZXhwYW5zaW9uLiAgTm90ZTogU1dJRyBkb2VzIG5vdCBzdXBwb3J0IHBvaW50ZXJzIHRvIG1lbWJlcnMgd2hpY2ggCiAgICAgICAgICAgYXJlIHRoZW1zZWx2ZXMgcG9pbnRlcnMgdG8gbWVtYmVycywgcmVmZXJlbmNlcyB0byBwb2ludGVycyB0byBtZW1iZXJzLAogICAgICAgICAgIG9yIG90aGVyIGNvbXBsaWNhdGVkIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBpcyBtdWNoIGJldHRlciBhdCBwYXJzaW5nIGNlcnRhaW4gQysrIGRlY2xhcmF0aW9ucy4gT3BlcmF0b3JzIGFuZAogICAgICAgICAgIGZyaWVuZHMgZ2VuZXJhbGx5IGRvbid0IGNhdXNlIGFueW1vcmUgc3ludGF4IGVycm9ycy4gIEhvd2V2ZXIsIG5laXRoZXIKICAgICAgICAgICBhcmUgcmVhbGx5IHN1cHBvcnRlZC4KCjgvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkICpoaWdobHkqIGV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBvZiBDKysKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuICBTaW5jZSBDKysgdGVtcGxhdGVzIGFyZSBlc3NlbnRpYWxseQogICAgICAgICAgIGdsb3JpZmllZCBtYWNyb3MgYW5kIFNXSUcgaGFzIGEgZnVsbHkgb3BlcmF0aW9uYWwgQyAKICAgICAgICAgICBwcmVwcm9jZXNzb3Igd2l0aCBtYWNybyBzdXBwb3J0LCB0aGUgcGFyc2VyIG5vdyBjb252ZXJ0cwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucyB0byBtYWNyb3MuICBGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbgogICAgICAgICAgIHRlbXBsYXRlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gVCBtYXgoVCBhLCBUIGIpOwoKICAgICAgICAgICBpcyBpbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX21heChfX25hbWUsVCkKICAgICAgICAgICAgICAgJW5hbWUoX19uYW1lKSBUIG1heChUIGEsIFQgYik7CiAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgYSB2ZXJzaW9uIG9mIHRoZSB0ZW1wbGF0ZSwgYSBzcGVjaWFsICV0ZW1wbGF0ZSBkZWNsYXJhdGlvbgogICAgICAgICAgIGlzIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgbWF4PGludD47ICAgICAgICAgIAogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsKCiAgICAgICAgICAgVGhlIHBhcmFtZXRlciB0byB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHByb3BlciBDIGlkZW50aWZpZXIgdGhhdCdzCiAgICAgICAgICAgdXNlZCB0byB1bmlxdWVseSBuYW1lIHRoZSByZXN1bHRpbmcgaW5zdGFudGlhdGlvbi4gICBXaGVuIHVzZWQsIHRoZQogICAgICAgICAgIHRoZSBleHBhbmRlZCBtYWNybyBsb29rcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVuYW1lKG1heGludCkgaW50IG1heChpbnQgYSwgaW50IGIpOwogICAgICAgICAgICAgICVuYW1lKG1heGRvdWJsZSkgZG91YmxlIG1heChkb3VibGUgYSwgZG91YmxlIGIpOwoKICAgICAgICAgICBBIHNpbWlsYXIgdGVjaG5pcXVlIGlzIHVzZWQgZm9yIHRlbXBsYXRlIGNsYXNzZXMuICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2ZWN0b3IoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBHZXRzIGNvbnZlcnRlZCBpbnRvIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfdmVjdG9yKF9fbmFtZSwgVCkKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPFQ+IF9fbmFtZTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIF9fbmFtZSB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIF9fbmFtZShpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBfX25hbWUgdmVjdG9yPFQ+OwogICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgQW4gYSBzcGVjaWZpYyBpbnN0YW50aWF0aW9uIGlzIGNyZWF0ZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXk6CgogICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlYykgdmVjdG9yPGludD47CgogICAgICAgICAgIFRoZSByZXN1bHRpbmcgY29kZSBwYXJzZWQgYnkgU1dJRyBpcyB0aGVuOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgaW50dmVjIHsKICAgICAgICAgICAgICAgICAgaW50ICpkYXRhOwogICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnR2ZWMoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgIGludCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIGludHZlYyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgTm90ZTogdGhlIGxhc3QgdHlwZWRlZiBpcyBub24tc3RhbmRhcmQgQyBhbmQgaXMgdXNlZCBieSBTV0lHIHRvIHByb3ZpZGUKICAgICAgICAgICBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBuYW1lICJpbnR2ZWMiIGFuZCB0aGUgdGVtcGxhdGUgdHlwZSAKICAgICAgICAgICAidmVjdG9yPGludD4iLgoKICAgICAgICAgICBDQVVUSU9OOiAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBhbmQgdGhlIGZpcnN0IHRpbWUgU1dJRyBoYXMKICAgICAgICAgICBzdXBwb3J0ZWQgQysrIHRlbXBsYXRlcy4gICBFcnJvciByZXBvcnRpbmcgaXMgZXNzZW50aWFsIG5vbi1leGlzdGVudC4KICAgICAgICAgICBJdCB3aWxsIHByb2JhYmx5IGJyZWFrIGluIGNlcnRhaW4gY2FzZXMuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioqCgo4LzE1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gd3JhcHBpbmcgb2YgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLiAgQXJyYXlzCiAgICAgICAgICAgYXJlIG5vdyBwcm9wZXJseSBtYXBwZWQgdG8gYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mCiAgICAgICAgICAgb25lIGxlc3MgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IFsxMF07ICAgICAgICAgICAgICAtLT4gIGludCAqCiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF07ICAgICAgICAgIC0tPiAgaW50ICgqKVsyMF07CiAgICAgICAgICAgICAgICBpbnQgWzEwXVsyMF1bMzBdOyAgICAgIC0tPiAgaW50ICgqKVsyMF1bMzBdOwoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2VydGFpbiBTV0lHIGV4dGVuc2lvbnMgYmVjYXVzZQogICAgICAgICAgIG9sZGVyIHZlcnNpb25zIHNpbXBseSBtYXBwZWQgYWxsIGFycmF5cyBpbnRvIGEgc2luZ2xlCiAgICAgICAgICAgcG9pbnRlciBzdWNoIGFzICJpbnQgKiIuICAgQWx0aG91Z2ggcG9zc2libHkgdW51c3VhbCwgCiAgICAgICAgICAgdGhlIG5ldyB2ZXJzaW9uIGlzIGNvcnJlY3QgaW4gdGVybXMgb2YgdGhlIEMgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSBBcnJheSBzZXR0ZXJzIGdlbmVyYXRlZCBmb3Igc3RydWN0L2NsYXNzIGFycmF5IG1lbWJlcnMuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYW55IGltcHJvdmVtZW50cyB0byBUY2wvUGVybC9QeXRob24gbW9kdWxlcyB0byBiZXR0ZXIKICAgICAgICAgICB3b3JrIHdpdGggbXVsdGlwbGUgaW50ZXJmYWNlIGZpbGVzIGFuZCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuCgo4LzEzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgYmVoYXZpb3Igb2YgJWltcG9ydCBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBwb2xsdXRlcyB0aGUgbW9kdWxlIG5hbWVzcGFjZSBieSB1c2luZwogICAgICAgICAgICdmcm9tIG1vZHVsZSBpbXBvcnQgKicgdG8gcmVmZXIgdG8gdGhlIG90aGVyIG1vZHVsZS4gCiAgICAgICAgICAgSW5zdGVhZCwgaXQgZG9lcyBhIHByb3BlciAnaW1wb3J0IG1vZHVsZScuICAgQWxzbywgU1dJRwogICAgICAgICAgIG1heSB3b3JrIGEgbG90IGJldHRlciB3aGVuIGltcG9ydGluZyBtb2R1bGVzIHRoYXQgaW5jbHVkZQogICAgICAgICAgIHJlZmVyZW5jZXMgdG8gb3RoZXIgaW1wb3J0ZWQgbW9kdWxlcy4KCjgvMTMvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgbmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucywgZ2VuZXJhbGl6aW5nIHRob3NlIG9mIHRoZQoJICAgR3VpbGUtc3BlY2lmaWMgNS8yNy8yMDAxIGNoYW5nZXM6IAoJICAgKiAkZGVzY3JpcHRvciBpcyB0aGUgc2FtZSBhcyBTV0lHVFlQRSRtYW5nbGUsIGJ1dCBhbHNvCgkgICAgIGVuc3VyZXMgdGhhdCB0aGUgdHlwZSBkZXNjcmlwdG9yIG9mIHRoaXMgbmFtZSBnZXRzCgkgICAgIGRlZmluZWQuCgkgICAqICQqdHlwZSwgJCpsdHlwZSwgJCptYW5nbGUsICQqZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgc3RhciwgYnV0IHRoZXkgUkVNT1ZFIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyBmcm9tIHRoZSB0eXBlLiAoVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBwb2ludGVyIAoJICAgICB0eXBlcy4pCgkgICAqICQmdHlwZSwgJCZsdHlwZSwgJCZtYW5nbGUsICQmZGVzY3JpcHRvciBhcmUgdGhlIHNhbWUgYXMKCSAgICAgdGhlIHZhcmlhbnRzIHdpdGhvdXQgYW1wZXJzYW5kLCBidXQgdGhleSBBREQgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIHRvIHRoZSB0eXBlLgoJICAgVGhlIEd1aWxlLXNwZWNpZmljIHN1YnN0aXR1dGlvbiAkYmFzZWRlc2NyaXB0b3Igd2FzIHJlbW92ZWQKCSAgIGJlY2F1c2UgaXQgd2FzIHVzZWxlc3MuCgo4LzEyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJWV4dGVybiBkaXJlY3RpdmUgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIHdpdGhkcmF3bi4gIFRoZQogICAgICAgICAgIHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUgd2FzIHRvIGltcG9ydCBzZWxlY3RlZCBkZWZpbml0aW9ucwogICAgICAgICAgIGZyb20gb3RoZXIgaW50ZXJmYWNlIGZpbGVzIGFuZCBoZWFkZXJzLiAgSG93ZXZlciwgdGhlIHNhbWUKICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIGJldHRlciBoYW5kbGVkIHRocm91Z2ggJWltcG9ydC4gICBUaGlzCiAgICAgICAgICAgbGVhdmVzIFNXSUcgd2l0aCB0d28gZmlsZSBpbmNsdXNpb24gZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgZmlsZW5hbWUgICAgIC0gSW5zZXJ0cyBpbnRvIGN1cnJlbnQgaW50ZXJmYWNlCiAgICAgICAgICAgICAgJWltcG9ydCBmaWxlbmFtZSAgICAgIC0gSW1wb3J0IHR5cGVzIGFuZCBjbGFzc2VzIGZyb20gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5vdGhlciBtb2R1bGUKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzA5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBuZXcgc3VwcG9ydCBmb3Igd3JhcHBpbmcgQy9DKysgY2FsbGJhY2sgZnVuY3Rpb25zLiAKICAgICAgICAgICBBIGNvbW1vbiBwcm9ibGVtIHdpdGggc29tZSBDIGxpYnJhcmllcyBpcyB0aGF0IG1hbnkKICAgICAgICAgICBmdW5jdGlvbnMgdGFrZSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXMgYW4gYXJndW1lbnQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBpbnQgKCpvcCkoaW50LGludCksIC4uLik7CgogICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHRoZSBvbmx5IHdheSB0byBjYWxsIHN1Y2ggYSBmdW5jdGlvbiBpcyB0bwogICAgICAgICAgIHBhc3MgaXQgYSBmdW5jdGlvbiBwb2ludGVyIG9mIHNvbWUgY29tcGF0aWJsZSB0eXBlLiAgSW4KICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgaGFkIHRvIHNvbHZlIHRoaXMgcHJvYmxlbQogICAgICAgICAgIHdpdGggc29tZSByZWFsbHkgZ3Jvc3MgaGFja3MuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgIHVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGFzIGEgY2FsbGJhY2ssCgogICAgICAgICAgICAgICBpbnQgZm9vKGludCwgaW50KTsKCiAgICAgICAgICAgeW91IGhhZCB0byBpbnN0YWxsIGEgcG9pbnRlciB0byBpdCBhcyBhIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgCgogICAgICAgICAgICAgICBjb25zdCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciBpZiB5b3UgaGFkIGEgcmVhbGx5IG9sZCBTV0lHIHZlcnNpb246CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAoKk9QX0ZVTkMpKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgZG9fb3AoLi4uLCBPUF9GVU5DLCAuLi4pOwogICAgICAgICAgICAgICBjb25zdCBPUF9GVU5DIEZPTyA9IGZvbzsKCiAgICAgICAgICAgCiAgICAgICAgICAgTm93LCB5b3UgY2FuIGRvIG9uZSBvZiB0d28gdGhpbmdzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCBmb28oaW50LGludCk7CgogICAgICAgICAgIFRoaXMgY3JlYXRlcyBhIGNvbnN0YW50ICdmb28nIG9mIHR5cGUgaW50ICgqKShpbnQsaW50KS4KICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwoKICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBmdW5jdGlvbnMgYXJlIGluc3RhbGxlZCBhcyBjb25zdGFudHMgd2hlcmUKICAgICAgICAgICB0aGUgbmFtZSBpcyBkZWZpbmVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGdpdmVuIHRvICVjYWxsYmFjaygpLgogICAgICAgICAgIElmIHRoZSBuYW1lcyBnZW5lcmF0ZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZGlmZmVyIGZyb20gdGhlCiAgICAgICAgICAgYWN0dWFsIGZ1bmN0aW9uIG5hbWUsIGJvdGggYSBmdW5jdGlvbiB3cmFwcGVyIGFuZCBhIGNhbGxiYWNrIAogICAgICAgICAgIGNvbnN0YW50IGFyZSBjcmVhdGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlY2FsbGJhY2soIiUodXBwZXIpcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKICAgICAgICAgICAKICAgICAgICAgICBDcmVhdGVzIHR3byB3cmFwcGVyIGZ1bmN0aW9ucyAnZm9vJywgJ2JhcicgYW5kIGFkZGl0aW9uYWxseQogICAgICAgICAgIGNyZWF0ZXMgdHdvIGNhbGxiYWNrIGNvbnN0YW50cyAnRk9PJywgJ0JBUicuCgogICAgICAgICAgIE5vdGU6IFNXSUcgc3RpbGwgZG9lcyBub3QgcHJvdmlkZSBhdXRvbWF0aWMgc3VwcG9ydCBmb3IgCiAgICAgICAgICAgd3JpdGluZyBjYWxsYmFjayBmdW5jdGlvbnMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogc3RydWN0IG5lc3RpbmcgZml4ZXMgYXMgcGVyIFNGIGJ1ZyAjNDQ3NDg4LgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVuYW1lIGRpcmVjdGl2ZSBub3cgYXBwbGllcyB0byBjb25zdGFudHMgY3JlYXRlZCB3aXRoCiAgICAgICAgICAgI2RlZmluZSBhbmQgJWNvbnN0YW50LiAgSG93ZXZlciwgbW9zdCBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgd2VyZSBuZXZlciB3cml0dGVuIHRvIHN1cHBvcnQgdGhpcyBhbmQgd2lsbCBoYXZlIHRvIGJlCiAgICAgICAgICAgbW9kaWZpZWQgdG8gbWFrZSBpdCB3b3JrLiAgVGNsLCBQeXRob24sIGFuZCBQZXJsIG1vZHVsZXMKICAgICAgICAgICBhcmUgd29ya2luZyBub3cuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBjaGFuZ2VzIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiBDIGRlY2xhcmF0aW9uIHBhcnNpbmcuCiAgICAgICAgICAgQWx0aG91Z2ggU1dJRyBpcyBzdGlsbCBub3QgYSBmdWxsIEMgcGFyc2VyLCBpdHMgYWJpbGl0eQogICAgICAgICAgIHRvIGhhbmRsZSBjb21wbGV4IGRhdGF0eXBlcyBpbmNsdWRpbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIGFycmF5cyBoYXMgYmVlbiB2YXN0bHkgaW1wcm92ZWQuICAKCjgvMDMvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBEaXN0cmlidXRpb24gZml4ZXM6IGF1dG9jb25mIG5vIGxvbmdlciBuZWVkZWQgdG8gaW5zdGFsbCBTV0lHLgoKOC8wMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCB0d28gdW5kb2N1bWVudGVkIHBhcnNpbmcgZmVhdHVyZXMuICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgIHN1cHBvcnRzIG91dC1vZi1jbGFzcyBzdGF0aWMgZnVuY3Rpb24gb3IgdmFyaWFibGUKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdGF0aWMgaW50IEZvbzo6YmFyOwoKICAgICAgICAgICBUaGlzIGZlYXR1cmUgbWF5IHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50IGRlbWFuZC4gCiAgICAgICAgICAgSG93ZXZlciwgc2luY2UgU1dJRyBpcyBtb3N0IG9mdGVuIHVzZWQgd2l0aCBoZWFkZXIgZmlsZXMsCiAgICAgICAgICAgaXQgaXMgbW9yZSBsaWtlbHkgZm9yIHRoZXNlIGRlZmluaXRpb25zIHRvIGJlIGluY2x1ZGVkCiAgICAgICAgICAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzAyLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBDbGVhbnVwIG9mIHRoZSBHSUZQbG90IGV4YW1wbGVzLiBVcGdyYWRlZCBKYXZhIEdJRlBsb3QgZXhhbXBsZS4KCjgvMDEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBFZmZpY2llbmN5IGNoYW5nZXM6IF9jUHRyIHVzZWQgd2hlcmUgcG9zc2libGUgcmF0aGVyIHRoYW4KCSAgICAgZ2V0Q1B0cigpLiBCdWcgZml4ZXMgZm9yIGluaGVyaXRhbmNlIC0gZGVyaXZlZCBjbGFzcyBzb21ldGltZXMKCSAgICAgZGlkbid0IGRlbGV0ZSB0aGUgYyBtZW1vcnkgd2hlbiBfZGVsZXRlKCkgd2FzIGNhbGxlZC4KCSAgICogW0phdmFdIEFic3RyYWN0IGMrKyBjbGFzc2VzIGFyZSB3cmFwcGVkIHdpdGggYSBqYXZhIGFic3RyYWN0IHNoYWRvdwoJICAgICBjbGFzcy4gQWxzbyBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBpcyBtYXBwZWQgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QuCgkgICAqIFRoZSBkZWZhdWx0IG91dHB1dCBmaWxlIGhhcyBhbHdheXMgYmVlbiA8bW9kdWxlPl93cmFwLmMuIEl0IGlzIG5vdwoJICAgICA8bW9kdWxlPl93cmFwLmN4eCBpZiB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24gaXMgcGFzc2VkIHRvIHN3aWcuCgkgICAgIFRoaXMgaGFzIGJlZW4gZG9uZSBhcyBvdGhlcndpc2UgYysrIGNvZGUgd291bGQgYXBwZWFyIGluIGEgYyBmaWxlLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKCjcvMzEvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIHRvIGJlIG1vcmUgQy1saWtlIGluIHN5bnRheC4KICAgICAgICAgICBUaGUgc3ludGF4IGlzIG5vdzoKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgTkFNRSA9IFZBTFVFOwogICAgICAgICAgICAgICAgJWNvbnN0YW50IFRZUEUgTkFNRSA9IFZBTFVFOwogCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IEZvbyAqQmFyID0gJlNwYW07CgogICAgICAgICAgIEEgbW9yZSBzdWJ0bGUgY2FzZSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBibGFoOwoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIE1vZHVsZXMgdGhhdCB3ZXJlIHVzaW5nCiAgICAgICAgICAgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgZGlyZWN0bHkgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICAgICAKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBvYnNjdXJlIGFuZCB1bmRvY3VtZW50ZWQgZm9ybSBvZiB0aGUgJWlubGluZSBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAlaW5saW5lIGludCBibGFoKGludCBhLCBpbnQgYikgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCiAgICAgICAgICAgKG5vdGU6IHRoaXMgZmVhdHVyZSB3YXMgbmV2ZXIgZG9jdW1lbnRlZCBhbmQgaXMgd2l0aGRyYXduKQoKNy8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyBleHBsaWNpdGx5IGRlY2xhcmVkCiAgICAgICAgICAgcmV0dXJuIHR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGZvbyhpbnQpOwoKICAgICAgICAgICBJbiBDLCBzdWNoIGZ1bmN0aW9ucyB3ZXJlIGltcGxpY2l0bHkgYXNzdW1lZCB0byByZXR1cm4gYW4gJ2ludCcuCiAgICAgICAgICAgSW4gQysrLCB0aGlzIGlzIGlsbGVnYWwuICBFaXRoZXIgd2F5LCBpdCdzIGNvbnNpZGVyZWQgYmFkCiAgICAgICAgICAgc3R5bGUuICBSZW1vdmluZyBzdXBwb3J0IGZvciB0aGlzIGluIFNXSUcgd2lsbCBzaW1wbGlmeQogICAgICAgICAgIGNlcnRhaW4gaXNzdWVzIGluIHBhcnNpbmcuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzMwLzIwMDE6IG1rb2VwcGUKCSAgICogUGFydGlhbCBtZXJnZSBmcm9tIHRoZSBDVlMgdHJ1bmsuICBUaGUgU291cmNlL0RPSCBkaXJlY3RvcnkKCSAgICAgYW5kIG1vc3Qgb2YgdGhlIFNvdXJjZS9Td2lnIGRpcmVjdG9yeSBpcyB1cC10by1kYXRlIG5vdy4KCSAgICogW0d1aWxlXSAlc2NoZW1lIGlzIG5vdyBhIG1hY3JvIGZvciAlaW5zZXJ0KCJzY2hlbWUiKS4gIAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAiRklMRU5BTUUiOyAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgJXsgU0NIRU1FLUNPREUgJX0KCSAgICAgTmV3IG1hY3JvcyAlbXVsdGlwbGVfdmFsdWVzLCAldmFsdWVzX2FzX2xpc3QsCgkgICAgICV2YWx1ZXNfYXNfdmVjdG9yLiAKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBoYXZlIGJlZW4gdHVybmVkIGludG8gU1dJRyBwcmFnbWFzLgogICAgICAgICAgICVwcmFnbWEoc3dpZykgcmVhZG9ubHkgYW5kICVwcmFnbWEoc3dpZykgcmVhZHdyaXRlLiAgTWFjcm9zCiAgICAgICAgICAgYXJlIHVzZWQgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXByYWdtYSBkaXJlY3RpdmUuICAlcHJhZ21hIG11c3QgYWx3YXlzCiAgICAgICAgICAgYmUgZGlyZWN0ZWQgdG8gYSBzcGVjaWZpYyBsYW5ndWFnZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcHJhZ21hKHN3aWcpIG1ha2VfZGVmYXVsdDsKICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImJsYWguaSI7CgogICAgICAgICAgIEFsc28gZXh0ZW5kZWQgdGhlIHByYWdtYSBkaXJlY3RpdmUgdG8gYWxsb3cgY29kZSBibG9ja3MKIAogICAgICAgICAgICAgICVwcmFnbWEoZm9vKSBjb2RlID0gJXsKICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB0aGUgd2F5ICdjb25zdCcgdmFyaWFibGVzIGFyZSB3cmFwcGVkLiAgSW4gCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgYSAnY29uc3QnIHZhcmlhYmxlIHdhcwogICAgICAgICAgIHdyYXBwZWQgYXMgYSBjb25zdGFudC4gICBOb3csICdjb25zdCcgdmFyaWFibGVzIGFyZQogICAgICAgICAgIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcy4gIFRoZXJlIGFyZSBzZXZlcmFsCiAgICAgICAgICAgcmVhc29ucyBmb3IgbWFraW5nIHRoaXMgY2hhbmdlLCBtb3N0bHkgcGVydGFpbmluZyB0bwogICAgICAgICAgIHN1YnRsZSBkZXRhaWxzIG9mIGhvdyAnY29uc3QnIGFjdHVhbGx5IHdvcmtzLiAKCiAgICAgICAgICAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIG9sZCBpbnRlcmZhY2VzIHRoYXQgdXNlZCAnY29uc3QnCiAgICAgICAgICAgdG8gY3JlYXRlIGNvbnN0YW50cy4gICBBcyBhIHJlcGxhY2VtZW50LCBjb25zaWRlciB1c2luZyB0aGlzOgoKICAgICAgICAgICBjb25zdCBpbnQgYSA9IDQ7ICAgPT09PiAgICVjb25zdGFudCBpbnQgYSA9IDQ7CiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW9yZ2FuaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24gb2YgdHlwZSBwYXJzaW5nLgogICAgICAgICAgIFR5cGVzIHdpdGggJ2NvbnN0JyBzaG91bGQgd29yayBjb3JyZWN0bHkgbm93LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9zdCBzd2lnIGRpcmVjdGl2ZXMgcmVsYXRlZCB0byB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0KICAgICAgICAgICBhcmUgbm93IGRlcHJlY2F0ZWQuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIE9iamVjdGl2ZS1DIGluIG9yZGVyIHRvIHNpbXBsaWZ5CiAgICAgICAgICAgcGFyc2VyIHJlY29uc3RydWN0aW9uLiAgV2lsbCByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudAogICAgICAgICAgIGRlbWFuZC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENvZGUgaW5jbHVzaW9uIGhhcyBiZWVuIG1vZGlmaWVkIGluIHRoZSBwYXJzZXIuICBBIGNvbW1vbgogICAgICAgICAgIGRpcmVjdGl2ZSAlaW5zZXJ0IGlzIG5vdyB1c2VkIGZvciBldmVyeXRoaW5nLiAgVGhpcwogICAgICAgICAgIGluc2VydHMgYSBmaWxlIGludG8gdGhlIG91dHB1dDoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAiZm9vLnN3ZyIKCiAgICAgICAgICAgVGhpcyBpbnNlcnRzIHNvbWUgaW5saW5lIGNvZGUgaW50byB0aGUgb3V0cHV0CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgJXsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uIAogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGVyZSBhcmUgZml2ZSBwcmVkZWZpbmVkIHRhcmdldHMgZm9yIHRoZSBpbnNlcnQgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgImhlYWRlciIgICAgLSBIZWFkZXIgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgInJ1bnRpbWUiICAgLSBSdW50aW1lIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJ3cmFwcGVyIiAgIC0gV3JhcHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgICJpbml0IiAgICAgIC0gSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgICAgICAgICAgICAgIm51bGwiICAgICAgLSBOb3RoaW5nLiBEaXNjYXJkLgoKICAgICAgICAgICBUaGUgZm9sbG93aW5nIGRpcmVjdGl2ZXMgYXJlIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGFyZQogICAgICAgICAgIG5vdyBkZWZpbmVkIGluIHRlcm1zIG9mIG1hY3JvczoKCiAgICAgICAgICAgICAgICV7IC4uLiAlfSAgICAgICAgICAgLT4gJWluc2VydChoZWFkZXIpICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJWluaXQgJXsgLi4uICV9ICAgICAtPiAlaW5zZXJ0KGluaXQpICAgICV7IC4uLiAlfQogICAgICAgICAgICAgICAld3JhcHBlciAleyAuLi4gJX0gIC0+ICVpbnNlcnQod3JhcHBlcikgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVydW50aW1lICV7IC4uLiAlfSAgLT4gJWluc2VydChydW50aW1lKSAleyAuLi4gJX0KCiAgICAgICAgICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gZGVmaW5lIG5ldyBuYW1lZCB0YXJnZXRzIGJ5IHVzaW5nIHRoZQogICAgICAgICAgIEMgQVBJIGZ1bmN0aW9uIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgpIChzZWUgbWFpbi5jeHgpLgogICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGV4cG9zZSBhIHNoYWRvdyBjbGFzcyBmaWxlLAogICAgICAgICAgIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoInNoYWRvdyIsIGZfc2hhZG93KTsKCiAgICAgICAgICAgVGhlbiBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAgICVpbnNlcnQoc2hhZG93KSAleyAuLi4gJX0KCiAgICAgICAgICAgTm90ZTogdGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgYW55IG9sZCBpbnRlcmZhY2VzLCBidXQKICAgICAgICAgICBkb2VzIG9wZW4gdXAgbmV3IHBvc3NpYmlsaXRpZXMgZm9yIGVuaGFuY2VtZW50cy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm93IGFsd2F5cyBpbmNsdWRlcyBhIHN0YW5kYXJkIGxpYnJhcnkgZmlsZSAnc3dpZy5zd2cnLgogICAgICAgICAgIFRoaXMgZmlsZSBkZWZpbmVzIGEgbGFyZ2UgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zCiAgICAgICAgICAgdGhhdCBkZWZpbmUgdGhlIGJlaGF2aW9yIG9mIHZhcmlvdXMgU1dJRyBkaXJlY3RpdmVzLgogICAgICAgICAgIFByZXZpb3VzbHksIGFsbCBTV0lHIGRpcmVjdGl2ZXMgd2VyZSBoYW5kbGVkIGFzIHNwZWNpYWwKICAgICAgICAgICBjYXNlcyBpbiB0aGUgcGFyc2VyLiAgVGhpcyBtYWRlIHRoZSBwYXJzZXIgYSBsYXJnZSAKICAgICAgICAgICBibG9hdGVkIG1lc3MuICBOb3csIHRoZSBwYXJzZXIgaXMgc3RyaXBwZWQgZG93biB0byBhIGZldwogICAgICAgICAgIHNpbXBsZSBkaXJlY3RpdmVzIGFuZCBtYWNyb3MgYXJlIHVzZWQgdG8gaGFuZGxlIGV2ZXJ5dGhpbmcgZWxzZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEZpeGVzIGZvciBTb3VyY2Vmb3JnZSBidWcgIzQ0NDc0OCAtIG5ldyB0ZXN0Y2FzZSBjcHBfc3RhdGljOgoJICAgICBbVENMXSBDbGFzcyB3aXRoIGp1c3Qgc3RhdGljIG1lbWJlciB2YXJpYWJsZS9mdW5jdGlvbiBmaXgKCSAgICAgW0phdmFdIEZpeGVkIHN0YXRpYyB2YXJpYWJsZXMgc3VwcG9ydAoJICAgICBbUnVieV0gU3RhdGljIHZhcmlhYmxlcyB3b3JrYXJvdW5kIHJlbW92ZWQKCjcvMjcvMjAwMTogbWtvZXBwZQoJICAgKiBzdHlwZS5jIChTd2lnVHlwZV9kZWZhdWx0KTogU3RyaXAgcXVhbGlmaWVycyBmaXJzdC4gVGhlCgkgICAgIGRlZmF1bHQgdHlwZSBvZiAiaW50ICogY29uc3QiIGlzIG5vdyAiU1dJR1BPSU5URVIgKiIuCgkgICAqIG1haW4uY3h4OiBEZWZpbmUgIl9fY3BsdXNwbHVzIiBpbiBTV0lHJ3MgcHJlcHJvY2Vzc29yIGlmCgkgICAgIGluIEMrKyBtb2RlLgoJICAgKiBbR3VpbGVdOiBBZGRlZCBzb21lIHN1cHBvcnQgZm9yIGFycmF5cyBhbmQgQysrCgkgICAgIHJlZmVyZW5jZXMsIGZpeGluZyB0aGUgImNvbnN0YW50X3BvaW50ZXJzIiB0ZXN0IGNhc2UuCgkgICAqIE1vdmVkIG1vc3QgdGVzdHMgZnJvbSB0aGUgb2xkIEd1aWxlLXNwZWNpZmljIHRlc3Qtc3VpdGUKCSAgICAgdG8gdGhlIG5ldyB0ZXN0LXN1aXRlLiAgQWxzbyBtb3ZlZCBwZXJsNS9wb2ludGVyLWN4eAoJICAgICBleGFtcGxlIHRoZXJlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogVGVzdC1zdWl0ZSBhZGRlZC4KCSAgICogSW5pdGlhbCB0ZXN0Y2FzZXM6IGNvbnN0YW50X3BvaW50ZXJzIGNwcF9lbnVtIGRlZmluZXMKCSAgICAgc2l6ZW9mX3BvaW50ZXJzIHVuaW9ucyB2aXJ0dWFsX2Rlc3RydWN0b3IKCSAgICogTWFrZSBjbGVhbiBpbXByb3ZlbWVudHMuCgo3LzI0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gVW5kZXJzY29yZXMgaW4gdGhlIHBhY2thZ2UgbmFtZSBhbmQvb3IgbW9kdWxlIG5hbWUKCSAgIG5vIGxvbmdlciBnaXZlIGxpbmtpbmcgcHJvYmxlbXMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNb3JlIHBhcnNlciBidWcgZml4ZXMgZm9yIGNvbnN0YW50IHBvaW50ZXJzCgo3LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXSBBZXN0aGV0aWMgaW1wcm92ZW1lbnQgaW4gdmFyaWFibGUgd3JhcHBlcnMuCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIGNvcmUtZHVtcCBwcm9ibGVtIGluIHBvaW50ZXIgbGlicmFyeSB3aGVuIAogICAgICAgICAgICAgZnJlZWluZyBjaGFyYWN0ZXIgYXJyYXlzLgogICAgICAgICAgICAgU0YgQnVnIFsgIzQxNTgzNyBdIHBvaW50ZXIgbGliIGNvcmUgZHVtcAoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBkZXN0cnVjdG9ycyBhbmQgc2hhZG93CiAgICAgICAgICAgICBjbGFzc2VzLiAgU0YgYnVnICMyMjExMjguCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIFRvIHByb3ZpZGUgYmV0dGVyIGxpbmUtbnVtYmVyIHRyYWNraW5nIGluIGludGVyZmFjZXMKICAgICAgICAgICAgIHdpdGggbG90cyBvZiBtYWNyb3MsIHNwZWNpYWwgbG9jYXRvciBjb21tZW50cyBhcmUKICAgICAgICAgICAgIG5vdyBnZW5lcmF0ZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8qQGZvby5pLDQyLEJMQUhAKi9leHBhbmRlZCBtYWNyby8qQEAqLwoKICAgICAgICAgICAgIFRoZSBmaXJzdCAvKkAuLi5AKi8gc2VxdWVuY2Ugc2V0cyB0aGUgY29udGV4dAogICAgICAgICAgICAgdG8gcG9pbnQgdG8gdGhlIG1hY3JvIGNvZGUuICBUaGUgLypAQCovIGNvbW1lbnQKICAgICAgICAgICAgIHRlcm1pbmF0ZXMgdGhlIGNvbnRleHQuICBUaGUgU1dJRyBwYXJzZXIgc2hvdWxkCiAgICAgICAgICAgICBpZ25vcmUgYWxsIG9mIHRoZSBsb2NhdG9yIGNvbW1lbnRzIGFzIHNob3VsZAogICAgICAgICAgICAgdGhlIEMgY29tcGlsZXIgKHNob3VsZCBzdWNoIGNvbW1lbnRzIGVuZCB1cAogICAgICAgICAgICAgaW4gZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSkuCgo3LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogVGhlIHBhcnNlciBub3cgaGFuZGxlcyBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzIGluCgkgICB0eXBlbWFwcy4gIFRoaXMgaW50cm9kdWNlZCBhIG5ldyBzaGlmdC9yZWR1Y2UgY29uZmxpY3QsIGJ1dAoJICAgb25seSB3aXRoIGEgaGV1cmlzdGljIGZ1bmN0aW9uLXBvaW50ZXIgY2F0Y2gtYWxsIHJ1bGUuICAKCSAgICogW0d1aWxlXTogQWRkZWQgdHlwZW1hcHMgZm9yIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMuIAoJICAgKiBGaXhlZCB0aGUgInRlbXBsYXRlLXdoaXRlc3BhY2UiIHByb2JsZW0gYnkgY2Fub25pY2FsaXppbmcKCSAgICAgd2hpdGVzcGFjZSwgZXNwZWNpYWxseSBhcm91bmQgYW5nbGUgYnJhY2tldHMgYW5kIGNvbW1hcy4gCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogQSBTY2hlbWUgZmlsZSBpcyBlbWl0dGVkIGlmIHRoZSAtc2Ntc3R1YiBGSUxFLlNDTQoJICAgY29tbWFuZC1saW5lIG9wdGlvbiBpcyB1c2VkLiAgVGhlICVzY2hlbWUgZGlyZWN0aXZlCgkgICAoaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3IgYSBwcmFnbWEpIGFsbG93cyB0byBpbnNlcnQKCSAgIGFyYml0cmFyeSBjb2RlIGhlcmUuICBJbiAic2ltcGxlIiBhbmQgInBhc3NpdmUiIGxpbmthZ2UsCgkgICB0aGUgZmlsZSBnZXRzIGZpbGxlZCB3aXRoIGRlZmluZS1tb2R1bGUgYW5kIGV4cG9ydAoJICAgZGVjbGFyYXRpb25zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogUGFyc2VyIGJ1ZyBmaXggdG8gc3VwcG9ydCBjb25zdGFudCBwb2ludGVycywgZWcgaW50KiBjb25zdCBwdHIuCgkgICBGaXhlZCBldmVyeXdoZXJlIC0gdmFyaWFibGVzLCBwYXJhbWV0ZXJzLCByZXR1cm4gdHlwZXMgZXRjLiBOb3RlIHRoYXQKCSAgIHdoZW4gd3JhcHBpbmcgYSBjb25zdGFudCBwb2ludGVyIHZhcmlhYmxlIG9ubHkgdGhlIGdldHRlciBpcyBnZW5lcmF0ZWQuCgo3LzE3LzIwMDE6IG1rb2VwcGUKCSAgICogRml4ZWQgU0YgYnVnICM0NDE0NzAgKCNkZWZpbmUgWCAiLy8iIHdvdWxkIG5vdCBiZSBwYXJzZWQsCgkgICAgIHNlZSB0ZXN0LXN1aXRlIGVudHJ5ICJwcmVwcm9jLTEiKSwgcmVwb3J0ZWQgYnkgVC4gVy4gQnVydG9uCgkgICAgIDx0d2J1cnRvbkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBDaGFuZ2VkIHRoZSB0eXBlIG9mIGNoYXJhY3RlciBjb25zdGFudHMgdG8gImNoYXIiLCByYXRoZXIKCSAgICAgdGhhbiAiY2hhciAqIi4gIENoYW5nZWQgdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcwoJICAgICB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBleGNlcHQgZm9yIHRoZSBHdWlsZSBtb2R1bGUsCgkgICAgIHdoZXJlIGl0IGlzIGRlc2lyZWQgdG8gbWFrZSB0aGVtIFNjaGVtZSBjaGFyYWN0ZXJzLiAgVGhpcwoJICAgICBmaXhlcyBTRiBidWcgIzIzMTQwOSwgdGVzdC1zdWl0ZSBlbnRyeSAiY2hhci1jb25zdGFudCIuCgkgICAqIEFwcGxpZWQgcGF0Y2ggZm9yIERPSC9Eb2gvbWVtb3J5LmMgYnkgTGVzIFNjaGFmZmVyCgkgICAgIDxzY2hhZmZlckBvcHRvbmxpbmUubmV0PiAoYXZvaWQgcmVxdWlyZWQgc2lkZSBlZmZlY3RzIGluCgkgICAgIGFzc2VydCkuIAoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgZm9yIHZpcnR1YWwgZGVzdHJ1Y3RvciB3aXRoIHZvaWQgYXMgcGFyYW1ldGVyCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyICNkZWZpbmVzIGVtYmVkZGVkIHdpdGhpbiBjbGFzc2VzL3N0cnVjdHMvdW5pb25zCgkgICBDb25zZXF1ZW50bHkgJWNvbnN0YW50IGNhbiBub3cgYWxzbyBiZSBwbGFjZWQgd2l0aGluIGEgc3RydWN0L2NsYXNzL3VuaW9uLgoJICAgKiBCdWcgZml4IGluIHBhcnNlciB0byBhbGxvdyBzaXplb2YoKklfYW1fYV9wb2ludGVyKSB3aXRoaW4gYSAjZGVmaW5lCgo3LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogQWRkZWQgY2hhbmdlcyBmb3IgdGhlIE1hY2ludG9zaCBjb250cmlidXRlZCBieSBMdWlnaQoJICAgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LiAKCSAgICogU29tZSAiY29uc3QiIGZpeGVzIGluIHRoZSBjb2RlLgoJICAgKiBbR3VpbGVdOiBNYWRlIHRoZSBjb25zdGFudC13cmFwcGVyIGZ1bmN0aW9ucyBtdWNoIHNob3J0ZXIuCgo3LzEzLzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogU29tZSAiY29uc3QiIGZpeGVzIGZvciBHdWlsZSB2ZXJzaW9uIDEuMy40LgoJICAgKiBIYW5kbGUgYW5vbnltb3VzIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCBzdGF0aWMKCSAgICAgYXJyYXkgbWVtYmVycyBvZiBjbGFzc2VzLiAgQm90aCBidWdzIHJlcG9ydGVkIGJ5IEFubmFsaXNhIFRlcnJhY2luYQoJICAgICA8YW5uYWxpc2EudGVycmFjaW5hQGRhdGFtYXQuaXQ+OyBzZWUgdGhlIGZpbGVzCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvc3RhdGljLWFycmF5LW1lbWJlci5pIGFuZAoJICAgICBhbm9ueW1vdXMtYXJnLmkuCgpWZXJzaW9uIDEuMy42ICAoSnVseSA5LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNy8wOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogRk9SRUdST1VORCBhbmQgQkFDS0dST1VORCBkZWZpbml0aW9uIG1pc3NpbmcgCgkgICBhZnRlciBUUkFOU1BBUkVOVCAjZGVmaW5lIGZpeCBpbiBHSUZQbG90Cgo3LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXJzIHNvIHRoYXQgdGhlIHJlbGVhc2UgaXMga25vd24KICAgICAgICAgICBhcyAxLjMuNi4gIEFsbCBmdXR1cmUgcmVsZWFzZXMgc2hvdWxkIGhhdmUgYSBzaW1pbGFyCiAgICAgICAgICAgdmVyc2lvbiBmb3JtYXQuCgo3LzAyLzIwMDE6IG1rb2VwcGUKCSAgICogW1B5dGhvbl06IFByZXZlbnQgdGhlIHByb2JsZW0gb2Ygc2VsZi50aGlzb3duIG5vdCBiZWluZwoJICAgZGVmaW5lZCBpZiB0aGUgQysrIGNsYXNzIGNvbnN0cnVjdG9yIHJhaXNlZCBhbiBleGNlcHRpb24uCgkgICBUaGFua3MgdG8gTHVpZ2kgQmFsbGFiaW8gPGJhbGxhYmlvQG1hYy5jb20+LgoKNi8yOS8yMDAxOiBta29lcHBlCgkgICAqIE1vcmUgcG9ydGFiaWxpdHkgZml4ZXM7IGZpeGVkICJnY2MgLVdhbGwiIHdhcm5pbmdzLgoKNi8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogR0lGUGxvdCBleGFtcGxlczogVFJBTlNQQVJFTlQgI2RlZmluZSBtdWx0aXBsZSB0aW1lcyBvbiBTb2xhcmlzIAoJICAgKGNsYXNoZXMgd2l0aCBzdHJlYW0uaCkuCgkgICAqIE11bHRpcGxlIGRlZmluaXRpb24gYnVnIGZpeCBmb3Igc2hhZG93IGNsYXNzZXMuIFRoZSBwZXJsIGFuZCBweXRob24gCgkgICBtb2R1bGVzIGhhZCB3b3JrYXJvdW5kcyB3aGljaCBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBmaXhlcyBpbiAKCSAgIHRoZSBjb3JlLiBNYW55IG9mIHRoZSBMYW5ndWFnZTo6Y3BwX3h4eHggZnVuY3Rpb25zIG5vdyBzZXQgYSAKCSAgIGZsYWcgd2hpY2ggdGhlIGRlcml2ZWQgY2xhc3NlcyBjYW4gYWNjZXNzIHRocm91Z2ggCgkgICBpc19tdWx0aXBsZV9kZWZpbml0aW9uKCkgdG8gc2VlIHdoZXRoZXIgb3Igbm90IGNvZGUgc2hvdWxkIGJlIAoJICAgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgYmVsb3cgd291bGQgaGF2ZSBwcm9kdWNlZCB2YXJ5aW5nIGRlZ3JlZXMgCgkgICBvZiBpbmNvcnJlY3Qgc2hhZG93IGNsYXNzIGNvZGUgZm9yIHRoZSB2YXJpb3VzIG1vZHVsZXM6CgkgICBjbGFzcyBUZXN0Q2xhc3MKCSAgIHsKCSAgIHB1YmxpYzoKCSAgICAgVGVzdENsYXNzKCkge307CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge307CgkgICAgIH5UZXN0Q2xhc3MoKSB7fTsKCSAgICAgdW5zaWduZWQgbG9uZyB4eXooc2hvcnQgaykge307CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fTsKCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoKSB7fTsKCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoaW50IGEpIHt9OwoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VyZWQgYmVmb3JlIHRoZSBKYXZhIGNsYXNzIGRlY2xhcmF0aW9uCgkgICBbSmF2YV0gdW5yZWxhdGVkIGVudW0gaW5pdGlhbGlzYXRpb25zIG5vIGxvbmdlciBhcHBlYXIgaW4gSmF2YSBjbGFzcwoJICAgW0phdmFdIGlmIG1vZHVsZSBlbmRzIGluICdfJyBjb3JyZWN0IEpOSSBuYW1lcyBhcmUgbm93IHByb2R1Y2VkCgo2LzA0LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBtb2RzIC0gTW9kaWZpZWQgY29uc3RydWN0b3IgcmVwbGFjZXMKCSAgIG5ld0luc3RhbmNlKCkuIF9kZWxldGUoKSBub3cgdGhyZWFkIHNhZmUuIGdldENQdHIoKSByZXBsYWNlcwoJICAgX3NlbGYuIF9zZWxmQ2xhc3MoKSByZW1vdmVkIGFzIG5vdyByZWR1bmRhbnQuIAogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCSAgIFtKYXZhXSBOb3QgYWxsIG91dHB1dCBqYXZhIGZpbGVzIGhhZCBTV0lHIGJhbm5lci4gTmV3IGJhbm5lci4KCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIGZpbmFsaXplcnMgYXJlIG91dHB1dCBieSBkZWZhdWx0OiBDb21tYW5kCgkgICBsaW5lIG9wdGlvbiAtZmluYWxpemUgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgd2l0aCAtbm9maW5hbGl6ZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBDYXN0IFNDTV9DQVIoKSB0byBzY21fYml0c190IGJlZm9yZSBzaGlmdGluZyBpdC4KCSAgIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGNvbXBpbGluZyB3aXRoIGEgR3VpbGUgY29uZmlndXJlZCB3aXRoCgkgICBzdHJpY3QgQyB0eXBlIGNoZWNraW5nLiAgCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIGNvbmZpZ3VyZSBvcHRpb24gIi0td2l0aC1zd2lnbGliZGlyIi4KCjUvMzEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBTdXBwb3J0IG11bHRpcGxlIHBhcmFsbGVsIGxpc3RzIG9yIHZlY3RvcnMgaW4KCSAgIHRoZSB0eXBlbWFwcyBwcm92aWRlZCBieSBsaXN0LXZlY3Rvci5pLiAgTmV3IHR5cGVtYXBzIGZpbGUsCgkgICBwb2ludGVyLWluLW91dC5pLiAKCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gSFRNTCB1cGRhdGUgZm9yIGV4YW1wbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICBBZGRlZCBzdWJkaXJlY3RvcnkgZm9yCgkgICBEZWJpYW4gcGFja2FnZSBjb250cm9sIGZpbGVzLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEJ1aWxkIGEgcnVudGltZSBsaWJyYXJ5LCBsaWJzd2lnZ3VpbGUuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9uICQqZGVzY3JpcHRvci4gIFVzZSB0aGUge30KCSAgIHN5bnRheCwgcmF0aGVyIHRoYW4gdGhlICIiIHN5bnRheCBmb3IgdGhlIHN0YW5kYXJkCgkgICB0eXBlbWFwcywgaW4gb3JkZXIgdG8gd29yayBhcm91bmQgc3RyYW5nZSBtYWNyby1leHBhbnNpb24KCSAgIGJlaGF2aW9yIG9mIHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIFRoaXMgaW50cm9kdWNlcyBzb21lCgkgICBleHRyYSBicmFjZXMuCgo1LzI3LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gSGFuZGxlIHBvaW50ZXIgdHlwZXMgd2l0aCB0eXBlbWFwcywgcmF0aGVyIHRoYW4KCSAgIGhhcmQtY29kZWQuIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMgJGRlc2NyaXB0b3IsCgkgICAkYmFzZWRlc2NyaXB0b3I7IHNlZSBkb2N1bWVudGF0aW9uLiBTb21lIGNsZWFuLXVwIGluIHRoZQoJICAgdmFyaWFibGUvY29uc3RhbnRzIHdyYXBwZXIgZ2VuZXJhdG9yIGNvZGUuICBOZXcgY29udmVuaWVuY2UKCSAgIG1hY3JvIFNXSUdfR3VpbGVfTXVzdEdldFB0ciwgd2hpY2ggYWxsb3dzIGdldHRpbmcgcG9pbnRlcnMKCSAgIGZyb20gc21vYnMgaW4gYSBmdW5jdGlvbmFsIHN0eWxlLiAgTmV3IHR5cGVtYXAgZmlsZQoJICAgImxpc3QtdmVjdG9yLmkiLCBwcm92aWRpbmcgbWFjcm9zIHRoYXQgZGVmaW5lIHR5cGVtYXBzIGZvcgoJICAgY29udmVydGluZyBiZXR3ZWVuIEMgYXJyYXlzIGFuZCBTY2hlbWUgbGlzdHMgYW5kIHZlY3RvcnMuCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIFNUTCBzdHJpbmcgbW92ZWQgaW50byBpdHMgb3duIHR5cGVtYXAgYXMgaXQgaXMgYysrIGNvZGUgYW5kIAoJICAgaXQgYnJlYWsgYW55IGMgY29kZSB1c2luZyB0aGUgdHlwZW1hcHMuaSBmaWxlLgoJICAgLSBGaXhlcyBmb3Igd3JhcHBlcnMgYXJvdW5kIGdsb2JhbCB2YXJpYWJsZXMgLSBhcHBsaWVzIHRvIHByaW1pdGl2ZSAKCSAgIHR5cGVzIGFuZCB1c2VyIHR5cGVzIChjbGFzcy9zdHJ1Y3QpIGFuZCBwb2ludGVycyB0byB0aGVzZS4KCSAgIC0gU3RydWN0dXJlIG1lbWJlciB2YXJpYWJsZXMgYW5kIGNsYXNzIHB1YmxpYyBtZW1iZXIgdmFyaWFibGVzIGdldHRlcnMgCgkgICBhbmQgc2V0dGVycyBwYXNzIGEgcG9pbnRlciB0byB0aGUgbWVtYmVyIGFzIHdhcyBpbiAxLjNhMyBhbmQgMS4xIAoJICAgKDEuM2E1IHdhcyBwYXNzaW5nIGJ5IHZhbHVlKQoJICAgLSBQYXJhbWV0ZXJzIHRoYXQgd2VyZSBhcnJheXMgYW5kIHJldHVybiB0eXBlcyB3ZXJlIGluY29ycmVjdGx5IAoJICAgYmVpbmcgcGFzc2VkIHRvIGNyZWF0ZV9mdW5jdGlvbigpIGFzIHBvaW50ZXJzLgoJICAgLSBGaXggZm9yIGFycmF5cyBvZiBlbnVtcy4gCgkgICBbSmF2YV0gVXBkYXRlZCBqYXZhIGV4YW1wbGVzIGFuZCBhZGRlZCB0d28gbW9yZS4KCSAgIFtKYXZhXSBKYXZhIG1vZHVsZSB1cGRhdGVkIGZyb20gU1dJRzEuM2EzIGluY2x1ZGluZyBjb2RlIGNsZWFudXAgZXRjLgoJICAgW0phdmFdIGVudW0gc3VwcG9ydCBhZGRlZC4KCSAgIFtKYXZhXSBBcnJheSBzdXBwb3J0IGltcGxlbWVudGVkCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgaW1wcm92ZWQgLSBKYXZhIG9iamVjdHMgdXNlZCByYXRoZXIgdGhhbiAKCSAgIGxvbmdzIGhvbGRpbmcgdGhlIGMgcG9pbnRlciB0byB0aGUgd3JhcHBlZCBzdHJ1Y3R1cmUvYysrY2xhc3MKCjUvMjIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBpbiBDKysgbW9kZS4gVGhhbmtzCgkgICB0byBHcmVnIFRyb3hlbCA8Z2R0QGlyLmJibi5jb20+LgoKNS8yMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyBsaW5rYWdlICJtb2R1bGUiIGZvciBjcmVhdGluZyBHdWlsZSBtb2R1bGVzIGZvcgoJICAgR3VpbGUgdmVyc2lvbnMgPj0gMS41LjAuIAoKNC8xOC8yMDAxOiBta29lcHBlCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBwYXNzaW5nIHRocm91Z2ggU2NoZW1lX09iamVjdAoJICAgcG9pbnRlcnMuIAoKNC85LzIwMDEgOiBta29lcHBlIAoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgYGJvb2wnLiAgSW5jbHVzaW9uIG9mIGhlYWRlcnMKCSAgIGFuZCBzdXBwb3J0IHJvdXRpbmVzIGlzIG5vdyBkYXRhLWRyaXZlbiB2aWEgbXpzY2hlbWUuaS4KCSAgIEhlYWRlcnMgY29tZSBmcm9tIHRoZSBuZXcgZmlsZSBtenNjaGVtZGVjLnN3Zy4gIERvbid0IGFib3J0CgkgICBpbW1lZGlhdGVseSB3aGVuIGEgdHlwZS1oYW5kbGluZyBlcnJvciBpcyByZXBvcnRlZC4gIFdoZW4KCSAgIHNlYXJjaGluZyBmb3IgdHlwZW1hcHMgZm9yIGVudW1zLCBmYWxsIGJhY2sgdG8gdXNpbmcgaW50LAoJICAgbGlrZSB0aGUgR3VpbGUgYmFja2VuZCBkb2VzLiAgU3VwcG9ydCBjaGFyIGNvbnN0YW50cy4gIEVtaXQKCSAgIGNvcnJlY3Qgd3JhcHBlciBjb2RlIGZvciB2YXJpYWJsZXMuCgozLzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKipPVVRQVVQsIGNoYXIgKipCT1RILgoKMy8yLzIwMDEgOiBta29lcHBlIAoJICAgW0d1aWxlXSBFdmVyeSB3cmFwcGVyIGZ1bmN0aW9uIG5vdyBnZXRzIGEgYm9vbGVhbiB2YXJpYWJsZQoJICAgZ3N3aWdfbGlzdF9wIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIG11bHRpcGxlIHZhbHVlcyBhcmUKCSAgIHByZXNlbnQuIFRoZSBtYWNyb3MgR1VJTEVfQVBQRU5EX1JFU1VMVCwgR1VJTEVfTUFZQkVfVkFMVUVTCgkgICBhbmQgR1VJTEVfTUFZQkVfVkVDVE9SIHVzZSB0aGlzIHZhcmlhYmxlLCByYXRoZXIgdGhhbgoJICAgY2hlY2tpbmcgd2hldGhlciB0aGUgY3VycmVudCByZXR1cm4gdmFsdWUgaXMgYSBsaXN0LiBUaGlzCgkgICBhbGxvd3MgZm9yIHR5cGVtYXBzIHJldHVybmluZyBhIGxpc3QgYXMgYSBzaW5nbGUgdmFsdWUgKGEKCSAgIGxpc3Qgd2FzIGVycm9uZW91c2x5IGNvbnZlcnRlZCBpbnRvIGEgdmVjdG9yIG9yIGEKCSAgIG11bHRpcGxlLXZhbHVlIG9iamVjdCBpbiB0aGlzIGNhc2UpLgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIHJldHVybmluZyBtdWx0aXBsZSB2YWx1ZXMgYXMKCSAgIHZlY3RvcnMsIG9yIHBhc3NpbmcgdGhlbSB0byBhIG11bGlwbGUtdmFsdWUKCSAgIGNvbnRpbnVhdGlvbi4gQnkgZGVmYXVsdCwgbXVsdGlwbGUgdmFsdWVzIHN0aWxsIGdldAoJICAgcmV0dXJuZWQgYXMgYSBsaXN0LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIGEgImJlZm9yZXJldHVybiIgcHJhZ21hLiBUaGUgdmFsdWUgb2YgdGhpcwoJICAgcHJhZ21hIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IHJldHVybiBzdGF0ZW1lbnQuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgR3VpbGUgMS40LjEgcHJvY2VkdXJlCgkgICBkb2N1bWVudGF0aW9uIGZvcm1hdHMsIHNlZSBpbnRlcm5hbHMuaHRtbC4KCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBNYWRlIHRoZSB3cmFwcGVyIGNvZGUgY29tcGlsZSB3aXRoIEMrKyBpZiB0aGUKCSAgICItYysrIiBjb21tYW5kLWxpbmUgc3dpdGNoIGlzIGdpdmVuLiAgVGhhbmtzIHRvCgkgICA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5vdyB0d28gdHlwZSB0YWJsZXMsIHN3aWdfdHlwZXMgYW5kCgkgICBzd2lnX3R5cGVzX2luaXRpYWwsIGFyZSB1c2VkLCBhcyBhbGwgb3RoZXIgU1dJRyBsYW5ndWFnZQoJICAgbW9kdWxlcyBkby4gIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBmb3IgdGhlIHRyaWNreQoJICAgY29uc3RydWN0aW9uIHVzZWQgYmVmb3JlIHRoYXQgdGhlIGJyb2tlbiBSZWRoYXQgNy4wIGdjYwoJICAgZG9lc24ndCBwYXJzZS4gUmVwb3J0ZWQgYnkgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqT1VUUFVULCBjaGFyICpCT1RIOyBhIGJhZAoJICAgZnJlZSgpIHdvdWxkIGJlIGVtaXR0ZWQuICBBZGRlZCB0eXBlbWFwIGZvciBTQ00uCgoKVmVyc2lvbiAxLjMgQWxwaGEgNSAKPT09PT09PT09PT09PT09PT09PQoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFtQeXRob25dIFB5dGhvbiBtb2R1bGUgZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUgZm9yCiAgICAgICAgICBjcmVhdGluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgd3JhcHBlciBmdW5jdGlvbi4gTW9kaWZpY2F0aW9uCiAgICAgICAgICBzdWdnZXN0ZWQgYnkgSm9uIFRyYXZpcy4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBMaWJyYXJ5IGZpbGVzIHNwZWNpZmllZCB3aXRoIHRoZSAtbCBvcHRpb24gYXJlIG5vdyBpbmNsdWRlZCBhdCB0aGUKICAgICAgICAgIGVuZCBvZiB0aGUgaW50ZXJmYWNlIGZpbGUgKHJldmVydGluZyB0byB0aGUgb2xkIGJlaGF2aW9yKS4KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggZW51bSBoYW5kbGluZy4gIGVudW1zIGFyZSBub3cgbWFuaXB1bGF0ZWQgYXMKICAgICAgICAgICdpbnQnLCBidXQgY2FzdCBpbnRvIHRoZSBlbnVtIHR5cGUgd2hlbiB2YWx1ZXMgYXJlIHBhc3NlZCB0byB0aGUgCiAgICAgICAgICBjb3JyZXNwb25kaW5nIEMgZnVuY3Rpb24uCgo5LzE5LzAwIDogbWtvZXBwZQoJICBbR3VpbGVdIFJlbW92ZWQgIi13aXRoLXNtb2JzIiBjb21tYW5kLWxpbmUgb3B0aW9uLCBhcyB0aGlzIGlzIHRoZQoJICBkZWZhdWx0IG5vdy4gIEFkZGVkICItZW1pdC1zZXR0ZXJzIiBjb21tYW5kLWxpbmUgb3B0aW9uLAoJICB3aGljaCB0dXJucyBvbiBnZW5lcmF0aW5nIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzOyBzZWUKCSAgaW50ZXJuYWxzLmh0bWwuCgo5LzE4LzAwIDogbWtvZXBwZQoJICBJbmNvcnBvcmF0ZWQgcGF0Y2ggIzEwMTQzMCwgZml4aW5nIGJ1Z3MgaW4gdGhlIEd1aWxlIG1vZHVsZTogCgkgIDEuIFNvbWUgYXJndW1lbnRzIHdlcmUgZXJyb25lb3VzbHkgdGFrZW4gYXMgKm9wdGlvbmFsKiBhcmd1bWVudHMgd2hlbgoJICAgICBpZ25vcmVkIGFyZ3VtZW50cyB3ZXJlIHByZXNlbnQuIAoJICAyLiBHdWlsZSAxLjMuNCB3YXMgbm90IHN1cHBvcnRlZCBzaW5jZSBmdW5jdGlvbnMgaW50cm9kdWNlZCBpbiBHdWlsZQoJICAgICAgMS40IHdlcmUgdXNlZC4JICAKCSAgMy4gQWRkZWQgaGFuZGxpbmcgb2YgYGNvbnN0IGNoYXIgKicuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZhaWxlZCBhc3NlcnRpb24gYW5kIGxhcmdlIGZpbGVzLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0aGUgJyUnIGNoYXJhY3RlciBhcHBlYXJpbmcgaW4gYWRkZWQgbWV0aG9kcwogICAgICAgICAgYW5kIGZ1bmN0aW9uIGJvZGllcy4gIFByZXByb2Nlc3NvciBidWcuCgpWZXJzaW9uIDEuMyBBbHBoYSA0IChTZXB0ZW1iZXIgNCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzMvMDAgIDogdHRuCiAgICAgICAgICBBZGRlZCBpbnN0cnVjdGlvbnMgZm9yIG1haW50YWluZXJzIGluIEV4YW1wbGVzL1JFQURNRSBvbiBob3cKICAgICAgICAgIHRvIG1ha2UgZXhhbXBsZXMgYWxzbyBiZSB1c2VmdWwgaW4gdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgogICAgICAgICAgQWxzbywgIm1ha2UgY2hlY2siIG5vdyB1c2VzIC4vTGliIGJ5IHZpYSBlbnYgdmFyIGBTV0lHX0xJQicuCiAgICAgICAgICBUaGlzIGlzIG92ZXJyaWRhYmxlIGxpa2Ugc286CiAgICAgICAgICAgICBtYWtlIGNoay1zd2lnbGliPS9teS9leHBlcmltZW50YWwvc3dpZy9MaWIgY2hlY2sKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAkdHlwZW1hcCB2YXJpYWJsZSB0byB0eXBlbWFwcy4gIFRoaXMgZ2V0cyByZXBsYWNlZCB3aXRoCiAgICAgICAgICBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSB0eXBlbWFwIHRoYXQgaXMgYXBwbGllZC4gIEZlYXR1cmUKICAgICAgICAgIHJlcXVlc3QgZnJvbSByc2Fsei4KCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBFeHBlcmltZW50YWwgb3B0aW1pemF0aW9uIHRvIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdmlydHVhbAogICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIElmIHlvdSBoYXZlIHR3byBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgQSgpIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIGNsYXNzIEIoKSA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgU3dpZyBub3cgd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGlzCgogICAgICAgICAgICAgICAgQV9mb28oQSAqYSkgewogICAgICAgICAgICAgICAgICAgIGEtPmZvbygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGFuZCB1c2UgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGJvdGggQV9mb28oKSBhbmQgQl9mb28oKS4KICAgICAgICAgIFRoaXMgb3B0aW1pemF0aW9uIG9ubHkgdGFrZXMgcGxhY2UgaWYgYm90aCBtZXRob2RzIGFyZSBkZWNsYXJlZAogICAgICAgICAgYXMgdmlydHVhbCBhbmQgYm90aCB0YWtlIGlkZW50aWNhbCBwYXJhbWV0ZXJzLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlc3RvcmVkIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAgZm9yIHNldHRpbmcgc3RydWN0dXJlIG1lbWJlcnMuCiAgICAgICAgICBVbmxpa2UgdGhlIG9sZCB2ZXJzaW9uLCB0aGUgbmV3IHZlcnNpb24gaXMgZXhwYW5kZWQgaW5saW5lIGluIHRoZQogICAgICAgICAgd3JhcHBlciBmdW5jdGlvbiBhbGxvd2luZyBhY2Nlc3MgdG8gc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBpbnRlcm5hbHMgKGEgc29tZXRpbWVzIHJlcXVlc3RlZCBmZWF0dXJlKS4gVGhlICJtZW1iZXJvdXQiIHR5cGVtYXAKICAgICAgICAgIGlzIGdvbmUuIFVzZSB0aGUgIm91dCIgdHlwZW1hcHMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEF0dHJpYnV0ZSBzZXQgbWV0aG9kcyBubyBsb25nZXIgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIG1lbWJlci4KICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBub3cgZ2V0cyBzZXQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgdm9pZCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgIGYtPnggPSB4OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiBTV0lHMS4xIGl0IHVzZWQgdG8gYmUgdGhpczoKCiAgICAgICAgICAgICAgaW50IEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYtPnggPSB4KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGR1ZSB0byB0aGUgY29tcGxleGl0eSBjcmVhdGVkIGJ5IHRyeWluZwogICAgICAgICAgdG8gZG8gdGhpcyB3aXRoIG1vcmUgZXhvdGljIGRhdGF0eXBlcyBzdWNoIGFzIGFycmF5cy4gIEl0IGFsc28KICAgICAgICAgIGNvbXBsaWNhdGVzIGlubGluaW5nIGFuZCBoYW5kbGluZyBvZiB0aGUgIm1lbWJlcmluIiB0eXBlbWFwLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgcHRyY2FzdCgpIGFuZCBwdHJtYXAoKSBmdW5jdGlvbnMgZnJvbSB0aGUKICAgICAgICAgIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBPbGQgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wYXRpYmxlCiAgICAgICAgICB3aXRoIG5ldyB0eXBlIHN5c3RlbS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVF1ZXJ5KGNvbnN0IGNoYXIgKm5hbWUpIGFkZGVkLgogICAgICAgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHRoZSB0eXBlIGluZm8gc3RydWN0dXJlCiAgICAgICAgICB0aGF0IGlzIHVzZWQgZm9yIHR5cGUtY2hlY2tpbmcuICBJdCB3b3JrcyB3aXRoIGVpdGhlciB0aGUKICAgICAgICAgIG5pY2UgQyBuYW1lIG9yIG1hbmdsZWQgdmVyc2lvbiBvZiBhIGRhdGF0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJpbnQgKiIpOwogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFN3aWdfVHlwZVF1ZXJ5KCJfcF9pbnQiKTsKCiAgICAgICAgICBUaGlzIGlzIGFuIGFkdmFuY2VkIGZlYXR1cmUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBzdXBwb3J0IHNvbWUKICAgICAgICAgIGV4b3RpYyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG5lZWQgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZQogICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlIG9iamVjdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IGRpcmVjdGl2ZSAldHlwZXMoKSBhZGRlZC4gIFRoaXMgaXMgdXNlZCB0bwogICAgICAgICAgZXhwbGljaXRseSBsaXN0IGRhdGF0eXBlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbgogICAgICAgICAgdGhlIHJ1bnRpbWUgdHlwZS1jaGVja2luZyBjb2RlLiBOb3JtYWxseSBpdCBpcyBuZXZlcgogICAgICAgICAgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGJ1dCBzb21ldGltZXMgYWR2YW5jZWQgZXh0ZW5zaW9ucwogICAgICAgICAgKHN1Y2ggYXMgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5KSBtYXkgbmVlZCB0byBtYW51YWxseQogICAgICAgICAgYWRkIHR5cGVzIHRvIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzAwIDogYmVhemxleQogICAgICAgICAgSW1wcm92ZWQgaGFuZGxpbmcgb2Ygc3RyaW5nIGFycmF5IHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCiAgICAgICAgICBhIGdsb2JhbCB2YXJpYWJsZSBvZiB0aGUgZm9ybSAiY2hhciBuYW1lWzY0XSIgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgbWFuYWdlZCBhcyBhIDY0IGNoYXJhY3RlciBzdHJpbmcuICBQcmV2aW91c2x5IHRoaXMgZGlkbid0CiAgICAgICAgICB3b3JrIGF0IGFsbCBvciByZXF1aXJlZCB0aGUgdXNlIG9mIGEgc3BlY2lhbCB0eXBlbWFwLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFIChUY2wsIFBlcmwsIFB5dGhvbikgKioqCgo4LzMxLzAwIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCBgY2hlY2stYysrLWV4YW1wbGVzJywgd2hpY2ggdXNlcyBuZXcKCSAgZmlsZXMgdW5kZXIgRXhhbXBsZXMvQysrIGNvbnRyaWJ1dGVkIGJ5IFRhbCBTaGFsaWYuICBOb3cgIm1ha2UKCSAgY2hlY2siIGFsc28gZG9lcyAibWFrZSBjaGVjay1jKystZXhhbXBsZXMiLiAgQWxzbywgZXhwYW5kZWQKCSAgYWN0aW9ucyBpbiBgY2hlY2stZ2lmcGxvdC1leGFtcGxlJyBhbmQgYGNoZWNrLWFsaXZlbmVzcycuCgo4LzMwLzAwIDogbWtvZXBwZQoJICBNYWpvciBjbGVhbi11cCBpbiB0aGUgR3VpbGUgbW9kdWxlLiBBZGRlZCB0eXBlbWFwLWRyaXZlbgoJICBkb2N1bWVudGF0aW9uIHN5c3RlbS4gQ2hhbmdlZCB0byBoYW5kbGUgbW9yZSB0aGFuIDEwCgkgIGFyZ3MuIFVwZGF0ZWQgYW5kIGV4dGVuZGVkIGV4YW1wbGVzLgoJICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVpbnNlcnQgZGlyZWN0aXZlIHRoYXQgaW5zZXJ0cyB0aGUgY29udGVudHMgb2YgYSBmaWxlCiAgICAgICAgICBpbnRvIGEgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IHdyYXBwZXIgZmlsZS4gIFRoaXMgaXMgb25seSBpbnRlbmRlZAogICAgICAgICAgZm9yIHVzZSBieSB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBXb3JrcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXJzKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChydW50aW1lKSAgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydCh3cmFwcGVycykgImZpbGUuc3dnIjsKICAgICAgICAgICAgICAgJWluc2VydChpbml0KSAgICAgImZpbGUuc3dnIjsKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI5LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgbmV3ICVydW50aW1lIGRpcmVjdGl2ZSB3aGljaCBpbmNsdWRlcyBjb2RlIGludG8gdGhlIHJ1bnRpbWUKICAgICAgICAgIHBvcnRpb24gb2YgdGhlIHdyYXBwZXIgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVydW50aW1lICV7CiAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgaW50ZXJuYWwgcnVudGltZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgVGhlcmUgaXMgbm8gcHJhY3RpY2FsIHJlYXNvbiBmb3Igb3JkaW5hcnkgdXNlcnMgdG8gdXNlIHRoaXMKICAgICAgICAgIGZlYXR1cmUgKGFsbW9zdCBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHVzaW5nICV7IC4uLiAlfQogICAgICAgICAgaW5zdGVhZCkuICAgSG93ZXZlciwgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzIG1heSB3YW50IHRvCiAgICAgICAgICB1c2UgdGhpcyBpbiBsYW5ndWFnZSBjb25maWd1cmF0aW9uIGZpbGVzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZyBsaXRlcmFscyBsaWtlCiAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICIkdGFyZ2V0ID0gU3ZJVigkc291cmNlKTsiOwoKICAgICAgICAgIFdoZW4gY29kZSBpcyBzcGVjaWZpZWQgbGlrZSB0aGlzLCBpdCBpcyAqTk9UKiBlbmNsb3NlZAogICAgICAgICAgaW5zaWRlIGEgbG9jYWwgc2NvcGUgKGFzIHdpdGggb2xkZXIgdHlwZW1hcCBkZWNsYXJhdGlvbnMpLgogICAgICAgICAgTm90ZTogY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGluIHRoZQogICAgICAgICAgY29kZSBzdHJpbmcgc28gaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBhIHF1b3RlIG9yIHNvbWUKICAgICAgICAgIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVyLCBtYWtlIHN1cmUgeW91IHVzZSBhIChcKS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gZm9sbG93IHR5cGVkZWYgZGVjbGFyYXRpb25zLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IE51bWJlcjsKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGludGVnZXIgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB2b2lkIGZvbyhOdW1iZXIgYSk7CgogICAgICAgICAgVGhlIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgYXJndW1lbnQgJ051bWJlciBhJy4KICAgICAgICAgIE9mIGNvdXJzZSwgaWYgeW91IHNwZWNpZnkgYSB0eXBlbWFwIGZvciAnTnVtYmVyJyBpdCB3aWxsIHRha2UKICAgICAgICAgIHByZWNlZGVuY2UgKG5vciB3aWxsIGl0IGV2ZXIgYmUgYXBwbGllZCB0byBhbiAnaW50JykuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWZhdWx0IHR5cGVtYXAgc3BlY2lmaWNhdGlvbiBoYXMgY2hhbmdlZC4gICBJbiBvbGRlcgogICAgICAgICAgdmVyc2lvbnMgb2Ygc3dpZywgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgVG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBhIGRhdGF0eXBlLiAgIE5vdyB0aGF0CiAgICAgICAgICBTV0lHIGZvbGxvd3MgdHlwZWRlZiBkZWNsYXJhdGlvbnMsIHRoaXMgaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICBTaW1wbHkgc3BlY2lmeWluZyBhIHR5cGVtYXAgZm9yICdpbnQnIHdpbGwgd29yayBmb3IgYWxsCiAgICAgICAgICB2YXJpYXRpb25zIG9mIGludGVnZXJzIHRoYXQgYXJlIHR5cGVkZWYnZCB0byAnaW50Jy4KCiAgICAgICAgICBDYXZlYXQsIHNwZWNpZnlpbmcgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHBvaW50ZXJzLAogICAgICAgICAgcmVmZXJlbmNlcywgYXJyYXlzLCBhbmQgdXNlciBkZWZpbmVkIHR5cGVzIGlzIGEgbGl0dGxlCiAgICAgICAgICBkaWZmZXJlbnQuICBUaGlzIG11c3QgYmUgZG9uZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUE9JTlRFUiAqIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHUkVGRVJFTkNFICYgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcmVmZXJlbmNlIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR0FSUkFZIFtdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHVzZXItZGVmaW5lZCB0eXBlIChieSB2YWx1ZSkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGR1c3RpbgogICAgICAgICAgVGhlIGZpbGUgc3dpZy0xLjNhMS0xLnNwZWMgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIFRvb2xzIGRpcmVjdG9yeS4KICAgICAgICAgIEl0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGEgcmVkaGF0IHBhY2thZ2UgZm9yIFNXSUcsIGFsdGhvdWdoIGl0CiAgICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBmb3IgdGhlIG5leHQgcHVibGljIHJlbGVhc2UuCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcmV3cml0dGVuLiAgRXZlbnR1YWxseSB0aGV5IG1heSBiZQogICAgICAgICAgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmcgYmV0dGVyLCBidXQgZm9yIG5vdyB0aGV5IHN0YXkuICBIb3dldmVyLAogICAgICAgICAgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGEgc2lnbmlmaWNhbnQgY2hhbmdlcyB0aGF0IG1heSB0cmlwIHNvbWUKICAgICAgICAgIHBlb3BsZSB1cDoKCiAgICAgICAgICAxLiAgVHlwZW1hcCBzY29waW5nIGlzIGN1cnJlbnRseSBicm9rZW4uICBCZWNhdXNlIG9mIHRoaXMsIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIHdvbid0IHdvcmsuCgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICogewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGludCBiYXIoYmxhaCAqeCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICo7ICAgLyogQ2xlYXIgdHlwZW1hcCAqLwoKICAgICAgICAgICAgICAodGhpcyBicmVha3MgYmVjYXVzZSB0aGUgY29kZSBmb3IgdGhlIGNsYXNzIEZvbyBpcyBhY3R1YWxseQogICAgICAgICAgICAgIGdlbmVyYXRlZCBhZnRlciB0aGUgZW50aXJlIGludGVyZmFjZSBmaWxlIGhhcyBiZWVuIHByb2Nlc3NlZCkuCiAgICAgICAgICAgICAgVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IGJ1Zy4KCiAgICAgICAgICAyLiAgSW4gU1dJRzEuMSwgdGhlICVhcHBseSBkaXJlY3RpdmUgd29ya2VkIGJ5IHBlcmZvcm1pbmcgYQogICAgICAgICAgICAgIHZlcnkgY29tcGxleCB0eXBlLWFsaWFzaW5nIHByb2NlZHVyZS4gIEZyb20gdGhpcyBwb2ludCBvbiwKICAgICAgICAgICAgICAlYXBwbHkgaXMgc2ltcGx5IGEgZ2VuZXJhbGl6ZWQgdHlwZW1hcCBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCwgZG91YmxlICp5IH07CgogICAgICAgICAgICAgIENvcGllcyAqQUxMKiBjdXJyZW50bHkgZGVmaW5lZCB0eXBlbWFwcyBmb3IgJ2RvdWJsZSAqT1VUUFVUJyBhbmQKICAgICAgICAgICAgICBjb3BpZXMgdGhlbSB0byAnZG91YmxlICp4JyBhbmQgJ2RvdWJsZSAqeScuCgogICAgICAgICAgICAgIE1vc3QgcGVvcGxlIHByb2JhYmx5IHdvbid0IGV2ZW4gbm90aWNlIHRoaXMgY2hhbmdlIGluCiAgICAgICAgICAgICAgJWFwcGx5LiAgSG93ZXZlciwgd2hlcmUgaXQgd2lsbCBicmVhayB0aGluZ3MgaXMgaW4gY29kZSBsaWtlCiAgICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgKk9VVFBVVCB7IGRvdWJsZSAqeCB9OwogICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICpPVVRQVVQgewogICAgICAgICAgICAgICAgICAgICAgIC4uLiB3aGF0ZXZlciAuLi4KICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICp4KTsKCiAgICAgICAgICAgICAgSW4gU1dJRzEuMSwgeW91IHdpbGwgZmluZCB0aGF0ICdmb28nIHVzZXMgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZQogICAgICAgICAgICAgIGV2ZW4gdGhvdWdoIGl0IHdhcyBkZWZpbmVkIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlICh0aGlzIGlzCiAgICAgICAgICAgICAgdGhlIHdlaXJkIGFsaWFzaW5nIHNjaGVtZSBhdCB3b3JrKS4gIEluIFNXSUcxLjMgYW5kIGxhdGVyLAogICAgICAgICAgICAgIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUgaXMgaWdub3JlZCBiZWNhdXNlIGl0IGlzIGRlZmluZWQKICAgICAgICAgICAgICBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICAzLiAgVGhlICVjbGVhciBkaXJlY3RpdmUgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZXJhc2UgYWxsIGN1cnJlbnRseQogICAgICAgICAgICAgIGRlZmluZWQgdHlwZW1hcHMgZm9yIGEgcGFydGljdWxhciB0eXBlLiAgVGhpcyBkaWZmZXJzIGZyb20KICAgICAgICAgICAgICBTV0lHMS4xIHdoZXJlICVjbGVhciBvbmx5IHJlbW92ZWQgcnVsZXMgdGhhdCB3ZXJlIGFkZGVkIHVzaW5nCiAgICAgICAgICAgICAgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgNC4gIFR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93IHBlcmZvcm1lZCB1c2luZyAqZXhhY3QqIHR5cGVzLgogICAgICAgICAgICAgIFRoaXMgbWVhbnMgdGhhdCB0aGluZ3MgbGlrZSB0aGlzCgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNoYXIgKiB7IH0KICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICogeyB9CgogICAgICAgICAgICAgIGFyZSBkaWZmZXJlbnQgdHlwZW1hcHMuICAgIEEgc2ltaWxhciBydWxlIGFwcGxpZXMgZm9yIHBvaW50ZXJzLAogICAgICAgICAgICAgIGFycmF5cywgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlICogeyB9CgogICAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgdG8gJ2RvdWJsZSAmJywgJ2RvdWJsZSBbXScsICBOb3csIGl0IG9ubHkgYXBwbGllcwogICAgICAgICAgICAgIHRvICdkb3VibGUgKicuICBJZiB5b3Ugd2FudCBhICdkb3VibGUgJicsIHlvdSdsbCBuZWVkIHRvIGhhbmRsZQogICAgICAgICAgICAgIHRoYXQgc2VwYXJhdGVseS4KCiAgICAgICAgICA1LiAgQXJyYXkgbWF0Y2hpbmcgaGFzIGJlZW4gc2ltcGxmaWVkLiAgSW4gU1dJRzEuMSwgYXJyYXkgbWF0Y2hpbmcKICAgICAgICAgICAgICB3YXMgcGVyZm9ybWVkIGJ5IHRyeWluZyB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBkaW1lbnNpb25zLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLCAnZG91YmxlIGFbMTBdWzIwXScgd2FzIG1hdGNoZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdW0FOWV0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgICAgIEluIFNXSUcxLjMsIG9ubHkgdGhlIGZvbGxvd2luZyBtYXRjaGVzIGFyZSBhdHRlbXB0ZWQ6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgIE9uIHRoZSBwb3NpdGl2ZSBzaWRlLCB0eXBlbWFwIG1hdGNoaW5nIGlzIG5vdyAqc2lnbmlmaWNhbnRseSogZmFzdGVyCiAgICAgICAgICB0aGFuIGJlZm9yZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFNlY3JldCBkZXZlbG9wZXIgZmVhdHVyZS4gIFNpbmNlIGRhdGF0eXBlcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIAogICAgICAgICAgc3RyaW5ncyBpbnRlcm5hbGx5LCB5b3UgY2FuIGJ5cGFzcyBsaW1pdGF0aW9ucyBvZiB0aGUgcGFyc2VyIGFuZAogICAgICAgICAgY3JlYXRlIGEgd2lsZCBkYXRhdHlwZSBieSBzaW1wbHkgZW5jbG9zaW5nIHRoZSByYXcgc3RyaW5nIGVuY29kaW5nCiAgICAgICAgICBpbiBiYWNrdGlja3MgKGBgKSBhbmQgc3RpY2tpbmcgaXQgaW4gdGhlIGludGVyZmFjZSBmaWxlIGFueXdoZXJlIGEKICAgICAgICAgIHR5cGUgaXMgZXhwZWN0ZWQuICBGb3IgZXhhbXBsZSwgYGEoMjApLmEoMTApLnAuZihpbnQsaW50KWAuICBUaGlzIAogICAgICAgICAgZmVhdHVyZSBpcyBvbmx5IGludGVuZGVkIGZvciB0ZXN0aW5nIChpLmUuLCB5b3Ugd2FudCB0byBzZWUgd2hhdAogICAgICAgICAgaGFwcGVucyB0byB5b3VyIGxhbmd1YWdlIG1vZHVsZSBpZiBpdCBnZXRzIGEgcmVmZXJlbmNlIHRvIGEgcG9pbnRlcgogICAgICAgICAgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zIG9yIHNvbWV0aGluZykuIAogICAgICAgICAgKioqIFNJQ0sgSEFDSyAqKioKCjgvMTQvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDb21wbGV0ZWx5IG5ldyB0eXBlLXN5c3RlbSBhZGRlZCB0byB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICBNb3JlIGRldGFpbHMgbGF0ZXIuCgo4LzExLzAwIDogYmVhemxleQogICAgICAgICAgQ2xlYW5lZCB1cCBzb21lIG9mIHRoZSBJL08gaGFuZGxpbmcuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMKICAgICAgICAgIGFueSB0ZW1wb3JhcnkgZmlsZXMgc3VjaCBhcyBfd3JhcC53cmFwLCBfd3JhcC5paSwgX3dyYXAuaW5pdC4KICAgICAgICAgIEluc3RlYWQsIHRoZXNlICJmaWxlcyIgYXJlIGtlcHQgYXJvdW5kIGluIG1lbW9yeSBhcyBzdHJpbmdzCiAgICAgICAgICAoYWx0aG91Z2ggdGhpcyBpcyB0cmFuc3BhcmVudCB0byBsYW5ndWFnZSBtb2R1bGVzKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJjaGVjayIgYW5kIHZhcmlhbnRzLgoJICBUaGlzIGNhbiBiZSB1c2VkIGxpa2UgIm1ha2UgY2hlY2siIG9yLCB0byBleHBsaWNpdGx5IHNraXAgYQoJICBsYW5ndWFnZSBMQU5HOiAibWFrZSBza2lwLUxBTkc9dHJ1ZSBjaGVjayIuICBMQU5HIGlzIHNraXBwZWQKCSAgYXV0b21hdGljYWxseSBpZiAuL2NvbmZpZ3VyZSBkZXRlcm1pbmVzIHRoYXQgTEFORyBzdXBwb3J0IGlzCgkgIGluc3VmZmljaWVudC4KCgkgIEN1cnJlbnRseSwgdGhlIGNoZWNrIGlzIGxpbWl0ZWQgdG8gZG9pbmcgdGhlIGVxdWl2YWxlbnQgb2YKCSAgIm1ha2UgYWxsIiBpbiBzb21lIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3Rvcmllcy4gIFRoaXMgc2hvdWxkCgkgIGJlIGV4cGFuZGVkIGJvdGggaG9yaXpvbnRhbGx5IChkaWZmZXJlbnQgdHlwZXMgb2YgdGVzdHMpIGFuZAoJICB2ZXJ0aWNhbGx5IChhZnRlciAibWFrZSBhbGwiIGluIGFuIEV4YW1wbGVzIHN1YmRpciBzdWNjZWVkcywKCSAgZG8gc29tZSBhZGRpdGlvbmFsIHRlc3RzIHdpdGggdGhlIHJlc3VsdGluZyBpbnRlcnByZXRlciwgZXRjKS4KCjgvNC8wMCAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0ICJkaXN0Y2xlYW4iLCB3aGljaCBkZWxldGVzIGFsbCB0aGUKCSAgZmlsZXMgLi9jb25maWd1cmUgY3JlYXRlcywgaW5jbHVkaW5nIGNvbmZpZy5zdGF0dXMgYW5kIGZyaWVuZHMuCgo4LzMvMDAgIDogaGFyY29oCgkgIGphdmEgY2hhbmdlcz8/PyBbdG9kbzogZG9jdW1lbnQgY2hhbmdlc10KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8ga2V5IG9mZiBvZiB0aGUgcmVhbCBkYXRhdHlwZXMKICAgICAgICAgIHVzZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLiAgVGhpcyBtZWFucyB0aGF0IHR5cGVtYXBzIGZvcgogICAgICAgICAgImNvbnN0IGNoYXIgKiIgYW5kICJjaGFyICoiIHdpbGwgYmUgZGlmZmVyZW5jZSBhcyB3aWxsIHR5cGVtYXBzCiAgICAgICAgICBmb3IgIlZlY3RvciIgYW5kICJWZWN0b3IgKi4iCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgaXMgbGlrZWx5IHRvIGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWx5IG9uIHRoZSBvZGQgdHlwZQogICAgICAgICAgaGFuZGxpbmcgYmVoYXZpb3Igb2YgdHlwZW1hcHMgaW4gU1dJRzEuMS0tZXNwZWNpYWxseSB3aXRoCiAgICAgICAgICByZXNwZWN0IHRvIGludGVyZmFjZXMgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTmV3ICVjb25zdGFudCBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgY3JlYXRlIHRydWUgY29uc3RhbnRzIGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLgogICAgICAgICAgSXQncyBtb3N0IHNpbXBsZSBmb3JtIGlzIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWNvbnN0YW50IEZPTyA0MjsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSB0eXBlIGlzIGluZmVycmVkIGZyb20gdGhlIHN5bnRheCBvZiB0aGUKICAgICAgICAgIHZhbHVlIChpbiByZWFsaXR5LCBhbGwgI2RlZmluZSBtYWNyb3MgYXJlIHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgZGlyZWN0aXZlcyBvZiB0aGlzIGZvcm0pLgoKICAgICAgICAgIEFuIGV4cGFuZGVkIHZlcnNpb24gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICVjb25zdGFudChGb28gKikgRk9PID0gJkZvb09iajsKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFuIGV4cGxpY2l0IHR5cGUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMKICAgICAgICAgIGxhdHRlciBmb3JtIG1heSBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0CiAgICAgICAgICB1c2VkIHRvIGJlIHNwZWNpZmllZCBhcwoKICAgICAgICAgICAgIGNvbnN0IEZvbyAqRk9PID0gJkZvb09iajsKCiAgICAgICAgICAod2hpY2ggYXJlIG5vdyB0cmVhdGVkIGFzIHZhcmlhYmxlcykuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqIFRoZSBzeW50YXggbWF5IGNoYW5nZSBpbgogICAgICAgICAgdGhlIGZpbmFsIHJlbGVhc2UuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciBzbyB0aGF0IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybQogICAgICAgICAgImNvbnN0IHR5cGUgKmEiIGFyZSBoYW5kbGVkIGFzIHZhcmlhYmxlcywgbm90IGNvbnN0YW50cy4KICAgICAgICAgIE5vdGU6IFNXSUcxLjEgaGFuZGxlZCB0aGlzIGNhc2UgZXJyb25lb3VzbHkgYmVjYXVzZQogICAgICAgICAgY29uc3QgY2hhciAqYSBpcyBhIHBvaW50ZXIgdmFyaWFibGUgdGhhdCBjYW4gYmUgcmVhc3NpZ25lZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgTm90ZToganVzdCBiZWNhdXNlIHRoaXMgaXMgdGhlICJyaWdodCIgd2F5IHRvIGRvIHRoaW5ncywKICAgICAgICAgIGRvZXNuJ3QgbWVhbiBpdCdzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGludGVycHJldGF0aW9uLgogICAgICAgICAgSSBzdXNwZWN0IHRoYXQgbWFueSBDIHByb2dyYW1tZXJzIG1pZ2h0IHVzZSAnY29uc3QgY2hhciAqJwogICAgICAgICAgd2l0aCB0aGUgaW50ZW50IG9mIGNyZWF0aW5nIGEgY29uc3RhbnQsIHdpdGhvdXQgcmVhbGl6aW5nCiAgICAgICAgICB0aGF0IHRoZXkndmUgY3JlYXRlZCBhIHJlYXNzaWduYWJsZSBnbG9iYWwgdmFyaWFibGUuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlIEMvQysrIHdyYXBwaW5nIGxheWVyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCBhbmQKICAgICAgICAgIHJlaW1wbGVtZW50ZWQuICBUaGlzIGNoYW5nZSBzaG91bGQgaXJvbiBvdXQgYSBmZXcgcm91Z2gKICAgICAgICAgIHNwb3RzIHdpdGggdGhlIGhhbmRsaW5nIG9mIGRhdGF0eXBlcy4gIEluIGFkZGl0aW9uLCB0aGUKICAgICAgICAgIHdyYXBwZXIgY29kZSBpcyBzb21ld2hhdCBjbGVhbmVyLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0IGludm9sdmUKICAgICAgICAgIHN1YnRsZSBjb3JuZXItY2FzZXMgd2l0aCB0eXBlbWFwcyBhbmQgdGhlICVhZGRtZXRob2RzCiAgICAgICAgICBkaXJlY3RpdmUgc2luY2Ugc29tZSBvZiB0aGVzZSBmZWF0dXJlcyBoYWQgc29tZXdoYXQKICAgICAgICAgIHR5cGUgaGFuZGxpbmcgYmVoYXZpb3IgaW4gU1dJRzEuMS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgIm1lbWJlcmluIiBhbmQgIm1lbWJlcm91dCIgdHlwZW1hcHMgYXJlIGdvbmUgZm9yIHRoZQogICAgICAgICAgbW9tZW50LCBidXQgdGhleSBtaWdodCByZXR1cm4gYXMgc29vbiBhcyBJIGZpZ3VyZSBvdXQKICAgICAgICAgIGhvdyB0byBpbnRlZ3JhdGUgdGhlbSB3aXRoIHNvbWUgb2YgdGhlIHN0cmVhbWxpbmVkIEMgd3JhcHBlcgogICAgICAgICAgZnVuY3Rpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIyLzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIG9sZCB0eXBlIGhhbmRsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzIHByaW50X3R5cGUoKSwKICAgICAgICAgIHByaW50X2Z1bGwoKSwgcHJpbnRfbWFuZ2xlKCksIGV0Yy4uLiBhcmUgZ29uZSBhbmQgaGF2ZSBiZWVuCiAgICAgICAgICByZXBsYWNlZCB3aXRoIGEgc21hbGxlciBzZXQgb2YgZnVuY3Rpb25zLiAgU2VlIHRoZSBmaWxlCiAgICAgICAgICBEb2MvaW50ZXJuYWxzLmh0bWwgZm9yIGRldGFpbHMuICBUaGlzIHdpbGwgYnJlYWsgYWxsIHRoaXJkCiAgICAgICAgICBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogYmVhemxleQogICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJXZhbCBhbmQgJW91dCBkaXJlY3RpdmVzLiAgVGhlc2UgZGlyZWN0aXZlcwogICAgICAgICAgc2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3Nhcnkgc2luY2UgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIGFjaGlldmUgc2ltaWxhciByZXN1bHRzLiAgIFRoaXMgYWxzbyBjbGVhbnMgdXAgdGhlCiAgICAgICAgICBoYW5kbGluZyBvZiB0eXBlcyBhbmQgcGFyYW1ldGVycyBxdWl0ZSBhIGJpdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IHR0bgoJICBGaXhlZCB1bnNwZWNpZmllZC1tb2R1bGUgYnVnIGluIEd1aWxlIHN1cHBvcnQgYW5kIHJlbW92ZWQKCSAgbW9yZSBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGF0Y2hlcyBzdWJtaXR0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKCSAgUmUtZW5hYmxlIHJlY29nbml0aW9uIG9mICItd2l0aC1zbW9icyIgKHdpdGggbm8gZWZmZWN0IHNpbmNlCgkgIHdlIHVzZSBzbW9icyBieSBkZWZhdWx0IG5vdykgZm9yIHRoZSB0aW1lIGJlaW5nLiAgQWZ0ZXIgdGhlCgkgIDEuM2E0IHJlbGVhc2UsIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmFsIGFuIGVycm9yLgoKNy8xNy8wMCA6IHR0bgoJICBGaXhlZCBOVUxMLWlucHV0IGJ1ZyBpbiBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZy4KCSAgUmVwb3J0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoKNy8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIG1lbW9yeSBsZWFrIGluIFB5dGhvbiB0eXBlLWNoZWNraW5nIGNvZGUuIFJlcG9ydGVkIGJ5CiAgICAgICAgICBLZWl0aCBEYXZpZHNvbi4gIEJ1ZyAjMTA5Mzc5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENoYW5nZWQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZnVuY3Rpb24gcGFyYW1ldGVycy4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaGFuZGxpbmcgb2YgdGhlICVuYW1lKCkgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgY2xhc3NlcyBpbiB0aGUgVGNsIG1vZHVsZS4gUHJvYmxlbSByZXBvcnRlZCBieSBKYW1lcyBCYWlsZXkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcGFyc2luZyBhbmQgZW51bSBoYW5kbGluZyBwcm9ibGVtcyB3aXRoIGNoYXJhY3RlciBjb25zdGFudHMuCiAgICAgICAgICBSZXBvcnRlZCBieSBHcmVnIEtvY2hhbnNraS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIFdyYXBwZXJGdW5jdGlvbiBjbGFzcyBmcm9tIHRoZSBjb3JlIGFuZCB1cGRhdGVkIHRoZSBsYW5ndWFnZQogICAgICAgICAgbW9kdWxlLiAgVGhpcyB3aWxsIGJyZWFrIHRoaXJkIHBhcnR5IG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOS8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBTV0lHIG5vIGxvbmdlciBtYWtlcyB1c2Ugb2YgQysrIG9wZXJhdG9yIG92ZXJsb2FkaW5nLgogICAgICAgICAgVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYnJlYWsgKmFsbCogdGhpcmQgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIG1haW4gU1dJRyBDVlMgdHJlZS4gU29ycnkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvOC8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBleHBlcmltZW50YWwgYW5kIHVuZG9jdW1lbnRlZCAiYnVpbGQiIHR5cGVtYXAgdGhhdAogICAgICAgICAgd2FzIGludGVuZGVkIHRvIHdvcmsgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMuIFNpbXBseSB0b28gd2VpcmQKICAgICAgICAgIHRvIGtlZXAgYXJvdW5kLiAgQmVzaWRlcywgYSBiZXR0ZXIgcmVwbGFjZW1lbnQgaXMgaW4gdGhlIHdvcmtzLgoKNy82LzAwICA6IHR0bgogICAgICAgICAgUmVtb3ZlZCBub24tIndpdGgtc21vYnMiIGZ1bmN0aW9uYWxpdHkgKEd1aWxlIHN1cHBvcnQpLCBpLmUuLAogICAgICAgICAgIi13aXRoLXNtb2JzIiBpcyBub3cgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlciBuZWVkcyB0byBiZQoJICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQtbGluZS4KCjcvNS8wMCAgOiB0dG4KICAgICAgICAgIEluY29ycG9yYXRlZCBSdWJ5IHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWFzYWtpIEZ1a3VzaGltYS4KCjYvMjgvMDAgOiB0dG4KICAgICAgICAgIEFwcGxpZWQgbW9yZS10aGFuLTEwLWFyZ3MgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjYvMjcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXdyb3RlIHNvbWUgb2YgdGhlIHN0cmluZyBoYW5kbGluZyBhbmQgZWxpbWluYXRlZCB0aGUgQysrCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAod2hpY2ggaXMgbm93IGp1c3QgYSB3cmFwcGVyKS4KCjYvMjcvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIERvYy9pbmRleC5odG1sIGFuZCBEb2MvaW50ZXJuYWxzLmh0bWwuICBUaGUgdGFyZ2V0CiAgICAgICAgICBhdWRpZW5jZSBmb3IgdGhlIGxhdHRlciBpcyBuZXcgU1dJRyBkZXZlbG9wZXJzLgoKClZlcnNpb24gMS4zIEFscGhhIDMgKEp1bmUgMTgsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzE4LzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgbmFtaW5nLmN4eCwgaGFzaC5jeHgsIGFuZCBzeW1ib2wuY3h4IGZpbGVzIGZyb20KICAgICAgICAgIHRoZSBTV0lHMS4xIGRpcmVjdG9yeS4gICBDb250aW51ZWQgdG8gbWlncmF0ZSB0aGluZ3MgYXdheQogICAgICAgICAgZnJvbSB0aGUgQysrIGJhc2UgKGFsdGhvdWdoIHRoZXJlJ3Mgc3RpbGwgYSBsb3Qgb2Ygd29yayB0byBkbykuCgo2LzE3LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYSBmZXcgbW9yZSBleGFtcGxlcyB0byB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5LiAgU3RpbGwKICAgICAgICAgIG5lZWQgdG8gZG8gYSBsb3Qgb2Ygd29yayBvbiB0aGlzLgoKNi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1pbmNsdWRlYWxsIHRvIGZvbGxvdyBhbGwgI2luY2x1ZGUgc3RhdGVtZW50cyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjYvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUcmllZCB0byBmaXggYXMgbWFueSBDKysgd2FybmluZ3MgYXMgcG9zc2libGUgd2hlbiBjb21waWxpbmcKICAgICAgICAgIHdpdGggdGhlIFN1biBXb3Jrc2hvcCBDKysgY29tcGlsZXIuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCiAgICAgICAgICB0aGF0IHRoZXJlIGFyZSBhIGxvdCBvZiBzdGF0ZW1lbnRzIHRoYXQgY29udGFpbiBzdHJpbmcgbGl0ZXJhbHMKICAgICAgICAgIG9mIHRoZSBmb3JtIChjaGFyKikiQmxhaCIuCgo2LzE1LzAwOiAgYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIGNsZWFudXAgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiBpbiB0aGUKICAgICAgICAgIGxvdy1sZXZlbCBET0ggbGlicmFyeS4gICBUaGlzIHNlZW1zIHRvIHJlc3VsdCBpbiBhIHNwZWVkdXAKICAgICAgICAgIG9mIDUwLTEwMCUgZm9yIHByZXByb2Nlc3NpbmcgYW5kIG90aGVyIHJlbGF0ZWQgdGFza3MuCgo1LzEwLzAwIDogdHRuCgkgIEFwcGxpZWQgdmFyaWFibGUtd3JhcHBpbmcgYnVnZml4IHBhdGNoIGNvbnRyaWJ1dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjQvMTcvMDAgOiB0dG4KCSAgVXBkYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBXZSBub3cgdXNlIGEgYFNjaGVtZV9UeXBlJy1iYXNlZCBzdHJ1Y3R1cmUgdG8gd3JhcCBwb2ludGVycy4KCjQvMTEvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIGZ1cnRoZXIgR3VpbGUtc3VwcG9ydCBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFR5cGVtYXBzIHByZXZpb3VzbHkgZGVsZXRlZCBoYXZlIGJlZW4gcmUtYWRkZWQuICBUaGVyZSBpcyBub3cKCSAgZXhjZXB0aW9uIGhhbmRsaW5nIChzZWUgRG9jL2VuZ2luZWVyaW5nLmh0bWwpLiAgYFNXSUdfaW5pdCcgaXMgbm93CgkgIGRlY2xhcmVkIGV4dGVybiBvbmx5IGZvciBzaW1wbGUgbGlua2FnZS4gIFNvbWUgYnVncyB3ZXJlIGZpeGVkLgoKNC8wNi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgVGhpcyBpbmNsdWRlcyBuZXcgZGlyZWN0b3JpZXMgTGliL216c2NoZW1lIGFuZCBFeGFtcGxlcy9tenNjaGVtZS4KCjQvMDMvMDAgOiB0dG4KCSAgQWRkZWQgRXhhbXBsZXMvZ3VpbGUgYW5kIGNoaWxkcmVuLiAgVGhpcyBpcyBhbiBhZGFwdGF0aW9uIG9mCgkgIHRoZSBzYW1lLW5hbWVkIGRpcmVjdG9yeSBmcm9tIHRoZSBTV0lHLTEuMXA1IGRpc3RyaWJ1dGlvbi4KCSAgQWRkZWQgR3VpbGUtc3BlY2lmaWMgc2VjdGlvbiB0byBEb2MvZW5naW5lZXJpbmcuaHRtbC4KCjQvMDIvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIG5ldyBndWlsZW1haW4uaSBieSBNYXJ0aW4gRnJvZWhsaWNoLgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUtc3VwcG9ydCByZXdyaXRlIHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi13aXRoLXNtb2JzIiBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mCgkgIHBvaW50ZXIgdHlwZSBoYW5kbGluZyB1c2luZyBzbW9icywgdGhlIGNhbm9uaWNhbCBtZWNoYW5pc20gZm9yCgkgIGRlZmluaW5nIG5ldyB0eXBlcyBpbiBHdWlsZS4gIFByZXZpb3VzIGltcGxlbWVudGF0aW9uICh1c2luZwoJICBzdHJpbmdzKSBpcyBhdCB0aGUgbW9tZW50IHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4gIEF0CgkgIHNvbWUgcG9pbnQsICItd2l0aC1zbW9icyIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyCgkgIHJlcXVpcmVkLgoKMy8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHB1cmlmeSBwYXRjaGVzIHN1Ym1pdHRlZCBieSBSYW0gQmhhbWlkaXBhdHkuCgozLzAyLzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgR3VpbGUgImxpbmthZ2UiIHNjaGVtZXMuCgkgIEN1cnJlbnRseSwgIi1MaW5rYWdlIGhvYmJpdCIgd29ya3MuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMiAoTWFyY2ggMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNYWRlIFNXSUcgaWdub3JlIHRoZSAnbXV0YWJsZScga2V5d29yZC4KCjIvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbmNvcnBvcmF0ZWQgc29tZSBwYXRjaGVzIHRvIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0bwogICAgICAgICAgdGhlIC1oaWRlIG9wdGlvbiBhbmQgdGhlIGRlc3RydWN0aW9uIG9mIG9iamVjdHMuCiAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgS2FybCBGb3JuZXIuCgoyLzI3LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVGhpcyBpbmNsdWRlcyBhIGNwcCBtYWNybyBpbiBMaWIvZ3VpbGUvZ3VpbGUuc3dnIGFuZCB0aGUKCSAgZW50aXJlIGZpbGUgTGliL2d1aWxlL3R5cGVtYXBzLmkuCgoyLzI1LzAwIDogdHRuCgkgIE1vZGlmaWVkIGNvbmZpZ3VyZS5pbiBhbmQgTWFrZWZpbGUuaW4gZmlsZXMgdG8gc3VwcG9ydAoJICBub24tbG9jYWwgYnVpbGQgKHVzZWZ1bCBpbiBtdWx0aS1hcmNoIGVudmlyb25tZW50cykuCgoyLzI0LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBHdWlsZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IENsYXJrIE1jR3Jldy4KCSAgVGhpcyB3b3JrcyB3aXRoIEd1aWxlIDEuMywgYnV0IHNpbmNlIGl0IGRlcGVuZHMgaGVhdmlseQoJICBvbiB0aGUgZ2hfIGludGVyZmFjZSwgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCBsYXRlciB2ZXJzaW9ucy4KCSAgSXQgaGFzIG5vdCBiZWVuIHRlc3RlZCB3aXRoIHZlcnNpb25zIGJlZm9yZSAxLjMuCgkgIFdBUk5JTkc6IENvZGUgaXMgdW5zdGFibGUgZHVlIHRvIGV4cGVyaW1lbnRhdGlvbiBieSB0dG4uCgoyLzE2LzAwIDogYmVhemxleQogICAgICAgICAgQSB2YXJpZXR5IG9mIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3MgY29kZSBnZW5lcmF0aW9uLiAgTWFueSBvZiB0aGVzZSByZXN1bHQgaW4gc3Vic3RhbnRpYWwKICAgICAgICAgIHJ1bnRpbWUgcGVyZm9ybWFuY2UgZ2FpbnMuICBIb3dldmVyLCB0aGVzZSBoYXZlIGNvbWUgYXQKICAgICAgICAgIGEgY29zdCBvZiByZXF1aXJpbmcgdGhlIHVzZSBvZiBQeXRob24gMS41LjIuICBGb3Igb2xkZXIKICAgICAgICAgIHZlcnNpb25zLCB1c2UgJ3N3aWcgLW5vb3B0IC1weXRob24nIHRvIHR1cm4gb2ZmIHRoZXNlCiAgICAgICAgICBvcHRpbWl6YXRpb24gZmVhdHVyZXMuCgpWZXJzaW9uIDEuMyBBbHBoYSAxIChGZWJydWFyeSAxMSwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzExLzAwIDogQWRkZWQgJ3ZvaWQnIHRvIHByb3RvdHlwZSBvZiBQeXRob24gbW9kdWxlIGluaXRpYWxpemVyLgogICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyayBIb3dzb24gKDEvMjAvMDApLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUgdG8gZGlzY2FyZCBvd25lcnNoaXAgb2YgYW4KICAgICAgICAgIG9iamVjdCB3aGVuZXZlciBpdCBpcyBhc3NpZ25lZCB0byBhIG1lbWJlciBvZiBhbm90aGVyIG9iamVjdC4KICAgICAgICAgIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhcm91bmQgZm9yIGF3aGlsZSwgYnV0IHdhcyBtb3N0IHJlY2VudGx5CiAgICAgICAgICByZXBvcnRlZCBieSBCdXJraGFyZCBLbG9zcyAoMTIvMzAvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGJyYWNlcyBhcm91bmQgbWFjcm9zIGluIHRoZSBleGNlcHRpb24uaSBsaWJyYXJ5LiAgUmVwb3J0ZWQKICAgICAgICAgIGJ5IEJ1Y2sgSG9kZ2VzICgxMi8xOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBidWcgaW4gdGhlIGNvbnN0cmFpbnRzLmkgbGlicmFyeS4gUmVwb3J0ZWQgYnkgQnVjawogICAgICAgICAgSG9kZ2VzICgxMi8xNC85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgJW5hdGl2ZSBkaXJlY3RpdmUgbm93IGdlbmVyYXRlcyBUY2w4IG9iamVjdC1zdHlsZSBjb21tYW5kIGNhbGxzLgogICAgICAgICAgQSBmdWxsIHNvbHV0aW9uIGZvciBUY2w3IGFuZCBUY2w4IGlzIHN0aWxsIG5lZWRlZC4gUGF0Y2ggc3VnZ2VzdGVkCiAgICAgICAgICBieSBNaWtlIFdlaWJsZW4gKDExLzI5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIGNvZGUgdG8gaW5jbHVkZSB0aGUgJG5kaW0gdmFyaWFibGUgZm9yIGFycmF5cy4KICAgICAgICAgIFBhdGNoIHByb3ZpZGVkIGJ5IE1pY2hlbCBTYW5uZXIgKDExLzEyLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIG1vZHVsZSB0byByYWlzZSBhIFJ1bnRpbWUgZXJyb3IgaWYgYW4gYXR0ZW1wdAogICAgICAgICAgaXMgbWFkZSB0byBzZXQgYSByZWFkLW9ubHkgbWVtYmVyIG9mIGEgc2hhZG93IGNsYXNzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgIE1pY2hlbCBTYW5uZXIgKDExLzUvOTkpLgoKMi8xMC8wMCA6IFRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBoYXMgYmVlbiByZW1vdmVkLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkKICAgICAgICAgIHRvIHJldHVybiBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuCgoyLzEvMDAgIDogQWRkZWQgYSBudW1iZXIgb2YgcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2luZyBhbmQgdHlwZS1jaGVja2luZyBjb2RlLiAgQ29udHJpYnV0ZWQgYnkgVmFkaW0gQ2h1Z3Vub3YuCgogICAgICAgICAgMS4gUmVtb3ZlIF9rd2FyZ3MgYXJndW1lbnQgZnJvbSB0aGUgc2hhZG93IHdyYXBwZXJzIHdoZW4gLWtleXdvcmQKICAgICAgICAgICAgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIHNhdmVzIHVzIGEgY29uc3RydWN0aW9uIG9mIGtleXdvcmQKICAgICAgICAgICAgIGRpY3Rpb25hcnkgb24gZWFjaCBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MsICoqX2t3YXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncywgX2t3YXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMi4gSW5jb3Jwb3JhdGUgc2VsZiBpbnRvIHRoZSBfYXJncyB0dXBsZS4gIFRoaXMgc2F2ZXMgYXQgbGVhc3Qgb25lIHR1cGxlCiAgICAgICAgICAgICBhbGxvY2F0aW9uIHBlciBtZXRob2QgY2FsbC4KCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMSgqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgMy4gUmVtb3ZlICpQdHIgY2xhc3Nlcy4KICAgICAgICAgICAgIEFzc3VtZSB0aGF0IHdlIGFyZSBTV0lHZ2luZyBhIGMrKyBjbGFzcyBDcHBDbGFzcy4KICAgICAgICAgICAgIEN1cnJlbnRseSBTV0lHIHdpbGwgZ2VuZXJhdGUgYm90aCBDcHBDbGFzc1B0ciBjbGFzcwogICAgICAgICAgICAgdGhhdCBob3N0cyBhbGwgbWV0aG9kcyBhbmQgYWxzbyBDcHBDbGFzcyB0aGF0IGlzIGRlcml2ZWQKICAgICAgICAgICAgIGZyb20gdGhlIGZvcm1lciBhbmQgY29udGFpbnMganVzdCB0aGUgY29uc3RydWN0b3IuCiAgICAgICAgICAgICBXaGVuIENwcENsYXNzIG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbnRlcnByZXRlciB3aWxsIHRyeQogICAgICAgICAgICAgdG8gZmluZCBpdCBpbiB0aGUgQ3BwQ2xhc3MncyBkaWN0aW9uYXJ5IGZpcnN0LCBhbmQgb25seSB0aGVuCiAgICAgICAgICAgICBjaGVjayB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICBDcHBDbGFzc1B0ciBmdW5jdGlvbmFsaXR5IG1heSBiZSBlbXVsYXRlZCB3aXRoOgoKICAgICAgICAgICAgIGltcG9ydCBuZXcKICAgICAgICAgICAgIF9uZXdfaW5zdGFuY2UgPSBuZXcuaW5zdGFuY2UKICAgICAgICAgICAgIGRlZiBDcHBDbGFzc1B0cih0aGlzKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uZXdfaW5zdGFuY2UoQ3BwQ2xhc3MsIHsidGhpcyI6dGhpcywidGhpc293biI6MH0pCgogICAgICAgICAgICAgVGhpcyBzYXZlcyB1cyBvbmUgZGljdGlvbmFyeSBsb29rdXAgcGVyIGNhbGwuCgogICAgICAgICAgICAgPERCPlRoZSBuZXcgbW9kdWxlIHdhcyBmaXJzdCBhZGRlZCBpbiBQeXRob24tMS41LjIgc28gaXQKICAgICAgICAgICAgIHdvbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucy4gIEkndmUgaW1wbGVtZW50ZWQgYW4KICAgICAgICAgICAgIGFsdGVybmF0aXZlIHRoYXQgYWNoaWV2ZXMgdGhlIHNhbWUgdGhpbmc8L0RCPgoKICAgICAgICAgIDQuIFVzZSBDT2JqZWN0cyBpbnN0ZWFkIG9mIHN0cmluZ3MgZm9yIHBvaW50ZXJzLgoKICAgICAgICAgIERhdmU6IFRoaXMgZW5oYW5jZW1lbnRzIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiB1cCB0byA1MCUgaW4gc29tZQogICAgICAgICAgb2YgdGhlIHByZWxpbWluYXJ5IHRlc3RzIEkgcmFuLgoKMi8xLzAwICA6IFVwZ3JhZGVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHVzZSBhIG5ldyB0eXBlLWNoZWNraW5nIHNjaGVtZSB0aGF0CiAgICAgICAgICBpcyBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSwgYW5kCiAgICAgICAgICBpcyBsZXNzIGVycm9yIHByb25lLiBVbmZvcnR1bmF0ZWx5LCBpdCB3aWxsIGJyZWFrIGFsbCBjb2RlIHRoYXQKICAgICAgICAgIGRlcGVuZHMgb24gdGhlIFNXSUdfR2V0UHRyKCkgZnVuY3Rpb24gY2FsbCBpbiB0eXBlbWFwcy4KICAgICAgICAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0dldFB0cihzdHJpbmcsJnB0ciwiX0Zvb19wIikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihweW9iaiwgJnB0ciwgU1dJR19UWVBFX0Zvb19wKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdGU6IEluIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gU1dJR19UWVBFX0Zvb19wIGlzIG5vIGxvbmdlcgogICAgICAgICAgYSB0eXBlLXNpZ25hdHVyZSBzdHJpbmcsIGJ1dCByYXRoZXIgYW4gaW5kZXggaW50byBhIHR5cGUKICAgICAgICAgIGVuY29kaW5nIHRhYmxlIHRoYXQgY29udGFpbnMgdHlwZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8zMC8wMCA6IGxvaWMKCSAgQ29uZGl0aW9uYWx5IGNvbXBpbGUgZXhwZXJpbWVudGFsIGNvZGUgd2l0aCAtLWVuYWJsZS1leHBlcmltZW50CgkgIGNvbmZpZ3VyZSBmbGFnLgoJICBGaXggLmN2c2lnbm9yZSB0byBpZ25vcmUgY29uZmlncnVlICYgeWFjYyBnZW5lcmF0ZWQgZmlsZXMKCjEvMjgvMDAgOiBsb2ljCgkgIEFwcGx5IGF1dG9tYWtlIGV2ZXJ5d2hlcmUKCSAgS2VlcCBjb25maWd1cmUgc2NyaXB0cyBzbyB0aGF0IHBlb3BsZSBhcmUgbm90ICpmb3JjZWQqIHRvIGF1dG9jb25mCiAgICAgICAgICBLZWVwIHNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHlhY2Mgc28gdGhhdCBjb21waWxhdGlvbiB3aXRob3V0IHlhY2MKCSAgaXMgcG9zc2libGUuCgkgIFNvdXJjZS9MUGFyc2UvY3NjYW5uZXIuYzogY2hhbmdlIGx5YWNjLmggaW50byBwYXJzZXIuaCB0byBwbGVhc2UKCSAgZGVmYXVsdCB5YWNjIGdlbmVyYXRpb24gcnVsZXMuCgkgIFVzZSBBQ19DT05GSUdfU1VCRElSUyBpbiBjb25maWd1cmUuaW4gaW5zdGVhZCBvZiBoYW5kIG1hZGUgc2NyaXB0LgoJICBVcGRhdGUgYWxsIHJlbGV2YW50IC5jdnNpZ25vcmUgdG8gaW5jbHVkZSAuZGVwcwoJICBGaXhlZCBtaXNzaW5nIDsgbGluZSAxMzYgU291cmNlL1N3aWcvc3dpZy5oCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBudW1iZXIgb2YgbWlub3IgZW5kLW9mLWZpbGUgcGFyc2luZyBwcm9ibGVtcyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtZnJlZXplIG9wdGlvbiB0aGF0IGZvcmNlcyBTV0lHIHRvIGZyZWV6ZSB1cG9uIGV4aXQuCiAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIGRlYnVnZ2luZyB0b29sIHNvIHRoYXQgSSBjYW4gbW9yZQogICAgICAgICAgZWFzaWx5IGV4YW1pbmUgU1dJRydzIG1lbW9yeSBmb290cHJpbnQuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gZ3VpbGUgbW9kdWxlIGZvciBzdXBwb3J0aW5nIG9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGlldGVyIEJhcm9uLgoKMS8xMy8wMCA6IGxvaWMKCSAgQWRkZWQgLmN2c2lnbm9yZSwgRXhhbXBsZXMvLmN2c2lnbm9yZSwgU291cmNlL0RPSC9Eb2gvLmN2c2lnbm9yZQoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogRml4ZWQgLUkgaGFuZGxpbmcgYnVnCgkgIFNvdXJjZS9Nb2R1bGVzMS4xL2phdmEuY3h4OiBmaXhlZCBjaGFyKiAtPiBjb25zdCBjaGFyKiB3YXJuaW5ncyB0aGF0IGFyZQoJICBlcnJvcnMgd2hlbiBjb21waWxpbmcgd2l0aCBnY2MtMi45NS4yCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBjYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIGZvciBTdHJpbmdfcmVwbGFjZQoJICB0b2tlbiBhbmQgcmVwIHNob3VsZCByZWFsbHkgYmUgY29uc3QuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgSGFyY28ncyBKYXZhIG1vZHVsZXMuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmV2b2tlZCB0aGUgJWlmZGVmLCAlaWZuZGVmLCAlZW5kaWYsICVpZiwgJWVsaWYsIGFuZCAlZWxzZQogICAgICAgICAgZGlyZWN0aXZlcy4gIFRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGFzIFNXSUcgbm93IGhhcyBhIHJlYWwKICAgICAgICAgIHByZXByb2Nlc3Nvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vdmVkIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVsZXMgZnJvbSB0aGUgU1dJRyBkaXJlY3RvcnkKICAgICAgICAgIHRvIHRoZSBNb2R1bGVzIGRpcmVjdG9yeSAod2hlcmUgdGhleSByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdG8gYmVnaW4gd2l0aCkuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXN0YXQgb3B0aW9uIGZvciBwcmludGluZyBzdGF0aXN0aWNzLiBUaGUKICAgICAgICAgIHN0YXRpc3RpY3MgcmVwb3J0aW5nIHdhcyBpbmFkZXF1YXRlIGFuZCBtb3N0bHkgYnJva2VuCiAgICAgICAgICBhbnl3YXkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtdCBvcHRpb24gZm9yIHJlYWRpbmcgYSB0eXBlbWFwIGZpbGUuICBNb3JlCiAgICAgICAgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gIEp1c3QgaW5jbHVkZSB0eXBlbWFwcyBhdCB0aGUgdG9wCiAgICAgICAgICBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAlY2hlY2tvdXQgZGlyZWN0aXZlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLWNpIG9wdGlvbiBmb3IgZmlsZSBjaGVja2luLiAgIFRvbyBwcm9ibGVtYXRpYwogICAgICAgICAgdG8gaW1wbGVtZW50LiAgUHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgcHV0IHlvdXIgU1dJRyBsaWJyYXJ5CiAgICAgICAgICB1bmRlciBDVlMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWxldGVkIHRoZSBMQVRFWCBtb2R1bGUuICBTb3JyeS4uLiBEaWRuJ3Qga25vdyBhbnlvbmUKICAgICAgICAgIHdobyB3YXMgdXNpbmcgaXQuICBCZXNpZGVzLCBJJ20gbG9va2luZyB0byBzaW1wbGlmeQogICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24gbW9kdWxlIHRvIHVzZSBhIC50eHQKICAgICAgICAgIHN1ZmZpeCBmb3IgaXRzIG91dHB1dCBmaWxlIGluc3RlYWQgb2YgLmRvYy4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgbG9uZy1sb3N0IFNXSUcgcHJlcHJvY2Vzc29yIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAgICAgICAgIEl0IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBSYXcgcHJlcHJvY2Vzc2VkIG91dHB1dAogICAgICAgICAgY2FuIGJlIHZpZXdlZCB1c2luZyBzd2lnIC1FIGZpbGUuaS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5IGFuZCBkam1pdGNoZQogICAgICAgICAgQ29tcGxldGVseSByZW9yZ2FuaXplZCB0aGUgU1dJRyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCiAgICAgICAgICBiYXNpYyBvcmdhbml6YXRpb24gaXMgbm93OgoKICAgICAgICAgICAgICAgIFNvdXJjZS8gICAgICAgICBTV0lHIHNvdXJjZSBjb2RlCiAgICAgICAgICAgICAgICBMaWIvICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIChzd2lnX2xpYikKICAgICAgICAgICAgICAgIERvYy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICBFeGFtcGxlcy8gICAgICAgRXhhbXBsZXMKCiAgICAgICAgICBNb3JlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgoKMTIvMDgvOTk6IExvaWMgRGFjaGFyeSAobG9pY0BzZW5nYS5vcmcpCgkgIEVuaGFuY2VkIHBhY2thZ2UgaGFuZGxpbmcgZm9yIHBlcmw1IGFuZCBjKysuCgoJICBXaXRoIG5ldyBvcHRpb24gLWhpZGUgRm9vOjpCYXIsIGV2ZXJ5IHBlcmw1IG9iamVjdCAoRnJvYikgaXMKCSAgcXVhbGlmaWVkIGJ5IEZvbzo6QmFyOjpGcm9iLiBUaGUgcGFja2FnZSBuYW1lIGlzIHNvbGVseSB1c2VkCgkgIHRvIGVuY2Fwc3VsYXRlIEMvQysrIHdyYXBwZXJzIG91dHB1dCBpbiA8bW9kdWxlPl93cmFwLmMgYW5kIHRoZQoJICBjb3JyZXNwb25kaW5nIHBlcmwgcGFja2FnZSBpbiA8bW9kdWxlPi5wbS4gTm90ZSB0aGF0IGEgcGFja2FnZQoJICBuYW1lIG1heSBjb250YWluIDo6IChGcm9iOjpOaXR6KSBhbmQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUKCSAgcGFja2FnZSBuYW1lIHByb3ZpZGVkIGJ5IC1oaWRlIChGb286OkJhcjo6RnJvYjo6Tml0eikuCgoJICBJbiAqX3dyYXAuYywgU1dJR19pbml0IG1hY3JvIGlzIHVzZWQuIFdhcyBwcmV2aW91c2x5IGRlZmluZWQKCSAgYnV0IG5vdCB1c2VkIGFuZCBzaW1wbGlmaWVzIGNvZGUuCgoJICBBZGRlZCB0eXBlbWFwKHBlcmw1LHBlcmw1aW4pIGFuZCB0eXBlbWFwKHBlcmw1LHBlcmw1b3V0KSB0aGF0CgkgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHR5cGVtYXAocGVybDUsaW4pIGFuZCB0eXBlbWFwKHBlcmw1LG91dCkKCSAgYnV0IGNvbnRhaW4gcGVybCBjb2RlIGFuZCBhcHBsaWVzIHRvIHdyYXBwZXJzIGdlbmVyYXRlZCBieQoJICAtc2hhZG93LgoKCSAgTGFja2luZyBwcm9wZXIgcmVncmVzc2lvbiB0ZXN0cyBJIHVzZWQKCSAgRXhhbXBsZXMvcGVybDUve2MrKyxjb25zdHJhaW50LGRlZmFyZyxleGNlcHQsCgkgIGdyYXBoL2dyYXBoWzEyMzRdLG11bHRpbmhlcml0LG5lc3RlZCxzaGFkb3csc2ltcGxlLHRyZWUsCgkgIHR5cGVtYXBzL3thcmd2LGFyZ3YyLGFycmF5bWVtYmVyLGRhdGFiYXNlLGZpbGUsaWdub3JlLGludGVnZXIsCgkgIG91dHB1dCxwYXNzcmVmLHJlZmVyZW5jZSxyZXR1cm59fS8uIEkgcmFuIHN3aWcgd2l0aCBhbmQgd2l0aG91dAoJICB0aGUgcGF0Y2hlcywgZGlmZiB0aGUgZ2VuZXJhdGVkc291cmNlcywgcnVuIHRoZSAucGwgZmlsZXMKCSAgYW5kIGNoZWNrZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLiBJbiBhbGwgdGhvc2UgZXhhbXBsZXMKCSAgSSBoYWQgbm8gZXJyb3IuCgoxMS8yMS85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gcHJvdmlkZSBmdWxsIHZhcmlhYmxlIGxpbmtpbmcgY2FwYWJpbGl0aWVzCiAgICAgICAgICB0byBhbGwgZGF0YXR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICB3ZXJlIGNyZWF0ZWQgZm9yIGRhdGF0eXBlcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVGNsX0xpbmtWYXIoKSBmdW5jdGlvbi4KICAgICAgICAgIE5vdywgd2Ugc2ltcGx5IHVzZSB2YXJpYWJsZSB0cmFjZXMgdG8gc3VwcG9ydCBldmVyeXRoaW5nLiBUaGlzIG1heQogICAgICAgICAgYnJlYWsgc2NyaXB0cyB0aGF0IHJlbHkgdXBvbiB0aGUgb2xkZXIgYmVoYXZpb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzk5OiBBZGRlZCBzbGlnaHQgdHdlYWsgdG8gd3JhcHBlciBnZW5lcmF0b3IgdG8gY29sbGVjdCBsb2NhbCB2YXJpYWJsZXMKICAgICAgICAgIG9mIHNpbWlsYXIgdHlwZS4gIFByb2R1Y2VzIHNvbWV3aGF0IG1vcmUgY29tcGFjdCB3cmFwcGVyIGNvZGUuCgoxMS8yMC85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gdXNlIFNXSUdfR2V0QXJncygpIHRvIHBhcnNlCiAgICAgICAgICBhcmd1bWVudHMuICAgIFRoaXMgaXMgYSB0ZWNobmlxdWUgYm9ycm93ZWQgZnJvbSBQeXRob24gaW4gd2hpY2gKICAgICAgICAgIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHVzaW5nIGEgZm9ybWF0IHN0cmluZyBjb252ZW50aW9uIHNpbWlsaWFyCiAgICAgICAgICB0byBmcHJpbnRmKCkuICAgVGhpcyByZXN1bHRzIGluIGEgKnN1YnN0YW50aWFsKiByZWR1Y3Rpb24gaW4gdGhlCiAgICAgICAgICBzaXplIG9mIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIHdpdGggb25seSBhIG1vZGVzdCBydW50aW1lIG92ZXJoZWFkCiAgICAgICAgICBpbiBnb2luZyB0aHJvdWdoIHRoZSBleHRyYSBjb252ZXJzaW9uIGZ1bmN0aW9uLgoKMTEvMTMvOTk6IENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgY2xhc3Mvc3RydWN0dXJlIGdlbmVyYXRpb24gY29kZSBmb3IgdGhlCiAgICAgICAgICBUY2wgbW9kdWxlLiAgTm93LCBhIHNtYWxsIHNldCBvZiBydW50aW1lIGZ1bmN0aW9ucyBhcmUgdXNlZAogICAgICAgICAgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgY2xhc3NlcyAoaW5zdGVhZCBvZiBhCiAgICAgICAgICBtYXNzaXZlIGFtb3VudCBvZiBydW50aW1lIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGZvciBlYWNoIGNsYXNzKS4KICAgICAgICAgIENsYXNzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHNpbXBseSBlbmNvZGVkIGluIGEgc2VyaWVzIG9mCiAgICAgICAgICBzdGF0aWMgdGFibGVzLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpIVUdFKiByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLS1lc3BlY2lhbGx5IGZvciBDKysuCgoxMS8xMy85OTogUmVtb3ZlZCB0aGUgLXRjbCAoVGNsIDcueCkgbW9kdWxlLiAgVGNsIDguMCBpcyBub3cgc2V2ZXJhbAogICAgICAgICAgeWVhcnMgb2xkIGFuZCB0aGUgZGVmYWN0byBzdGFuZGFyZC0tbm8gcmVhbCByZWFzb24gdG8ga2VlcAogICAgICAgICAgc3VwcG9ydGluZyB0aGUgb2xkIHZlcnNpb24gYXQgdGhpcyBwb2ludC4KCjExLzEzLzk5OiBDbGVhbmVkIHVwIC1jIG9wdGlvbiBmb3IgUHl0aG9uIG1vZHVsZS4gIFRoZSBweWV4cC5zd2cgZmlsZQogICAgICAgICAgaXMgbm93IGdvbmUuCgoxMS8xMy85OTogRml4ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHRvIHdvcmsgYmV0dGVyIHdpdGggc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9uIFdpbmRvd3MuICBTdGF0aWMgbGlua2luZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIGJ5IGRlZmluaW5nCiAgICAgICAgICB0aGUgLURTVEFUSUNfTElOSyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBbGJlcnRvIEZvbnNlY2EuCgoxMS81Lzk5IDogRml4ZWQgYW4gb2JzY3VyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHJlbGF0ZWQgdG8gdGhlIGdlbmVyYXRpb24KICAgICAgICAgIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgIEJ1ZyByZXBvcnRlZCBieSBCcmFkIENsZW1lbnRzLgoKMTEvNS85OSA6IEZpeGVkIGEgZmV3IG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBwdXJpZnkuCgoxMS81Lzk5IDogT2ZmaWNpYWxseSBkZXByZWNhdGVkIHRoZSAtaHRjbCwgLWh0aywgYW5kIC1wbHVnaW4gb3B0aW9ucwogICAgICAgICAgZnJvbSB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxMC8yNi85OTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgZnJvbSBweXRob24vdHlwZW1hcHMuaS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBLZWl0aCBEYXZpZHNvbi4KCjgvMTYvOTkgOiBBZGRlZCBfV0lOMzIgc3ltYm9sIHRvIGxpYnJhcmllcyB0byBiZXR0ZXIgc3VwcG9ydCBXaW5kb3dzLgoKOC8xNi85OSA6IERlcHJlY2F0ZWQgdGhlIFBlcmw0IG1vZHVsZS4gICBJdCBpcyBubyBsb25nZXIgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgICBkaXN0cmlidXRpb24gYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJbiB0aGUgZW50aXJlIDMgeWVhcnMgU1dJRwogICAgICAgICAgaGFzIGJlZW4gYXJvdW5kIEkgbmV2ZXIgcmVjZWl2ZWQgYSBzaW5nbGUgY29tbWVudCBhYm91dCBpdCBzbyBJJ20KICAgICAgICAgIGFzc3VtaW5nIG5vIG9uZSB3aWxsIG1pc3MgaXQuLi4KCjgvMTYvOTkgOiBNb2RpZmllZCB0aGUgdHlwZS1jaGVja2luZyBjb2RlIHRvIHJlZ2lzdGVyIHR5cGUgbWFwcGluZ3MgdXNpbmcgYQogICAgICAgICAgdGFibGUgaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBTV0lHX1JlZ2lzdGVyTWFwcGluZygpLiAgVGhpcwogICAgICAgICAgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNvbWV3aGF0LgoKOC8xNS85OSA6IENsZWFuZWQgdXAgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2luZyBjb2RlIGluIHRoZSBUY2wgbW9kdWxlLgoKOC8xNS85OSA6IE1hbnkgY2hhbmdlcyB0byB0aGUgbGlicmFyaWVzIHRvIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMuCgo4LzEzLzk5IDogRWxpbWluYXRlZCBDKysgY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBleHRlcm4gIkMiIGxpbmthZ2UuCgo4LzEzLzk5IDogU29tZSBjbGVhbnVwIG9mIFB5dGhvbiAuc3dnIGZpbGVzIHRvIGJldHRlciBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICBvbiBXaW5kb3dzLgoKOC8xMy85OSA6IE1vZGlmaWVkIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZSB0byBhdHRhY2ggcHJhZ21hcyBkZWNsYXJlZCBpbnNpZGUKICAgICAgICAgIGEgY2xhc3MgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgJXByYWdtYShweXRob24pIGFkZHRvbWV0aG9kID0gImluc2VydDpwcmludCBgaGVsbG8gd29ybGQnIgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgTW9zdCBwZW9wbGUgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBob3cgdGhpcyB3b3Jrcy4gIEZvciBwZW9wbGUKICAgICAgICAgIHdyaXRpbmcgYmFja2VuZCBtb2R1bGVzLCBjbGFzcy1iYXNlZCBwcmFnbWFzIHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBsYW5nLT5jcHBfb3Blbl9jbGFzcygpICAgICAgICAgICAgIC8vIE9wZW4gYSBjbGFzcwogICAgICAgICAgICAgIGxhbmctPmNwcF9wcmFnbWEoKSAgICAgICAgICAgICAgICAgLy8gU3VwcGx5IHByYWdtYXMKICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgbWVtYmVycwoKICAgICAgICAgICAgICBsYW5nLT5jcHBfY2xvc2VfY2xhc3MoKSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcwoKICAgICAgICAgIEFsbCBvZiB0aGUgcHJhZ21hcyBhcmUgcGFzc2VkIGZpcnN0IHNpbmNlIHRoZXkgbWlnaHQgYmUgdXNlZCB0bwogICAgICAgICAgYWZmZWN0IHRoZSBjb2RlIGdlbmVyYXRpb24gb2Ygb3RoZXIgbWVtYmVycy4gICBQbGVhc2Ugc2VlCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZSBmb3IgYW4gZXhhbXBsZS4gICBQYXRjaGVzIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMy85OSA6IFBhdGNoIHRvIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byBlbGltaW5hdGUgaWdub3JlZAogICAgICAgICAgZXhjZXB0aW9uIGVycm9ycyBpbiBkZXN0cnVjdG9ycy4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMS85OSA6IE1pbm9yIHBhdGNoIHRvIHN3aWdfbGliL3B5dGhvbi9zd2lncHRyLnN3ZyAgKGFkZGVkIFNXSUdTVEFUSUMKICAgICAgICAgIGRlY2xhcmF0aW9uKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEx5bGUgSm9obnNvbi4KCjgvMTEvOTkgOiBBZGRlZCBGSVJTVEtFWS9ORVhUS0VZIG1ldGhvZHMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjgvMTEvOTkgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgcmV0dXJuZWQKICAgICAgICAgIGFuZCBwYXNzZWQgYXMgJ05vbmUuJyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4KCjgvMTAvOTkgOiBGaXhlZCBtaXNzaW5nICdpbnQnIHNwZWNpZmllcnMgaW4gdmFyaW91cyBwbGFjZXMuCgo4LzEwLzk5IDogQWRkZWQgV2luZG93cyBtYWtlZmlsZSBmb3IgUnVudGltZSBsaWJyYXJpZXMuICBDb250cmlidXRlZAogICAgICAgICAgYnkgQm9iIFRlY2hlbnRpbi4KCjgvMTAvOTkgOiBGaXhlZCBtaW5vciBwcm9ibGVtIGluIFB5dGhvbiBydW50aW1lIG1ha2VmaWxlIGludHJvZHVjZWQKICAgICAgICAgIGJ5IGtleXdvcmQgYXJndW1lbnRzLgoKOC84Lzk5ICA6IENoYW5nZWQgJHRhcmdldCBvZiBwZXJsNShvdXQpIHR5cGVtYXAgZnJvbSBTVCgwKSB0bwogICAgICAgICAgU1QoYXJndmkpLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiBGaXhlZCBidWcgaW4gdHlwZW1hcCBjaGVja2luZyByZWxhdGVkIHRvIHRoZSBBTlkga2V5d29yZAogICAgICAgICAgaW4gYXJyYXlzIGFuZCBpZ25vcmVkIGFyZ3VtZW50cy4gIEVycm9yIHJlcG9ydGVkIGJ5CiAgICAgICAgICBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6ICVlbmFibGVkb2MgYW5kICVkaXNhYmxlZG9jIGRpcmVjdGl2ZXMgY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICBpbnNpZGUgY2xhc3Mvc3RydWN0dXJlIGRlZmluaXRpb25zLiAgIEhvd2V2ZXIsIG5vIGNoZWNrCiAgICAgICAgICBpcyBtYWRlIHRvIHNlZSBpZiB0aGV5IGFyZSBiYWxhbmNlZCAoaS5lLiwgYSAlZGlzYWJsZWRvYwogICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBhIG1hdGNoaW5nCiAgICAgICAgICAlZW5hYmxlZG9jIGluIHRoZSBzYW1lIGNsYXNzKS4KCjgvOC85OSAgOiBLZXl3b3JkIGFyZ3VtZW50IGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgbW9kdWxlLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhjaGFyICpiYXIsIGludCBzcGFtLCBkb3VibGUgeCk7CgogICAgICAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcwoKICAgICAgICAgICAgICAgZm9vKHggPSAzLjQsIGJhcj0iaGVsbG8iLCBzcGFtPTQyKQoKICAgICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHJ1biBTV0lHIHdpdGggdGhlICcta2V5d29yZCcgY29tbWFuZAogICAgICAgICAgbGluZSBvcHRpb24uICAgIE1peGluZyBrZXl3b3JkIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgc2hvdWxkIHdvcmsgYXMgd2VsbC4gICBVbm5hbWVkIGFyZ3VtZW50cyBhcmUgYXNzaWduZWQgbmFtZXMKICAgICAgICAgIHN1Y2ggYXMgImFyZzEiLCAiYXJnMiIsIGV0Yy4uLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgRnVuY3Rpb25zIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIHN1Y2ggYXMKICAgICAgICAgIGJhcihpbnQgKk9VVFBVVCwgaW50ICpPVVRQVVQpIHdpbGwgbGlrZWx5IGNhdXNlIHByb2JsZW1hdGljCiAgICAgICAgICB3cmFwcGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLiAgIFRvIGZpeCB0aGlzLCAgdXNlIGRpZmZlcmVudAogICAgICAgICAgbmFtZXMgb3IgdXNlICVhcHBseSB0byBtYXAgdHlwZW1hcHMgdG8gYWx0ZXJuYXRlIG5hbWVzLgoKOC84Lzk5ICA6IEhhbmRsaW5nIG9mIHRoZSAndGhpcycgcG9pbnRlciBoYXMgYmVlbiBjaGFuZ2VkIGluIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBQcmV2aW91c2x5LCBkZXJlZmVyZW5jaW5nIG9mICcudGhpcycgb2NjdXJlZCBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBzaGFkb3cgY2xhc3MgaXRzZWxmLiAgIE5vdywgdGhpcyBzdGVwIG9jY3VycyBpbiB0aGUgQwogICAgICAgICAgd3JhcHBlcnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgICBTV0lHX0dldFB0ck9iaihQeU9iamVjdCAqLCB2b2lkICoqcHRyLCBjaGFyICp0eXBlKQoKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHBvaW50ZXIKICAgICAgICAgIG9yIGEgc2hhZG93IGNsYXNzIGluc3RhbmNlIHdpdGggYSAnLnRoaXMnIGF0dHJpYnV0ZSBvZgogICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZS4gIFRoaXMgY2hhbmdlIGFsbG93cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIDEuICBUaGUgcmVhbCBzaGFkb3cgY2xhc3MgaW5zdGFuY2UgZm9yIGFuIG9iamVjdCBpcwogICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgQyB3cmFwcGVycyB3aGVyZSBpdCBjYW4gYmUgZXhhbWluZWQvbW9kaWZpZWQKICAgICAgICAgICAgICBieSB0eXBlbWFwcy4KCiAgICAgICAgICAyLiAgSGFuZGxpbmcgb2YgZGVmYXVsdC9rZXl3b3JkIGFyZ3VtZW50cyBpcyBub3cgZ3JlYXRseQogICAgICAgICAgICAgIHNpbXBsaWZpZWQuCgogICAgICAgICAgMy4gIFRoZSBQeXRob24gd3JhcHBlciBjb2RlIGlzIG11Y2ggbW9yZSBzaW1wbGUuCgogICAgICAgICAgUGx1cywgaXQgZWxpbWluYXRlZCBtb3JlIHRoYW4gMzAwIGxpbmVzIG9mIEMrKyBjb2RlIGluIHRoZQogICAgICAgICAgUHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAqKiogQ0FWRUFUIDogVGhpcyByZXF1aXJlcyB0aGUgYWJzdHJhY3Qgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgIEl0IHNob3VsZCB3b3JrIHdpdGggUHl0aG9uIDEuNCwgYnV0IHByb2JhYmx5IG5vdGhpbmcgb2xkZXIKICAgICAgICAgIHRoYW4gdGhhdC4KCgo4LzgvOTkgIDogRml4ZWQgaGFuZGxpbmcgb2YgImNvbnN0IiBhbmQgcG9pbnRlcnMgaW4gY2xhc3Nlcy4gIEluIHBhcnRpY3VsYXIsCiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcwoKICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBjb25zdCBpbnQgICppcHRyOwogICAgICAgICAgfQoKICAgICAgICAgIGFyZSBoYW5kbGVkIGFzIGFzc2lnbmFibGUgdmFyaWFibGVzIGFzIG9wcG9zZWQgdG8gY29uc3RhbnQKICAgICAgICAgIHZhbHVlcyAodGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBpbiBDL0MrKykuICAgTm90ZToKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzICJjaGFyICpjb25zdCBtc2ciIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KICAgICAgICAgIENvbnN0YW50cyBkZWNsYXJlZCBhdCB0aGUgZ2xvYmFsIGxldmVsIHVzaW5nIGNvbnN0IGFyZSBhbHNvCiAgICAgICAgICBicm9rZW4gKGJlY2F1c2UgSSBoYXZlIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdGhhdCByZWx5IHVwb24KICAgICAgICAgIHRoaXMgYmVoYXZpb3IpLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0CiAgICAgICAgICBtaXN0YWtlbmx5IHRyZWF0ICdjb25zdCBjaGFyIConIHR5cGVzIGFzIGNvbnN0YW50IHZhbHVlcy4KCjgvOC85OSAgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHN1cHBvcnQgYml0LWZpZWxkcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19rZXl3b3JkIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfZXh0ZXJuICA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyAgOiAxOwogICAgICAgICAgfSBmbGFnczsKCiAgICAgICAgICBCaXQtZmllbGRzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gaW50ZWdlciB0eXBlcyBhbmQgdGhlaXIKICAgICAgICAgIGFyZSBvdGhlciByZXN0cmljdGlvbnMuICBTV0lHIHBlcmZvcm1zIG5vIHN1Y2ggdHlwZS1jaGVja2luZwogICAgICAgICAgKGFsdGhvdWdoIHRoZSBDIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvYmxlbXMgd2hlbiBpdCB0cmllcyB0bwogICAgICAgICAgY29tcGlsZSB0aGUgd3JhcHBlciBjb2RlKS4KCjgvOC85OSAgOiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlIG9mICRiYXNldHlwZSBzdWJzdGl0dXRpb24gaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgJXR5cGVtYXAocHl0aG9uLCBhcmdvdXQpIHNwYW0qKiBPVVRQVVR7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgY2hhciogYSA9ICIkYmFzZXR5cGVfcCI7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICB9CgogICAgICAgICAgKFBhdGNoIHN1Z2dlc3RlZCBieSBOYXRoYW4gRHVuZmllbGQpLgoKNi8yMi85OSA6IE1hZGUgYSB2ZXJ5IHNsaWdodCB0d2VhayB0byB0aGUgUGVybDUgc2hhZG93IGNsYXNzCiAgICAgICAgICBjb2RlIHRoYXQgYWxsb3dzIHR5cGVtYXBzIHRvIGFsdGVyIHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgb2Ygb2JqZWN0cyAodG8gc3VwcG9ydCBwb2x5bW9ycGhpYyB0eXBlcykuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgRHJha2UgRGllZHJpY2guCgo0LzgvOTkgIDogRml4ZWQgbnVsbCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsIG1vZHVsZS4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjMvMTcvOTkgOiBGaXhlZCBidWcgaW4gcGVybDVwdHIuc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR3JlZyBBbmRlcnNvbi4KCjIvMjcvOTkgOiBFbGltaW5hdGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIFN3aWcgcnVucyBvbgogICAgICAgICAgZW1wdHkgZmlsZXMuCgoyLzI3Lzk5IDogQWRkZWQgcGF0Y2ggdG8gR3VpbGUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB1bnVzZWQKICAgICAgICAgIHZhcmlhYmxlcy4gICBDb250cmlidXRlZCBieSBNaWtlIFNpbW9ucy4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgcmV0dXJuaW5nIHJlZmVyZW5jZXMuCgoyLzI3Lzk5IDogRml4ZWQgUnVudGltZS9NYWtlZmlsZS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pa2UgUm9tYmVyZy4KCjIvMjcvOTkgOiBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyB0byB0aGUgdHlwZS1jaGVja2VyLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAtZXhwb3J0YWxsIHN3aXRjaCBhbmQgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIGluIFBlcmw1IG1vZHVsZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjIvMjcvOTkgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgdG8gcmVjb2duaXplICd1bmRlZicgYXMgYSBOVUxMIGNoYXIgKi4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgUGVybDUgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIG5ld2VyIHZlcnNpb25zIG9mCiAgICAgICAgICBBY3RpdmVTdGF0ZSBQZXJsIGZvciBXaW4zMi4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgaW5jbHVkZSBvcmRlciBvZiBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgIC1JIG9wdGlvbi4KCjIvNS85OC0gOiBEYXZlIGZpbmlzaGVzIGhpcyBkaXNzZXJ0YXRpb24sIGdvZXMgam9iIGh1bnRpbmcsIG1vdmVzIHRvCjIvNS85OSAgICBDaGljYWdvIGFuZCBnZW5lcmFsbHkgdGhyYXNoZXMgYWJvdXQuCgpWZXJzaW9uIDEuMSBQYXRjaCA1IChGZWJydWFyeSA1LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi80Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgIGxvY2F0aW9ucyBhcmUgc3BlY2lmaWVkICgtLXdpdGgtdGNsaW5jbCwgZXRjLi4uKS4KCjIvMi85OCAgOiBGaXhlZCBuYW1lLWNsYXNoIGJ1ZyByZWxhdGVkIHRvIHRoZSBzd2l0Y2ggdG8gQyBtYWNyb3MgZm9yIGFjY2Vzc29yCiAgICAgICAgICBmdW5jdGlvbnMuICBUaGUgbmV3IHNjaGVtZSBkaWQgbm90IHdvcmsgY29ycmVjdGx5IGZvciBvYmplY3RzCiAgICAgICAgICB3aXRoIG1lbWJlcnMgc3VjaCBhcyAnb2JqJywgJ3ZhbCcsIGV0Yy4uLiAgIEZpeGVkIHRoZSBidWcgYnkKICAgICAgICAgIGFwcGVuZGluZyB0aGUgd29yZCAnc3dpZycgdG8gbWFjcm8gYXJndW1lbnQgbmFtZXMuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoyLzIvOTggIDogU2xpZ2h0IGZpeCB0byB0aGUgUGVybDUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICBhYm91dCAndmFybmFtZSB1c2VkIG9ubHkgb25jZSA6IHBvc3NpYmxlIHR5cG8nLiAgRml4CiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjEvOS85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybCA1IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgY29uc3RhbnRzIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjEvOS85OCAgOiBGaXhlZCBsaW5raW5nIGJ1ZyB3aXRoIFB5dGhvbiAxLjUgZW1iZWQuaSBsaWJyYXJ5IGZpbGUuCgpWZXJzaW9uIDEuMSBQYXRjaCA0IChKYW51YXJ5IDQsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEvNC85OCAgOiBDaGFuZ2VkIHN0cnVjdHVyZWQgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB0byBiZSBtb3JlIGZyaWVuZGx5CiAgICAgICAgICB0byBCb3JsYW5kIEMrKy4KCjEvNC85OCAgOiBBZGRlZCB0aGUgZnVuY3Rpb24gTWFrZWZpbGUud2luLmJjIGZvciBjb21waWxpbmcgdGhlIGV4YW1wbGVzCiAgICAgICAgICB1bmRlciBCb3JsYW5kIDUuMi4KCjEvNC85OCAgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwZXJsNSBtb2R1bGUgYW5kIEMrKyBjb21waWxhdGlvbi4gIFRoZQogICAgICAgICAgPG1hdGguaD4gbGlicmFyeSBpcyBub3cgaW5jbHVkZWQgYmVmb3JlIGFueSBQZXJsIGhlYWRlcnMKICAgICAgICAgIGJlY2F1c2UgUGVybCB0aGUgZXh0ZXJuICJDIiBsaW5rYWdlIG9mIG1hdGguaCBzY3Jld3MgYWxvdAogICAgICAgICAgb2YgdGhpbmdzIHVwIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MpLgoKMS8yLzk4ICA6IENoYW5nZSB0byB0aGUgUHl0aG9uIG1vZHVsZSB0aGF0IHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb25zdGFudHMKICAgICAgICAgIGNyZWF0ZWQgYnkgQysrIGNsYXNzZXMsIGluaGVyaXRhbmNlLCBhbmQgc2hhZG93IGNsYXNzZXMuICAgVGhpcwogICAgICAgICAgbW9kaWZpY2F0aW9uIG1heSBpbnRyb2R1Y2UgYSBmZXcgc2xpZ2h0IGluY29tcGF0aWJpbGl0aWVzIGlmCiAgICAgICAgICB5b3UgYXR0ZW1wdCB0byB1c2UgdGhlIG5vbi1zaGFkb3cgY2xhc3MgaW50ZXJmYWNlIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzIGVuYWJsZWQuICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjEvMi85OCAgOiBTdXBwb3J0IGZvciBUY2wgOC4wIG5hbWVzcGFjZXMgaGFzIGJlZW4gYWRkZWQuICAgVGhpcyAqcmVwbGFjZXMqCiAgICAgICAgICB0aGUgb3JpZ2luYWwgU1dJRyBtZWNoYW5pc20gdGhhdCBhc3N1bWVkIFtpbmNyIFRjbF0gbmFtZXNwYWNlcy4KICAgICAgICAgIFRvIHVzZSBuYW1lc3BhY2VzLCBzaW1wbHkgcnVuIFNXSUcgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnMKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiBhIG5hbWVzcGFjZSB0aGF0IG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIG5hbWUKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAtcHJlZml4IGJhciBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIHRoZSBuYW1lc3BhY2UgJ2JhcicKCiAgICAgICAgICBUaGUgdXNlIG9mIG5hbWVzcGFjZXMgaXMgbmV3IGluIFRjbCA4LjAuICBIb3dldmVyLCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBnZW5lcmF0ZWQgYnkgU1dJRyB3aWxsIHN0aWxsIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMgb2YgVGNsIG5ld2VyCiAgICAgICAgICB0aGFuIGFuZCBpbmNsdWRpbmcgVGNsIDcuMy9UazMuNiBldmVuIGlmIHRoZSAtbmFtZXNwYWNlIG9wdGlvbiBpcwogICAgICAgICAgdXNlZC4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCByZWxpZWQgb24gdGhlCiAgICAgICAgICAtcHJlZml4IGFuZCAtbmFtZXNwYWNlIG9wdGlvbnMuCgoxLzIvOTggIDogQWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgdG8gdGhlIFRjbCB3cmFwcGVyIGNvZGUKCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lICAgICAgLSBOYW1lIG9mIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICAgICAgIFNXSUdfcHJlZml4ICAgIC0gUHJlZml4L25hbWVzcGFjZSBhcHBlbmRlZCB0byBjb21tYW5kIG5hbWVzCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lc3BhY2UgLSBOYW1lIG9mIHRoZSBuYW1lc3BhY2UKCiAgICAgICAgICBTV0lHIGxpYnJhcnkgd3JpdGVycyBjYW4gdXNlIHRoZXNlIHRvIHRoZWlyIGFkdmFudGFnZXMuCgoxLzIvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFRjbDggbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBwb2ludGVyIGNvbnN0YW50cyAodGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciB3YXMgbWlzc2luZyBmcm9tCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlKS4KCjEvMi85OCAgOiBBZGRlZCB0aGUgY29uc3RoYXNoLmkgbGlicmFyeSBmaWxlIHRvIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEvMS85OCAgOiBDaGFuZ2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBQeXRob24gdHlwZW1hcHMuaSBmaWxlLiAgIFRoZSBmb2xsb3dpbmcKICAgICAgICAgIHNpZ25pZmljYW50IGNoYW5nZXMgd2VyZSBtYWRlIDoKCiAgICAgICAgICAgICAgICAxLiAgVGhlIE9VVFBVVCB0eXBlbWFwIG5vdyByZXR1cm5zIFB5dGhvbiB0dXBsZXMgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICAgIGxpc3RzLiAgIExpc3RzIGNhbiBiZSByZXR1cm5lZCBhcyBiZWZvcmUgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgTF9PVVRQVVQgdHlwZS4gICAgSWYgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgaXMgbmVlZGVkLCBydW4gU1dJRyB3aXRoIHRoZSAtRE9VVFBVVF9MSVNUIG9wdGlvbi4KCiAgICAgICAgICAgICAgICAyLiAgVGhlIEJPVEggdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvIElOT1VULiAgRm9yIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoZSAiQk9USCIgbWV0aG9kIHN0aWxsIGV4aXN0cyBob3dldmVyLgoKICAgICAgICAgICAgICAgIDMuICBPdXRwdXQgdHlwZW1hcHMgbm93IGdlbmVyYXRlIGxlc3MgY29kZSB0aGFuIGJlZm9yZS4KCiAgICAgICAgICBDaGFuZ2VzIHRvIHR5cGVtYXBzLmkgbWF5IGJyZWFrIGV4aXN0aW5nIFB5dGhvbiBzY3JpcHRzIHRoYXQgYXNzdW1lCiAgICAgICAgICBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBsaXN0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8zMS85NzogRml4ZWQgbG9uZyBvdmVyZHVlIHByb2JsZW1zIHdpdGggdGhlIHRlc3Rpbmcgc2NyaXB0cyBhbmQgY2VydGFpbgogICAgICAgICAgbWFrZWZpbGVzIHRoYXQgcmVxdWlyZWQgdGhlIHVzZSBvZiB0aGUgYmFzaCBzaGVsbC4gICBFdmVyeXRoaW5nIHNob3VsZAogICAgICAgICAgd29yayBwcm9wZXJseSB3aXRoIHRoZSBzdGFuZGFyZCBCb3VybmUgc2hlbGwgKHNoKSBub3cuCgoxMi8zMS85NzogTW9kaWZpZWQgdHlwZW1hcHMgdG8gYWxsb3cgJGJhc2V0eXBlIGFzIGEgdmFsaWQgbG9jYWwgdmFyaWFibGUuCiAgICAgICAgICBUaGlzIGFsbG93cyBmb3IgYWxsIHNvcnRzIG9mIGJpemFycmUgaGFja2lzaCB0eXBlbWFwcyB0aGF0CiAgICAgICAgICBkbyBjb29sIHRoaW5ncy4gICBQYXRjaCBjb250cmlidXRlZCBieSBEb21pbmlxdWUgRHVtb250LgoKMTIvMzEvOTc6IFN3aXRjaGVkIGFjY2Vzc29yIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIG1lbWJlciBkYXRhIHRvCiAgICAgICAgICBDIHByZXByb2Nlc3NvciBtYWNyb3MgKGV4Y2VwdCBpbiBjYXNlcyBpbnZvbHZpbmcgdHlwZW1hcHMKICAgICAgICAgIG9yIGNoYXIgKikuCgoxMi8zMS85NzogRml4ZWQgYSBidWcgcmVsYXRlZCB0byBDKysgbWVtYmVyIGRhdGEgaW52b2x2aW5nIHJlZmVyZW5jZXMuCgoxMi8zMS85NzogQ2hhbmdlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHRvCiAgICAgICAgICBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgIFRoaXMgY2xlYW5zIHVwIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGFuZCByZXN1bHRzIGluIGZld2VyIGZ1bmN0aW9uIGRlZmluaXRpb25zLgoKMTIvMzEvOTc6IENoYW5nZWQgdGhlIGRlZmF1bHQgQyBjb25zdHJ1Y3RvciB0byB1c2UgY2FsbG9jKCkgaW5zdGVhZAogICAgICAgICAgb2YgbWFsbG9jKCkKCjEyLzMwLzk3OiBDaGFuZ2VkIHRoZSBjcmVhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFBlcmw1IG1vZHVsZS4KICAgICAgICAgIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGV5IHNob3VsZCB3b3JrIGluIGV4YWN0bHkgdGhlCiAgICAgICAgICBzYW1lIHdheSBhcyBiZWZvcmUgZXhjZXB0IHRoYXQgdGhleSBub3cgcmVxdWlyZSBtdWNoIGxlc3MKICAgICAgICAgIHdyYXBwZXIgY29kZS4gICBNb2R1bGVzIGNvbnRhaW5pbmcgbGFyZ2UgbnVtYmVycyBvZgogICAgICAgICAgY29uc3RhbnRzIG1heSBzZWUgZ3JlYXRlciB0aGFuIGEgNTAlIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUuCgoxMi8zMC85NzogTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gYmUgbW9yZSBpbnRlbGxpZ2VudCBhYm91dCB0aGUKICAgICAgICAgIGNyZWF0aW9uIG9mIGNvbnN0YW50cy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyByZWR1bmRhbnQKICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24KICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSByZWR1Y2VkLiAgIChNYW55IHRoYW5rcyB0byBKaW0gRnVsdG9uKS4KCjEyLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiBDKysgY29kZSBnZW5lcmF0aW9uIHJlbGF0ZWQgdG8gbWVtYmVyIGZ1bmN0aW9ucywKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLCBhbmQgcmVmZXJlbmNlcy4KCjEyLzI5Lzk3OiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBhIGZldyBtYWtlZmlsZXMgdG8gc3VwcG9ydCBQeXRob24gMS41CgoxMi8yOS85NzogQWRkZWQgJ2VtYmVkMTUuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBmaWxlIHNob3VsZCBiZSB1c2VkIHRvCiAgICAgICAgICBzdGF0aWNseSBsaW5rIHZlcnNpb25zIG9mIFB5dGhvbiAxLjUuICAgIFRvIG1ha2UgaXQgdGhlIGRlZmF1bHQsCiAgICAgICAgICBzaW1wbHkgY29weSAnc3dpZ19saWIvcHl0aG9uL2VtYmVkMTUuaScgdG8gJ3N3aWdfbGliL3B5dGhvbi9lbWJlZC5pJwoKVmVyc2lvbiAxLjEgUGF0Y2ggMyAoTm92ZW1iZXIgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHdpdGggc2hhZG93IGNsYXNzZXMgYW5kCiAgICAgICAgICBzdGF0aWMgY2xhc3MgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGNsYXNzIGluc3RhbmNlcy4KICAgICAgICAgIE5vdGUgOiBUaGUgZml4IGZvciB0aGlzIGJ1ZyByZXF1aXJlcyBhIHNsaWdodCByZXN0cnVjdHVyaW5nIG9mCiAgICAgICAgICBvZiB0aGUgLnBtIGZpbGVzIGNyZWF0ZWQgYnkgU1dJRy4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsL1RjbDggbW9kdWxlcyByZWxhdGVkIHRvIHZhcmlhYmxlIGxpbmtpbmcKICAgICAgICAgIG9mIGNoYXJhY3RlciBhcnJheXMuICBJZiB5b3UgZGVjbGFyZWQgYSBnbG9iYWwgdmFyaWFibGUgJ2NoYXIgZm9vWzEwXScsCiAgICAgICAgICB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSB3b3VsZCBlaXRoZXIgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQKICAgICAgICAgIGltbWVkaWF0ZWx5IHVwb24gbG9hZGluZyBvciB3ZWlyZCBtZW1vcnkgY29ycnVwdGlvbiBlbHNld2hlcmUuCiAgICAgICAgICBUaGlzIHNob3VsZCBub3cgYmUgZml4ZWQgYWx0aG91Z2ggY2hhcmFjdGVyIGFycmF5cyBjYW4gb25seSBiZQogICAgICAgICAgcmVhZC1vbmx5LgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIHRoYXQgY2F1c2VkIGl0IHRvCiAgICAgICAgICBmYWlsIGlmIGZpbGVzIHdlcmUgaW1wb3J0ZWQgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuCiAgICAgICAgICB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KCjExLzIzLzk3OiBGaXhlZCBpbmNvcnJlY3QgZGlhZ25vc3RpYyBtZXNzYWdlIGluIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uCiAgICAgICAgICBtb2R1bGUuCgoxMS8yMy85NzogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2YgdGhlIC1vIG9wdGlvbiB3aGVuIHVzZWQgd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuIElmIC1vIHdhcyB1c2VkIHRvIHNwZWNpZnkgYm90aCB0aGUgcGF0aG5hbWUgYW5kIGZpbGVuYW1lCiAgICAgICAgICBvZiBTV0lHJ3Mgb3V0cHV0IHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgc3dpZyAtbyAvaG9tZS9zd2lnL3dyYXBwZXIuYyAtc2hhZG93IC1wZXJsNSBmb28uaQoKICAgICAgICAgIFRoZSB3cmFwcGVyIGNvZGUgd291bGQgYmUgcGxhY2VkIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIC1vLAogICAgICAgICAgYnV0IHRoZSAucG0gZmlsZSBhbmQgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBwbGFjZWQgaW4gdGhlCiAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgU1dJRyB3YXMgcnVuLiAgIE5vdywgdGhlc2UgZmlsZXMgYXJlIHBsYWNlZAogICAgICAgICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZSAtbyBvcHRpb24uCiAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBhbHNvIG5lZWRlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbiBvbiB0aGUKICAgICAgICAgIE1hY2ludG9zaC4KCjExLzIzLzk3OiBBZGRlZCBhICd0aGlzKCknIG1ldGhvZCB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzIGNhbgogICAgICAgICAgYmUgdXNlZCB0byByZXR1cm4gdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlIGZyb20gYSBzaGFkb3cKICAgICAgICAgIGNsYXNzIHRoYXQgaXMgcmVwcmVzZW50ZWQgYXMgYSB0aWVkIGhhc2guICAgVG8gdXNlIGp1c3QKICAgICAgICAgIGludm9rZSBhcyBhIG1ldGhvZCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAkbCA9IG5ldyBMaXN0OyAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAkcHRyID0gJGwtPnRoaXMoKTsgICAjIEdldCB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbCA4IHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUgKHdoaWNoIHdhcyBjb21wbGV0ZWx5CiAgICAgICAgICBicm9rZW4gaW4gMS4xcDIpLgoKMTEvMjMvOTc6IE1vZGlmaWVkIHRoZSBQZXJsNSB0eXBlLWNoZWNrZXIgdG8gZml4IGEgZmV3IHByb2JsZW1zCiAgICAgICAgICB3aXRoIGdsb2JhbCB2YXJpYWJsZXMgb2YgcG9pbnRlciB0eXBlcyBhbmQgdG8gYWxsb3cKICAgICAgICAgIHRpZWQgaGFzaGVzIHRvIGJlIHVzZWQgaW50ZXJjaGFuZ2FibHkgd2l0aCBub3JtYWwKICAgICAgICAgIHBvaW50ZXIgdmFsdWVzLgoKMTEvMjMvOTc6IE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1lY2hhbmlzbSB0byBhbGxvdyBvdXRwdXQKICAgICAgICAgIHR5cGVtYXBzIG9mIHR5cGUgJ3ZvaWQnLiAgIFRoZXNlIHdlcmUgaWdub3JlZCBwcmV2aW91c2x5LAogICAgICAgICAgYnV0IG5vdyBpZiB5b3Ugc3BlY2lmeSwKCiAgICAgICAgICAgICAgICAldHlwZW1hcChsYW5nLG91dCkgdm9pZCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdm9pZCAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBZb3UgY2FuIGNoYW5nZSBvciBhc3NpZ24gYSByZXR1cm4gdmFsdWUgdG8gdGhlIGZ1bmN0aW9uLgoKMTEvMjMvOTc6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJ2Jvb2wnIGRhdGF0eXBlcyBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjExLzIzLzk3OiBGaXhlZCBtaW5vciBwYXJzaW5nIGVycm9yIHdpdGggQysrIGluaXRpYWxpemVycy4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsOCBtb2R1bGUgc28gdGhhdCBDIGZ1bmN0aW9ucyB0aGF0IGNhbGwgYmFjayBpbnRvCiAgICAgICAgICBUY2wgZG9uJ3QgY29ycnVwdCB0aGUgcmV0dXJuIHJlc3VsdCBvYmplY3QgKFNXSUcgd2FzIGdhdGhlcmluZwogICAgICAgICAgdGhlIHJlc3VsdCBvYmplY3QgdG9vIGVhcmx5IHdoaWNoIGxlYWRzIHRvIHByb2JsZW1zIGlmIHN1YnNlcXVlbnQKICAgICAgICAgIFRjbCBjYWxscyBhcmUgbWFkZSkuCgoxMS8yMy85NzogRml4ZWQgYSBjb2RlIGdlbmVyYXRpb24gYnVnIGluIHRoZSBQeXRob24gbW9kdWxlIHdoZW4gdHdvIG9yCiAgICAgICAgICBtb3JlIG91dHB1dCBwYXJhbWV0ZXJzIHdlcmUgdXNlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnRzIG9mIGEKICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlaW5jbHVkZSB0eXBlbWFwcy5pCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICpPVVRQVVQsIGRvdWJsZSAqT1VUUFVULCBkb3VibGUgYSk7CgogICAgICAgICAgUHJldmlvdXNseSwgZG9pbmcgdGhpcyByZXN1bHRlZCBpbiB0aGUgY3JlYXRpb24gb2YgYW4KICAgICAgICAgIGV4dHJhbmVvdXMgY29tbWEgaW4gdGhlIG91dHB1dCwgcmVzdWx0aW5nIGluIGEgQyBzeW50YXggZXJyb3IuCgoxMS8yMi85NzogRml4ZWQgYSBidWcgd2hlbiB0ZW1wbGF0ZSBoYW5kbGluZyB0aGF0IHdhcyBzdHJpcHBpbmcgd2hpdGVzcGFjZQogICAgICAgICAgYXJvdW5kIG5lc3RlZCB0ZW1wbGF0ZXMuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBGb288QmFyPGRvdWJsZT4gPgoKICAgICAgICAgIHdhcyBnZXR0aW5nIG11bmdlZCBpbnRvIEZvbzxCYXI+PiB3aGljaCBpcyBhIHN5bnRheCBlcnJvciBpbgogICAgICAgICAgaW4gdGhlIEMrKyBjb21waWxlci4KCjExLzIyLzk3OiBGaXhlZCBidWdzIGluIHRoZSBCb3JsYW5kIEMrKyBtYWtlZmlsZXMuCgoxMS8yMi85NzogRml4ZWQgbWVtb3J5IGNvcnJ1cHRpb24gYnVnIHdoZW4gcHJvY2Vzc2luZyBpbnRlZ2VyCiAgICAgICAgICBhcmd1bWVudHMgaW4gVGNsOCBtb2R1bGUuCgoxMS8yMS85NzogRml4ZWQgYSBidWcgaW4gdGhlIFJ1bnRpbWUvTWFrZWZpbGUgcmVsYXRlZCB0byBUY2wgOC4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgUGVybDUgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICBObyBsb25nZXIgZ2VuZXJhdGVzIGEgcGVybCBzeW50YXggZXJyb3IuCgoxMS85Lzk3IDogQ2hhbmdlZCBhIHN0cm5jcHkoKSB0byBzdHJjcHkoKSBpbiB0aGUgcG9pbnRlciB0eXBlLWNoZWNrZXIuCiAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYSBzdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpbgogICAgICAgICAgdHlwZS1jaGVja2luZy4KCjEwLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzIGFuZAogICAgICAgICAgdXNlci1kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhWZWN0b3IgYSwgVmVjdG9yIGIgPSBkKTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmsgcHJvcGVybHkuCgpWZXJzaW9uIDEuMSBQYXRjaCAyIChTZXB0ZW1iZXIgNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzQvOTcgIDogRml4ZWQgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIG9mIHZpcnR1YWwgZnVuY3Rpb25zIHRoYXQKICAgICAgICAgIHdhcyBpbnRyb2R1Y2VkIGJ5IHNvbWUgY2hhbmdlcyBpbiB0aGUgQysrIG1vZHVsZS4KClZlcnNpb24gMS4xIFBhdGNoIDEgKEF1Z3VzdCAyNywgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOC8yNi85NyA6IEZpeGVkIGNvbXBpbGF0aW9uIGFuZCBydW4tdGltZSBidWdzIHdpdGggVGNsIDguMCBmaW5hbC4KCjgvMjEvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggYXJyYXlzIGFwcGVhcmluZyBhcyBhcmd1bWVudHMKICAgICAgICAgIHRvIEMrKyBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIEJhcihpbnQgYVsyMF1bMjBdKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgVGhlcmUgaXMgc3RpbGwgYSBidWcgdXNpbmcgYXJyYXlzIHdpdGggYWRkZWQgbWV0aG9kcwogICAgICAgICAgaG93ZXZlci4KCjgvMjAvOTcgOiBGaXhlZCBhIGJ1ZyB3aXRoIGdlbmVyYXRpbmcgdGhlIGNvZGUgZm9yIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKOC8xOS85NyA6IE1vZGlmaWVkIHRoZSB0eXBlbWFwcGVyIHRvIHN1YnN0aXR1dGUgdGhlICckYXJnJyB2YWx1ZQogICAgICAgICAgd2hlbiBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzLiAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKiAoZG91YmxlIHRlbXBfJGFyZykgewogICAgICAgICAgICAgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gYXBwbGllZCB0byBhIHJlYWwgZnVuY3Rpb24gc3VjaCBhcyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICphLCBkb3VibGUgKmIsIGRvdWJsZSAqcmVzdWx0KTsKCiAgICAgICAgICB0aHJlZSBsb2NhbCB2YXJpYWJsZXMgd2lsbCBiZSBjcmVhdGVkIGFzIGZvbGxvd3MgOgoKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9hOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2I7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfcmVzdWx0OwoKICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB3cml0aW5nIG11bHRpcGxlIHR5cGVtYXBzIHRoYXQgbmVlZAogICAgICAgICAgdG8gYWNjZXNzIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcy4KCgo3LzI3Lzk3IDogRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHdpdGggdGhlICVhcHBseSBkaXJlY3RpdmUgYW5kIGFycmF5cy4KICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGVjbGFyYXRpb25zIHNob3VsZCBub3cgd29yayA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIFtBTlldIHsgUmVhbCBbQU5ZXSB9OwogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIFs0XSB7IGRvdWJsZSBbMTBdIH07CgogICAgICAgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgYXBwbHkgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgeyBSZWFsIH07CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrLS1ldmVuIGlmIGFycmF5cyBpbnZvbHZpbmcgZG91YmxlcyBhbmQgUmVhbHMgYXJlCiAgICAgICAgICB1c2VkIGxhdGVyLgoKNy8yNy85NyA6IENoYW5nZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICJBcnJheSBYIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBZIiB0bwogICAgICAgICAgb25seSBhcHBlYXIgaWYgcnVubmluZyBTV0lHIGluIHZlcmJvc2UgbW9kZS4KCjcvMjcvOTcgOiBBZGRlZCB0aGUgdmFyaWFibGVzICRwYXJtbmFtZSBhbmQgJGJhc2VtYW5nbGUgdG8gdGhlIHR5cGVtYXAKICAgICAgICAgIGdlbmVyYXRvci4gICAgJHBhcm1uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZAogICAgICAgICAgd2hlbiB0aGUgdHlwZW1hcCB3YXMgbWF0Y2hlZC4gIEl0IG1heSBiZSAiIiBpZiBubyBwYXJhbWV0ZXIKICAgICAgICAgIHdhcyB1c2VkLiAgICRiYXNlbWFuZ2xlIGlzIGEgbWFuZ2xlZCB2ZXJzaW9uIG9mIHRoZSBiYXNlCiAgICAgICAgICBkYXRhdHlwZS4gICAgU29tZXRpbWVzIHVzZWQgZm9yIGFycmF5IGhhbmRsaW5nLgoKNy8yNy85NyA6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIG91dHB1dCBhcmd1bWVudHMgd2l0aCBQeXRob24gc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICBPcmlnaW5hbGx5LCBpZiBhIGZ1bmN0aW9uIHJldHVybmVkIGFuIG9iamVjdCAnRm9vJywgdGhlIHNoYWRvdyBjbGFzcwogICAgICAgICAgbWVjaGFuaXNtIHdvdWxkIGNyZWF0ZSBjb2RlIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgZGVmIHJldHVybl9mb28oKToKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZvb1B0cihzaGFkb3djLnJldHVybl9mb28oKSkKICAgICAgICAgICAgICAgICAgICAgIHZhbC50aGlzID0gMQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHR5cGVtYXBzIGFsbG93IGEgdXNlciB0byByZWRlZmluZQogICAgICAgICAgdGhlIG91dHB1dCBiZWhhdmlvciBvZiBhIGZ1bmN0aW9uLS1hcyBhIHJlc3VsdCwgd2UgY2FuIG5vIGxvbmdlcgogICAgICAgICAgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHJldHVybiB0eXBlIGJlaW5nIGEgcG9pbnRlciBvcgogICAgICAgICAgZXZlbiBiZWluZyBhIHNpbmdsZSB2YWx1ZSBmb3IgdGhhdCBtYXR0ZXIgKGl0IGNvdWxkIGJlIGEgbGlzdCwKICAgICAgICAgIHR1cGxlLCBldGMuLi4pLiAgIElmIFNXSUcgZGV0ZWN0cyB0aGUgdXNlIG9mIG91dHB1dCB0eXBlbWFwcwogICAgICAgICAgKGVpdGhlciAib3V0IiBvciAiYXJnb3V0IikgaXQgcmV0dXJucyB0aGUgcmVzdWx0IHVubW9kaWZpZWQgbGlrZQogICAgICAgICAgdGhpcyA6CgogICAgICAgICAgICAgICAgZGVmIHJldHVybl9mb28oKToKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNoYWRvd2MucmV0dXJuX2ZvbygpCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KICAgICAgICAgIHdpdGggdGhlIHJldHVybiB2YWx1ZSAoaW5jbHVkaW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBjb252ZXJ0aW5nIGl0CiAgICAgICAgICBpbnRvIGEgUHl0aG9uIGNsYXNzKS4KCjcvMjYvOTcgOiBGaXhlZCBhIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGVzIGxpa2UgJ3Vuc2lnbmVkIGxvbmcgaW50JywKICAgICAgICAgICd1bnNpZ25lZCBzaG9ydCBpbnQnLCBldGMuLi4KCjcvMjQvOTcgOiBNaW5vciBidWcgZml4IHRvIFRjbCA4IG1vZHVsZSB0byBwYXJzZSBlbnVtcyBwcm9wZXJseS4gIEFsc28KICAgICAgICAgIGZpeGVkIGEgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSBpbiB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKHBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEhlbnJ5IFJvd2xleS4KCjcvMjQvOTcgOiBBZGRlZCBQeXRob24tdHVwbGUgdHlwZW1hcHMgY29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjcvMjQvOTcgOiBJbmNvcnBvcmF0ZWQgc29tZSBjaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlIGluIHN1cHBvcnQgb2YKICAgICAgICAgIE1hcmsgSGFtbW9uZCdzIENPTSBzdXBwb3J0LiAgSSdtIG5vdCBlbnRpcmVseSBzdXJlIHRoZXkKICAgICAgICAgIHdvcmsgeWV0IGhvd2V2ZXIuICBOZWVkcyBkb2N1bWVudGF0aW9uIGFuZCB0ZXN0aW5nLgoKNy8yNC85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHdoZW4gc3RydWN0dXJlcyBoYWQgYXJyYXkgbWVtYmVycwogICAgICAgICAgYW5kIHR5cGVtYXBzIHdlcmUgdXNlZC4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAobWVtYmVyaW4pIGRvdWJsZSBbMjBdWzIwXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGEgZG91YmxlIFsyMF1bMjBdIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFbMjBdWzIwXTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgT3JpZ2luYWxseSwgdGhpcyB3b3VsZCBnZW5lcmF0ZSBhIGNvbXBpbGVyLXR5cGUgZXJyb3Igd2hlbgogICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3YXMgY29tcGlsZWQuICAgTm93LCBhIGhlbHBlciBmdW5jdGlvbiBsaWtlCiAgICAgICAgICB0aGlzIGlzIGdlbmVyYXRlZCA6CgogICAgICAgICAgICAgICAgZG91YmxlICpGb29fYV9zZXQoRm9vICphLCBkb3VibGUgdmFsWzIwXVsyMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBtZW1iZXJpbiB0eXBlbWFwIGhlcmUgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSAqKSB2YWw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBvbmUgY2FuIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgdmFyaWFibGUKICAgICAgICAgIGlzIGFuIGFycmF5IG9mIHRoZSAqc2FtZSogdHlwZSBhcyB0aGUgc3RydWN0dXJlIG1lbWJlci4gVGhpcwogICAgICAgICAgbWF5IGJyZWFrIHNvbWUgY29kZXMgdGhhdCBtYW5hZ2VkIHRvIHdvcmsgYXJvdW5kIHRoZSBhcnJheSBidWcuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMTMvOTcgOiBGaXhlZCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4gdXNpbmcgQyBnbG9iYWwgdmFyaWFibGVzIHRoYXQKICAgICAgICAgIGFyZSBwb2ludGVycy4gIFdoZW4gdXNlZCBpbiBmdW5jdGlvbiBjYWxscyBhbmQgb3RoZXIgb3BlcmF0aW9ucywKICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciB3b3VsZCBiZSBpbnZhbGlkLS0tY2F1c2luZyBjb3JlCiAgICAgICAgICBkdW1wcyBhbmQgb3RoZXIgcHJvYmxlbXMuICBTV0lHIGltcGxlbWVudHMgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgdXNpbmcgUGVybCBtYWdpYyB2YXJpYWJsZXMuICBBcyBpdCB0dXJucyBvdXQsIHRoZSBlcnJvcgogICAgICAgICAgd2FzIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBwb2ludGVyLWV4dHJhY3Rpb24gY29kZQogICAgICAgICAgd2FzIHNvbWVob3cgYnlwYXNzaW5nIHRoZSBwcm9jZWR1cmUgdXNlZCB0byByZXNvbHZlIG1hZ2ljYWwKICAgICAgICAgIHZhcmlhYmxlcyAoaGVuY2UsIGxlYXZpbmcgdGhlIHZhbHVlIHVuZGVmaW5lZCkuICBUbyBmaXgKICAgICAgICAgIHRoZSBwcm9ibGVtLCBTV0lHIG5vdyBleHBsaWNpdGx5IHJlc29sdmVzIG1hZ2ljIGJlZm9yZQogICAgICAgICAgZXh0cmFjdGluZyBwb2ludGVyIHZhbHVlcy4KCjcvMTIvOTcgOiBFbGltaW5hdGVkIHRoZSBsYXN0IHJlbW5hbnRzIG9mIGZyZWUoKSBhbmQgbWFsbG9jKCkgZnJvbQogICAgICAgICAgdGhlIFNXSUcgY29tcGlsZXIuCgo3LzEyLzk3IDogRml4ZWQgcGFyc2luZyBwcm9ibGVtcyB3aXRoIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMgYW5kCiAgICAgICAgICB0ZW1wb3JhcnkgdmFyaWFibGVzIG9mIGFycmF5cy4gICAgQWxzbyBtYWRlIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgU1dJRyB0byBoYW5kbGUgdHlwZW1hcHMgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXSAoZG91YmxlIHRlbXBbJGRpbTBdKSB7CgkJICAgICAgLi4uIHN0b3JlIGRhdGEgaW4gdGVtcFskZGltMF0gLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdCBvbmx5IGRvZXMgdGhpcyB0eXBlbWFwIG1hdGNoIGFueSBkb3VibGUgW10gYXJyYXksIGl0CiAgICAgICAgICBjcmVhdGVzIGEgbG9jYWwgdmFyaWFibGUgd2l0aCBwcmVjaXNlbHkgdGhlIHJpZ2h0IGRpbWVuc2lvbnMuCiAgICAgICAgICAoaWUuICRkaW0wIGdldHMgZmlsbGVkIGluIHdpdGggdGhlIHJlYWwgbnVtYmVyIG9mIGRpbWVuc2lvbnMpLgogICAgICAgICAgT2YgY291cnNlLCBvZmYgdGhlIHJlY29yZCwgdGhpcyB3aWxsIGJlIGEgd2F5IHRvIGFkZCBtb3JlCiAgICAgICAgICBmdW5jdGlvbmFsaXR5IHRvIHRoZSB0eXBlbWFwcy5pIGxpYnJhcmllcy4KCjcvOS85NyAgOiBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggUGVybDUsIHN0YXRpYyBsaW5raW5nLCBhbmQgc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgV2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcyB0b2dldGhlciwgd3JpdGUKICAgICAgICAgIGEgdG9wLWxldmVsIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyB3aGVuIHNoYWRvdyBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgIHVzZWQgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvbywgYmFyLCBnbG9iOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIHNoYWRvdyBjbGFzc2VzIGFyZSB1c2VkLCB0aGUgbW9kdWxlIG5hbWVzIGhhdmUgYW4gZXh0cmEgJ2MnCiAgICAgICAgICBhcHBlbmRlZCBzbyBpdCBzaG91bGQgcmVhZCBhcyA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vYywgYmFyYywgZ2xvYmM7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzLCBjb25zaWRlciB1c2luZyB0aGUgU1dJRyBydW50aW1lCiAgICAgICAgICBsaWJyYXJ5LgoKNy84Lzk3ICA6IEluY29ycG9yYXRlZCBmaXhlZCB2ZXJzaW9ucyBvZiB0aGUgQm9ybGFuZCBDKysgTWFrZWZpbGVzLgoKNy84Lzk3ICA6IEZpcnN0IGN1dCBhdCB0cnlpbmcgdG8gZWxpbWluYXRlIGV4Y2Vzc2l2ZSBjb21waWxlciB3YXJuaW5ncy4KICAgICAgICAgIEFzIGl0IHR1cm5zIG91dCwgYWxvdCBvZiB3YXJuaW5ncyBnbyBhd2F5IGlmIHlvdSBqdXN0IG1ha2UKICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgIGNsaWVudERhdGEgPSBjbGllbnREYXRhOwoKICAgICAgICAgIGluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLiAgTW9zdCBjb21waWxlcnMgc2hvdWxkIGp1c3QKICAgICAgICAgIGlnbm9yZSB0aGlzIGNvZGUgKGF0IGxlYXN0IHdvdWxkIGNhbiBob3BlKS4KCjcvOC85NyAgOiBGaXhlZCBiaXphcnJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCB0eXBlbWFwcyBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0eXBlbWFwcyBjb250YWluaW5nIHByaW50ZiBmb3JtYXR0aW5nIHN0cmluZ3Mgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAobWVtYmVyb3V0KSBpbnQgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIiw0Mik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBnZW5lcmF0ZSBjb21wbGV0ZWx5IGJvZ3VzIGNvZGUgd2l0aCBnYXJiYWdlIHJlcGxhY2luZwogICAgICAgICAgdGhlICclZCcuICAgQ2F1c2VkIGJ5IG9uZSBmYXVsdHkgdXNlIG9mIHByaW50ZiAod2Fzbid0IGFibGUgdG8gZmluZAogICAgICAgICAgYW55IG90aGVyIG9jY3VyZW5jZXMpLgoKNy83Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2l0aCBub24tbWVtYmVyCiAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgcmV0dXJuaW5nIG1vcmUgdGhhbiBvbmUgdmFsdWUuCgo3LzcvOTcgIDogSW5jb3Jwb3JhdGVkIG1vZGlmaWNhdGlvbnMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBHdWlsZSAxLjIuCiAgICAgICAgICBTdGlsbCBuZWVkIHRvIHRlc3QgaXQgb3V0LCBidXQgaXQgaXMgcnVtb3JlZCB0byB3b3JrLgoKNy8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIG91dHB1dCBhcmd1bWVudHMgYW5kIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICAgIElmIGFuIG91dHB1dCBhcmd1bWVudCBpcyBkZXRlY3RlZCwgU1dJRyBhc3N1bWVzCiAgICAgICAgICB0aGF0IHRoZSByZXN1bHQgaXMgYSBsaXN0IGFuZCBoYW5kbGVzIGl0IGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICBJZiB0aGUgbm9ybWFsIHJldHVybiB0eXBlIG9mIGFuIGZ1bmN0aW9uIGlzIGFuIG9iamVjdCwKICAgICAgICAgIGl0IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBzaGFkb3cgY2xhc3MgYXMgYmVmb3JlLCBidXQKICAgICAgICAgIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhCiAgICAgICAgICBsaXN0LiAgKioqIE5PVEUgOiBUaGlzIGJlaGF2aW9yIGhhcyBiZWVuIHN1YnNlcXVlbnRseSBjaGFuZ2VkICoqKgoKNi8yOS85NyA6IENoYW5nZWQgRVhQT1JUIHRvIFNXSUdFWFBPUlQgaW4gYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgU2hvdWxkIHByb3ZpZGUgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLgoKNi8yOS85NyA6IE1vZGlmaWVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyBzbyB0aGF0IG91dHB1dCBhcmd1bWVudHMKICAgICAgICAgIHdvcmsgY29ycmVjdGx5ICh3aGVuIHR5cGVtYXBzIGFyZSB1c2VkKS4KClZlcnNpb24gMS4xIChKdW5lIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMjQvOTcgOiBGaXhlZCBPYmplY3RpdmUtQyBjb25zdHJ1Y3RvciBidWcgd2hlbiB3b3JraW5nIHdpdGggUGVybDUKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLgoKNi8yMy85NyA6IEZpeGVkIHNvbWUgcGFyc2luZyBwcm9ibGVtcyB3aXRoIE9iamVjdGl2ZS1DLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgbm93IDoKCiAgICAgICAgICAgICAgIC0gZm9vIDogKGludCkgYSB3aXRoOiAoaW50KSBiOwoKNi8yMi85NyA6IEFkZGVkIFNXSUcgUnVudGltZSBsaWJyYXJ5LiAgIFRoaXMgbGlicmFyeSBjb250YWlucwogICAgICAgICAgdGhlIFNXSUcgcG9pbnRlciB0eXBlLWNoZWNrZXIgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCiAgICAgICAgICB0aGF0IGFyZSBub3JtYWxseSBpbmNsdWRlZCBpbiBldmVyeSBtb2R1bGUuICBCeSB1c2luZwogICAgICAgICAgdGhlIGxpYnJhcnksIGl0IGlzIGVhc2llciB0byB3b3JrIHdpdGggbXVsdGlwbGUgU1dJRwogICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgbWlub3IgYnVnIGluIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvZiBtdWx0aXBsZSBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gV2hlbiB1c2VkIHdpdGgKICAgICAgICAgIFBlcmw1IHNoYWRvdyBjbGFzc2VzLCB0aGlzIGdlbmVyYXRlcyBhICdyZXF1aXJlJyBzdGF0ZW1lbnQKICAgICAgICAgIHRvIGxvYWQgaW4gZXh0ZXJuYWwgbW9kdWxlcy4KCjYvMjIvOTcgOiBBZGRlZCAtc3dpZ2xpYiBvcHRpb24uICBUaGlzIHByaW50cyBvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5IGFuZCBleGl0cy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCB0bwogICAgICAgICAgY29uZmlndXJhdGlvbiB0b29scyB0aGF0IGFyZSBsb29raW5nIGZvciBTV0lHIGFuZCBpdHMgbGlicmFyeQogICAgICAgICAgbG9jYXRpb24gKGUuZy4gYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLi4uKS4KCjYvMjEvOTcgOiBGaXhlZCBleHBvcnQgYnVnIHdpdGggUGVybDUuMDA0IG9uIFdpbmRvd3MtTlQuCgo2LzIwLzk3IDogTWlub3IgY2hhbmdlIHRvIGNvZGUgZ2VuZXJhdGlvbiBvZiBjbGFzcy9zdHJ1Y3R1cmUgbWVtYmVycyBpbgogICAgICAgICAgb3JkZXIgdG8gd29yayBiZXR0ZXIgd2l0aCB0eXBlbWFwcy4gU2hvdWxkIGhhdmUgbm8gbm90aWNhYmxlCiAgICAgICAgICBpbXBhY3Qgb24gZXhpc3RpbmcgU1dJRyBtb2R1bGVzLgoKNi8xOS85NyA6IEFkZGVkIC10IG9wdGlvbi4gVGhpcyBhbGxvd3MgU1dJRyB0byBsb2FkIGEgdHlwZW1hcCBmaWxlIGJlZm9yZQogICAgICAgICAgcHJvY2Vzc2luZyBhbnkgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBzd2lnIC10IHR5cGVtYXBzLmkgLXB5dGhvbiBleGFtcGxlLmkKCiAgICAgICAgICBBdCBtb3N0LCBvbmx5IG9uZSB0eXBlbWFwIGZpbGUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIG1hbm5lci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTgvOTcgOiBOZWVkIGEgTWFrZWZpbGUgZmFzdD8gVHlwZQoKICAgICAgICAgICAgICAgICBzd2lnIFstdGNsLCAtcGVybDUsIC1weXRob25dIC1jbyBNYWtlZmlsZQoKICAgICAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgYSBNYWtlZmlsZSBzcGVjaWZpYyB0byB0aGF0IHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgIFlvdSBqdXN0IG5lZWQgdG8gbW9kaWZ5IGl0IGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZCB5b3UncmUKICAgICAgICAgIHJlYWR5IHRvIHJ1bi4KCjYvMTgvOTcgOiBDb21wbGV0ZWQgdGhlIC1jaSBvcHRpb24uICBUaGlzIG9wdGlvbiBjaGVja3MgYSBmaWxlIGludG8gdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkuICAgSXQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhCiAgICAgICAgICBsYW5ndWFnZSBvcHRpb24uIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRjbCAtY2kgZm9vYmFyLmkKCiAgICAgICAgICBDaGVja3MgdGhlIGZpbGUgZm9vYmFyLmkgaW50byB0aGUgVGNsIHBhcnQgb2YgdGhlIGxpYnJhcnkuCiAgICAgICAgICBJbiBvcmRlciB0byBjaGVjayBhIGZpbGUgaW50byB0aGUgZ2VuZXJhbCBsaWJyYXJ5IChhY2Nlc3NpYmxlCiAgICAgICAgICB0byBhbGwgbGFuZ3VhZ2VzIG1vZHVsZXMpLCBkbyB0aGUgZm9sbG93aW5nCgogICAgICAgICAgICAgICAgICBzd2lnIC1jaSAtbyAuLi9mb29iYXIuaSBmb29iYXIuaQoKICAgICAgICAgIChBZG1pdHRlZGx5IHRoaXMgbG9va3MgYSBsaXR0bGUgc3RyYW5nZSBidXQgaXMgdW5hdm9pZGFibGUpLgogICAgICAgICAgVGhlIGNoZWNrLWluIG9wdGlvbiBpcyBwcmltYXJpbHkgZGVzaWduZWQgZm9yIFNXSUcgbWFpbnRlbmFuY2UKICAgICAgICAgIGFuZCBsaWJyYXJ5IGRldmVsb3BtZW50LiBUaGUgY29tbWFuZCB3aWxsIGZhaWwgaWYgdGhlIHVzZXIgZG9lcwogICAgICAgICAgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUgU1dJRyBsaWJyYXJ5LiAgVGhpcmQgcGFydHkgbGlicmFyeQogICAgICAgICAgZXh0ZW5zaW9ucyBjYW4gZWFzaWx5IGluc3RhbGwgdGhlbXNlbHZlcyBieSBzaW1wbHkgcHJvdmlkaW5nCiAgICAgICAgICBhIHNoZWxsIHNjcmlwdCB0aGF0IHVzZXMgJ3N3aWcgLWNpJyB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgbGlicmFyeSBmaWxlcy4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8ga25vdyB3aGVyZSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICBpcyBsb2NhdGVkIGlmIHlvdSB1c2UgdGhpcyBtZWNoYW5pc20uCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE2Lzk3IDogRml4ZWQgYSBidWcgaW4gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2hlbiAlbmFtZSgpIHdhcyBhcHBsaWVkCiAgICAgICAgICB0byBhIGNsYXNzIGRlZmluaXRpb24uICAgVW5mb3J0dW5hdGVseSwgZml4aW5nIHRoZSBidWcgcmVxdWlyZWQKICAgICAgICAgIGEgY2hhbmdlIGluIHRoZSBMYW5ndWFnZSBDIEFQSSBieSBhZGRpbmcgYW4gZXh0cmEgYXJndW1lbnQgdG8KICAgICAgICAgIHRoZSBMYW5ndWFnZTo6Y3BwX2NsYXNzX2RlY2woKSBmdW5jdGlvbi4gIFRoaXMgbWF5IGJyZWFrCiAgICAgICAgICBTV0lHIEMrKyBleHRlbnNpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzE1Lzk3IDogQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAlbW9kdWxlIGRpcmVjdGl2ZSBvciAtbW9kdWxlIG9wdGlvbi4KCjYvMTUvOTcgOiBGaXhlZCBsaW5lIG51bWJlciBidWcgd2hlbiByZXBvcnRpbmcgZXJyb3JzIGZvciB1bmRlZmluZWQKICAgICAgICAgIGJhc2UgY2xhc3Nlcy4KCjYvMTUvOTcgOiBBZGRlZCBuZXcgJXJlbmFtZSBkaXJlY3RpdmUuICBUaGlzIGFsbG93cyB0aGUgZm9yd2FyZCBkZWNsYXJhdGlvbgogICAgICAgICAgb2YgYSByZW5hbWluZy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSBPbGROYW1lIE5ld05hbWU7CgogICAgICAgICAgICAgICAgIC4uLi4gbGF0ZXIgLi4uCiAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCiAgICAgICAgICBVbmxpa2UgJW5hbWUsICVyZW5hbWUgd2lsbCByZW5hbWUgYW55IG9jY3VyZW5jZSBvZiB0aGUgb2xkIG5hbWUuCiAgICAgICAgICBUaGlzIGFwcGxpZXMgdG8gZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGNsYXNzIG1lbWJlcnMgYW5kIHNvIGZvcnRoLgogICAgICAgICAgVGhlcmUgaXMgbm8gd2F5IHRvIGRpc2FibGUgJXJlbmFtZSBvbmNlIHNldCwgYnV0IHlvdSBjYW4gY2hhbmdlIHRoZQogICAgICAgICAgbmFtZSBieSByZWRlY2xhcmluZyBpdCB0byBzb21ldGhpbmcgZWxzZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTUvOTcgOiBJbXByb3ZlZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlICVuYW1lIGRpcmVjdGl2ZSBzbyB0aGF0IGl0CiAgICAgICAgICBjb3VsZCBiZSB1c2VkIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gOgoKICAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1dJRwogICAgICAgICAgICAgICAgICAgICVuYW1lKE5ld05hbWUpCiAgICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCjYvMTUvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBmdW5jdGlvbnMgd2l0aCBubyByZXR1cm4gZGF0YXR5cGUuICBJbiB0aGlzIGNhc2UsCiAgICAgICAgICBTV0lHIGFzc3VtZXMgYSByZXR1cm4gdHlwZSBvZiAnaW50Jy4KCjYvMTEvOTcgOiBJbXByb3ZlZCBlcnJvciByZXBvcnRpbmcgaW4gdGhlIHBhcnNlci4gIEl0IHNob3VsZCBiZSBhIGxpdHRsZQogICAgICAgICAgbGVzcyBzZW5zaXRpdmUgdG8gZXJyb3JzIHRoYXQgb2NjdXIgaW5zaWRlIGNsYXNzIGRlZmluaXRpb25zCiAgICAgICAgICBub3cuICBBbHNvIHJlcG9ydHMgZXJyb3JzIGZvciBmdW5jdGlvbiBwb2ludGVycy4KCjYvMTEvOTcgOiBNYWRlICckJyBhIGxlZ2FsIHN5bWJvbCBpbiBpZGVudGlmaWVycy4gIFRoaXMgaXMgdG8gc3VwcG9ydAogICAgICAgICAgc29tZSBPYmplY3RpdmUtQyBsaWJyYXJpZXMuICBTb21lIGNvbXBpbGVycyAoc3VjaCBhcyBnY2MpIG1heSBhbHNvCiAgICAgICAgICBhbGxvdyBpZGVudGlmaWVycyB0byBjb250YWluIGEgJCBpbiBDL0MrKyBjb2RlIGFzIHdlbGwgKHRoaXMgaXMKICAgICAgICAgIGFuIG9ic2N1cmUgZmVhdHVyZSBvZiBDKS4gV2hlbiAnJCcgYXBwZWFycyBpbiBpZGVudGlmaWVyLCBTV0lHCiAgICAgICAgICByZW1hcHMgaXQgdG8gdGhlIHN0cmluZyAnX1NfJyB3aGVuIGNyZWF0aW5nIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGZ1bmN0aW9uLiBUaHVzIGEgZnVuY3Rpb24gJ2ZvbyRiYXInIHdvdWxkIGJlIGNhbGxlZCAnZm9vX1NfYmFyJy4KCjYvMTEvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHdpdGggX19yZXByX18gbWV0aG9kLiAgSWYKICAgICAgICAgIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLCBpdCB3YXMgaWdub3JlZCwgYnV0IG5vdyBpdCBzaG91bGQgd29yay4KCjYvOS85NyAgOiBGaXhlZCB0aGUgVGNsIDguMCBtb2R1bGUgdG8gd29yayB3aXRoIFRjbCA4LjBiMS4gICBTV0lHIGlzIG5vCiAgICAgICAgICBsb25nZXIgY29tcGF0aWJsZSB3aXRoICphbnkqIGFscGhhIHJlbGVhc2Ugb2YgVGNsIDguMC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi83Lzk3ICA6IFB1dCBhIG1heGltYWwgZXJyb3IgY291bnQgaW4gKGN1cnJlbnRseSBzZXQgdG8gMjApLiBTV0lHIHdpbGwgYmFpbCBvdXQKICAgICAgICAgIGlmIGl0IGdlbmVyYXRlcyBtb3JlIGVycm9ycyB0aGFuIHRoaXMgKHVzZWZ1bCBmb3IgcHJldmVudGluZyBTV0lHCiAgICAgICAgICBmcm9tIHByaW50aW5nIDQwMDAgc3ludGF4IGVycm9ycyB3aGVuIGl0IGdldHMgY29uZnVzZWQpLgoKNi83Lzk3ICA6IEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHBhcnNpbmcgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KCjYvNy85NyAgOiBNaW5vciBjaGFuZ2UgdG8gUGVybDUgbW9kdWxlLiAgQysrIHN0YXRpYyBmdW5jdGlvbnMgYXJlIG5vdwogICAgICAgICAgcHV0IGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlaXIgY2xhc3Mgd2hlbiB1c2luZyBzaGFkb3cgY2xhc3Nlcy4KCjYvNy85NyAgOiBDZW50cmFsaXplZCB0aGUgbmFtaW5nIG9mIGZ1bmN0aW9ucywgbWVtYmVycywgd3JhcHBlcnMgZXRjLi4uIEJ5CiAgICAgICAgICBjZW50cmFsaXppbmcgdGhlIG5hbWluZyBzY2hlbWUsIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlCiAgICAgICAgICBzb21lIG11bHRpLWZpbGUgb3B0aW1pemF0aW9ucy4gIEFsc28sIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bwogICAgICAgICAgY2hhbmdlIFNXSUcncyBuYW1pbmcgc2NoZW1lIChwZXJoYXBzIGEgbmV3IGZlYXR1cmUgdG8gYmUgYWRkZWQKICAgICAgICAgIGxhdGVyKS4KCjYvMi85NyAgOiBBZGRlZCAnYXJnaW5pdCcgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGFzc2lnbiBpbml0aWFsIHZhbHVlcwogICAgICAgICAgdG8gZnVuY3Rpb24gYXJndW1lbnRzLiAgRG9pbmcgc28gbWFrZXMgaXQgc29tZXdoYXQgZWFzaWVyIHRvIGRldGVjdAogICAgICAgICAgaW1wcm9wZXIgYXJndW1lbnQgcGFzc2luZyB3aGVuIHdvcmtpbmcgd2l0aCBvdGhlciB0eXBlbWFwcy4KCjYvMi85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gcmVhZC1vbmx5IHZhcmlhYmxlcyB3ZXJlIGluaGVyaXRlZAogICAgICAgICAgaW50byBvdGhlciBjbGFzc2VzLiAgVW5kZXIgaW5oZXJpdGFuY2UsIHRoZSB2YXJpYWJsZXMgd291bGQKICAgICAgICAgIGJlY29tZSB3cml0YWJsZSwgYnV0IHRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZC4KCjUvMzAvOTcgOiBBbiBlbXB0eSAlbmFtZSgpIGRpcmVjdGl2ZSBpcyBubyBsb25nZXIgYWxsb3dlZCBvciBzdXBwb3J0ZWQuCiAgICAgICAgICBUaGlzIGRpcmVjdGl2ZSB3YXMgb3JpZ2luYWxseSB1c2VkIHRvIHN0cmlwIHRoZSBwcmVmaXgKICAgICAgICAgIG9mZiBvZiBhIGNsYXNzIG9yIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbmV2ZXIgcmVhbGx5CiAgICAgICAgICBzZWVtZWQgdG8gd29yayByaWdodCBhbmQgaXQgY29tcGxpY2F0ZWQgdGhlIEMrKyBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgc2lnbmlmaWNhbnRseS4gICBBcyBmYXIgYXMgSSBjYW4gdGVsbCBubyBvbmUgdXNlcyBpdCwgc28gaXQKICAgICAgICAgIGlzIG5vdyBoaXN0b3J5LiAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzI4Lzk3IDogRml4ZWQgYSBwYXJzaW5nIGJ1ZyB3aXRoICNkZWZpbmUgYW5kIEMrKyBjb21tZW50cy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG5vdyB3b3JrIHByb3Blcmx5IDoKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIENPTlNUICAgNCAgICAgLy8gQSBDb21tZW50Cgo1LzI4Lzk3IDogTWFkZSBzb21lIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB0byB0aGUgU1dJRyBTdHJpbmcgY2xhc3MuCiAgICAgICAgICAob25seSBhZmZlY3RzIHRoZSBTV0lHIGNvbXBpbGVyIGl0c2VsZikuCgo1LzI4Lzk3IDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBza2lwIHRlbXBsYXRlIGRlZmluaXRpb25zIGFuZCBpc3N1ZSBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuCgo1LzI4Lzk3IDogUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0eXBlcyBhZGRlZCAoaWUuIHRlbXBsYXRlcykuCiAgICAgICAgICBUeXBlcyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgU1dJRyBjb21waWxlcgoKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyh2ZWN0b3I8Y29tcGxleD4gKmEsIHZlY3Rvcjxkb3VibGU+ICpiKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIHRoZSBlbnRpcmUgbmFtZSAndmVjdG9yPGNvbXBsZXg+JyBiZWNvbWVzIHRoZSBuYW1lCiAgICAgICAgICBvZiB0aGUgZGF0YXR5cGUuICAgICAgRHVlIHRvIHNwYWNlIGxpbWl0YXRpb25zIGluIGRhdGF0eXBlCiAgICAgICAgICByZXByZXNlbnRhdGlvbnMsIHRoZSBuYW1lIHNob3VsZCBub3QgZXhjZWVkIDk2IGNoYXJhY3RlcnMuCgogICAgICAgICAgTm90ZSA6IFRoaXMgaXMgb25seSBwYXJ0IG9mIHdoYXQgaXMgbmVlZGVkIGZvciB0ZW1wbGF0ZSBzdXBwb3J0LgogICAgICAgICAgVGVtcGxhdGUgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IFNXSUcuCgogICAgICAgICAgVGhlIHRlbXBsYXRlIG5vdGF0aW9uIGFib3ZlIG1heSBhbHNvIGJlIHVzZWQgd2hlbiBzcGVjaWZ5aW5nCiAgICAgICAgICBPYmplY3RpdmUtQyBwcm90b2NvbCBsaXN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjQvOTcgOiBGaXJzdCBjdXQgYXQgT2JqZWN0aXZlLUMgc3VwcG9ydCBhZGRlZC4gICBBcyBpdCB0dXJucyBvdXQsIGFsbW9zdAogICAgICAgICAgZXZlcnl0aGluZyBjYW4gYmUgaGFuZGxlZCB3aXRoIG9ubHkgYSBmZXcgbWlub3IgbW9kaWZpY2F0aW9ucyB0bwogICAgICAgICAgdGhlIEMrKyBtb2R1bGUuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzIzLzk3IDogRml4ZWQgcmVwZWF0ZWQgZGVmaW5pdGlvbiBidWcgaW4gbXVsdGlwbGUgaW5oZXJpdGFuY2UgaGFuZGxpbmcKICAgICAgICAgIHdoZW4gbXVsdGlwbGUgYmFzZSBjbGFzc2VzIHNoYXJlIGEgY29tbW9uIGJhc2UgY2xhc3MgKGllLgogICAgICAgICAgdGhlIGV2aWwgZGlhbW9uZCkuCgo1LzIxLzk3IDogRml4ZWQgcmF0aGVyIGVtYmFycmFzc2luZyB0eXBvIHRoYXQgd29ya2VkIGl0cyB3YXkgaW50byB0aGUKICAgICAgICAgIFRlc3RzL0J1aWxkIGRpcmVjdG9yeS4KCjUvMTkvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgbmF0aXZlIG1ldGhvZHMgYW5kCiAgICAgICAgICBzaGFkb3cgY2xhc3NlcyB3aXRoIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcy4KCjUvMTkvOTcgOiBNb2RpZmllZCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBzbGlnaHRseSBzbyB0aGF0IGl0IHdvdWxkIHdvcmsKICAgICAgICAgIHdpdGggcG9pbnRlcnMgYSBsaXR0bGUgYmV0dGVyLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgdW5zaWduZWQgbG9uZyB7IERXT1JEIH07CgogICAgICAgICAgQXBwbGllcyAqYWxsKiB0eXBlbWFwcyBhc3NvY2lhdGVkIHdpdGggInVuc2lnbmVkIGxvbmciIHRvCiAgICAgICAgICAiRFdPUkQiLiAgIFRoaXMgbm93IGluY2x1ZGVzIHBvaW50ZXJzIHRvIHRoZSB0d28gZGF0YXR5cGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUsIGEgdHlwZW1hcCBhcHBsaWVkIHRvICJ1bnNpZ25lZCBsb25nICoqIiB3b3VsZAogICAgICAgICAgYWxzbyBiZSBhcHBsaWVkIHRvIGFueSBvY2N1cnJlbmNlIG9mICJEV09SRCAqKiIgYXMgd2VsbC4KCjUvMTkvOTcgOiBGaXhlZCBhbiBvd25lcnNoaXAgYXNzaWdubWVudCBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSB3aGVuCiAgICAgICAgICBjbGFzcyBtZW1iZXJzIHdlcmUgcmV0dXJuaW5nIG5ldyBvYmplY3RzIGJlbG9uZ2luZyB0bwogICAgICAgICAgZGlmZmVyZW50IGNsYXNzZXMuCgo1LzE3Lzk3IDogQWRkZWQgYSBmZXcgbW9yZSB0eXBlbWFwIHZhcmlhYmxlcy4KCiAgICAgICAgICAgICAgICAgICRuYW1lICAgICAgICAgIC0gTmFtZSBvZiBmdW5jdGlvbi92YXJpYWJsZS9tZW1iZXIKICAgICAgICAgICAgICAgICAgJGJhc2V0eXBlICAgICAgLSBCYXNlIGRhdGF0eXBlICh0eXBlIHdpdGhvdXQgcG9pbnRlcnMpCiAgICAgICAgICAgICAgICAgICRhcmdudW0gICAgICAgIC0gQXJndW1lbnQgbnVtYmVyCgo1LzE2Lzk3IDogRml4ZWQgZW1iYXJyYXNzaW5nIHVuZGVyc2NvcmUgZXJyb3IgaW4gbG9jYWwgdmFyaWFibGUKICAgICAgICAgIGFsbG9jYXRvci4KCjUvMTYvOTcgOiBGaXhlZCBuYW1lc3BhY2UgY2xhc2ggYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMKICAgICAgICAgIHdoZW4gY3JlYXRpbmcgYXJyYXlzIGFzIG5ldyBsb2NhbCB2YXJpYWJsZXMuCgo1LzE1Lzk3IDogRml4ZWQgc29tZSBidWdzIHdpdGggaW5oZXJpdGFuY2Ugb2YgYWRkZWQgbWV0aG9kcyBhY3Jvc3MKICAgICAgICAgIG11bHRpcGxlIGZpbGVzLiAgIFNXSUcgbm93IHVzZXMgbmFtZXMgb2YgYmFzZSBjbGFzc2VzCiAgICAgICAgICB3aGVuIGdlbmVyYXRpbmcgc3VjaCBmdW5jdGlvbnMuCgo1LzE0Lzk3IDogRmluaXNoZWQgc3VwcG9ydCBmb3IgZGVmYXVsdCB0eXBlbWFwcy4gIFByaW1hcmlseSB1c2VkCiAgICAgICAgICBpbnRlcm5hbGx5LCB0aGV5IGNhbiBiZSB1c2VkIHRvIG1hdGNoIHRoZSBiYXNpYwogICAgICAgICAgYnVpbHQtaW4gZGF0YXR5cGVzIHVzZWQgaW5zaWRlIG9mIFNXSUcuICAgWW91IGNhbgogICAgICAgICAgc3BlY2lmeSB0aGVtIGluIGludGVyZmFjZSBmaWxlcyBhcyB3ZWxsIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSBhdG9pKCR0YXJnZXQpOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgVW5saWtlIG5vcm1hbCB0eXBlbWFwcywgdGhpcyBkZWZhdWx0IG1hcCB3aWxsIGdldCBhcHBsaWVkCiAgICAgICAgICB0byAqYWxsKiBpbnRlZ2VyIGRhdGF0eXBlcyBlbmNvdW50ZXJlZCwgaW5jbHVkaW5nIHRob3NlCiAgICAgICAgICByZW5hbWVkIHdpdGggdHlwZWRlZiwgZXRjLi4uCgo1LzEzLzk3IDogRml4ZWQgc3Vic3RyaW5nIGJ1ZyBpbiB0eXBlIGNoZWNrZXIuCgo1LzEyLzk3IDogRml4ZWQgYnVnIGluIHBhcmFtZXRlcml6ZWQgdHlwZW1hcHMgd2hlbiBkZWNsYXJpbmcgbG9jYWwKICAgICAgICAgIHZhcmlhYmxlcyBvZiBzdHJ1Y3R1cmVzLgoKVmVyc2lvbiAxLjEgQmV0YTYgKE1heSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo1LzkvOTcgIDogRml4ZWQgYml6YXJyZSBOVUxMIHBvaW50ZXIgaGFuZGxpbmcgYnVnIGluIFBlcmw1IG1vZHVsZS4KCjUvOC85NyAgOiBGaXhlZCBteXN0ZXJpb3VzIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHJ1bm5pbmcgU1dJRyBvbiBhbgogICAgICAgICAgZW1wdHkgZmlsZS4KCjUvNy85NyAgOiBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3cgcmVwbGFjZSB0aGUgc3BlY2lhbCBzeW1ib2wgIiRjbGVhbnVwIgogICAgICAgICAgd2l0aCB0aGUgY2xlYW51cCBjb2RlIHNwZWNpZmllZCB3aXRoIHRoZSAiZnJlZWFyZyIgdHlwZW1hcC4KICAgICAgICAgIFRoaXMgY2hhbmdlIG5lZWRlZCB0byBwcm9wZXJseSBtYW5hZ2UgbWVtb3J5IGFuZCBleGNlcHRpb25zLgoKNS81Lzk3ICA6IEFkZGVkIHRoZSAndHlwZW1hcHMuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBjb250YWlucyBhCiAgICAgICAgICB2YXJpZXR5IG9mIGNvbW1vbiB0eXBlbWFwcyBmb3IgaW5wdXQgdmFsdWVzLCBwb2ludGVycywKICAgICAgICAgIGFuZCBzbyBvbi4KCjUvNS85NyAgOiBDaGFuZ2VkIGJlaGF2aW9yIG9mICJhcmdvdXQiIHR5cGVtYXAgaW4gUHl0aG9uIG1vZHVsZS4KICAgICAgICAgIE9sZCB2ZXJzaW9ucyBhdXRvbWF0aWNhbGx5IHR1cm5lZCB0aGUgcmVzdWx0IGludG8gYQogICAgICAgICAgUHl0aG9uIGxpc3QuICBUaGUgbmV3IHZlcnNpb24gZG9lcyBub3RoaW5nLCBsZWF2aW5nIHRoZQogICAgICAgICAgaW1wbGVtZW50YXRpb24gdXAgdG8gdGhlIHVzZXIuICBUaGlzIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkKICAgICAgICAgIGJ1dCBtYXkgYnJlYWsgb2xkZXIgY29kZXMgdGhhdCByZWx5IG9uIHR5cGVtYXBzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24gb2YKICAgICAgICAgICJhcmdvdXQiIGFuZCAiaWdub3JlIiB0eXBlbWFwcy4KCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB0aGF0IHdvdWxkIGdlbmVyYXRlIGluY29ycmVjdCBjb2RlCiAgICAgICAgICBpZiBhbGwgZnVuY3Rpb24gYXJndW1lbnRzIGFyZSAiaWdub3JlZCIuCgo1LzQvOTcgIDogQWRkZWQgJWFwcGx5IGFuZCAlY2xlYXIgZGlyZWN0aXZlcy4gICBUaGVzZSBmb3JtIGEgaGlnaGVyIGxldmVsCiAgICAgICAgICBpbnRlcmZhY2UgdG8gdGhlIHR5cGVtYXAgbWVjaGFuaXNtLiAgSW4gYSBudXRzaGVsbCwgdGhleQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBwcm9jZXNzaW5nIG9mIHZhcmlvdXMgZGF0YXR5cGVzIHdpdGhvdXQKICAgICAgICAgIGV2ZXIgaGF2aW5nIHRvIHdyaXRlIGEgdHlwZW1hcC4gIFNlZSB0aGUgU1dJRyBkb2N1bWVudGF0aW9uCiAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLiAgKiogTkVXIEZFQVRVUkUgKioKCjUvNC85NyAgOiBBZGRlZCBhIGxvY2FsIHZhcmlhYmxlIGV4dGVuc2lvbiB0byB0aGUgdHlwZW1hcCBoYW5kbGVyLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSAqKGRvdWJsZSB0ZW1wKSB7CgkJICAgICAgICB0ZW1wID0gYXRvZigkc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBJbiB0aGlzIGNhc2UsICd0ZW1wJyBpcyBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgZXhpc3RzCiAgICAgICAgICBpbiB0aGUgZW50aXJlIHdyYXBwZXIgZnVuY3Rpb24gKG5vdCBqdXN0IHRoZSB0eXBlbWFwCiAgICAgICAgICBjb2RlKS4gIFRoaXMgbWVjaGFuaXNtIHByb3ZpZGVzIGJldHRlciBzdXBwb3J0IGZvcgogICAgICAgICAgY2VydGFpbiB0eXBlcyBvZiBhcmd1bWVudCBoYW5kbGluZyBhbmQgYWxzbyBtYWtlcyBpdAogICAgICAgICAgcG9zc2libGUgdG8gd3JpdGUgdGhyZWFkLXNhZmUgdHlwZW1hcHMuICBBbnkgbnVtYmVyCiAgICAgICAgICBsb2NhbCB2YXJpYWJsZXMgY2FuIGJlIGRlY2xhcmVkIGJ5IHN1cHBseWluZyBhIGNvbW1hCiAgICAgICAgICBzZXBhcmF0ZWQgbGlzdC4gICBMb2NhbCB2YXJpYWJsZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAgIHVuaXF1ZSwgZXZlbiBpZiB0aGUgc2FtZSB0eXBlbWFwIGlzIGFwcGxpZWQgbWFueSB0aW1lcwogICAgICAgICAgaW4gYSBnaXZlbiBmdW5jdGlvbi4KICAgICAgICAgICoqIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIFBlcmw0IG9yIEd1aWxlIG1vZHVsZXMuCgo1LzIvOTcgIDogRml4ZWQgcHJvY2Vzc2luZyBvZiAlaWZkZWYsICVlbmRpZiwgJWlmLCBldGMuLi4gIChUaGVzZSBhcmUKICAgICAgICAgIFNXSUcgZXF1aXZhbGVudHMgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgY2FuIHBhc3MgdGhyb3VnaCB0aGUgQyBwcmVwcm9jZXNzb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLgoKNS8yLzk3ICA6IEZpeGVkIG1ham9yIChidXQgc3VidGxlKSBidWcgaW4gdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlcgogICAgICAgICAgcmVsYXRlZCB0byBzZWFyY2hpbmcgYW5kIHR5cGUtY2hlY2tpbmcgZm9yIEMrKyBpbmhlcml0YW5jZS4KICAgICAgICAgIFRvIG1ha2UgYSBsb25nIHN0b3J5IHNob3J0LCBpZiB5b3UgaGFkIHR3byBjbGFzc2VzIG5hbWVkCiAgICAgICAgICAiRm9vIiBhbmQgIkZvb09iamVjdCIgdGhlIHR5cGUgY2hlY2tlciB3b3VsZCBzb21ldGltZXMKICAgICAgICAgIGdldCBjb25mdXNlZCBhbmQgYmUgdW5hYmxlIHRvIGxvY2F0ZSAiRm9vIiBpbiBhbiBpbnRlcm5hbAogICAgICAgICAgdGFibGUuCgo1LzIvOTcgIDogRml4ZWQgc29tZSBidWdzIGluIHRoZSAtY28gb3B0aW9uLgoKNC8yNC85NyA6IFBvaW50ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgU1dJRyBsaWJyYXJ5LgoKNC8xOS85NyA6IEFkZGVkIHRoZSAlbmV3IGRpcmVjdGl2ZS4gICBUaGlzIGlzIGEgImhpbnQiIHRoYXQgY2FuIGJlIHVzZWQKICAgICAgICAgIHRvIHRlbGwgU1dJRyB0aGF0IGEgZnVuY3Rpb24gaXMgcmV0dXJuaW5nIGEgbmV3IG9iamVjdC4gRm9yCiAgICAgICAgICBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgRm9vICpjcmVhdGVfZm9vKCk7CgogICAgICAgICAgVGhpcyB0ZWxscyBTV0lHIHRoYXQgY3JlYXRlX2ZvbygpIGlzIGNyZWF0aW5nIGEgbmV3IG9iamVjdAogICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgdG8gaXQuICAgTWFueSBsYW5ndWFnZSBtb2R1bGVzIG1heQogICAgICAgICAgY2hvb3NlIHRvIGlnbm9yZSB0aGUgaGludCwgYnV0IHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLAogICAgICAgICAgdGhlICVuZXcgaXMgdXNlZCB0byBoYW5kbGUgcHJvcGVyIG93bmVyc2hpcCBvZiBvYmplY3RzLgoKICAgICAgICAgICVuZXcgY2FuIGFsc28gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmdzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBjaGFyICpjcmVhdGVfc3RyaW5nKCk7CgogICAgICAgICAgV2hlbiB1c2VkLCBhbGwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGNsZWFudXAKICAgICAgICAgIHRoZSByZXR1cm5lZCBzdHJpbmctLWVsaW1pbmF0aW5nIG1lbW9yeSBsZWFrcy4KICAgICAgICAgICoqIE5FVyBGRUFUVVJFICoqCgo0LzE5Lzk3IDogQWRkZWQgYSBuZXcgdHlwZW1hcCAibmV3ZnJlZSIuICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGgKICAgICAgICAgIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBtZXRob2QgYnkgd2hpY2gKICAgICAgICAgIGEgbmV3IG9iamVjdCByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGlzIGRlbGV0ZWQuCgo0LzE5Lzk3IDogVGhlIHN5bWJvbCAiX19jcGx1c3BsdXMiIGlzIG5vdyBkZWZpbmVkIGluIHRoZSBTV0lHIGludGVycHJldGVyCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCB0aGUgLWMrKyBvcHRpb24uCgo0LzE3Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3Igc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgd2hlbiB1c2VkIGluc2lkZSB0aGUKICAgICAgICAgICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjQvMTUvOTcgOiBBZGRlZCBhIHNwZWNpYWwgdHlwZW1hcCBzeW1ib2wgUFJFVklPVVMgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgcmVzdG9yZSBhIHByZXZpb3VzIHR5cGVtYXAuIEZvciBleGFtcGxlIDoKCgkgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCAqID0gUFJFVklPVVM7CgogICAgICAgICAgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBpbiBsaWJyYXJ5IGZpbGVzLgoKNC8xMy85NyA6IEFkZGVkICVwcmFnbWEgZGlyZWN0aXZlIGZvciBQZXJsNSBtb2R1bGUuICAgVHdvIG5ldyBwcmFnbWFzIGFyZQogICAgICAgICAgYXZhaWxhYmxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgY29kZSA9ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJmaWxlLnBsIgoKICAgICAgICAgIEJvdGggaW5zZXJ0IGNvZGUgaW50byB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLiAgVGhpcyBjYW4KICAgICAgICAgIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSBjdXN0b21pemUgdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4KCjQvMTMvOTcgOiBTY2FubmVyIG1vZGlmaWVkIHRvIG9ubHkgcmVjb2duaXplIEMrKyBrZXl3b3JkcyB3aGVuIHRoZSAtYysrCiAgICAgICAgICBvcHRpb24gaGFzIGJlZW4gc3BlY2lmaWVkLiAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciBDIHByb2dyYW1zCiAgICAgICAgICB0aGF0IG1ha2UgdXNlIG9mIHRoZXNlIGtleXdvcmRzIGZvciBpZGVudGlmaWVycy4KICAgICAgICAgIFNXSUcgbWF5IG5lZWQgdG8gYmUgZXhwbGljaXRseSBydW4gd2l0aCB0aGUgLWMrKyBvcHRpb24gd2hlbgogICAgICAgICAgY29tcGlsaW5nIEMrKyBjb2RlICh0aGlzIHdhcyBhbGxvd2VkLCBidXQgbm90IHJlY29tbWVuZGVkIGluCiAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucykuICoqUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSoqCgo0LzExLzk3IDogRml4ZWQgYSByYXRoZXIgbmFzdHkgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byB1c2luZwogICAgICAgICAgdmFyaWFibGUgbGlua2luZyB3aXRoIGNvbXBsZXggZGF0YXR5cGVzIGFuZCBwb2ludGVycy4gICBPbiBVbml4LAogICAgICAgICAgY29kZSB3b3VsZCB3b3JrIChzb21laG93KSwgYnV0IHdvdWxkIGNhdXNlIGFuIGFjY2VzcyB2aW9sYXRpb24KICAgICAgICAgIHVuZGVyIFdpbmRvd3MtTlQuICBUaGUgZml4IHNob3VsZCBjb3JyZWN0IHRoZSBwcm9ibGVtLAogICAgICAgICAgYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHByb2JsZW0gdXNpbmcgZ2xvYmFsIHZhcmlhYmxlcyBvZgogICAgICAgICAgY29tcGxleCBkYXRhdHlwZXMgaW4gY29uanVuY3Rpb24gd2l0aCBzaGFkb3cgY2xhc3Nlcy4gIEZvcnR1bmF0ZWx5LAogICAgICAgICAgdGhpcyBzb3J0IG9mIHRoaW5nIHNlZW1zIHRvIGJlIHJlbGF0aXZlbHkgcmFyZSAoY29uc2lkZXJpbmcKICAgICAgICAgIHRoYXQgdGhlIGJ1ZyBoYXMgYmVlbiBhcm91bmQgZm9yIG1vcmUgdGhhbiBhIHllYXIgLSB5aWtlcyEpLgoKNC8xMS85NyA6IEZpeGVkIGJpemFycmUgY29uc3RhbnQgZXZhbHVhdGlvbiBidWcgaW4gUGVybDUgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICB3aGVuIHJ1bm5pbmcgdW5kZXIgV2luZG93cy1OVC4KCjQvOC85NyAgOiBCdWcgd2hlbiB1c2luZyBkZWZhdWx0IGFyZ3VtZW50cyBhbmQgQysrIHJlZmVyZW5jZXMgZml4ZWQuCgo0LzgvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3MgaW4gUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzIHJlbGF0ZWQgdG8KICAgICAgICAgIHVzaW5nIGNsYXNzIHJlbmFtaW5nIChhcHBseWluZyB0aGUgJW5hbWUgZGlyZWN0aXZlIHRvIGEgY2xhc3MKICAgICAgICAgIGRlZmluaXRpb24pIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjQvNy85NyAgOiBGaXhlZCBtaW5vciBidWdzIGluIHN3aWdwdHIuc3dnLCB0Y2w4cHRyLnN3ZywgYW5kIHBlcmw1cHRyLnN3ZyB0bwogICAgICAgICAgcHJldmVudCBpbmZpbml0ZSBsb29wcyB3aGVuIHdlaXJkIGRhdGF0eXBlcyBhcmUgcGFzc2VkLgoKMy8yOS85NyA6ICdNYWtlZmlsZS53aW4nIGFkZGVkLiAgIFRoaXMgaXMgdXNlZCB0byBidWlsZCBtb3N0IG9mIHRoZSBleGFtcGxlcwogICAgICAgICAgaW4gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB1bmRlciBXaW5kb3dzIE5ULzk1LgoKMy8yNy85NyA6IEZpeGVzIHRvIFNXSUcncyBlcnJvciByZXR1cm4gY29kZXMuICAgU1dJRyBub3cgcmV0dXJucyBub24temVybwogICAgICAgICAgZXhpdCBjb2RlcyBmb3IgY2VydGFpbiBraW5kcyBvZiBlcnJvcnMgKHdoaWNoIG1ha2VzIGl0IG1vcmUKICAgICAgICAgIGZyaWVuZGx5IHRvIG1ha2VmaWxlcykuICAgICBBbiBvdmVyaGF1bCBvZiB0aGUgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgIGlzIG9uIHRoZSB0by1kbyBsaXN0IGFuZCB3aWxsIHByb2JhYmx5IHNob3cgdXAgaW4gYSBsYXRlciByZWxlYXNlLgoKMy8yNS85NyA6IEJ1ZyBmaXguICAiZnJlZWFyZyIgYW5kICJhcmdvdXQiIHR5cGVtYXBzIGhhdmUgYmVlbiBmaXhlZCBpbgogICAgICAgICAgdGhlIFBlcmw1IG1vZHVsZS4gIEluIHByZXZpb3VzIHZlcnNpb25zLCBmdW5jdGlvbiBpbnB1dCBwYXJhbWV0ZXJzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlcnMgc2hhcmVkIHRoZSBzYW1lIG1lbW9yeSBzcGFjZS0tY2F1c2luZwogICAgICAgICAgYWxsIHNvcnRzIG9mIG5hc3R5IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIHBhc3MgcGVybCB2YWx1ZXMgYnkKICAgICAgICAgIHJlZmVyZW5jZS4gICBTV0lHIG5vdyBpbnRlcm5hbGx5IG1ha2VzIGEgImNvcHkiICh3aGljaCBpcyByZWFsbHkKICAgICAgICAgIGp1c3QgYSBwb2ludGVyKSBvZiBhZmZlY3RlZCBwYXJhbWV0ZXJzIGFuZCB1c2VzIHRoYXQuICAgVGhpcwogICAgICAgICAgaXMgZG9uZSB0cmFuc3BhcmVudGx5IHNvIHRoZXJlIGlzIG5vIG5vdGljYWJsZSBpbXBhY3Qgb24gYW55CiAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzLiAgIFRoaXMgY2hhbmdlIGlzIHByb2JhYmx5IG9ubHkgbm90aWNhYmxlCiAgICAgICAgICB0byBleHBlcnQgdXNlcnMuCgozLzI1Lzk3IDogQWRkZWQgdHlwZS1jaGVjayB0byB2ZXJib3NlIGFuZCBzdGF0IG1vZGUuICBTV0lHIHdpbGwgbm93IGdlbmVyYXRlIGEgbGlzdAogICAgICAgICAgb2YgYWxsIGRhdGF0eXBlcyB0aGF0IHdlcmUgdXNlZCBidXQgdW5kZWZpbmVkICh1c2VmdWwgZm9yIHRyYWNraW5nCiAgICAgICAgICBkb3duIHdlaXJkIGJ1Z3MpLiAgIFRoaXMgaXMgZW5hYmxlZCB3aXRoIHRoZSAtdiBvcHRpb24gKHdoaWNoCiAgICAgICAgICBpcyBub3cgb2ZmaWNpYWxseSBrbm93biBhcyAib3Zlcmx5IHZlcmJvc2UiIG1vZGUpIG9yIHRoZSAtc3RhdCBvcHRpb24uCgozLzI1Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGFyc2VyIHRvIG1ha2UgaW5jbHVkZSBndWFyZHMgd29yayBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgI2lmbmRlZiBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgI2RlZmluZSBJTlRFUkZBQ0VfSQogICAgICAgICAgICAgICAgJW1vZHVsZSBmb29iYXIuaQogICAgICAgICAgICAgICAgLi4uIGRlY2xhcmF0aW9ucyAuLi4KICAgICAgICAgICAgICAgICNlbmRpZgoKMy8yNC85NyA6ICVjaGVja291dCBkaXJlY3RpdmUgYWRkZWQuICAgVGhpcyBhbGxvd3MgYW4gaW50ZXJmYWNlIGZpbGUgdG8KICAgICAgICAgIGV4dHJhY3QgZmlsZXMgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5IGFuZCBwbGFjZSB0aGVtIGluIHRoZQogICAgICAgICAgY3VycmVudCBkaXJlY3RvcnkuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHNjcmlwdHMgYW5kCiAgICAgICAgICBvdGhlciBoZWxwZXIgY29kZSB0aGF0IG1pZ2h0IGJlIGFzc29jaWF0ZWQgd2l0aCBsaWJyYXJ5IGZpbGVzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICVjaGVja291dCBhcnJheS50Y2wKCiAgICAgICAgICBXaWxsIGxvb2sgZm9yIGEgZmlsZSAiYXJyYXkudGNsIiBpbiB0aGUgbGlicmFyeSBhbmQgY29weSBpdAogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSwgdGhpcyBkaXJlY3RpdmUgZG9lcyBub3RoaW5nIChpdCB3aWxsIG5vdCBvdmVyd3JpdGUgYW4KICAgICAgICAgIGV4aXN0aW5nIGZpbGUpLiAgVGhpcyBvbmx5IGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGZvciBub3cuCgozLzI0Lzk3IDogU1dJRyB3aWxsIG5vdyBsb29rIGluIHRoZSBTV0lHIExpYnJhcnkgZm9yIGEgZmlsZSBpZiBpdCBjYW4ndAogICAgICAgICAgZmluZCBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBBcyBhIHJlc3VsdCwgaXQgaXMgZWFzeSB0bwogICAgICAgICAgbWFrZSBtb2R1bGVzIGZyb20gU1dJRyBsaWJyYXJ5IGZpbGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgd2FudCB0byBtYWtlIGEgUHl0aG9uIG1vZHVsZSBmcm9tIHRoZSBTV0lHIHRpbWVycyBsaWJyYXJ5LCBqdXN0CiAgICAgICAgICB0eXBlIHRoaXMgaW4gYW55IGRpcmVjdG9yeSA6CgogICAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIHRpbWVycy5pCgogICAgICAgICAgWW91IHdpbGwgZ2V0IHRoZSBmaWxlcyB0aW1lcnNfd3JhcC5jIGFuZCB0aW1lcnNfd3JhcC5kb2MgaW4KICAgICAgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IHlvdSBjYW4gbm93IGNvbXBpbGUuICAgVGhlIGZpbGUKICAgICAgICAgIHJlbWFpbnMgaW4gdGhlIFNXSUcgbGlicmFyeSAoYWx0aG91Z2ggeW91IGNhbiBjaGVjayBpdCBvdXQKICAgICAgICAgIHVzaW5nIHRoZSAtY28gb3B0aW9uKS4gICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAtY28gb3B0aW9uIGFkZGVkIHRvIFNXSUcgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gdGhlIFNXSUcgbGlicmFyeS4KICAgICAgICAgIFdoZW4gdXNlZCwgdGhpcyBpbnN0cnVjdHMgU1dJRyB0byBjaGVjayBvdXQgYSBsaWJyYXJ5IGZpbGUgYW5kCiAgICAgICAgICBwbGFjZSBpdCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgdW5peCA+IHN3aWcgLWNvIGFycmF5LmkKICAgICAgICAgICAgICAgIGFycmF5LmkgY2hlY2tlZCBvdXQgZnJvbSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgICAgICB1bml4ID4KCiAgICAgICAgICBPbmNlIGluIHlvdXIgZGlyZWN0b3J5IHlvdSBjYW4gY3VzdG9taXplIHRoZSBmaWxlIHRvIHN1aXQgeW91cgogICAgICAgICAgcGFydGljdWxhciBwdXJwb3Nlcy4gIFRoZSBjaGVja291dCBvcHRpb24gbWFrZXMgaXQgZWFzeSB0bwogICAgICAgICAgZ3JhYiBsaWJyYXJ5IGZpbGVzIHdpdGhvdXQga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgU1dJRwogICAgICAgICAgaW5zdGFsbGF0aW9uLCBidXQgaXQgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydAogICAgICAgICAgaW5jbHVkaW5nIHNjcmlwdHMsIEMgY29kZSwgYW5kIG90aGVyIG1pc2NlbGxhbmVvdXMgZmlsZXMKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBwdXQgYSBjb29sIHNjcmlwdAogICAgICAgICAgaW4gdGhlIGxpYnJhcnkgYW5kIGNoZWNrIGl0IG91dCB3aGVuZXZlciB5b3Ugd2FudGVkIHRvIHVzZSBpdC4KICAgICAgICAgICoqKiBOZXcgRmVhdHVyZSAqKioKCjMvMjQvOTcgOiAjcHJhZ21hIGV4cG9ydCBkaXJlY3RpdmVzIGFkZGVkIHRvIFRjbCBvdXRwdXQgZm9yIGNvbXBpbGluZwogICAgICAgICAgc2hhcmVkIGxpYnJhcmllcyBvbiB0aGUgTWFjLgoKMy8yNC85NyA6IE1pbm9yIGNoYW5nZXMgdG8gd2lzaC5pIGFuZCB0Y2xzaC5pIGxpYnJhcnkgZmlsZXMgdG8gcHJvdmlkZQogICAgICAgICAgc3VwcG9ydCBmb3IgdGhlIE1hY2ludG9zaC4KCjMvMTkvOTcgOiBTV0lHJ3MgcG9saWN5IHRvd2FyZHMgTlVMTCBwb2ludGVycyBoYXMgYmVlbiByZWxheGVkLiAgVGhlCiAgICAgICAgICBwb2xpY3kgb2YgcmVxdWlyaW5nIGEgc3BlY2lhbCBjb21waWxlciBkaXJlY3RpdmUgLURBTExPV19OVUxMCiAgICAgICAgICB0byB1c2UgTlVMTCBwb2ludGVycyBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiAgV2hpbGUgdGhpcyBtYXkKICAgICAgICAgIHNlZW0gInVuc2FmZSIsIGl0IHR1cm5zIG91dCB0aGF0IHlvdSBjYW4gdXNlIGEgImNoZWNrIgogICAgICAgICAgdHlwZW1hcCB0byBhY2hpZXZlIHNvbWUgc2FmZXR5LiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgTm9kZSAqIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0YXJnZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiTlVMTCBQb2ludGVycyBub3QgYWxsb3dlZC4iKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHByZXZlbnRzIGFueSBOVUxMIHZhbHVlIG9mIGEgIk5vZGUgKiIgcG9pbnRlciB0byBiZQogICAgICAgICAgcGFzc2VkIHRvIGEgZnVuY3Rpb24uICAgKEkgdGhpbmsgdGhpcyBpcyBtdWNoIGNsZWFuZXIKICAgICAgICAgIHRoYW4gdGhlIG9sZCAtREFMTE9XX05VTEwgaGFjayBhbnl3YXlzKS4KCjMvMTkvOTcgOiBGaXhlZCBwb2ludGVyIGhhbmRsaW5nIGVycm9ycyBpbiBQZXJsNSBtb2R1bGUuICBNb2R1bGVzIG5vCiAgICAgICAgICBsb25nZXIgY29yZSBkdW1wIHdoZW4gYSBQZXJsIHJlZmVyZW5jZSBpcyBpbmFkdmVydGVudGx5CiAgICAgICAgICBwYXNzZWQgaW4gYXMgYSBDIHBvaW50ZXIuCgozLzE4Lzk3IDogQWRkZWQgYSAiY2hlY2siIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUKICAgICAgICAgIHZhbGlkaXR5IG9mIGZ1bmN0aW9uIGlucHV0IHZhbHVlcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChwZXJsNSxjaGVjaykgaW50IHBvc2ludCB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9haygiQXJndW1lbnQgaXMgbm90IGEgcG9zaXRpdmUgaW50ZWdlciIpOwogICAgICAgICAgICAgICAgfQoKMy8xOC85NyA6IEFkZGVkIGFuICRhcmcgdmFyaWFibGUgdG8gVGNsIHR5cGVtYXBzLiAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyCiAgICAgICAgICB0byByZXR1cm4gYXJndW1lbnQgdmFsdWVzIGJ5ICJyZWZlcmVuY2UiLgoKMy8xOC85NyA6IEZpeGVkIGEgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIEMrKyByZWZlcmVuY2VzIGFuZAogICAgICAgICAgdGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4KCjMvMTgvOTcgOiBGaXhlZCBhIGZldyBnbGl0Y2hlcyBpbiB0aGUgdHlwZW1hcCBtb2R1bGUgd2l0aCByZXNwZWN0IHRvCiAgICAgICAgICBjaGFpbmluZy4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgICAkaW4gICAgICAgICAgICAgICAgLy8gSW5zZXJ0cyBwcmV4aXN0aW5nIHR5cGVtYXAKICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGEgJWRcbiIsICR0YXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gYWxsb3dlZCBmb3IgcXVpdGUgc29tZSB0aW1lLCBidXQgZGlkbid0IHdvcmsKICAgICAgICAgIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgd2FzIGRlZmluZWQuICBOb3csIGl0IHN0aWxsIGRvZXNuJ3QKICAgICAgICAgIHdvcmsgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCBpcyBkZWZpbmVkLCBidXQgaXQgaXNzdWVzIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4gICBUaGVyZSBpcyBzb21lIHN1cHBvcnQgdXNpbmcgZGVmYXVsdCB0eXBlbWFwcywKICAgICAgICAgIGJ1dCBub25lIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHRha2UgYWR2YW50YWdlIG9mIGl0LiAgVGhpcwogICAgICAgICAgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGF0IHRoaXMgdGltZS4KClZlcnNpb24gMS4xYjUgUGF0Y2ggMSAoTWFyY2ggMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzE2Lzk3IDogRml4ZWQgcmVmZXJlbmNlcyBidWcgd2l0aCBDKysgY29kZSBnZW5lcmF0aW9uLgoKMy8xNi85NyA6IEZpeGVkIGluaXRpYWxpemF0aW9uIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gdGhhdAogICAgICAgICAgd2FzIGNhdXNpbmcgd2VpcmQgcHJvYmxlbXMuCgozLzE2Lzk3IDogRml4ZWQgZmF0YWwgYnVnIHdpdGggLWMgb3B0aW9uIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaW52b2x2aW5nIHRoZSAldGV4dCBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBzb3J0aW5nLiBJbiB0aGUgb2xkIHN5c3RlbSwgJXRleHQgZW50cmllcyB3b3VsZCBmbG9hdCB0byB0aGUKICAgICAgICAgIHRvcCBvZiBhIHNlY3Rpb24gYmVjYXVzZSB0aGV5IHdlcmUgIm5hbWVsZXNzIi4gICBOb3cgdGhleSBhcmUKICAgICAgICAgIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQgd2lsbCBzdGF5IGluIHRoZSBwcm9wZXIKICAgICAgICAgIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBlbnRyeS4KClZlcnNpb24gMS4xYjUgKE1hcmNoIDEyLCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTEvOTcgOiBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IFRjbC9UayA4LjBhMi4KICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgKioqIFNXSUcgbm8gbG9uZ2VyIHdvcmtzIHdpdGggVGNsL1RrIDguMGExLgoKMy8xMC85NyA6IEZpeGVkIGJ1ZyB3aXRoIGlnbm9yZWQgYXJndW1lbnRzIGFuZCBDKysgbWVtYmVyIGZ1bmN0aW9ucyBpbgogICAgICAgICAgdGhlIFB5dGhvbiBtb2R1bGUuCgozLzkvOTcgIDogUGFyc2luZyBidWdzIHdpdGggbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGFuZCBwcml2YXRlbHkKICAgICAgICAgIGRlY2xhcmVkIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBmaXhlZC4KCjMvOS85NyAgOiBGaXhlZCBhIGZldyBtaW5vciBjb2RlIGdlbmVyYXRpb24gYnVncyB3aXRoIEMrKyBjbGFzc2VzIGFuZAogICAgICAgICAgY29uc3RydWN0b3JzLiAgIEluIHNvbWUgY2FzZXMsIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlCiAgICAgICAgICB3b3VsZCBub3QgY29tcGlsZSBwcm9wZXJseS4gICBTV0lHIG5vdyBhdHRlbXB0cyB0byB1c2UKICAgICAgICAgIHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgaW5zdGVhZC4KCjMvOC85NyAgOiBBZGRlZCBhIC1sIG9wdGlvbiB0byBTV0lHIHRoYXQgYWxsb3dzIGFkZGl0aW9uYWwgU1dJRyBsaWJyYXJ5IGZpbGVzCiAgICAgICAgICB0byBiZSBncmFiYmVkIHdpdGhvdXQgaGF2aW5nIHRoZW0gc3BlY2lmaWVkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgIFRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGtlZXAgdGhlIGludGVyZmFjZSBmaWxlIGNsZWFuIGFuZCBtb3ZlIGNlcnRhaW4KICAgICAgICAgIG9wdGlvbnMgaW50byBhIE1ha2VmaWxlLiAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgc3dpZyAtdGNsIGV4YW1wbGUuaSAgICAgICAgICAgICAgIyAgQnVpbGQgYSBub3JtYWwgVGNsIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXRjbCAtbHdpc2guaSBleGFtcGxlLmkgICAgICMgIEJ1aWxkIGl0IGFzIGEgd2lzaCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBieSBpbmNsdWRpbmcgdGhlICd3aXNoLmknIGZpbGUuCgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiBleGFtcGxlLmkgICAgICAgICAgICMgQnVpbGQgYSBkeW5hbWljYWxseSBsb2FkZWQgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1sZW1iZWQuaSBleGFtcGxlLmkgIyBCdWlsZCBhIHN0YXRpYyBleHRlbnNpb24KCiAgICAgICAgICBUaGVzZSBraW5kcyBvZiBvcHRpb25zIGNvdWxkIHByZXZpb3VzbHkgYmUgYWNjb21wbGlzaGVkIHdpdGgKICAgICAgICAgIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgICAgICVtb2R1bGUgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAjaWZkZWYgU1RBVElDCiAgICAgICAgICAgICAgICAgICAlaW5jbHVkZSBlbWJlZC5pCiAgICAgICAgICAgICAgICAgICAjZW5kaWYKCjMvOC85NyAgOiBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBHdWlsZSBtb2R1bGUgdG8gdXNlIHRoZSBuZXcgZ2ggaW50ZXJmYWNlCiAgICAgICAgICBpbiBGU0YgR3VpbGUgMS4wLiAgICBUaGUgb2xkZXIgZ3NjbSBpbnRlcmZhY2UgdXNlZCBpbiBDeWdudXMKICAgICAgICAgIEd1aWxlIHJlbGVhc2VzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU1dJRy4KCjMvOC85NyAgOiBDbGVhbmVkIHVwIHRoZSBUY2wgTmV0c2NhcGUgcGx1Z2luIGV4YW1wbGUuICAgSXQgc2hvdWxkIHdvcmsgd2l0aAogICAgICAgICAgdmVyc2lvbiAxLjEgb2YgdGhlIHBsdWdpbiBub3cuCgozLzgvOTcgIDogQWRkZWQgYmV0dGVyIGFycmF5IHN1cHBvcnQgdG8gdGhlIHR5cGVtYXAgbW9kdWxlLiAgVGhlIGtleXdvcmQKICAgICAgICAgIEFOWSBjYW4gbm93IGJlIHVzZWQgdG8gbWF0Y2ggYW55IGFycmF5IGRpbWVuc2lvbi4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIHdpbGwgbWF0Y2ggYW55IHNpbmdsZS1kaW1lbnNpb25hbCBkb3VibGUgYXJyYXkuICAgVGhlIGFycmF5CiAgICAgICAgICBkaW1lbnNpb24gaXMgcGFzc2VkIGluIHRoZSB2YXJpYWJsZXMgJGRpbTAsICRkaW0xLCAuLi4gJGRpbTkuICBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKCQkgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldIHsKCQkJcHJpbnRmKCJSZWNlaXZlZCBhIGRvdWJsZVslZF1bJWRdWyVkXVxuIiwkZGltMCwkZGltMSwkZGltMik7CgkgICAgICAgICAgICB9CgogICAgICAgICAgQW55IHR5cGVtYXAgaW52b2x2aW5nIGEgc3BlY2lmaWMgYXJyYXkgZGltZW5zaW9uIHdpbGwgb3ZlcnJpZGUgYW55CiAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgQU5ZIHRhZy4gIFRodXMsIGEgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgWzVdWzRdW0FOWV0ge30KICAgICAgICAgIHdvdWxkIG92ZXJyaWRlIGEgZG91YmxlIFtBTlldW0FOWV1bQU5ZXS4gIEhvd2V2ZXIsIG92ZXJ1c2Ugb2YgdGhlIEFOWQogICAgICAgICAgdGFnIGluIGFycmF5cyBvZiBoaWdoLWRpbWVuc2lvbnMgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgZHVlIHRvCiAgICAgICAgICB0aGUgcGF0dGVybiBtYXRjaGluZyBydWxlIHVzZWQuIEZvciBleGFtcGxlLCB3aGljaCBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICB0eXBlbWFwcyBoYXMgcHJlY2VkZW5jZT8KCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldWzVdIHt9ICAgICAvLyBBdm9pZCB0aGlzIQogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbNV1bQU5ZXSB7fQoKMy83Lzk3ICA6IEZpeGVkIGEgbnVtYmVyIG9mIGJ1Z3MgcmVsYXRlZCB0byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSBoYW5kbGluZy4KICAgICAgICAgIFR5cGVkZWZzIGludm9sdmluZyBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgbm93IHdvcmtzIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgTUFUUklYWzRdWzRdOwoKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBleHRlcm4gZG91YmxlIGZvbyhNQVRSSVggYSk7CgogICAgICAgICAgVHlwZWNhc3Rpbmcgb2YgcG9pbnRlcnMgaW50byBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgaXMgbm93CiAgICAgICAgICBpbXBsZW1lbnRlZCBwcm9wZXJseSB3aGVuIG1ha2luZyBDL0MrKyBmdW5jdGlvbiBjYWxscy4KCjMvNi85NyAgOiBGaXhlZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgYnVnIGluIHRoZSBUY2wgT2JqZWN0LW9yaWVudGVkCiAgICAgICAgICBpbnRlcmZhY2UuICBXZWxsLCBhY3R1YWxseSwgZGlkbid0IGZpeCBpdCBidXQgaXNzdWVkIGEKICAgICAgICAgIFRjbCBlcnJvciBpbnN0ZWFkLiAgIFRoZSBidWcgd291bGQgbWFuaWZlc3QgaXRzZWxmIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdICAgICAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXSAgIyBNYWtlICRtIGludG8gYW4gb2JqZWN0IGFzc3VtaW5nICRsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBwb2ludGVyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNpbmNlICRtID09ICRsLCAkbCBnZXRzIGRlc3Ryb3llZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChzaW5jZSBpdHMgdGhlIHNhbWUgY29tbWFuZCBuYW1lKQogICAgICAgICAgICAgICAgICUgJG0gaW5zZXJ0IEZvbwogICAgICAgICAgICAgICAgIFNlZ21lbnRhdGlvbiBmYXVsdCAgICAgICAjIE5vdGUgOiB0aGUgbGlzdCBubyBsb25nZXIgZXhpc3RzIQoKICAgICAgICAgIE5vdywgYW4gZXJyb3Igd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiByZWRlZmluaW5nIHRoZSBjb21tYW5kLgogICAgICAgICAgQXMgaW4gOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XQogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdCiAgICAgICAgICAgICAgICAgT2JqZWN0IG5hbWUgYWxyZWFkeSBleGlzdHMhCgogICAgICAgICAgVXNlIGNhdGNoe30gdG8gaWdub3JlIHRoZSBlcnJvci4KCjMvMy85NyAgOiBCZXR0ZXIgc3VwcG9ydCBmb3IgZW51bXMgYWRkZWQuICAgRGF0YXR5cGVzIG9mICdlbnVtIE15RW51bScKICAgICAgICAgIGFuZCB0eXBlZGVmcyBzdWNoIGFzICd0eXBlZGVmIGVudW0gTXlFbnVtIEZvbzsnIG5vdyB3b3JrLgoKMy8zLzk3ICA6IFBhcnNlciBtb2RpZmllZCB0byBpZ25vcmUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgIGludCBhLGI7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgRm9vKGludCBpKSA6IGEoMCksIGIoaSksIEJhcihpLDApIHsgfTsKICAgICAgICAgICAgICAgfTsKCjMvMy85NyAgOiBNb2RpZmllZCBwYXJzZXIgdG8gaWdub3JlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSkgdGhyb3coWCxZKTsKCjMvMy85NyAgOiBBZGRlZCAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICVleHRlcm4KICAgICAgICAgIGV4Y2VwdCBpdCB0ZWxscyB0aGUgbGFuZ3VhZ2UgbW9kdWxlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgIGNvbWluZyBmcm9tIGEgc2VwYXJhdGUgbW9kdWxlLiAgIFRoaXMgaXMgdXN1YWxseSBvbmx5CiAgICAgICAgICBuZWVkZWQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMuCgozLzIvOTcgIDogQ2hhbmdlZCBwb2ludGVyIHR5cGUtY2hlY2tlciB0byBiZSBzaWduaWZpY2FudGx5IG1vcmUKICAgICAgICAgIGVmZmljaWVudCB3aGVuIHdvcmtpbmcgd2l0aCBkZXJpdmVkIGRhdGF0eXBlcy4gIFRoaXMKICAgICAgICAgIGhhcyBiZWVuIGFjY29tcGxpc2hlZCBieSBzdG9yaW5nIHR5cGUtbWFwcGluZ3MgaW4gc29ydGVkCiAgICAgICAgICBvcmRlciwgdXNpbmcgYmluYXJ5IHNlYXJjaCBzY2hlbWVzLCBhbmQgY2FjaGluZyByZWNlbnRseQogICAgICAgICAgdXNlZCBkYXRhdHlwZXMuICAgRm9yIFNXSUcgZ2VuZXJhdGVkIEMrKyBtb2R1bGVzIHRoYXQKICAgICAgICAgIG1ha2UgYSBsYXJnZSBudW1iZXIgb2YgQyBmdW5jdGlvbiBjYWxscyB3aXRoIGRlcml2ZWQgdHlwZXMsCiAgICAgICAgICB0aGlzIGNvdWxkIHJlc3VsdCBpbiBzcGVlZHVwcyBvZiBiZXR3ZWVuIDEwMCBhbmQgNTAwMDAgcGVyY2VudC4KICAgICAgICAgIEhvd2V2ZXIsIGR1ZSB0byB0aGUgcmVxdWlyZWQgc29ydGluZyBvcGVyYXRpb24sIG1vZHVsZQogICAgICAgICAgbG9hZGluZyB0aW1lIG1heSBpbmNyZWFzZWQgc2xpZ2h0bHkgd2hlbiB0aGVyZSBhcmUgbG90cyBvZgogICAgICAgICAgZGF0YXR5cGVzLgoKMy8yLzk3ICA6IEZpeGVkIHNvbWUgQysrIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggUHl0aG9uCiAgICAgICAgICBlbWJlZC5pIGxpYnJhcnkgZmlsZXMuCgoyLzI3Lzk3IDogU2xpZ2h0IGNoYW5nZSB0byBDKysgY29kZSBnZW5lcmF0aW9uIHRvIHVzZSBjb3B5IGNvbnN0cnVjdG9ycwogICAgICAgICAgd2hlbiByZXR1cm5pbmcgY29tcGxleCBkYXRhIHR5cGUgYnkgdmFsdWUuCgoyLzI2Lzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgd2l0aCAtYyBvcHRpb24uCgoyLzI2Lzk3IDogU2xpZ2h0IHR3ZWFrIG9mIHBhcnNlciB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtZXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIChBTEUsIFNUT1VULCBMQUdFUiwgfTsKCjIvMjUvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIGluIFRjbCBtb2R1bGUgd2hlbiB1c2luZyB0aGUKICAgICAgICAgICVuYW1lKCkgZGlyZWN0aXZlIG9uIGEgY2xhc3NuYW1lLgoKMi8yNS85NyA6IEZpbmlzaGVkIGNvZGUtc2l6ZSBvcHRpbWl6YXRpb24gb2YgQysrIGNvZGUgZ2VuZXJhdGlvbiB3aXRoCiAgICAgICAgICBpbmhlcml0YW5jZSBvZiBhdHRyaWJ1dGVzLiAgICBJbmhlcml0ZWQgYXR0cmlidXRlcyBub3cKICAgICAgICAgIG9ubHkgZ2VuZXJhdGUgb25lIHNldCBvZiB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSByZS11c2VkCiAgICAgICAgICBpbiBhbnkgZGVyaXZlZCBjbGFzc2VzLiAgIFRoaXMgY291bGQgcHJvdmlkZSBiaWcgY29kZQogICAgICAgICAgc2l6ZSBpbXByb3ZlbWVudHMgaW4gc29tZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgaW50ZXJmYWNlcy4KCjIvMjUvOTcgOiBQZXJsNSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBib3RoIHRoZSBVbml4IGFuZCBXaW5kb3dzCiAgICAgICAgICB2ZXJzaW9ucy4gIFRoZSB3aW5kb3dzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIHdpdGggdGhlCiAgICAgICAgICBBY3RpdmV3YXJlIHBvcnQgb2YgUGVybCA1LjAwMyBydW5uaW5nIHVuZGVyIFdpbmRvd3MgOTUuCiAgICAgICAgICBUaGUgQyBzb3VyY2UgZ2VuZXJhdGVkIGJ5IFNXSUcgc2hvdWxkIGNvbXBpbGUgd2l0aG91dAogICAgICAgICAgbW9kaWZpY2F0aW9uIHVuZGVyIGJvdGggdmVyc2lvbnMgb2YgUGVybCwgYnV0IGlzIG5vdwogICAgICAgICAgZXZlbiBtb3JlIGhpZGVvdXMgdGhhbiBiZWZvcmUuCgoyLzI1Lzk3IDogTW9kaWZpZWQgcGFyc2VyIHRvIGFsbG93IHNjb3BlIHJlc29sdXRpb24gb3BlcmF0aW9uIHRvCiAgICAgICAgICBhcHBlYXIgaW4gZXhwcmVzc2lvbnMgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGFzIGluIDoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgYSA9ICBCYXI6OmRlZnZhbHVlKTsKCjIvMjUvOTcgOiBGaXhlZCBidWcgd2hlbiByZXNvbHZpbmcgc3ltYm9scyBpbnNpZGUgQysrIGNsYXNzZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBlbnVtIFZhbHVlIHtBTEUsIFNUT1VULCBMQUdFUn07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIHZvaWQgZGVmYXJnKFZhbHVlIHYgPSBTVE9VVCk7CgogICAgICAgICAgICAgIH07CgoyLzI0Lzk3IDogRml4ZWQgYnVnIHdpdGggbWVtYmVyIGZ1bmN0aW9ucyByZXR1cm5pbmcgdm9pZCAqLgoKMi8yMy85NyA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgdW5kZXIgV2luZG93cwoKICAgICAgICAgICAgLSAgTW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIG5vdyBwcm9wZXJseSBleHBvcnRlZC4KICAgICAgICAgICAgICAgSXQgc2hvdWxkIG5vdCBiZSBuZWNjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAgeW91cnNlbGYuCgogICAgICAgICAgICAtICBCaXphcnJlIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIKICAgICAgICAgICAgICAgY29kZSBhcyBBTlNJIEMgdW5kZXIgVmlzdWFsIEMrKyA0LnggZml4ZWQuCgogICAgICAgICAgICAtICBUZXN0ZWQgd2l0aCBib3RoIHRoZSBzdG9jayBQeXRob24tMS40IGRpc3RyaWJ1dGlvbiBhbmQgUHl0aG9ud2luCiAgICAgICAgICAgICAgIHJ1bm5pbmcgdW5kZXIgV2luOTUuCgoyLzE5Lzk3IDogRml4ZWQgdHlwZWRlZiBoYW5kbGluZyBidWcgaW4gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoyLzE5Lzk3IDogQWRkZWQgZXhjZXB0aW9uIHN1cHBvcnQuICBUbyB1c2UgaXQsIGRvIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICAlZXhjZXB0KGxhbmcpIHsKICAgICAgICAgICAgICAgICAgLi4uIHRyeSBwYXJ0IG9mIHRoZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAuLi4gY2F0Y2ggcGFydCBvZiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICRmdW5jdGlvbiBpcyBhIFNXSUcgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgYWN0dWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgaW4gYSB3cmFwcGVyIGZ1bmN0aW9uLiAgVGh1cywKICAgICAgICAgIGEgcmVhbCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgJWV4Y2VwdChwZXJsNSkgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoY2hhciAqJiBzeikgewogICAgICAgICAgICAgICAgICAgIC4uLiBwcm9jZXNzIGFuIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgfSBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICBjcm9haygiVW5rbm93biBleGNlcHRpb24uIEJhaWxpbmcgb3V0Li4uIik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KCjIvMTkvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBtYW5hZ2luZyBnZW5lcmljIGNvZGUgZnJhZ21lbnRzIChuZWVkZWQKICAgICAgICAgIGZvciBleGNlcHRpb25zKS4KCjIvMTkvOTcgOiBGaXhlZCBzb21lIHJlYWxseSBvYnNjdXJlIHR5cGVtYXAgc2NvcGluZyBidWdzIGluIHRoZSBDKysKICAgICAgICAgIGhhbmRsZXIuCgoyLzE4Lzk3IDogQ2xlYW5lZCB1cCBwZXJsbWFpbi5pIGZpbGUgYnkgcmVtb3Zpbmcgc29tZSBwcm9ibGVtYXRpYywKICAgICAgICAgIGJ1dCBzZWVtaW5nbHkgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb25zLgoKMi8xOC85NyA6IE9wdGltaXplZCBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb25zIHVuZGVyIGluaGVyaXRhbmNlLgogICAgICAgICAgU1dJRyBjYW4gbm93IHVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIGEKICAgICAgICAgIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiByZWdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yCiAgICAgICAgICB0aGUgc2FtZSBmdW5jdGlvbnMgaW4gYSBkZXJpdmVkIGNsYXNzLiAgICBUaGlzIGNvdWxkCiAgICAgICAgICBtYWtlIGEgZHJhc3RpYyByZWR1Y3Rpb24gaW4gd3JhcHBlciBjb2RlIHNpemUgZm9yIEMrKwogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggZGVlcCBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyBhbmQKICAgICAgICAgIGxvdHMgb2YgZnVuY3Rpb25zLgoKMi8xOC85NyA6IEFkZGl0aW9uYWwgbWV0aG9kcyBzcGVjaWZpZWQgd2l0aCAlYWRkbWV0aG9kcyBjYW4gbm93CiAgICAgICAgICBiZSBpbmhlcml0ZWQgYWxvbmcgd2l0aCBub3JtYWwgQysrIG1lbWJlciBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogTWlub3IgaW50ZXJuYWwgZml4ZXMgdG8gbWFrZSBTV0lHJ3Mgc3RyaW5nIGhhbmRsaW5nIGEgbGl0dGxlCiAgICAgICAgICBzYWZlci4KCjIvMTYvOTcgOiBNb3ZlZCBzb21lIGNvZGUgZ2VuZXJhdGlvbiBvZiBUY2wgc2hhZG93IGNsYXNzZXMgdG8KICAgICAgICAgIGxpYnJhcnkgZmlsZXMuCgoyLzE2Lzk3IDogRml4ZWQgZG9jdW1lbnRhdGlvbiBlcnJvciBvZiAnLWNvbmZpZ3VyZScgbWV0aG9kIGluCiAgICAgICAgICBUY2wgbW9kdWxlcy4KCjIvMTYvOTcgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgc2xpZ2h0bHkgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgIHRvIHVzZSBQZXJsIHJlZmVyZW5jZXMuCgoyLzEyLzk3IDogRml4ZWQgYXJndW1lbnQgY2hlY2tpbmcgYnVnIHRoYXQgd2FzIGludHJvZHVjZWQgYnkKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIChmdW5jdGlvbiBjYWxscyB3aXRoIHRvbyBtYW55CiAgICAgICAgICBhcmd1bWVudHMgd291bGQgc3RpbGwgYmUgZXhlY3V0ZWQpLiAgRnVuY3Rpb25zIG5vdwogICAgICAgICAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYXMgQyB2ZXJzaW9uCiAgICAgICAgICAod2l0aCBwb3NzaWJpbGl0eSBvZiBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgc3RpbGwgc3VwcG9ydGVkKS4KCjIvMTIvOTcgOiBGaXhlZCBkZWZhdWx0IGFyZ3VtZW50IGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgZ2VuZXJhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgZGVmYXVsdAogICAgICAgICAgYXJndW1lbnRzIG9mIGNvbXBsZXggZGF0YXR5cGVzLgoKMi8xMi85NyA6IEZpeGVkIHR5cGVtYXAgc2NvcGluZyBwcm9ibGVtcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIGdldCBhIGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBkb3VibGUgYmFyKGRvdWJsZSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gbmV3IGdldCBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgYXBwbHkgdGhlIHNlY29uZCB0eXBlbWFwIHRvIGFsbCBmdW5jdGlvbnMgaW4gRm9vCiAgICAgICAgICBkdWUgdG8gZGVsYXllZCBnZW5lcmF0aW9uIG9mIEMrKyB3cmFwcGVyIGNvZGUgKGNsZWFybHkgdGhpcwogICAgICAgICAgaXMgbm90IHRoZSBkZXNpcmVkIGVmZmVjdCkuICAgUHJvYmxlbSBoYXMgYmVlbiBmaXhlZCBieQogICAgICAgICAgYXNzaWduaW5nIHVuaXF1ZSBudW1lcmljYWwgaWRlbnRpZmllcnMgdG8gZXZlcnkgZGF0YXR5cGUgaW4KICAgICAgICAgIGFuIGludGVyZmFjZSBmaWxlIGFuZCByZWNvcmRpbmcgdGhlICJyYW5nZSBvZiBlZmZlY3QiIG9mIGVhY2gKICAgICAgICAgIHR5cGVtYXAuCgoyLzExLzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgImlnbm9yZSIgYW5kICJkZWZhdWx0IiB0eXBlbWFwcy4gIE9ubHkgdXNlCiAgICAgICAgICBpZiB5b3UgYWJzb2x1dGVseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKMi85Lzk3ICA6IEFkZGVkIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvcgogICAgICAgICAgQyBzdHJ1Y3RzIGFuZCBDKysgY2xhc3NlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFueSBzb3J0IG9mCiAgICAgICAgICBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCBieQogICAgICAgICAgcnVubmluZyBTV0lHIHdpdGggdGhlICctbWFrZV9kZWZhdWx0JyBvcHRpb24gb3IgYnkgaW5zZXJ0aW5nCiAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbnRvIGFuIGludGVyZmFjZSBmaWxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYSBtYWtlX2RlZmF1bHQKCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHByYWdtYSBkaXNhYmxlcyBhdXRvbWF0aWMgY29uc3RydWN0b3IgZ2VuZXJhdGlvbgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQKCjIvOS85NyAgOiBBZGRlZCAtbWFrZV9kZWZhdWx0IG9wdGlvbiBmb3IgcHJvZHVjaW5nIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgZm9yIGNsYXNzZXMgd2l0aG91dCB0aGVtLgoKMi85Lzk3ICA6IENoYW5nZWQgdGhlIHN5bnRheCBvZiB0aGUgU1dJRyAlcHJhZ21hIGRpcmVjdGl2ZSB0bwogICAgICAgICAgJXByYWdtYSBvcHRpb249dmFsdWUgb3IgJXByYWdtYShsYW5nKSBvcHRpb249dmFsdWUuCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgc3ludGF4IGEgbGl0dGxlIG1vcmUgY29uc2lzdGVudAogICAgICAgICAgYmV0d2VlbiBnZW5lcmFsIHByYWdtYXMgYW5kIGxhbmd1YWdlLXNwZWNpZmljIHByYWdtYXMuCiAgICAgICAgICBUaGUgb2xkIHN5bnRheCBzdGlsbCB3b3JrcywgYnV0IHdpbGwgcHJvYmFibHkgYmUgcGhhc2VkCiAgICAgICAgICBvdXQgKGEgd2FybmluZyBtZXNzYWdlIGlzIGN1cnJlbnRseSBwcmludGVkKS4KCjIvOS85NyAgOiBJbXByb3ZlZCBUY2wgc3VwcG9ydCBvZiBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIG9mCiAgICAgICAgICBzdHJ1Y3R1cmVzLCBjbGFzc2VzLCBhbmQgdW5pb25zLgoKMi85Lzk3ICA6IEZpeGVkIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtIGluIFB5dGhvbiAnZW1iZWQuaScgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIG1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHBlcmxtYWluLmkgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byByZXR1cm4gYW4gQXR0cmlidXRlRXJyb3Igd2hlbgogICAgICAgICAgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2VkIChvbGRlciB2ZXJzaW9ucyByZXR1cm5lZAogICAgICAgICAgYSBOYW1lRXJyb3IpLgoKMi85Lzk3ICA6IEZpeGVkIGJ1ZyB3aGVuICVhZGRtZXRob2RzIGlzIHVzZWQgYWZ0ZXIgYSBjbGFzcyBkZWZpbml0aW9uIHdob3NlCiAgICAgICAgICBsYXN0IHNlY3Rpb24gaXMgcHJvdGVjdGVkIG9yIHByaXZhdGUuCgoyLzgvOTcgIDogTWFkZSBzbGlnaHQgY2hhbmdlcyBpbiBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB0byBzdXBwb3J0CiAgICAgICAgICB0aGUgTWFjaW50b3NoLgoKMi84Lzk3ICA6IEV4dGVuZGVkIHN3aWdtYWluLmN4eCB0byBwcm92aWRlIGEgcnVkaW1lbnRhcnkgTWFjaW50b3NoIGludGVyZmFjZS4KICAgICAgICAgIEl0J3MgYSByZWFsbHkgYmFkIGludGVyZmFjZSwgYnV0IHdvcmtzIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIKICAgICAgICAgIGlzIHdyaXR0ZW4uCgoxLzI5Lzk3IDogRml4ZWQgdHlwZS1jYXN0aW5nIGJ1ZyBpbnRyb2R1Y2VkIGJ5IDEuMWI0IHdoZW4gc2V0dGluZy9nZXR0aW5nIHRoZQogICAgICAgICAgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbnZvbHZpbmcgY29tcGxleCBkYXRhIHR5cGVzLgoKMS8yOS85NyA6IFJlbW92ZWQgZXJyb25lb3VzIHdoaXRlIHNwYWNlIGJlZm9yZSBhbiAjZW5kaWYgaW4gdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICBieSB0aGUgUHl0aG9uIG1vZHVsZSAod2FzIGNhdXNpbmcgZXJyb3JzIG9uIERFQyBBbHBoYSBjb21waWxlcnMpLgoKMS8yNi85NyA6IEZpeGVkIGVycm9ycyB3aGVuIHVzaW5nIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGluIFB5dGhvbiBzaGFkb3cKCSAgc2hhZG93IGNsYXNzZXMuCgoxLzIzLzk3IDogRml4ZWQgYnVnIHdpdGggbmVzdGVkICVleHRlcm4gZGVjbGFyYXRpb25zLgoKMS8yMS85NyA6IEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIGludm9sdmluZyBjb25zdCBkYXRhdHlwZXMuCgoxLzIxLzk3IDogU29tZXdoYXQgb2JzY3VyZSwgYnV0IHNlcmlvdXMgYnVnIHdpdGggaGF2aW5nIG11bHRpcGxlIGxldmVscwogICAgICAgICAgb2YgdHlwZWRlZnMgZml4ZWQuICBGb3IgZXhhbXBsZSA6CgoJCXR5cGVkZWYgY2hhciAqU3RyaW5nOwogICAgICAgICAgICAgICAgdHlwZWRlZiBTdHJpbmcgIE5hbWU7CgpWZXJzaW9uIDEuMSBCZXRhNCAoSmFudWFyeSAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogU1dJRyAxLjFiMyBjcmFzaGVkIGFuZCBidXJuZWQgc2hvcnRseSBhZnRlciB0YWtlIG9mZiBkdWUKdG8gYSBmZXcgbWFqb3IgcnVuLXRpbWUgcHJvYmxlbXMgdGhhdCBzdXJmYWNlZCBhZnRlciByZWxlYXNlLgpUaGlzIHJlbGVhc2Ugc2hvdWxkIGZpeCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aG9zZSBwcm9ibGVtcy4KCjEvMTYvOTcgOiBGaXhlZCBtYWpvciBtZW1vcnkgbWFuYWdlbWVudCBidWcgb24gTGludXgKCjEvMTQvOTcgOiBGaXhlZCBidWcgaW4gZnVuY3Rpb25zIHJldHVybmluZyBjb25zdGFudCBDKysgcmVmZXJlbmNlcy4KCjEvMTQvOTcgOiBNb2RpZmllZCBDKysgbW9kdWxlIHRvIGhhbmRsZSBkYXRhdHlwZXMgYmV0dGVyLgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBhICpzaW5nbGUqIHNjb3BlIHJlc29sdXRpb24KICAgICAgICAgIG9wZXJhdG9yIGluIGRhdGF0eXBlcy4gIEllIDogRm9vOjpiYXIuICAgU1dJRyBkb2Vzbid0CiAgICAgICAgICB5ZXQgaGFuZGxlIG5lc3RlZCBjbGFzc2VzLCBzbyB0aGlzIHNob3VsZCBiZQogICAgICAgICAgc3VmZmljaWVudCBmb3Igbm93LgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyB0eXBlZGVmIGluc2lkZSBhIEMrKyBjbGFzcy4KCjEvMTQvOTcgOiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gZGF0YXR5cGVzIGRlZmluZWQgaW5zaWRlCiAgICAgICAgICBhIEMrKyBjbGFzcy4gIFNXSUcgd2FzIG5vdCBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZSwKICAgICAgICAgIGJ1dCBhIG5ldyBzY29waW5nIG1lY2hhbmlzbSBhbmQgbWV0aG9kIGZvciBoYW5kbGluZwogICAgICAgICAgZGF0YXR5cGVzIGluc2lkZSBhIEMrKyBjbGFzcyBoYXZlIGJlZW4gYWRkZWQuCgoxLzE0Lzk3IDogQ2hhbmdlZCBlbnVtZXJhdGlvbnMgdG8gdXNlIHRoZSB2YWx1ZSBuYW1lIGluc3RlYWQKICAgICAgICAgIG9mIGFueSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnRlcmZhY2UKICAgICAgICAgIGZpbGUuICBUaGlzIG1ha2VzIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgZnJpZW5kbHkgdG8KICAgICAgICAgIEMrKyBjb21waWxlcnMuCgoxLzE0Lzk3IDogUmVtb3ZlZCB0eXBlZGVmIGJ1ZyB0aGF0IG1hZGUgYWxsIGVudW1lcmF0aW9ucwogICAgICAgICAgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyIGluIHRoZSB0eXBlIGNoZWNrZXIgKHNpbmNlCiAgICAgICAgICBpdCBnZW5lcmF0ZWQgYWxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlKS4KClZlcnNpb24gMS4xIEJldGEzIChKYW51YXJ5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogQSAqaHVnZSogbnVtYmVyIG9mIGNoYW5nZXMgcmVsYXRlZCB0byBvbmdvaW5nIG1vZGlmaWNhdGlvbnMuCgoxLiAgU3VwcG9ydCBmb3IgQysrIG11bHRpcGxlIGluaGVyaXRhbmNlIGFkZGVkLgoKMi4gIFR5cGVtYXBzIGFkZGVkLgoKMy4gIFNvbWUgc3VwcG9ydCBmb3IgbmVzdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhZGRlZC4KCjQuICBEZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nIGFkZGVkLgoKNS4gIC1jIG9wdGlvbiBhZGRlZCBmb3IgYnVpbGRpbmcgYmFyZSB3cmFwcGVyIGNvZGUgbW9kdWxlcy4KCjYuICBSZXdyb3RlIFBvaW50ZXIgdHlwZS1jaGVja2luZyB0byBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlCiAgICBjb3JyZWN0bHkuCgo3LiAgVGNsIDguMCBtb2R1bGUgYWRkZWQuCgo4LiAgUGVybDQgYW5kIEd1aWxlIG1vZHVsZXMgcmVzdXJyZWN0ZWQgZnJvbSB0aGUgZGVhZCAod2VsbCwgdGhleQogICAgYXQgbGVhc3Qgd29yayBhZ2FpbikuCgo5LiAgTmV3IE9iamVjdCBPcmllbnRlZCBUY2wgaW50ZXJmYWNlIGFkZGVkLgoKMTAuIEJ1ZyBmaXhlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjExLiBDbGVhbmVkIHVwIG1hbnkgb2YgdGhlIGludGVybmFsIG1vZHVsZXMgb2YgdGhlIHBhcnNlci4KCjEyLiBUb25zIG9mIGV4YW1wbGVzIGFuZCB0ZXN0aW5nIG1vZHVsZXMgYWRkZWQuCgoxMy4gRml4ZWQgYnVncyByZWxhdGVkIHRvIHVzZSBvZiAiY29uc3QiIHJldHVybiB2YWx1ZXMuCgoxNC4gRml4ZWQgYnVnIHdpdGggQysrIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjE1LiBDaGFuZ2VkIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQuCgpWZXJzaW9uIDEuMSBCZXRhMiAoRGVjZW1iZXIgMywgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgY2hhbmdlcwogICBpbnZvbHZlZCBhcmUgdG9vIG51bWVyb3VzIHRvIG1lbnRpb24uICBCYXNpY2FsbHksIHRha2UgZXZlcnl0aGluZwogICB5b3Uga25ldyBhYm91dCB0aGUgb2xkIHN5c3RlbSwgdGhyb3cgdGhlbSBvdXQsIGFuZCByZWFkIHRoZQogICBmaWxlIERvYy9kb2MucHMuCgoyLiBMaW1pdGVkIHN1cHBvcnQgZm9yICNpZiBkZWZpbmVkKCkgYWRkZWQuCgozLiBUeXBlIGNhc3RzIGFyZSBub3cgYWxsb3dlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gIGllCgogICAgICAgICAjZGVmaW5lICBBICAgKGludCkgMwoKNC4gQWRkZWQgc3VwcG9ydCBmb3IgdHlwZWRlZiBsaXN0cy4gIEZvciBleGFtcGxlIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgICAgIGRvdWJsZSB4LHksejsKICAgICAgICB9IFZlY3RvciwgKlZlY3RvclB0cjsKCjUuIE5ldyBTV0lHIGRpcmVjdGl2ZXMgKHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBzeXN0ZW0pCgoJJXN0eWxlCgklbG9jYWxzdHlsZQoJJXN1YnNlY3Rpb24KCSVzdWJzdWJzZWN0aW9uCgo2LiBSZW9yZ2FuaXplZCB0aGUgQysrIGhhbmRsaW5nIGFuZCBtYWRlIGl0IGEgbGl0dGxlIGVhc2llciB0bwogICB3b3JrIHdpdGggaW50ZXJuYWxseS4KCjcuICBGaXhlZCBwcm9ibGVtIHdpdGggaW5oZXJpdGluZyBkYXRhIG1lbWJlcnMgaW4gUHl0aG9uCiAgICBzaGFkb3cgY2xhc3Nlcy4KCjguICBGaXhlZCBzeW1ib2wgdGFibGUgcHJvYmxlbXMgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBib3RoCiAgICBQeXRob24gYW5kIFBlcmwuCgo5LiAgRml4ZWQgYW5ub3lpbmcgc2VnbWVudGF0aW9uIGZhdWx0IGJ1ZyBpbiB3cmFwcGVyIGNvZGUKICAgIGdlbmVyYXRlZCBmb3IgUGVybDUuCgoxMC4gRml4ZWQgYnVnIHdpdGggJWFkZG1ldGhvZHMgZGlyZWN0aXZlLiAgTm93IGl0IGNhbiBiZSBwbGFjZWQKICAgIGFueXdoZXJlIGluIGEgY2xhc3MuCgoxMS4gTW9yZSB0ZXN0IGNhc2VzIGFkZGVkIHRvIHRoZSBTV0lHIHNlbGYtdGVzdC4gICBEb2N1bWVudGF0aW9uCiAgICB0ZXN0cyBhcmUgbm93IHBlcmZvcm1lZCBhbG9uZyB3aXRoIG90aGVyIHRoaW5ncy4KCjEyLiBSZW9yZ2FuaXplZCB0aGUgU1dJRyBsaWJyYXJ5IGEgbGl0dGxlIGJpdCBhbmQgc2V0IGl0IHVwIHRvCiAgICBzZWxmLWRvY3VtZW50IGl0c2VsZiB1c2luZyBTV0lHLgoKMTMuIExvdHMgYW5kIGxvdHMgb2YgbWlub3IgYnVnIGZpeGVzIChtb3N0bHkgb2JzY3VyZSwgYnV0IGJ1Z3MKICAgIG5vbmV0aGVsZXNzKS4KCgpWZXJzaW9uIDEuMSBCZXRhMSAoT2N0b2JlciAzMCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBBZGRlZCBuZXcgJWV4dGVybiBkaXJlY3RpdmUgZm9yIGhhbmRsaW5nIG11bHRpcGxlIGZpbGVzCgoyLiBQZXJsNSBzaGFkb3cgY2xhc3NlcyBhZGRlZAoKMy4gUmV3cm90ZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byB3b3JrIGJldHRlcgoKNC4gQWRkZWQgJ2Jvb2wnIGRhdGF0eXBlCgo1LiAleywlfSBibG9jayBpcyBub3cgb3B0aW9uYWwuCgo2LiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgbW9kdWxlCgo3LiBSZXdyb3RlIGFsbCBvZiB0aGUgU1dJRyB0ZXN0cyB0byBiZSBtb3JlIGluZm9ybWF0aXZlCiAgIChhbmQgbGVzcyBzY2FyeSkuCgo4LiBSZXdyb3RlIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nIHRvIGJlIG1vcmUgbWVtb3J5CiAgIGVmZmljaWVudCBhbmQgZmxleGlibGUuCgo5LiBDaGFuZ2VkIHBhcnNlciB0byBpZ25vcmUgJ3N0YXRpYycgZGVjbGFyYXRpb25zLgoKMTAuIEluaXRpYWxpemVycyBhcmUgbm93IGlnbm9yZWQuICBGb3IgZXhhbXBsZSA6CgoJc3RydWN0IEZvb0JhciBhID0gezMsNCw1fTsKCjExLiBTb21ld2hhdCBiZXR0ZXIgcGFyc2luZyBvZiBhcnJheXMgKGFsdGhvdWdoIGl0J3MKICAgIHVzdWFsbHkganVzdCBhIGJldHRlciBlcnJvciBtZXNzYWdlIG5vdykuCgoxMi4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzLgoKClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMzEsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBGaXhlZCBtaW5vciBidWcgaW4gQysrIG1vZHVsZQoKMi4gRml4ZWQgbWlub3IgYnVnIGluIHBvaW50ZXIgdHlwZS1jaGVja2VyIHdoZW4gdXNpbmcKICAgLURBTExPV19OVUxMLgoKMy4gRml4ZWQgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrIHdpdGggUHl0aG9uIDEuNGJldGEzCgo0LiBDaGFuZ2VkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aG91dAogICB5YWNjIG9yIGJpc29uLgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAyOCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBDaGFuZ2VkIHBhcnNlciB0byBzdXBwb3J0IG1vcmUgQy9DKysgZGF0YXR5cGVzICh3ZWxsLAogICAgbW9yZSB2YXJpYW50cykuICAgVHlwZXMgbGlrZSAidW5zaWduZWQiLCAic2hvcnQgaW50IiwKICAgICJsb25nIGludCIsIGV0Yy4uLiBub3cgd29yay4KCjIuICAidW5pb25zIiBhZGRlZCB0byBwYXJzZXIuCgozLiAgVXNlIG9mICJ0eXBlZGVmIiBhcyBpbiA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICBkb3VibGUgeCx5LHo7Cgl9IFZlY3RvcjsKCiAgICBOb3cgd29ya3MgY29ycmVjdGx5LiAgIFRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGlzIHVzZWQgYXMKICAgIHRoZSBzdHJ1Y3R1cmUgbmFtZS4KCjQuICBDb25kaXRpb25hbCBjb21waWxhdGlvbiB3aXRoICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwgZXRjLi4uCiAgICBhZGRlZC4KCjUuICBOZXcgJWRpc2FibGVkb2MsICVlbmFibGVkb2MgZGlyZWN0aXZlcyBhbGxvdyBkb2N1bWVudGF0aW9uCiAgICB0byBzZWxlY3RpdmVseSBiZSBkaXNhYmxlZCBmb3IgY2VydGFpbiBwYXJ0cyBvZiBhIHdyYXBwZXIKICAgIGZpbGUuCgo2LiAgTmV3IFB5dGhvbiBtb2R1bGUgc3VwcG9ydHMgYmV0dGVyIHZhcmlhYmxlIGxpbmtpbmcsIGNvbnN0YW50cywKICAgIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjcuICBQZXJsNSBtb2R1bGUgaW1wcm92ZWQgd2l0aCBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFhTCiAgICBhbmQgeHN1YnBwLiAgIFNXSUcgcG9pbnRlcnMgYW5kIG5vdyBjcmVhdGVkIHNvIHRoYXQgdGhleQogICAgYXJlIGNvbXBhdGlibGUgd2l0aCB4c3VicHAgcG9pbnRlcnMuCgo4LiAgU3VwcG9ydCBmb3IgW2luY3IgVGNsXSBuYW1lc3BhY2VzIGFkZGVkIHRvIFRjbCBtb2R1bGUuCgo5LiAgJXByYWdtYSBkaXJlY3RpdmUgYWRkZWQuCgoxMC4gJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGFkZGVkLgoKMTEuICVuYXRpdmUgZGlyZWN0aXZlIGFkZGVkIHRvIGFsbG93IHByZS1leGlzdGluZyB3cmFwcGVyIGZ1bmN0aW9ucwogICAgdG8gYmUgdXNlZC4KCjEyLiBXcm90ZSBjb25maWd1cmUgc2NyaXB0IGZvciBTV0lHIGluc3RhbGxhdGlvbi4KCjEzLiBGdW5jdGlvbiBwb2ludGVycyBub3cgYWxsb3dlZCB3aXRoIHR5cGVkZWYgc3RhdGVtZW50cy4KCjE0LiAldHlwZWRlZiBtb2RpZmllZCB0byBpbnNlcnQgYSBjb3JyZXNwb25kaW5nIEMgdHlwZWRlZiBpbnRvCiAgICB0aGUgb3V0cHV0IGZpbGUuCgoxNS4gRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIEMrKyByZWZlcmVuY2VzLgoKMTYuIE5ldyBTdHJpbmcgYW5kIFdyYXBwZXJGdW5jdGlvbiBjbGFzc2VzIGFkZCB0byBtYWtlIGdlbmVyYXRpbmcKICAgIHdyYXBwZXIgY29kZSBlYXNpZXIuCgoxNy4gRml4ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIHRvIGVsaW1pbmF0ZSBjb3JlIGR1bXBzCiAgICBhbmQgdG8gYWxsb3cgaGVscCBtZXNzYWdlcy4KCjE4LiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGFsbCBjb2RlIG1vZHVsZXMKCgpWZXJzaW9uIDEuMCBCZXRhIDMgKFBhdGNoIDEpIEp1bHkgMTcsIDE5OTYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLjAgRmluYWwgaXMgbm90IHF1aXRlIHJlYWR5IHlldCwgYnV0IHRoaXMgcmVsZWFzZSBmaXhlcyBhCm51bWJlciBvZiBpbW1lZGlhdGUgcHJvYmxlbXMgOgoKMS4gIENvbXBpbGVyIGVycm9ycyB3aGVuIHVzaW5nIC1zdHJpY3QgMSB0eXBlIGNoZWNraW5nIGhhdmUgYmVlbiBmaXhlZC4KCjIuICBQb2ludGVyIHR5cGUgY2hlY2tlciBub3cgcmVjb2duaXplcyBwb2ludGVycyBvZiB0aGUgZm9ybQogICAgXzBfVHlwZSBjb3JyZWN0bHkuCgozLiAgQSBmZXcgbWlub3IgZml4ZXMgd2VyZSBtYWRlIGluIHRoZSBNYWtlZmlsZQoKVmVyc2lvbiAxLjAgQmV0YSAzIChKdW5lIDE0LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKVGhlcmUgYXJlIGxvdHMgb2YgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UgOgoKMS4gIFNXSUcgaXMgbm93IGludm9rZWQgdXNpbmcgdGhlICJzd2lnIiBjb21tYW5kIGluc3RlYWQgb2YgIndyYXAiLgogICAgSGV5LCBzd2lnIHNvdW5kcyBjb29sZXIuCgoyLiAgVGhlIFNXSUdfTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gY2hhbmdlIHRoZQogICAgbG9jYXRpb24gd2hlcmUgU1dJRyBsb29rcyBmb3IgbGlicmFyeSBmaWxlcy4KCjMuICBDKysgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gICBZb3Ugc2hvdWxkIHVzZSB0aGUgLWMrKyBvcHRpb24KICAgIHRvIGVuYWJsZSBpdC4KCjQuICBUaGUgJWluaXQgZGlyZWN0aXZlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4KICAgICVtb2R1bGUgY29uc3RydWN0cyBhIHZhbGlkIG5hbWUgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgZm9yIHdoYXRldmVyIHRhcmdldCBsYW5ndWFnZSB5b3UncmUgdXNpbmcgKGFjdHVhbGx5IHRoaXMgbWFrZXMKICAgIFNXSUcgZmlsZXMgYSBsaXR0bGUgY2xlYW5lcikuICBUaGUgb2xkICVpbml0IGRpcmVjdGl2ZSBzdGlsbCB3b3Jrcy4KCjUuICBUaGUgc3ludGF4IG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgaGFzIGJlZW4gY2hhbmdlZC4gICBVc2Ugb2YgdGhlCiAgICBvbGQgb25lIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IG1heSBzdGlsbCB3b3JrLgoKNi4gIFRvIHN1cHBvcnQgVGNsL1RrIG9uIG5vbi11bml4IHBsYXRmb3JtcywgU1dJRyBpbXBvcnRzIGEgZmlsZSBjYWxsZWQKICAgIHN3aWd0Y2wuY2ZnIGZyb20gdGhlICQoU1dJR19MSUIpL3RjbCBkaXJlY3RvcnkuICAgSSBkb24ndCBoYXZlIGFjY2VzcwogICAgdG8gYW4gTlQgbWFjaGluZSwgYnV0IHRoaXMgZmlsZSBpcyBzdXBwb3NlZGx5IGFsbG93cyBTV0lHIHRvCiAgICBwcm9kdWNlIHdyYXBwZXIgY29kZSB0aGF0IGNvbXBpbGVzIG9uIGJvdGggVU5JWCBhbmQgbm9uIFVOSVggbWFjaGluZXMuCiAgICBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gZWRpdCB0aGUgZmlsZSBzd2lndGNsLmNmZy4gUGxlYXNlCiAgICBsZXQgbWUga25vdyBpZiB0aGlzIGRvZXNuJ3Qgd29yayBzbyBJIGNhbiB1cGRhdGUgdGhlIGZpbGUgYXMKICAgIG5lY2Vzc2FyeS4KCjcuICBUaGUgU1dJRyBydW4tdGltZSB0eXBlY2hlY2tlciBoYXMgYmVlbiBpbXByb3ZlZC4gICAgWW91IGNhbiBhbHNvCiAgICBub3cgcmVkZWZpbmUgaG93IGl0IHdvcmtzIGJ5IHN1cHBseWluZyBhIGZpbGUgY2FsbGVkICJzd2lncHRyLmNmZyIKICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIFNXSUcgaW50ZXJmYWNlIGZpbGVzLiAgIEJ5IGRlZmF1bHQsCiAgICBTV0lHIHJlYWRzIHRoaXMgZmlsZSBmcm9tICQoU1dJR19MSUIpL2NvbmZpZy4KCjguICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgOgoKCS0gIERvY3VtZW50YXRpb24gb3JkZXIgaXMgcHJpbnRlZCBpbiBpbnRlcmZhY2UgZmlsZSBvcmRlciBieQogICAgICAgICAgIGRlZmF1bHQuICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwdXR0aW5nIGFuICVhbHBoYQogICAgICAgICAgIGRpcmVjdGl2ZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgLSAgWW91IGNhbiBzdXBwbHkgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHRleHQgdXNpbmcKCiAgICAgICAgICAgJXRleHQgJXsgcHV0IHlvdXIgdGV4dCBoZXJlICV9CgogICAgICAgIC0gIEEgZmV3IG1pbm9yIGJ1Z3Mgd2VyZSBmaXhlZC4KCjkuICBBIGZldyBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGhhbmRsaW5nIG9mIGNvbW1hbmQgbGluZQogICAgb3B0aW9ucyAoYnV0IGl0J3Mgc3RpbGwgbm90IGZpbmlzaGVkKS4KCjEwLiAgTG90cyBvZiBtaW5vciBidWcgZml4ZXMgaW4gbW9zdCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIGJlZW4KICAgICBtYWRlLgoKMTEuIEZpbGVuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB0byA4LjMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhIFNXSUcKICAgIHBvcnQgdG8gbm9uLXVuaXggcGxhdGZvcm1zICh3b3JrIGluIHByb2dyZXNzKS4KCjEyLiBDKysgZmlsZSBzdWZmaXggaXMgbm93IC5jeHggKGZvciBzYW1lIHJlYXNvbikuCgoxMy4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBncmFkZWQgc2lnbmlmaWNhbnRseSBhbmQgaXMgbm93CiAgICBhcm91bmQgMTAwIHBhZ2VzLiAgICBJIGFkZGVkIG5ldyBleGFtcGxlcyBhbmQgYSBzZWN0aW9uIG9uCiAgICBDKysuICBUaGUgZG9jdW1lbnRhdGlvbiBub3cgaW5jbHVkZXMgYSBUYWJsZSBvZiBDb250ZW50cy4KCjE0LiBUaGUgU1dJRyBFeGFtcGxlcyBkaXJlY3RvcnkgaXMgc3RpbGwgd29lZnVsbHkgc3BhcnNlLCBidXQgaXMKICAgIGdldHRpbmcgYmV0dGVyLgoKU3BlY2lhbCBub3RpY2UgYWJvdXQgQysrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIFNXSUcgdG8gc3VwcG9ydCBDKysgcGFyc2luZy4gIEN1cnJlbnRseQp0aGUgQysrIGlzIGZhciBmcm9tIGNvbXBsZXRlLCBidXQgc2VlbXMgdG8gd29yayBmb3Igc2ltcGxlIGNhc2VzLgpObyB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWRkIHNwZWNpYWwgQysrIHByb2Nlc3NpbmcgdG8gYW55IG9mCnRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgIFNlZSB0aGUgdXNlciBtYW51YWwgZm9yIGRldGFpbHMgYWJvdXQgaG93CkMrKyBpcyBoYW5kbGVkLiAgIElmIHlvdSBmaW5kIHByb2JsZW1zIHdpdGggdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwKcGxlYXNlIGxldCBtZSBrbm93LiAgRXhwZWN0IG1ham9yIGltcHJvdmVtZW50cyBpbiB0aGlzIGFyZWEuCgpOb3RlIDogSSBoYXZlIG9ubHkgc3VjY2Vzc2Z1bGx5IHVzZWQgU1dJRyBhbmQgQysrIHdpdGggVGNsIGFuZApQeXRob24uCgpOb3RpY2UgYWJvdXQgVmVyc2lvbiAxLjBGaW5hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVmVyc2lvbiAxLjBCMyBpcyB0aGUgbGFzdCBCZXRhIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gMS4wIEZpbmFsIGlzCnJlbGVhc2VkLiAgSSBoYXZlIGZyb3plbiB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAxLjAKYW5kIHdpbGwgb25seSBmaXggYnVncyBhcyB0aGV5IHNob3cgdXAuICBXb3JrIG9uIFNXSUcgdmVyc2lvbiAyLjAgaXMKYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IGlzIGdvaW5nIHRvIHJlc3VsdCBpbiByYXRoZXIgc2lnbmlmaWNhbnQKY2hhbmdlcyB0byBTV0lHJ3MgaW50ZXJuYWwgc3RydWN0dXJlIChob3BlZnVsbHkgZm9yIHRoZSBiZXR0ZXIpLiAgTm8KYW50aWNpcGF0ZWQgZGF0ZSBmb3IgdmVyc2lvbiAyLjAgaXMgc2V0LCBidXQgaWYgeW91J3ZlIGdvdCBhbiBpZGVhLApsZXQgbWUga25vdy4KClZlcnNpb24gMS4wIEJldGEgMiAoQXByaWwgMjYsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIHJlbGVhc2UgaXMgaWRlbnRpY2FsIHRvIEJldGExIGV4Y2VwdCBhIGZldyBtaW5vciBidWdzIGFyZQpmaXhlZCBhbmQgdGhlIFNXSUcgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41L1RrIDQuMS4KQSB0Y2w3LjUgZXhhbXBsZXMgZGlyZWN0b3J5IGlzIG5vdyBpbmNsdWRlZC4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIE1ha2VmaWxlIHRoYXQgZGlkbid0IGluc3RhbGwgdGhlIGxpYnJhcmllcwogIGNvcnJlY3RseS4KCi0gU1dJRyBMaWJyYXJ5IGZpbGVzIGFyZSBub3cgdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNSBhbmQgVGsgNC4xLgoKLSBNaW5vciBidWcgZml4ZXMgaW4gb3RoZXIgbW9kdWxlcy4KCgpWZXJzaW9uIDEuMCBCZXRhIDEgIChBcHJpbCAxMCwgMTk5NikuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=