QVBBQ0hFIDIuMyBTVEFUVVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0qLXRleHQtKi0KTGFzdCBtb2RpZmllZCBhdCBbJERhdGUkXQoKVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZpbGUgY2FuIGJlIGZvdW5kIGF0OgoKICAqIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvaHR0cGQvaHR0cGQvdHJ1bmsvU1RBVFVTCgpEb2N1bWVudGF0aW9uIHN0YXR1cyBpcyBtYWludGFpbmVkIHNlcGVyYXRlbHkgYW5kIGNhbiBiZSBmb3VuZCBhdDoKCiAgKiBkb2NzL1NUQVRVUyBpbiB0aGlzIHNvdXJjZSB0cmVlLCBvcgogICogaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9odHRwZC9odHRwZC90cnVuay9kb2NzL1NUQVRVUwoKQ29uc3VsdCB0aGUgZm9sbG93aW5nIFNUQVRVUyBmaWxlcyBmb3IgaW5mb3JtYXRpb24gb24gcmVsYXRlZCBwcm9qZWN0czoKCiAgKiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2Fwci9hcHIvdHJ1bmsvU1RBVFVTCiAgKiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2Fwci9hcHItdXRpbC90cnVuay9TVEFUVVMKClBhdGNoZXMgY29uc2lkZXJlZCBmb3IgYmFja3BvcnQgYXJlIG5vdGVkIGluIHRoZWlyIGJyYW5jaGVzJyBTVEFUVVM6CgogICogaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9odHRwZC9odHRwZC9icmFuY2hlcy8xLjMueC9TVEFUVVMKICAqIGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvaHR0cGQvaHR0cGQvYnJhbmNoZXMvMi4wLngvU1RBVFVTCiAgKiBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2h0dHBkL2h0dHBkL2JyYW5jaGVzLzIuMi54L1NUQVRVUwoKClJlbGVhc2UgaGlzdG9yeToKICAgIFtOT1RFIHRoYXQgeC57b2RkfS56IHZlcnNpb25zIGFyZSBzdHJpY3RseSBBbHBoYS9CZXRhIHJlbGVhc2VzLAogICAgICAgICAgd2hpbGUgeC57ZXZlbn0ueiB2ZXJzaW9ucyBhcmUgU3RhYmxlL0dBIHJlbGVhc2VzLl0KCiAgICAyLjMuMCAgIDogaW4gZGV2ZWxvcG1lbnQKCgpDb250cmlidXRvcnMgbG9va2luZyBmb3IgYSBtaXNzaW9uOgoKICAgICogSnVzdCBkbyBhbiBlZ3JlcCBvbiAiVE9ETyIgb3IgIlhYWCIgaW4gdGhlIHNvdXJjZS4KCiAgICAqIFJldmlldyB0aGUgYnVnIGRhdGFiYXNlIGF0OiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvCgogICAgKiBSZXZpZXcgdGhlICJQYXRjaEF2YWlsYWJsZSIgYnVncyBpbiB0aGUgYnVnIGRhdGFiYXNlOgoKICAgICAgaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2J1Z2xpc3QuY2dpP2J1Z19zdGF0dXM9TkVXJmJ1Z19zdGF0dXM9QVNTSUdORUQmYnVnX3N0YXR1cz1SRU9QRU5FRCZwcm9kdWN0PUFwYWNoZStodHRwZC0yLjAma2V5d29yZHM9UGF0Y2hBdmFpbGFibGUKCiAgICAgIEFmdGVyIHRlc3RpbmcsIHlvdSBjYW4gYXBwZW5kIGEgY29tbWVudCBzYXlpbmcgIlJldmlld2VkIGFuZCB0ZXN0ZWQiLgoKICAgICogT3BlbiBidWdzIGluIHRoZSBidWcgZGF0YWJhc2UuCgoKQ1VSUkVOVCBSRUxFQVNFIE5PVEVTOgoKClJFTEVBU0UgU0hPV1NUT1BQRVJTOgoKICAgICogSGFuZGxpbmcgb2Ygbm9uLXRyYWlsaW5nIC8gY29uZmlnIGJ5IG5vbi1kZWZhdWx0IGhhbmRsZXIgaXMgYnJva2VuCiAgICAgIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YXBhY2hlLWh0dHBkLWRldiZtPTEwNTQ1MTcwMTYyODA4MSZ3PTIKICAgICAgamVyZW5rcmFudHogYXNrczogV2h5IHNob3VsZCB0aGlzIGJsb2NrIGEgcmVsZWFzZT8KICAgICAgd3NhbmNoZXogYWdyZWVzOiB0aGlzIG1heSBiZSBhIGNoYW5nZSBpbiBiZWhhdmlvciwgYnV0IGlzbid0CiAgICAgICAgY2xlYXJseSB3cm9uZywgYW5kIGV2ZW4gaWYgc28sIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIGEKICAgICAgICBzaG93c3RvcHBlci4KCiAgICAqIHRoZSBlZGdlIGNvbm5lY3Rpb24gZmlsdGVyIGNhbm5vdCBiZSByZW1vdmVkIAogICAgICBodHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tLz9sPWFwYWNoZS1odHRwZC1kZXYmbT0xMDUzNjYyNTI2MTk1MzAmdz0yCgogICAgICBqZXJlbmtyYW50eiBhc2tzOiBXaHkgc2hvdWxkIHRoaXMgYmxvY2sgYSByZWxlYXNlPwoKICAgICAgc3RhcyByZXBsaWVzOiBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgcmV3cml0ZSBvZiB0aGUgZmlsdGVycyBzdGFjawogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiAoeW91IGhhdmUgc3VnZ2VzdGVkIHRoYXQpIGFuZCBvbmNlIDIuMiBpcwogICAgICAgICAgICByZWxlYXNlZCB5b3UgY2FuJ3QgZG8gdGhhdCBhbnltb3JlLiAKCgpDVVJSRU5UIFZPVEVTOgoKICAgICogSWYgdGhlIHBhcmVudCBwcm9jZXNzIGRpZXMsIHNob3VsZCB0aGUgcmVtYWluaW5nIGNoaWxkIHByb2Nlc3NlcwogICAgICAiZ3JhY2VmdWxseSIgc2VsZi10ZXJtaW5hdGUuIE9yIG1heWJlIHdlIHNob3VsZCBtYWtlIGl0IGEgcnVudGltZQogICAgICBvcHRpb24sIG9yIGhhdmUgYSBjb25jZXB0IG9mIDIgcGFyZW50IHByb2Nlc3NlcyAob25lIGJlaW5nIGEgCiAgICAgICJob3Qgc3BhcmUiKS4KICAgICAgU2VlOiBNZXNzYWdlLUlEOiA8M0M1ODIzMkMuRkU5MUYxOUZAR29sdXguQ29tPgoKICAgICAgU2VsZi1kZXN0cnVjdDogS2VuLCBNYXJ0aW4sIExhcnMKICAgICAgTm90IHNlbGYtZGVzdHJ1Y3Q6IEJyaWFuUCwgSWFuLCBDbGlmZiwgQmlsbFMKICAgICAgTWFrZSBpdCBydW50aW1lIGNvbmZpZ3VyYWJsZTogQWFyb24sIGppbSwgSnVzdGluLCB3cm93ZSwgcmVkZXJwaiwgbmQKCiAgICAgIC8qIFRoZSBiZWxvdyB3YXMgYSBjb25jZXB0IG9uICpob3cqIHRvIGhhbmRsZSB0aGUgcHJvYmxlbSAqLwogICAgICBIYXZlIDIgcGFyZW50czogKzE6IGppbQogICAgICAgICAgICAgICAgICAgICAgLTE6IEp1c3Rpbiwgd3Jvd2UsIHJlZGVycGosIG5kCiAgICAgICAgICAgICAgICAgICAgICArMDogTGFycywgTWFydGluICh3aGlsZSBzdGFuZGluZyBieSwgY291bGQgaXQgZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyB1c2VmdWw/KQoKICAgICogTWFrZSB0aGUgd29ya2VyIE1QTSB0aGUgZGVmYXVsdCBNUE0gZm9yIHRocmVhZGVkIFVuaXggYm94ZXMuCiAgICAgICsxOiAgIEp1c3RpbiwgSWFuLCBDbGlmZiwgQmlsbFMsIHN0cmlrZXIsIHdyb3dlLCBuZAogICAgICArMDogICBCcmlhblAsIEFhcm9uIChtdXRleCBjb250ZW50aW9uIGlzIGxvb2tpbmcgYmV0dGVyIHdpdGggdGhlCiAgICAgICAgICAgIGxhdGVzdCBjb2RlLCBsZXQncyBjb250aW51ZSB0dW5pbmcgYW5kIHRlc3RpbmcpLCByZWRlcnBqLCBqaW0KICAgICAgLTA6ICAgTGFycwoKICAgICAgcHF1ZXJuYTogRG8gd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBmb3IgMi4yPwoKClJFTEVBU0UgTk9OLVNIT1dTVE9QUEVSUyBCVVQgV09VTEQgQkUgUkVBTCBOSUNFIFRPIFdSQVAgVEhFU0UgVVA6CgogICAgKiBQYXRjaGVzIHN1Ym1pdHRlZCB0byB0aGUgYnVnIGRhdGFiYXNlOgogICAgICBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1ORVcmYnVnX3N0YXR1cz1BU1NJR05FRCZidWdfc3RhdHVzPVJFT1BFTkVEJnByb2R1Y3Q9QXBhY2hlK2h0dHBkLTIuMCZrZXl3b3Jkcz1QYXRjaEF2YWlsYWJsZQoKICAgICogRmlsdGVyIHN0YWNrcyBhbmQgc3VicmVxdWVzdHMsIHJlZGlyZWN0cyBhbmQgZmFzdCByZWRpcmVjdHMuCiAgICAgIFRoZXJlJ3MgYXQgbGVhc3Qgb25lIFBSIHRoYXQgc3VmZmVycyBmcm9tIHRoZSBjdXJyZW50IHVuY2xlYW4gYmVoYXZpb3VyCiAgICAgICh3aGljaCBsZXRzIHRoZSBzZXJ2ZXIgc2VuZCBnYXJiYWdlKTogUFIgMTc2MjkKICAgICAgbmQgc2F5czogRXZlcnkgc3VicmVxdWVzdCBzaG91bGQgZ2V0IGl0cyBvd24gZmlsdGVyIHN0YWNrIHdpdGggdGhlCiAgICAgICAgICAgICAgIHN1YnJlcV9jb3JlIGZpbHRlciBhcyBib3R0b20tbW9zdC4gVGhhdCBmaWx0ZXIgZG9lcyB0d28gdGhpbmdzOgogICAgICAgICAgICAgICAgIC0gc3dhbGxvdyBFT1MgYnVja2V0cwogICAgICAgICAgICAgICAgIC0gcmVkaXJlY3QgdGhlIGRhdGEgc3RyZWFtIHRvIHRoZSB1cHBlciByZXF1ZXN0J3MgKHJyLT5tYWluKQogICAgICAgICAgICAgICAgICAgZmlsdGVyIGNoYWluIGRpcmVjdGx5IGFmdGVyIHRoZSBzdWJyZXF1ZXN0J3Mgc3RhcnRpbmcKICAgICAgICAgICAgICAgICAgIHBvaW50LgogICAgICAgICAgICAgICBPbmNlIHdlIGhhdmUgYSBjbGVhbiBzb2x1dGlvbiwgd2UgY2FuIHRyeSB0byBvcHRpbWl6ZQogICAgICAgICAgICAgICBpdCwgc28gdGhhdCB0aGUgc2VydmVyIHdvbid0IGJlIHNsb3cgZG93biB0b28gbXVjaC4KCiAgICAqIFJGQyAyNjE2IHZpb2xhdGlvbnMuCiAgICAgIENsb3NlZCBQUnM6IDE1ODU3LgogICAgICBPcGVuIFBSczogMTU4NTIsIDE1ODU5LCAxNTg2MSwgMTU4NjQsIDE1ODY1LCAxNTg2NiwgMTU4NjgsIDE1ODY5LAogICAgICAgICAgICAgICAgMTU4NzAsIDE2MTIwLCAxNjEyNSwgMTYxMjYsIDE2MTMzLCAxNjEzNSwgMTYxMzYsIDE2MTM3LAogICAgICAgICAgICAgICAgMTYxMzgsIDE2MTM5LCAxNjE0MCwgMTYxNDIsIDE2NTE4LCAxNjUyMCwgMTY1MjEsIAogICAgICBqZXJlbmtyYW50eiBzYXlzOiBuZWVkIHRvIGRlY2lkZSBob3cgbWFueSB3ZSBuZWVkIHRvIGJhY2twb3J0IGFuZC9vcgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGVzZSByaXNlIHRvIHNob3dzdG9wcGVyIHN0YXR1cy4KICAgICAgd3Jvd2Ugc3VnZ2VzdHM6IGl0IHdvdWxkIGJlIG5pY2UgdG8gc2VlICJNVVNUIiB2LnMuICJTSE9VTEQiIHYucy4gIk1BWSIKICAgICAgICAgICAgICAgICAgICAgIG91dCBvZiB0aGlzIGxpc3QsIHdpdGhvdXQgcmV2aWV3aW5nIHRoZW0gaW5kaXZpZHVhbGx5LgoKICAgICogVGhlcmUgaXMgYSBidWcgaW4gaG93IHdlIHNvcnQgc29tZSBob29rcywgYXQgbGVhc3QgdGhlIHByZS1jb25maWcKICAgICAgaG9vay4gIFRoZSBmaXJzdCB0aW1lIHdlIGNhbGwgdGhlIGhvb2tzLCB0aGV5IGFyZSBpbiB0aGUgY29ycmVjdCAKICAgICAgb3JkZXIsIGJ1dCB0aGUgc2Vjb25kIHRpbWUsIHdlIGRvbid0IHNvcnQgdGhlbSBjb3JyZWN0bHkuICBDdXJyZW50bHksCiAgICAgIHRoZSBtb2R1bGVzL2h0dHAvY29uZmlnLm00IGZpbGUgaGFzIGJlZW4gcmVuYW1lZCB0byAKICAgICAgbW9kdWxlcy9odHRwL2NvbmZpZzIubTQgdG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLCBpdCBzaG91bGQgbW92ZWQKICAgICAgYmFjayB3aGVuIHRoaXMgaXMgZml4ZWQuCgogICAgICAgIE90aGVyQmlsbCBvZmZlcnMgdGhhdCB0aGlzIGlzIGEgU0VSSU9VUyBwcm9ibGVtLiAgV2UgZG8gbm90IHNvcnQKICAgICAgICBjb3JyZWN0bHkgYnkgdGhlIG9yZGVyaW5nIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHJlZ2lzdGVyIGhvb2sKICAgICAgICBmdW5jdGlvbnMuICBUaGlzIHdhcyBwcm92ZW4gd2hlbiBJIHJlb3JkZXJlZCB0aGUgb3Blbl9sb2dzIGhvb2sKICAgICAgICB0byBhdHRlbXB0IHRvIG9wZW4gdGhlIGVycm9yIGxvZ3MgcHJpb3IgdG8gdGhlIGFjY2VzcyBsb2dzLiAgUG9zc2libHkKICAgICAgICB0aGUgZW50aXJlIHNvcnRpbmcgY29kZSBuZWVkcyB0byBiZSByZWZhY3RvcmVkLgoKICAgICogcGlwZXMgZGVhZGxvY2sgb24gYWxsIHBsYXRmb3JtcyB3aXRoIGxpbWl0ZWQgcGlwZSBidWZmZXJzIChlLmcuIGJvdGgKICAgICAgTGludXggYW5kIFdpbjMyLCBhcyBvcHBvc2VkIHRvIG9ubHkgV2luMzIgb24gMS4zKS4gIFRoZSByaWdodCBzb2x1dGlvbgogICAgICBpcyBlaXRoZXIgR1N0ZWluJ3MgcHJvcG9zYWwgZm9yIGEgIkNHSSBCcmlnYWRlIiwgb3IgT3RoZXJCaWxsJ3MgcHJvcG9zYWwKICAgICAgZm9yICJQb2xsIEJ1Y2tldHMiIGZvciAiUG9sbGluZyBGaWx0ZXIgQ2hhaW5zIi4gIE9yIG1heWJlIGJvdGggOi0pCgogICAgKiBBbGwgaGFuZGxlcnMgc2hvdWxkIGFsd2F5cyBzZW5kIGNvbnRlbnQgZG93biBldmVuIGlmIHItPmhlYWRlcl9vbmx5CiAgICAgIGlzIHNldC4gIElmIG5vdCwgaXQgbWVhbnMgdGhhdCB0aGUgSEVBRCByZXF1ZXN0cyBkb24ndCBnZW5lcmF0ZSB0aGUKICAgICAgc2FtZSBoZWFkZXJzIGFzIGEgR0VUIHdoaWNoIGlzIHdyb25nLgoKICAgICogZXhlYyBjbWQgYW5kIHN1ZXhlYyBhcmctcGFzc2luZyBlbmhhbmNlbWVudHMKICAgICAgU3RhdHVzOiBQYXRjaGVzIHByb3Bvc2VkCiAgICAgIE1lc3NhZ2UtSUQ6IDwyMDAyMDUyNjA0MTc0OC5BMjkxNDhAcHJvZGlneS5SZWRicmljay5EQ1UuSUU+CiAgICAgIChzZWUgdGhlICJwcm9jLnBhdGNoIiBhbmQgInN1ZXhlYy1zaGVsbC5wYXRjaCIgbGlua3MgaW4gdGhpcyBtZXNzYWdlKQoKICAgICogVGhlIDIuMC4zNiB3b3JrZXIgTVBNIGdyYWNlbGVzcyBzaHV0ZG93biBjaGFuZ2VzIHdvcmsgYnV0IGFyZQogICAgICBhIGJpdCBjbHVua3kgb24gc29tZSBwbGF0Zm9ybXM7IGVnLCBvbiBMaW51eCwgdGhlIGxvb3AgdG8KICAgICAgam9pbiBlYWNoIHdvcmtlciB0aHJlYWQgc2VlbXMgdG8gaGFuZywgYW5kIHRoZSBwYXJlbnQgZW5kcyB1cAogICAgICBraWxsaW5nIG9mZiB0aGUgY2hpbGQgd2l0aCBTSUdLSUxMLiAgQnV0IGF0IGxlYXN0IGl0IHNodXRzIGRvd24uCgogICAgKiAtLWVuYWJsZS1tb2RzLXNoYXJlZD0iZm9vMSBmb28yIiBpcyBidXN0ZWQgb24gRGFyd2luLiAgUGllcgogICAgICAgIHBvc3RlZCBhIHBhdGNoIChNZXNzYWdlLUlEOiA8QjhEQkJFOEQuNTc1QSVwaWVyQGJldGF2ZXJzaW9uLm9yZz4pLgoKICAgICogV2UgZG8gbm90IHByb3Blcmx5IHN1YnN0aXR1dGUgdGhlIHByZWZpeC12YXJpYWJsZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KICAgICAgc2NyaXB0cyBvciBnZW5lcmF0ZWQtY29uZmlncy4gIChpLmUuIGlmIHN5c2NvbmZkaXIgaXMgZXRjLAogICAgICBodHRwZC1zdGQuY29uZiBwb2ludHMgdG8gY29uZi4pCgogICAgKiBJZiBhbnkgcmVxdWVzdCBnZXRzIHRocm91Z2ggYXBfcHJvY2Vzc19yZXF1ZXN0X2ludGVybmFsKCkgYW5kIGlzCiAgICAgIHNjaGVkdWxlZCB0byBiZSBzZXJ2ZWQgYnkgdGhlIGNvcmUgaGFuZGxlciwgd2l0aG91dCBhIGZsYWcgdGhhdCB0aGlzIAogICAgICByLT5maWxlbmFtZSB3YXMgdGVzdGVkIGJ5IGRpci9maWxlX3dhbGssIHdlIG5lZWQgdG8gNTAwIGF0IHRoZSB2ZXJ5IAogICAgICBlbmQgb2YgdGhlIGFwX3Byb2Nlc3NfcmVxdWVzdF9pbnRlcm5hbCgpIHByb2Nlc3Npbmcgc28gc3ViX3JlcS1lc3RlcnMKICAgICAga25vdyB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIHJ1bi4gIFRoaXMgcHJvdmlkZXMgYXV0aG9ycyBvZiBvbGRlciAKICAgICAgbW9kdWxlcyBiZXR0ZXIgY29tcGF0aWJpbGl0eSwgd2hpbGUgc3RpbGwgaW1wcm92aW5nIHRoZSBzZWN1cml0eSBhbmQgCiAgICAgIHJvYnVzdG5lc3Mgb2YgMi4wLiAKCiAgICAgICAgU3RhdHVzOiBzdGlsbCBuZWVkIHRvIGRlY2lkZSB3aGVyZSB0aGlzIGdvZXMsIE90aGVyQmlsbCBjb21tZW50cy4uLgogICAgICAgIE1lc3NhZ2UtSUQ6IDwwNjU3MDFjMTQ1MjYkNDk1MjAzYjAkOTZjMGIwZDBAcm93ZWNsYW4ubmV0PgogICAgICAgIFtEZWxldGVkIGNvbW1lbnRzIHJlZ2FyZGluZyB0aGUgYXBfcnVuX2hhbmRsZXIgcGhhc2UsIGFzIGlycmVsZXZhbnQKICAgICAgICAgICAgYXMgQmlsbFMgcG9pbnRzIG91dCB0aGF0ICJjb21tb24gY2FzZSB3aWxsIGJlIGNhdWdodCBpbgogIAkgICAgZGVmYXVsdF9oYW5kbGVyIGFscmVhZHkgKHdpdGggdGhlIHItPmZpbmZvLmZpbGV0eXBlID09IDAgY2hlY2spIgogICAgICAgICAgICBhbmQgdGhlIGlzc3VlIGlzIGRldGVjdGluZyB0aGlzIC1iZWZvcmUtIHdlIHRyeSB0byBydW4gdGhlIHJlcS5dCgoJZ3JlZ2FtZXMgc2F5czogY2FuIHRoaXMgaGFwcGVuIHNvbWVob3cgd2l0aG91dCBhIGJyb2tlbiBtb2R1bGUKICAgICAgICAgICAgYmVpbmcgaW52b2x2ZWQ/ICBJZiBub3QsIHdoeSB3YXN0ZSBjeWNsZXMgdHJ5aW5nIHRvIGRlZmVuZCBhZ2FpbnN0CiAgICAgICAgICAgIHBvdGVudGlhbCBicm9rZW4gbW9kdWxlcz8gIEl0IHNlZW1zIGZ1dGlsZS4KICAgICAgICB3cm93ZSBjb3VudGVyczogbm8sIGl0IHNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIHRoZSBtb2R1bGUgaXMgYnJva2VuLgogICAgICAgICAgICBCdXQgdGhlIHJpZ2h0IGFuc3dlciBpcyB0byBmYWlsIHRoZSByZXF1ZXN0IHVwLWZyb250IGluIGRpci9maWxlCiAgICAgICAgICAgIHdhbGsgaWYgdGhlIHBhdGggd2FzIGVudGlyZWx5IGludmFsaWQ7IGFuZCB3ZSBjYW4ndCBkbyB0aGF0IGVpdGhlcgogICAgICAgICAgICBVTlRJTCAyLjEgb3Igd2UgYnJlYWsgbW9kdWxlcyB0aGF0IGhhdmVuJ3QgaG9va2VkIG1hcF90b19zdG9yYWdlLgoKICAgICogV2l0aCBBUF9NT0RFX0VYSEFVU1RJVkUgaW4gdGhlIGNvcmUsIGl0IGlzIGZpbmFsbHkgY2xlYXIgdG8gbWUKICAgICAgaG93IHRoZSBQZXJjaGlsZCBNUE0gc2hvdWxkIGJlIHJlLXdyaXR0ZW4uICBJdCBoYXNuJ3Qgd29ya2VkCiAgICAgIGNvcnJlY3RseSBzaW5jZSBmaWx0ZXJzIHdlcmUgYWRkZWQgYmVjYXVzZSBpdCB3YXNuJ3QgcG9zc2libGUgdG8KICAgICAgZ2V0IHRoZSBjb250ZW50IHRoYXQgaGFkIGFscmVhZHkgYmVlbiB3cml0dGVuIGFuZCB0aGUgc29ja2V0IGF0CiAgICAgIHRoZSBzYW1lIHRpbWUuICBUaGlzIG1vZGUgbGV0cyB1cyBkbyB0aGF0LCBzbyB0aGUgTVBNIGNhbiBiZQogICAgICBmaXhlZC4KCiAgICAqIENhbiBhIHN0YXRpYyBodHRwZCBiZSBidWlsdCByZWxpYWJseT8KICAgICAgICBNZXNzYWdlLUlEOiA8MjAwMjAyMDcxNDI3NTEuVDMxNTgyQGNsb3ZlLm9yZz4KCiAgICAqIFVzYWdlIG9mIEFQUl9CUklHQURFX05PUk1BTElaRSBpbiBjb3JlX2lucHV0X2ZpbHRlciBzaG91bGQgYmUKICAgICAgcmVtb3ZlZCBpZiBwb3NzaWJsZS4KICAgICAgICBNZXNzYWdlLUlEOiA8UGluZS5MTlguNC4zMy4wMjAxMjAyMjMyNDMwLjMxOC0xMDAwMDBAZGVlcHRob3VnaHQuY3MudmlyZ2luaWEuZWR1PgogICAgICAgIEplZmYgd29uZGVycyBpZiB3ZSBzdGlsbCBjYXJlIGFib3V0IHRoaXMuICBJdCBpcyBubyBsb25nZXIgYW4KICAgICAgICBBUEkgaXNzdWUgYnV0IHNpbXBseSBhbiBleHRyYSB0cmlwIHRocm91Z2ggdGhlIGJyaWdhZGUuCgogICAgKiBHZXQgcGVyY2hpbGQgdG8gd29yayBvbiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBMaW51eC4gVGhpcwogICAgICB3aWxsIHJlcXVpcmUgYSBwb3J0YWJsZSBtZWNoYW5pc20gdG8gcGFzcyBkYXRhIGFuZCBmaWxlL3NvY2tldAogICAgICBkZXNjcmlwdG9ycyBiZXR3ZWVuIHZob3N0IGNoaWxkIGdyb3Vwcy4gQW4gQVBJIHdhcyBwcm9wb3NlZAogICAgICBvbiBkZXZAYXByOgogICAgICAgIE1lc3NhZ2UtSUQ6IDwyMDAyMDExMTExNTAwNi5LMTUyOUBjbG92ZS5vcmc+CgogICAgKiBUcnkgdG8gZ2V0IGxpYnRvb2wgaW50ZXItbGlicmFyeSBkZXBlbmRlbmN5IGNvZGUgd29ya2luZyBvbiBBSVguCiAgICAgICAgTWVzc2FnZS1JRDogPGNtM24xMGx4NTU1LmZzZkByZHUxNjMtNDAtMDkyLm5jLnJyLmNvbT4KCiAgICAgIEp1c3RpbiBzYXlzOiBJZiB3ZSBnZXQgaXQgd29ya2luZyBvbiBBSVgsIHdlIGNhbiBlbmFibGUgdGhpcwogICAgICAgICAgICAgICAgICAgb24gYWxsIHBsYXRmb3JtcyBhbmQgY2xlYW4gdXAgb3VyIGJ1aWxkIHN5c3RlbQogICAgICAgICAgICAgICAgICAgc29tZXdoYXQuCiAgICAgIEplZmYgc2F5czogICBJIHRob3VnaHQgSSB0ZXN0ZWQgYSBwYXRjaCBmb3IgeW91IHNvbWV0aW1lIGluCiAgICAgICAgICAgICAgICAgICBKYW51YXJ5IHRoYXQgeW91IHdlcmUgZ29pbmcgdG8gY29tbWl0IHdpdGhpbiBhIGZldwogICAgICAgICAgICAgICAgICAgZGF5cy4KCiAgICAqIEhhbmRsaW5nIG9mICUyZiBpbiBVUklzLiAgQ3VycmVudGx5IGJvdGggMS4zIGFuZCAyLjAKICAgICAgY29tcGxldGVseSBkaXNhbGxvdyAlMmYgaW4gdGhlIHJlcXVlc3QgVVJJIHBhdGggKHNlZQogICAgICBhcF91bmVzY2FwZV91cmwoKSBpbiB1dGlsLmMpLiAgSXQncyBwZXJtaXR0ZWQgYW5kIHBhc3NlZAogICAgICB0aHJvdWdoIGluIHRoZSBxdWVyeSBzdHJpbmcsIGhvd2V2ZXIuICBSb3kgc2F5cyB0aGUKICAgICAgb3JpZ2luYWwgcmVhc29uIGZvciBkaXNhbGxvd2luZyBpdCwgZnJvbSBmaXZlIHllYXJzIGFnbywKICAgICAgd2FzIHRvIHByb3RlY3QgQ0dJIHNjcmlwdHMgdGhhdCBhcHBsaWVkIFBBVEhfSU5GTyB0bwogICAgICBhIGZpbGVzeXN0ZW0gbG9jYXRpb24gYW5kIHdoaWNoIG1pZ2h0IGJlIHRyaWNrZWQgYnkKICAgICAgLi4lMmYuLiUyZiguLi4pLiAgV2UgKnNob3VsZCogYWxsb3cgcGF0aC1pbmZvIG9mIHRoZQogICAgICBmb3JtICdodHRwOi8vZm9vLmNvbS9pbmRleC5jZ2kvcGF0aC90by9wYXRoJTJmaW5mbycuCiAgICAgIFNpbmNlIHdlJ3ZlIHJldmFtcGVkIGEgbG90IG9mIG91ciBwcm9jZXNzaW5nIG9mIHBhdGgKICAgICAgc2VnbWVudHMsIGl0IHdvdWxkIGJlIG5pY2UgdG8gYWxsb3cgdGhpcywgb3IgYXQgbGVhc3QKICAgICAgYWxsb3cgaXQgY29uZGl0aW9uYWxseSB3aXRoIGEgZGlyZWN0aXZlLgoKICAgICAgICBPdGhlckJpbGwgYWRkcyB0aGF0ICUyZiBhcyB0aGUgU0VDT05EIGNoYXJhY3RlciBvZiBhIG11bHRpYnl0ZQogICAgICAgIHNlcXVlbmNlIGNhdXNlcyB0aGUgcmVxdWVzdCB0byBmYWlsISAgVGhpcyBoYXBwZW5zIG5vdGFibHkgaW4KICAgICAgICB0aGUgamEtamlzIGVuY29kaW5nLgoKICAgICogRnJlZUJTRCwgdGhyZWFkcywgYW5kIHdvcmtlciBNUE0uICBBbGwgc2VlbXMgdG8gd29yayBmaW5lIAogICAgICBpZiB5b3Ugb25seSBoYXZlIG9uZSB3b3JrZXIgcHJvY2VzcyB3aXRoIG1hbnkgdGhyZWFkcy4gIEFkZCAKICAgICAgYSBzZWNvbmQgd29ya2VyIHByb2Nlc3MgYW5kIHRoZSBhY2NlcHQgbG9jayBzZWVtcyB0byBiZQogICAgICBsb3N0LiAgVGhpcyBtaWdodCBiZSBhbiBBUFIgaXNzdWUgd2l0aCBob3cgaXQgZGVhbHMgd2l0aAogICAgICB0aGUgY2hpbGRfaW5pdCBob29rIChpLmUuIHRoZSBmY250bCBsb2NrIG5lZWRzIHRvIGJlIHJlc3luY2VkKS4KICAgICAgTW9yZSBleGFtaW5hdGlvbiBhbmQgYW5hbHlzaXMgaXMgcmVxdWlyZWQuCiAgICAgICAgU3RhdHVzOiBXb3JrcyB3aXRoIEZyZWVCU0QgNS4zLiBEb2VzIG5vdCB3b3JrIGluIHByZXZpb3VzIHZlcnNpb25zLgogICAgICAgICAgICAgICAgVGhpcyBoYXMgYWxzbyBiZWVuIHJlcG9ydGVkIG9uIEN5Z3dpbi4KCiAgICAqIFRoZXJlIGlzIGluY3JlYXNpbmcgZGVtYW5kIGZyb20gbW9kdWxlIHdyaXRlcnMgZm9yIGFuIEFQSQogICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlbSB0byBjb250cm9sIHRoZSBzZXJ2ZXIg4CBsYSBhcGFjaGVjdGwuCiAgICAgIFJlYXNvbnMgaW5jbHVkZSBzb2xlLWZ1bmN0aW9uIHNlcnZlcnMgdGhhdCBuZWVkIHRvIGRpZSBpZgogICAgICBhbiBleHRlcm5hbCBkZXBlbmRlbmN5IChlLmcuLCBhIGRhdGFiYXNlKSBmYWlscywgZXQgY2V0ZXJhLgogICAgICBQZXJoYXBzIHNvbWV0aGluZyBpbiB0aGUgKGV2ZXIgbW9yZSBhYnVzZWQpIHNjb3JlYm9hcmQ/CiAgICAgICAgCiAgICAgICAgICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgYWxyZWFkeSBoYXZlIGEgcGlwZSB0aGF0IGdvZXMgYmV0d2VlbiBwYXJlbnQKICAgICAgICAgICAgIGFuZCBjaGlsZCBmb3IgZ3JhY2VmdWwgc2h1dGRvd24gZXZlbnRzLCBhbG9uZyB3aXRoIGFuIEFQSSB0aGF0CiAgICAgICAgICAgICBjYW4gYmUgdXNlZCB0byBzZW5kIGEgbWVzc2FnZSBkb3duIHRoYXQgcGlwZS4gIEluIHRocmVhZGVkIE1QTXMsCiAgICAgICAgICAgICBpdCBpcyBlYXN5IGVub3VnaCB0byBtYWtlIHRoYXQgb25lIHBpcGUgYmUgdXNlZCBmb3IgZ3JhY2VmdWwKICAgICAgICAgICAgIGFuZCBncmFjZWxlc3MgZXZlbnRzLCBhbmQgaXQgaXMgYWxzbyBlYXN5IHRvIG9wZW4gdGhhdCBwaXBlCiAgICAgICAgICAgICB0byBib3RoIHBhcmVudCBhbmQgY2hpbGQgZm9yIHdyaXRpbmcuICBUaGVuIHdlIGp1c3QgbmVlZCB0bwogICAgICAgICAgICAgZmlndXJlIG91dCBob3cgdG8gZG8gZ3JhY2VsZXNzIG9uIG5vbi10aHJlYWRlZCBNUE1zLgoKICAgICogQWxsb3cgdGhlIERvY3VtZW50Um9vdCBkaXJlY3RpdmUgd2l0aGluIDxMb2NhdGlvbiA+IHNjb3Blcz8gIFRoaXMKICAgICAgYWxsb3dzIHRoZSBiZWxvdmVkIChjcnVzdHkpIEFsaWFzIC9mb28vIC9zb21lcGF0aC9mb28vIGZvbGxvd2VkCiAgICAgIGJ5IGEgPERpcmVjdG9yeSAvc29tZXBhdGgvZm9vPiB0byBiZWNvbWUgc2ltcGx5IAogICAgICA8TG9jYXRpb24gL2Zvby8+IERvY3VtZW50Um9vdCAvc29tZWZpbGUvZm9vIChJTUhPIGEgYml0IG1vcmUgbGVnaWJsZQogICAgICBhbmQgaW4teW91ci1mYWNlLikgIERvY3VtZW50Um9vdCB1bnNldCB3b3VsZCBiZSBhY2NlcHRlZCBbYW5kIHdvdWxkCiAgICAgIG5vdCBwZXJtaXQgY29udGVudCB0byBiZSBzZXJ2ZWQsIG9ubHkgdmlydHVhbCByZXNvdXJjZXMgc3VjaCBhcwogICAgICBzZXJ2ZXItaW5mbyBvciBzZXJ2ZXItc3RhdHVzLgogICAgICBUaGlzIHByb3Bvc2VkIGNoYW5nZSB3b3VsZCBfbm90XyBkZXByaWNhdGUgQWxpYXMuCiAgICAgICAgc3RyaWtlcjogU2VlIHRoZSB0aHJlYWQgc3RhcnRpbmcgd2l0aCBNZXNzYWdlLUlEOgogICAgICAgICAgSkxFR0tLTkVMTUhDSlBOTU9LSE9HRUVKRkJBQS5zdHJpa2VyQGFwYWNoZS5vcmcuCgogICAgKiBXaW4zMjogUm90YXRlbG9ncyBzb21ldGltZXMgaXMgbm90IHRlcm1pbmF0ZWQgd2hlbiBBcGFjaGUKICAgICAgZ29lcyBkb3duIGhhcmQuICBGaXJzdEJpbGwgd2FzIGxvb2tpbmcgYXQgcG9zc2libHkgdHJhY2tpbmcgdGhlIAogICAgICBjaGlsZCdzLWNoaWxkIHByb2Nlc3NlcyBpbiB0aGUgcGFyZW50IHByb2Nlc3MuCiAgICAgICAgc3RvZGRhcmQ6IFNoYXJlZCBzY29yZWJvYXJkIG1pZ2h0IG9mZmVyIGEgZ29vZCB3YXkgZm9yIHRoZSBwYXJlbnQgCiAgICAgICAgdG8ga2VlcCB0cmFjayBvZiAnb3RoZXIgY2hpbGQnIHByb2Nlc3NlcyBhbmQgd2hhY2sgdGhlbSBpZiB0aGUgY2hpbGQgCiAgICAgICAgZ29lcyBkb3duLgogICAgICAgIE90aGVyIHRob3VnaHRzIG9uIHdhbGtpbmcgdGhlIHByb2Nlc3MgY2hhaW4gdXNpbmcgdGhlIE5UIGtlcm5lbAogICAgICAgIGhhdmUgYWxzbyBiZWVuIHByb3Bvc2VkIG9uIEFQUi4KCiAgICAqIEVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSBjcmVhdGlvbiBvZiBwaXBlcyBpbiBtb2RfY2dpZAoKICAgICogQ29tYmluZSBsb2dfY2hpbGQgYW5kIHBpcGVkX2xvZ19zcGF3bi4gQ2xlYW4gdXAgaHR0cF9sb2cuYy4KICAgICAgQ29tbW9uIGxvZ2dpbmcgQVBJLgoKICAgICogUGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgZm9yayAocHJpbWFyaWx5IFdpbjMyIGFuZCBBUy80MDApCiAgICAgIEFyY2hpdGVjdCBzdGFydC11cCBjb2RlIHRoYXQgYXZvaWRzIGluaXRpYWxpemluZyBhbGwgdGhlIG1vZHVsZXMgCiAgICAgIGluIHRoZSBwYXJlbnQgcHJvY2VzcyBvbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBmb3JrLgoKICAgICogVGhlcmUgYXJlIHN0aWxsIGEgbnVtYmVyIG9mIHBsYWNlcyBpbiB0aGUgY29kZSB3aGVyZSB3ZSBhcmUKICAgICAgbG9zaW5nIGVycm9yIHN0YXR1cyAoaS5lLiB0aHJvd2luZyBhd2F5IHRoZSBlcnJvciByZXR1cm5lZCBieSBhCiAgICAgIHN5c3RlbSBjYWxsIGFuZCByZXBsYWNpbmcgaXQgd2l0aCBhIGdlbmVyaWMgZXJyb3IgY29kZSkKCiAgICAqIE1hc3Mgdmhvc3RpbmcgdmVyc2lvbiBvZiBzdUVYRUMuCgogICAgKiBBbGwgREJNcyBzdWZmZXIgZnJvbSBjb25mdXNpb24gaW4gc3VwcG9ydC9kYm1tYW5hZ2UgKHBlcmwgc2NyaXB0KSBzaW5jZSAKICAgICAgdGhlIGRibW1hbmFnZSBlbXBsb3lzIHRoZSBmaXJzdC1tYXRjaGVkIGRibSBmb3JtYXQuICBUaGlzIGlzIG5vdAogICAgICBuZWNlc3NhcmlseSB0aGUgbGlicmFyeSB0aGF0IEFwYWNoZSB3YXMgYnVpbHQgd2l0aC4gIEF1Z2h0IHRvCiAgICAgIHJld3JpdGUgZGJtbWFuYWdlIHVwb24gaW5zdGFsbGF0aW9uIHRvIGJpbi8gd2l0aCB0aGUgcHJvcGVyIGxpYnJhcnkgCiAgICAgIGZvciBwcmVkaWN0YWJsZSBtb2RfYXV0aF9kYm0gYWRtaW5pc3RyYXRpb24uCiAgICAgICAgUXVlc3Rpb25zOyBodGRibSBleGlzdHMsIHRpbWUgdG8ga2lsbCBkYm1tYW5hZ2UsIG9yIGRvZXMgaXQgcmVtYWluCiAgICAgICAgICAgICAgICAgICB1c2VmdWwgYXMgYSBwZXJsIGRibSBtYW5hZ2VtZW50IGV4YW1wbGU/ICBJZiB3ZSBrZWVwIGl0LAogICAgICAgICAgICAgICAgICAgZG8gd2UgYWRkcmVzcyB0aGUgaXNzdWUgYWJvdmU/CgogICAgKiBJbnRlZ3JhdGUgbW9kX2Rhdi4KICAgICAgICBTb21lIGFkZGl0aW9uYWwgaXRlbXMgcmVtYWluaW5nOgogICAgICAgIC0gY2FzZV9wcmVzZXJ2ZWRfZmlsZW5hbWUgc3R1ZmYKICAgICAgICAgICAgKHVzZSB0aGUgbmV3IGNhbm9uaWNhbCBuYW1lIHN0dWZmPykKICAgICAgICAtIGZpbmQgYSBuZXcgaG9tZSBmb3IgYXBfdGV4dChfaGVhZGVyKQogICAgICAgIC0gaXMgaXQgcG9zc2libGUgdG8gcmVtb3ZlIHRoZSBEQVY6IG5hbWVzcGFjZSBzdHVmZiBmcm9tIHV0aWxfeG1sPwoKICAgICogYXBfY29yZV90cmFuc2xhdGUoKSBhbmQgaXRzIHVzZSBieSBtb2RfbW1hcF9zdGF0aWMgYW5kIG1vZF9maWxlX2NhY2hlCiAgICAgIGFyZSBhIGJpdCB3b25reS4gIFRoZSBmdW5jdGlvbiBzaG91bGQgcHJvYmFibHkgYmUgZXhwb3NlZCBhcyBhIHV0aWxpdHkgCiAgICAgIGZ1bmN0aW9uIChzdWNoIGFzIGFwX3RyYW5zbGF0ZV91cmwyZnMoKSBvciBhcF92YWxpZGF0ZV9mc191cmwoKSBvciAKICAgICAgc29tZXRoaW5nKS4gIEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgYSBuZXcgaG9vayBwaGFzZSBhZnRlcgogICAgICAidHJhbnNsYXRlIiB3aGljaCB3b3VsZCBhbGxvdyB0aGUgbW9kdWxlIHRvIG11bmdlIHdoYXQgdGhlCiAgICAgIHRyYW5zbGF0aW9uIGhhcyBkZWNpZGVkIHRvIGRvLgogICAgICAgIFN0YXR1czogR3JlZyArMSAodm9sdW50ZWVycykKCiAgICAqIEV4cGxvcmUgdXNlIG9mIGEgcG9zdC1jb25maWcgaG9vayBmb3IgdGhlIGNvZGUgaW4gaHR0cF9tYWluLmMgd2hpY2gKICAgICAgY2FsbHMgYXBfZml4dXBfdmlydXRhbF9ob3N0cygpLCBhcF9maW5pX3Zob3N0X2NvbmZpZygpLCBhbmQKICAgICAgYXBfc29ydF9ob29rcygpICBbdG8gcmVkdWNlIHRoZSBsb2dpYyBpbiBtYWluKCldCgogICAgKiByZWFkIHRoZSBjb25maWcgdHJlZSBqdXN0IG9uY2UsIGFuZCBwcm9jZXNzIE4gdGltZXMgKGFzIG5lY2Vzc2FyeSkKCiAgICAqIChwb3NzaWJseSkgdXNlIFVVSURzIGluIG1vZF91bmlxdWVfaWQgYW5kL29yIG1vZF91c2VydHJhY2sKCiAgICAqIChwb3NzaWJseSkgcG9ydCB0aGUgYnVnIGZpeCBmb3IgUFIgNjk0MiAoc2VndiB3aGVuIExvYWRNb2R1bGUgaXMgcHV0CiAgICAgIGludG8gYSBWaXJ0dWFsSG9zdCBjb250YWluZXIpIHRvIDIuMC4KCiAgICAqIHNoaWZ0IHN0dWZmIHRvIG1vZF9jb3JlLmgKCiAgICAqIGNhbGxlcnMgb2YgYXBfcnVuX2NyZWF0ZV9yZXF1ZXN0KCkgc2hvdWxkIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKICAgICAgZm9yIGZhaWx1cmUgKERvdWcgdm9sdW50ZWVycykKCiAgICAqIEZpeCB0aGUgd29ya2VyIE1QTSB0byB1c2UgUE9EIHRvIGtpbGwgY2hpbGQgcHJvY2Vzc2VzIGluc3RlYWQKICAgICAgb2YgYXBfb3Nfa2lsbHBnLCByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IHNob3VsZCBkaWUuCgogICAgKiBTY29yZWJvYXJkIHN0cnVjdHVyZXMgY291bGQgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlIHN1Y2ggdGhhdAogICAgICBwcm9wZXIgYWxpZ25tZW50IGlzIG5vdCBtYWludGFpbmVkLCBsZWFkaW5nIHRvIHNlZ2ZhdWx0cyBvbiAKICAgICAgc29tZSBzeXN0ZW1zLiAgQ2xpZmYgcG9zdGVkIGEgcGF0Y2ggdG8gZGVhbCB3aXRoIHRoaXMgaXNzdWUgYnV0CiAgICAgIGxhdGVyIHJlY2FudGVkLiBTZWUgdGhpcyBtZXNzYWdlIHRvIGRldkBhcHIuYXBhY2hlLm9yZzoKICAgICAgTWVzc2FnZS1JRDogPFBpbmUuTE5YLjQuNDQuMDIwMzAxMTM1NDA5MC4xNjQ1Ny0yMDAwMDBAZGVlcHRob3VnaHQKICAgICAgICAgICAgICAgICAgLmNzLnZpcmdpbmlhLmVkdT4KCiAgICAqIEFQWFMgZWl0aGVyIG5lZWRzIHRvIGJlIGZpeGVkIGNvbXBsZXRlbHkgZm9yIHVzZSB3aGVuIGFwciBpcyBvdXQgb2YgdHJlZSwKICAgICAgb3IgaXQgc2hvdWxkIGRyb3AgcXVlcnkgbW9kZSBhbHRvZ2V0aGVyLCBhbmQgd2UganVzdCBncm93IGFuIAogICAgICBodHRwZC1jb25maWcgb3Igc2ltaWxhciBhcnJhbmdlbWVudC4gCiAgICAgIFRvIHF1b3RlIGEgZGlzY3Vzc2lvbiBpbiBTVEFUVVMgZWFybGllcjoKCiAgICAgICAgICB0aG9tbWF5OiB0aGlzIGRvZXNuJ3QgZml4IGFsbCB0aGUgcHJvYmxlbXMgd2l0aCBhcHhzIGFuZCBvdXQgb2YKICAgICAgICAgICAgICAgICAgIHRyZWUgYXByL2Fwci11dGlsLCBidXQgaXQncyBhIGdvb2Qgc3RhcnQuIFRoZXJlJ3Mgc3RpbGwgdGhlIAogICAgICAgICAgICAgICAgICAgcXVlcnkgY2FzZXM7IGJ1dCBJJ20gYmVnaW5uaW5nIHRvIHRoaW5rIHRoYXQgaW4gdGhlc2UgY2FzZXMgCiAgICAgICAgICAgICAgICAgICB0aGUgYXBwIHNob3VsZCBiZSBxdWVyeWluZyBhcHtyLHV9LWNvbmZpZyBkaXJlY3RseQogICAgICAgICAgZ3N0ZWluOiBhZ3JlZWQuIGFweHMgc2hvdWxkIGRlcHJlY2F0ZSB0aGUgLXEgZmxhZwogICAgICAgICAgcHF1ZXJuYTogSSB2b3RlIGZvciBhIGh0dHBkLWNvbmZpZywgYW5kIHRvIGRlcHJlY2F0ZSB0aGUgLXEgZmxhZy4KICAgICAgICAgIG1pbmZyaW46ICsxIGZvciBodHRwZC1jb25maWcsIGFuZCB0byBkZXByZWNhdGUgLXEuCgoKVE9ETyBJU1NVRVMgUkVNQUlOSU5HIElOIE1PRF9TU0w6CgogICAgKiBJbiBvcmRlciB0byB1c2UgYSBEU08gdmVyc2lvbiBvZiBtb2Rfc3NsIHdlIGhhdmUgdG8gbGluayB3aXRoCiAgICAgIC1sc3NsIGFuZCAtbGNyeXB0by4gQSB3b3JrYXJvdW5kIGlzIGluIHBsYWNlIHJpZ2h0IG5vdyB3aGVyZSB0aGUKICAgICAgZW50aXJlIEVYVFJBX0xJQlMgbWFjcm8gaXMgYmVpbmcgYXBwZW5kZWQgdG8gdGhlIG9iamVjdHMgbGlzdCwgYnV0CiAgICAgIHRoaXMgaXMgYSBoYWNrLiBXZSBzaG91bGQgZWl0aGVyIHJldmFtcCB0aGUgQVBBQ0hFX0NIRUNLX1NTTF9UT09MS0lUCiAgICAgIGF1dG9jb25mIGZ1bmN0aW9uIG9yIGNvbWUgdXAgd2l0aCBzb21lIG90aGVyIGF1dG9jb25mIGNoZWNrcyB0bwogICAgICBzZWFyY2ggZm9yIGxpYnNzbCBhbmQgbGliY3J5cHRvIGFuZCBwcm9wZXJseSBhZGQgdGhlbSB0byBtb2Rfc3NsJ3MKICAgICAgbGluayBmbGFncy4KCiAgICAqIFNTTCByZW5lZ290aWF0aW9ucyBpbiBjb21iaW5hdGlvbiB3aXRoIFBPU1QgcmVxdWVzdAoKICAgICogUG9ydCBvciBkaXNwb3NlIGFsbCBjb2RlIGluc2lkZSAjaWYgMC4uLiNlbmRpZiBibG9ja3MgdGhhdCByZW1haW4KICAgICAgZnJvbSB0aGUgcG9ydGluZyBlZmZvcnQuCgogICAgKiBEbyB3ZSBuZWVkIFNTTF9zZXRfcmVhZF9haGVhZCgpPwoKICAgICogdGhlIHNzbF9leHByIGFwaSBpcyBOT1QgVEhSRUFEIFNBRkUuICByYWNlIGNvbmRpdGlvbnMgZXhpc3Q6CiAgICAgICAtaW4gc3NsX2V4cHJfY29tcCgpIGlmIFNTTFJlcXVpcmUgaXMgdXNlZCBpbiAuaHRhY2Nlc3MKICAgICAgICAoc3NsX2V4cHJfaW5mbyBpcyBnbG9iYWwpCiAgICAgICAtaXMgc3NsX2V4cHJfZXZhbCgpIGlmIHRoZXJlIGlzIGFuIGVycm9yCiAgICAgICAgKHNzbF9leHByX2Vycm9yIGlzIGdsb2JhbCkKCiAgICAqIFNTTFJlcXVpcmUgZGlyZWN0aXZlIChwYXJzaW5nIG9mKSBsZWFrcyBtZW1vcnkKCiAgICAqIERpZmZpZS1IZWxsbWFuLVBhcmFtZXRlcnMgZm9yIHRlbXBvcmFyeSBrZXlzIGFyZSBoYXJkY29kZWQgaW4KICAgICAgc3NsX2VuZ2luZV9kaC5jLCB3aGlsZSB0aGUgY29tbWVudCBpbiBzc2xfZW5naW5lX2tlcm5lbC5jIHNheXM6CiAgICAgICJpdCBpcyBzdWdnZXN0ZWQgdGhhdCBrZXlzIGJlIGNoYW5nZWQgZGFpbHkgb3IgZXZlcnkgNTAwCiAgICAgIHRyYW5zYWN0aW9ucywgYW5kIG1vcmUgb2Z0ZW4gaWYgcG9zc2libGUuIgoKICAgICogc3NsX3Zhcl9sb29rdXAgY291bGQgYmUgcmV3cml0dGVuIHRvIGJlIE1VQ0ggZmFzdGVyCgogICAgKiBDUkwgY2FsbGJhY2sgc2hvdWxkIGJlIHBsdWdnYWJsZQoKICAgICogc2Vzc2lvbiBjYWNoZSBzdG9yZSBzaG91bGQgYmUgcGx1Z2dhYmxlCgogICAgKiBpbml0IGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuIHN0YXR1cyBjb2RlIHJhdGhlciB0aGFuIHNzbF9kaWUoKQoKICAgICogc3NsX2VuZ2luZV9wcGhyYXNlLmMgbmVlZHMgdG8gYmUgcmV3b3JrZWQgc28gaXQgaXMgZ2VuZXJpYyBlbm91Z2gKICAgICAgdG8gYWxzbyBkZWNyeXB0IHByb3h5IGtleXMKCiAgICAqIHRoZSBzaG1jYiBjb2RlIHNob3VsZCBqdXN0IGFsaWduIGl0cyBtZW1vcnkgc2VnbWVudCByYXRoZXIgdGhhbgogICAgICBqdW1waW5nIHRocm91Z2ggYWxsIHRoZSAic2FmZSIgbWVtY3B5IGFuZCBtZW1zZXQgaG9vcHMKCgpXSVNIIExJU1QKICAgICogbW9kX3Byb3h5OiBBYmlsaXR5IHRvIHJ1biBTU0wgb3ZlciBwcm94eSBnYXRld2F5IGNvbm5lY3Rpb25zLAogICAgICBlbmNyeXB0aW5nIChvciByZWVuY3J5cHRpbmcpIGF0IHRoZSBwcm94eS4KCiAgICAqIG1vZF9jYWNoZTogSGFuZGxlIEVTSSB0YWdzLgoKICAgICogbW9kX2NhY2hlOiBSZXNvbHZlIGlzc3VlIG9mIGhvdyB0byBjYWNoZSBwYWdlIGZyYWdlbWVudHMgKG9yIHBlcmhhcHMKICAgICAgLWlmLSB3ZSB3YW50IHRvIGNhY2hlIHBhZ2UgZnJhZ2VtZW50cykuIFRvZGF5LCBtb2RfY2FjaGUvbW9kX21lbV9jYWNoZQogICAgICB3aWxsIGNhY2hlICNpbmNsdWRlICd2aXJ0dWFsJyByZXF1ZXN0cyAoYnV0IG5vdCAjaW5jbHVkZSAnZmlsZScKICAgICAgcmVxdWVzdHMpLiBUaGlzIHdhcyBhY2NvbXBsaXNoZWQgYnkgbWFraW5nIENBQ0hFX0lOIGEKICAgICAgQ09OVEVOVF9TRVQtMSBmaWx0ZXIgdG8gZm9yY2UgaXQgdG8gcnVuIGJlZm9yZSB0aGUgU1VCUkVRX0NPUkUKICAgICAgZmlsdGVyLiAgQnV0IG5vdyByZXNwb25zZXMgY2Fubm90IGJlIGNhY2hlZCB0aGF0IGluY2x1ZGUgdGhlCiAgICAgIGVmZmVjdHMgb2YgaGF2aW5nIGJlZW4gcnVuIHRocm91Z2ggQ09OVEVOVF9TRVQgZmlsdGVycwogICAgICAobW9kX2RlZmxhdGUsIG1vZF9leHBpcmVzLCBldGMpLiAgV2UgY291bGQgcmVydW4gYWxsIHRoZQogICAgICBDT05URU5UX1NFVCBmaWx0ZXJzIG9uIHRoZSBjYWNoZWQgcmVzcG9uc2UsIGJ1dCB0aGlzIHdpbGwgbm90CiAgICAgIHdvcmsgaW4gYWxsIGNhc2VzLiBGb3IgZXhhbXBsZSwgbW9kX2V4cGlyZXMgcmVsaWVzIG9uIGluc3RhbGxpbmcKICAgICAgdGhlIEVYUElSQVRJT04gZmlsdGVyIGR1cmluZyBmaXh1cHMuIENvbnRlbnRzIHNlcnZlZCBvdXQgb2YKICAgICAgbW9kX2NhY2hlIChvdXQgb2YgdGhlIHF1aWNrX2hhbmRsZXIpIGJ5cGFzcyAtYWxsLSB0aGUgcmVxdWVzdAogICAgICBsaW5lIHNlcnZlciBob29rcyAoUnlhbiByZWFsbHkgaGF0ZWQgdGhpcy4gSXQgaXMgZ3JlYXQgZm9yCiAgICAgIHBlcmZvcm1hbmNlLCBidXQgYmFkIGJlY2F1c2Ugb2YgdGhlIGNvbXBsaWNhdGlvbnMgbGlzdGVkIGFib3ZlKS4KCiAgICBtb2RfY2FjaGUvbW9kX21lbV9jYWNoZS9tb2RfZGlza19jYWNoZToKCiAgICAqIG1vZF9tZW1fY2FjaGU6IENvbnNpZGVyIGFkZGluZyBhIFJldmFsaWRhdGVUaW1lb3V0IGRpcmVjdGl2ZSB0bwogICAgICBzcGVjaWZ5IHRpbWUgYXQgd2hpY2ggbG9jYWwgY2FjaGVkIGNvbnRlbnQgaXMgdG8gYmUgcmV2YWxpZGF0ZWQKICAgICAgKGllLCB1bmRlcmx5aW5nIGZpbGUgc3RhdCdlZCB0byBzZWUgaWYgaXQgaGFzIGNoYW5nZWQpLgoKICAgICogbW9kX2NhY2hlOiBDYWNoZUVuYWJsZS9DYWNoZURpc2FibGUgc2hvdWxkIGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zLgogICAgICBqZXJlbmtyYW50eiBzYXlzOiBUb28gc2xvdy4gIEdldCByZWdleHMgYXdheSBmcm9tIHNwZWVkeSBjYWNoZXMgYnkKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdC4gIEludHJvZHVjZSBhIG5ldyBDYWNoZUVuYWJsZVJlZ2V4IGlmIHlvdSB3YW50LgoKICAgICogbW9kX21lbV9jYWNoZS9tb2RfZGlza19jYWNoZTogTmVlZCB0byBiZSBhYmxlIHRvIHF1ZXJ5IGNhY2hlCiAgICAgIHN0YXR1cyAobnVtIG9mIGVudHJpZXMsIGNhY2hlIG9iamVjdCBwcm9wZXJ0aWVzLCBldGMuKS4KICAgICAgbW9kX3N0YXR1cyBjb3VsZCBiZSBleHRlbmRlZCB0byBxdWVyeSBvcHRpb25hbCBob29rcyBkZWZpbmVkCiAgICAgIGJ5IG1vZHVsZXMgZm9yIHRoZSBwdXJwb3NlIG9mIHJlcG9ydGluZyBtb2R1bGUgc3RhdHVzLgogICAgICBtb2RfY2FjaGUgKGV0LiBhbC4pIGNvdWxkIGRlZmluZSBvcHRpb25hbCBob29rcyB0aGF0IGFyZSBjYWxsZWQKICAgICAgdG8gY29sbGVjdCBzdGF0dXMuICBTdGF0dXMgc2hvdWxkIGJlIHF1ZXJ5YWJsZSBieQogICAgICBIVFRQIG9yIFNOTVA/CiAgICAgIGplcmVua3JhbnR6IHNheXM6IFlhd24uICBXaG8gY2FyZXMuCgogICAgKiBNYXhSZXF1ZXN0c1BlckNoaWxkIG1lYXN1cmVzIGNvbm5lY3Rpb25zLCBub3QgcmVxdWVzdHMuCiAgICAgICAgVW50aWwgc29tZW9uZSBoYXMgYSBiZXR0ZXIgd2F5LCB3ZSdsbCBwcm9iYWJseSBqdXN0IHJlbmFtZSBpdAogICAgICAgICJNYXhDb25uZWN0aW9uc1BlckNoaWxkIi4KICAgIAogICAgKiBSZWdleCBjb250YWluZXJzIGRvbid0IHdvcmsgaW4gYW4gaW50dXRpdmUgd2F5CiAgICAgICAgU3RhdHVzOiBObyBvbmUgaGFzIGNvbWUgdXAgd2l0aCBhbiBlZmZpY2llbnQgd2F5IHRvIGZpeCB0aGlzCiAgICAgICAgYmVoYXZpb3IuIERlYW4gaGFzIHN1Z2dlc3RlZCBnZXR0aW5nIHJpZCBvZiByZWdleCBjb250YWluZXJzCiAgICAgICAgY29tcGxldGVseS4KICAgICAgICBPdGhlckJpbGwgc3VnZ2VzdHM6IFdlIGF0IGxlYXN0IHNlZW0gdG8gYWdyZWUgb24gZWxpbWluYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSA8Q29udGFpbmVyIH4gZm9vPiBmb3JtcywgYW5kIHVzaW5nIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb250YWluZXJNYXRjaCBmb28+IHNlbWFudGljcy4KCiAgICAqIG9yaWdfY3QgaW4gdGhlIGJ5dGVyYW5nZS9tdWx0aXBhcnQgaGFuZGxpbmcgbWF5IG5vdCBiZQogICAgICBuZWVkZWQuIEFwYWNoZSAxLjMganVzdCBuZXZlciBzdGFzaGVkICJtdWx0aXBhcnQiIGludG8KICAgICAgci0+Y29udGVudF90eXBlLiBXZSBzaG91bGQgcHJvYmFibHkgZm9sbG93IHN1aXQgc2luY2UgdGhlCiAgICAgIGJ5dGVyYW5nZSBzdHVmZiBkb2Vzbid0IHdhbnQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgdG8gc2VlIHRoZQogICAgICBtdWx0aXBhcnQgY29udGVudC10eXBlOyB0aGUgb3RoZXIgY29kZSBzaG91bGQgc3RpbGwgdGhpbmsgaXQgaXMKICAgICAgZGVhbGluZyB3aXRoIHRoZSA8b3JpZ19jdD4gc3R1ZmYuCiAgICAgICAgU3RhdHVzOiBHcmVnIHZvbHVudGVlcnMgdG8gaW52ZXN0aWdhdGUgKGVzcC4gc2luY2UgaGUgd2FzIG1vc3QgCiAgICAgICAgICAgICAgICBsaWtlbHkgdGhlIG9uZSB0byBicmVhayBpdCA6LSkKCkVYUEVSSU1FTlRBTCBNT0RVTEVTOgoKICAgIEV4cGVyaW1lbnRhbCBtb2R1bGVzIHNob3VsZCBldmVudHVhbGx5IGJlIGJlIHByb21vdGVkIHRvIGZ1bGx5IHN1cHBvcnRlZAogICAgc3RhdHVzIG9yIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSBlbnRpcmVseSAoaWUsIHRoZQogICAgJ2V4cGVyaW1lbnQnIGZhaWxlZCkuIFRoaXMgc2VjdGlvbiB0cmFja3Mgd2hhdCBuZWVkcyB0byBoYXBwZW4gdG8gCiAgICBnZXQgdGhlIG1vZHVsZXMgcHJvbW90ZWQgdG8gZnVsbHkgc3VwcG9ydGVkIHN0YXR1cy4KCgo=