MC40OSAtIEZyaSAyMyBGZWJydWFyeSAyMDA3CgotIFNlY3VyaXR5OiBkYmNsaWVudCBwcmV2aW91c2x5IHdvdWxkIHByb21wdCB0byBjb25maXJtIGEgCiAgbWlzbWF0Y2hpbmcgaG9zdGtleSBidXQgd291bGRuJ3Qgd2FybiBsb3VkbHkuIEl0IHdpbGwgbm93CiAgZXhpdCB1cG9uIGEgbWlzbWF0Y2guCgotIENvbXBpbGUgZml4ZXMsIG1ha2Ugc3VyZSB0aGF0IGFsbCB2YXJpYWJsZSBkZWZpbml0aW9ucyBhcmUgYXQgdGhlIHN0YXJ0CiAgb2YgYSBzY29wZS4KCi0gQWRkZWQgLVAgcGlkZmlsZSBhcmd1bWVudCB0byB0aGUgc2VydmVyIChmcm9tIFN3ZW4gU2NoaWxsaWcpCgotIEFkZCAtTiBkYmNsaWVudCBvcHRpb24gZm9yICJubyBjb21tYW5kIgoKLSBBZGQgLWYgZGJjbGllbnQgb3B0aW9uIGZvciAiYmFja2dyb3VuZCBhZnRlciBhdXRoIgoKLSBBZGQgYWJpbGl0eSB0byBsaW1pdCBiaW5kaW5nIHRvIHBhcnRpY3VsYXIgYWRkcmVzc2VzLCB1c2UgCiAgLXAgW2FkZHJlc3M6XXBvcnQsIHBhdGNoIGZyb20gTWF4LUdlcmQgUmV0emxhZmYuCgotIFRyeSB0byBmaW5hbGx5IGZpeCBzc19mYW1pbHkgY29tcGlsYXRpb24gcHJvYmxlbXMgKGZvciBvbGQKICBnbGliYyBzeXN0ZW1zKQoKLSBGaXggZmluZGluZyByZWxhdGl2ZS1wYXRoIHNlcnZlciBob3N0a2V5cyB3aGVuIHJ1bm5pbmcgZGFlbW9uaXplZAoKLSBVc2UgJEhPTUUgaW4gcHJlZmVyZW5jZSB0byB0aGF0IGZyb20gL2V0Yy9wYXNzd2QsIHNvIHRoYXQKICBkYmNsaWVudCBjYW4gc3RpbGwgd29yayBvbiBicm9rZW4gc3lzdGVtcy4KCi0gRml4IHZhcmlvdXMgaXNzdWVzIGZvdW5kIGJ5IEtsb2N3b3JrIGRlZmVjdCBhbmFseXNpcywgbW9zdGx5IG1lbW9yeSBsZWFrcwogIGFuZCBlcnJvci1oYW5kbGluZy4gVGhhbmtzIHRvIEtsb2N3b3JrIGZvciB0aGVpciBzZXJ2aWNlLgoKLSBJbXByb3ZlIGJ1aWxkaW5nIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5CgotIEFkZCBjb21waWxlLXRpbWUgTE9HX0NPTU1BTkRTIG9wdGlvbiB0byBsb2cgdXNlciBjb21tYW5kcwoKLSBBZGQgJy15JyBmbGFnIHRvIGRiY2xpZW50IHRvIHVuY29uZGl0aW9uYWxseSBhY2NlcHQgaG9zdCBrZXlzLAogIHBhdGNoIGZyb20gTHVjaWFubyBNaWd1ZWwgRmVycmVpcmEgUm9jaGEKCi0gUmV0dXJuIGltbWVkaWF0ZWx5IGZvciAic2xlZXAgMTAgJiBlY2hvIGZvbyIsIHJhdGhlciB0aGFuIHdhaXRpbmcKICBmb3IgdGhlIHNsZWVwIHRvIHJldHVybiAocG9pbnRlZCBvdXQgYnkgUm9iIExhbmRsZXkpLgogIAotIEF2b2lkIGhhbmdpbmcgYWZ0ZXIgZXhpdCBpbiBjZXJ0YWluIGNhc2VzIChzdWNoIGFzIHNjcCkKCi0gVmFyaW91cyBtaW5vciBmaXhlcywgaW4gcGFydGljdWxhciB2YXJpb3VzIGxlYWtzIHJlcG9ydGVkIGJ5CiAgRXJpayBIb3ZsYW5kCiAgCi0gRGlzYWJsZSBjb3JlIGR1bXBzIG9uIHN0YXJ0dXAKCi0gRG9uJ3QgZXJhc2Ugb3ZlciBldmVyeSBzaW5nbGUgYnVmZmVyLCBzaW5jZSBpdCB3YXMgYSBib3R0bGVuZWNrLgogIE9uIHN5c3RlbXMgd2hlcmUgaXQgcmVhbGx5IG1hdHRlcnMsIGVuY3J5cHRlZCBzd2FwIHNob3VsZCBiZSB1dGlsaXNlZC4KCi0gUmVhZCAvZGV2L1t1XXJhbmRvbSBvbmx5IG9uY2UgYXQgc3RhcnR1cCB0byBjb25zZXJ2ZSBrZXJuZWwgZW50cm9weQoKLSBVcGdyYWRlIHRvIExpYlRvbUNyeXB0IDEuMTYgYW5kIExpYlRvbU1hdGggMC40MAoKLSBVcGdyYWRlIGNvbmZpZy5zdGF0dXMgYW5kIGNvbmZpZy5ndWVzcyAKCjAuNDguMSAtIFNhdCAxMSBNYXJjaCAyMDA2CgotIENvbXBpbGUgZml4IGZvciBzY3AKCjAuNDggLSBUaHVycyA5IE1hcmNoIDIwMDYKCi0gQ2hlY2sgdGhhdCB0aGUgY2lyY3VsYXIgYnVmZmVyIGlzIHByb3Blcmx5IGVtcHR5IGJlZm9yZQogIGNsb3NpbmcgYSBjaGFubmVsLCB3aGljaCBjb3VsZCBjYXVzZSB0cnVuY2F0ZWQgdHJhbnNmZXJzCiAgKHRoYW5rcyB0byBUb21hcyBWYW5layBmb3IgaGVscGluZyB0cmFjayBpdCBkb3duKQoKLSBJbXBsZW1lbnQgcGVyLUlQIHByZS1hdXRoZW50aWNhdGlvbiBjb25uZWN0aW9uIGxpbWl0cyAKICAoYWZ0ZXIgc29tZSBwb2tpbmcgZnJvbSBQYWJsbyBGZXJuYW5kZXopCgotIEV4aXQgZ3JhY2VmdWxseSBpZiB0cnlpbmcgdG8gY29ubmVjdCB0byBhcyBTU0ggdjEgc2VydmVyIAogIChyZXBvcnRlZCBieSBSdXNoaSBMYWxhKQoKLSBPbmx5IHJlYWQgL2Rldi9yYW5kb20gb25jZSBhdCBzdGFydHVwIHdoZW4gaW4gbm9uLWluZXRkIG1vZGUKCi0gQWxsb3cgY3RybC1jIHRvIGNsb3NlIGEgZGJjbGllbnQgcGFzc3dvcmQgcHJvbXB0IChtYXkKICBzdGlsbCBoYXZlIHRvIHByZXNzIGVudGVyIG9uIHNvbWUgcGxhdGZvcm1zKQoKLSBNZXJnZWQgaW4gdUNsaW51eCBwYXRjaCBmb3IgaW5ldGQgbW9kZQoKLSBVcGRhdGVkIHRvIHNjcCBmcm9tIE9wZW5TU0ggNC4zcDIgLSBmaXhlcyBhIHNlY3VyaXR5IGlzc3VlCiAgd2hlcmUgdXNlIG9mIHN5c3RlbSgpIGNvdWxkIGNhdXNlIHVzZXJzIHRvIGV4ZWN1dGUgYXJiaXRyYXJ5CiAgY29kZSB0aHJvdWdoIG1hbGZvcm1lZCBmaWxlbmFtZXMsIHJlZiBDVkUtMjAwNi0wMjI1CgowLjQ3IC0gVGh1cnMgRGVjIDggMjAwNQoKLSBTRUNVUklUWTogZml4IGZvciBidWZmZXIgYWxsb2NhdGlvbiBlcnJvciBpbiBzZXJ2ZXIgY29kZSwgY291bGQgcG90ZW50aWFsbHkKICBhbGxvdyBhdXRoZW50aWNhdGVkIHVzZXJzIHRvIGdhaW4gZWxldmF0ZWQgcHJpdmlsZWdlcy4gQWxsIG11bHRpLXVzZXIgc3lzdGVtcwogIHJ1bm5pbmcgdGhlIHNlcnZlciBzaG91bGQgdXBncmFkZSAob3IgYXBwbHkgdGhlIHBhdGNoIGF2YWlsYWJsZSBvbiB0aGUKICBEcm9wYmVhciB3ZWJwYWdlKS4KCi0gRml4IGNoYW5uZWwgaGFuZGxpbmcgY29kZSBzbyB0aGF0IHJlZGlyZWN0aW5nIHRvIC9kZXYvbnVsbCBkb2Vzbid0IHVzZQogIDEwMCUgQ1BVLgoKLSBUdXJuIG9uIHpsaWIgY29tcHJlc3Npb24gZm9yIGRiY2xpZW50LgoKLSBTZXQgImxvdyBkZWxheSIgVE9TIGJpdCwgY2FuIHNpZ25pZmljYW50bHkgaW1wcm92ZSBpbnRlcmFjdGl2aXR5CiAgb3ZlciBzb21lIGxpbmtzLgoKLSBBZGRlZCBjbGllbnQga2V5Ym9hcmQtaW50ZXJhY3RpdmUgbW9kZSBzdXBwb3J0LCBhbGxvd3Mgb3BlcmF0aW9uIHdpdGgKICBuZXdlciBPcGVuU1NIIHNlcnZlcnMgaW4gZGVmYXVsdCBjb25maWcuCgotIExvZyB3aGVuIHB1YmtleSBhdXRoIGZhaWxzIGJlY2F1c2Ugb2YgYmFkIH4vLnNzaC9hdXRob3JpemVkX2tleXMgcGVybWlzc2lvbnMKCi0gSW1wcm92ZSBsb2dnaW5nIG9mIGFzc2VydGlvbnMKCi0gQWRkZWQgYWVzLTI1NiBjaXBoZXIgYW5kIHNoYTEtOTYgaG1hYy4KCi0gRml4IHR3b2Zpc2ggc28gdGhhdCBpdCBhY3R1YWxseSB3b3Jrcy4KCi0gSW1wcm92ZSBQQU0gcHJvbXB0IGNvbXBhcmlzb24uCgotIEFkZGVkIC1nIChkYmNsaWVudCkgYW5kIC1hIChkcm9wYmVhciBzZXJ2ZXIpIG9wdGlvbnMgdG8gYWxsb3cKICBjb25uZWN0aW9ucyB0byBsaXN0ZW5pbmcgZm9yd2FyZGVkIHBvcnRzIGZyb20gcmVtb3RlIG1hY2hpbmVzLgoKLSBWYXJpb3VzIG90aGVyIG1pbm9yIGZpeGVzCgotIENvbXBpbGUgZml4ZXMgZm9yIGdsaWJjIDIuMSAoc3NfZmFtaWx5IHZzIF9fc3NfZmFtaWx5KSBhbmQgTmV0QlNECiAgKG5ldGluZXQvaW5fc3lzdG0uaCBuZWVkcyB0byBiZSBpbmNsdWRlZCkuCgowLjQ2IC0gU2F0IEp1bHkgOSAyMDA1CgotIEZpeCBsb25nLXN0YW5kaW5nIGJ1ZyB3aGljaCBjYXVzZWQgY29ubmVjdGlvbnMgdG8gYmUgY2xvc2VkIGlmIGFuIHNzaC1hZ2VudAogIHNvY2tldCB3YXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQoKLSBQcmludCBhIHdhcm5pbmcgaWYgd2Ugc2VlbSB0byBiZSBibG9ja2luZyBvbiAvZGV2L3JhbmRvbSAKICAoc3VnZ2VzdGVkIGJ5IFBhdWwgRm94KQoKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIERTUyBjb2RlICh0aGFua3MgdG8gQm9yaXMgQmVyZXpvdnNreSBmb3IgdGhlIHBhdGNoKQoKLSBkYmNsaWVudCAtTCBubyBsb25nZXIgc2VnZmF1bHRzLCBhbGxvY2F0ZSBjb3JyZWN0IGJ1ZmZlciBzaXplICh0aGFua3MKICB0byBEYXZpZCBDb29rIGZvciByZXBvcnRpbmcgaXQsIGFuZCBDaHJpc3RvcGhlciBGYXlsb3IgZm9yIGluZGVwZW5kZW50bHkKICBzZW5kaW5nIGluIGEgcGF0Y2gpCgotIEFkZGVkIFJTQSBibGluZGluZyB0byBzaWduaW5nIGNvZGUgKHN1Z2dlc3RlZCBieSBEYW4gS2FtaW5za3kpCgotIFJlYXJyYW5nZWQgYmlnbnVtIHJlYWRpbmcvcmFuZG9tIGdlbmVyYXRpb24gY29kZQoKLSBSZXNldCB0aGUgbm9uLWJsb2NraW5nIHN0YXR1cyBvbiBzdGRlcnIgYW5kIHN0ZG91dCBhcyB3ZWxsIGFzIHN0ZGluLAogIGZpeGVzIGEgcHJvYmxlbSB3aGVyZSB0aGUgc2hlbGwgcnVubmluZyBkYmNsaWVudCB3aWxsIGV4aXQgKHRoYW5rcyB0byAKICBCcmVudCBSb21hbiBmb3IgcmVwb3J0aW5nIGl0KQoKLSBGaXggc28gdGhhdCBhbGwgZmlsZSBkZXNjcmlwdG9ycyBhcmUgY2xvc2VkIHNvIHRoZSBjaGlsZCBzaGVsbCBkb2Vzbid0CiAgaW5oZXJpdCBkZXNjcmlwdG9ycyAodGhhbmtzIHRvIExpbmRlbiBNYXkgZm9yIHRoZSBwYXRjaCkKCi0gQ2hhbmdlIHNpZ25rZXkuYyB0byBhdm9pZCBnY2MgNCBnZW5lcmF0aW5nIGluY29ycmVjdCBjb2RlCgotIEFmdGVyIGJvdGggc2lkZXMgb2YgYSBmaWxlIGRlc2NyaXB0b3IgaGF2ZSBiZWVuIHNodXRkb3duKCksIGNsb3NlKCkKICBpdCB0byBhdm9pZCBsZWFraW5nIGRlc2NyaXB0b3JzICh0aGFua3MgdG8gQXJpIEh5dHRpbmVuIGZvciBhIHBhdGNoKQoKLSBVcGRhdGUgdG8gTGliVG9tQ3J5cHQgMS4wNSBhbmQgTGliVG9tTWF0aCAwLjM1CgowLjQ1IC0gTW9uIE1hcmNoIDcgMjAwNQoKLSBNYWtlZmlsZSBubyBsb25nZXIgYXBwZW5kcyAnc3RhdGljJyB0byBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcwoKLSBBZGQgb3B0aW9uYWwgU1NIX0FTS1BBU1Mgc3VwcG9ydCB0byB0aGUgY2xpZW50CgotIFJlc3BlY3QgSE9TVF9MT09LVVAgb3B0aW9uCgotIEZpeCBhY2NpZGVudGFsbHkgcmVtb3ZlZCAicmV0dXJuOyIgc3RhdGVtZW50IHdoaWNoIHdhcyByZW1vdmVkIGluIDAuNDQKICAoY2F1c2luZyBjbGllbnRzIHdoaWNoIHNlbnQgYW4gZW1wdHkgdGVybWluYWwtbW9kZXMgc3RyaW5nIHRvIGZhaWwgdG8KICBjb25uZWN0IC0gaW5jbHVkaW5nIHBzc2gsIHNzaC5jb20sIGRhbmdlciBoaXB0b3ApLiAocGF0Y2hlcwogIGluZGVwZW5kZW50bHkgZnJvbSBQYXVsIEZveCwgRGF2aWQgSG9yd2l0dCBhbmQgU3Zlbi1PbGEgVHVlY2tlKQoKLSBSZWFkICJ5L24iIHJlc3BvbnNlIGZvciBmaW5nZXJwcmludHMgZnJvbSAvZGV2L3R0eSBkaXJlY3RseSBzbyB0aGF0IGRiY2xpZW50CiAgd2lsbCB3b3JrIHdpdGggc2NwLgoKMC40NCAtIE1vbiBKYW4gMyAyMDA1CgotIFNFQ1VSSVRZOiBGaXggZm9yIFBBTSBhdXRoIHNvIHRoYXQgdXNlcm5hbWVzIGFyZSBsb2dnZWQgYW5kIGNvbnZlcnNhdGlvbgogIGZ1bmN0aW9uIHJlc3BvbnNlcyBhcmUgYWxsb2NhdGVkIGNvcnJlY3RseSAtIGFsbCAwLjQ0dGVzdDQgdXNlcnMgd2l0aCBQQU0KICBjb21waWxlZCBpbiAobm90IGRlZmF1bHQpIGFyZSBhZHZpc2VkIHRvIHVwZ3JhZGUuCgotIEZpeCBjYWxscyB0byBnZXRuYW1laW5mbygpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggU29sYXJpcwoKLSBQcmlzdGluZSBjb21waWxhdGlvbiB3b3JrcyAocnVuICdjb25maWd1cmUnIGZyb20gYSBmcmVzaCBkaXIgYW5kIG1ha2UgaXQKICB0aGVyZSkKCi0gRml4ZXMgZm9yIGNvbXBpbGluZyB3aXRoIG1vc3Qgb3B0aW9ucyBkaXNhYmxlZC4KCi0gVXBncmFkZWQgdG8gTGliVG9tQ3J5cHQgMC45OSBhbmQgTGliVG9tTWF0aCAwLjMyCgotIE1ha2Ugc3VyZSB0aGF0IHplcm9pbmcgb3V0IG9mIHZhbHVlcyBpbiBMVE0gYW5kIExUQyB3b24ndCBnZXQgb3B0aW1pc2VkIGF3YXkKCi0gUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb25zIGZyb20gbG9naW5yZWMuYwoKLSAvZGV2L3JhbmRvbSBpcyBub3cgdGhlIGRlZmF1bHQgZW50cm9weSBzb3VyY2UgcmF0aGVyIHRoYW4gL2Rldi91cmFuZG9tCgotIExvZ2dpbmcgb2YgSVBzIGluIGF1dGggc3VjY2Vzcy9mYWlsdXJlIG1lc3NhZ2VzIGZvciBpbXByb3ZlZCBncmVwcGFiaWxpdHkKCi0gRml4IGRiY2xpZW50IHNvIHRoYXQgInNjcCAtaSBrZXlmaWxlIiB3b3Jrcy4gKEl0IGNhbiBoYW5kbGUgIi1pa2V5ZmlsZQogIHByb3Blcmx5KQoKLSBBdm9pZCBhIHJhY2UgaW4gc2VydmVyIHNoZWxsLWhhbmRsaW5nIGNvZGUgd2hpY2ggcHJldmVudHMgdGhlIGV4aXQtY29kZQogIGZyb20gYmVpbmcgcmV0dXJuZWQgdG8gdGhlIGNsaWVudCBpbiBzb21lIGNpcmN1bXN0YW5jZXMuCgotIE1ha2VmaWxlIG1vZGlmaWVkIHNvIHRoYXQgaW5zdGFsbCB0YXJnZXQgd29ya3MgY29ycmVjdGx5IChkb2Vzbid0IHRyeQogIHRvIGluc3RhbGwgImFsbCIgYmluYXJ5KSAtIHBhdGNoIGZyb20gSnVlcmdlbiBEYXViZXJ0CgotIFZhcmlvdXMgbWlub3IgZml4ZXMgYW5kIGNvbXBpbGUgd2FybmluZ3MuCgowLjQ0dGVzdDQgLSBUdWUgU2VwdCAxNCAyMDA0IDIxOjE1OjU0ICswODAwCgotIEZpeCBpbmV0ZCBtb2RlIHNvIGl0IGFjdHVhbGx5IGxvYWRzIHRoZSBob3N0a2V5cyAob29wcykKCi0gQ2hhbmdlZCBEUk9QQkVBUl9ERUZQT1JUIHByb3Blcmx5IGV2ZXJ5d2hlcmUKCi0gRml4IGEgc21hbGwgbWVtb3J5IGxlYWsgaW4gdGhlIGF1dGggY29kZQoKLSBXQ09SRURVTVAgaXMgb25seSB1c2VkIG9uIHN5c3RlbXMgd2hpY2ggc3VwcG9ydCBpdCAoaWUgbm90IGN5Z3dpbiBvciBBSVgpCgotIENoZWNrIChhbmQgZmFpbCBmb3IpIGNhc2VzIHdoZW4gd2UgY2FuJ3QgbmVnb3RpYXRlIGFsZ29yaXRobXMgd2l0aCB0aGUKICByZW1vdGUgc2lkZSBzdWNjZXNzZnVsbHkgKHJhdGhlciB0aGFuIGJvbWJpbmcgb3V0IHVuZ3JhY2VmdWxseSkKCi0gSGFuZGxlIGF1dGhvcml6ZWRfa2V5cyBmaWxlcyB3aXRob3V0IGEgdGVybWluYXRpbmcgbmV3bGluZQoKLSBGaWRkbGUgdGhlIGNoYW5uZWwgcmVjZWl2ZSB3aW5kb3cgc2l6ZSBmb3IgcG9zc2libHkgYmV0dGVyIHBlcmZvcm1hbmNlCgotIEFkZGVkIGluIHRoZSBQQU0gYXV0aGVudGljYXRpb24gY29kZSAoZmluYWxseSEgdGhhbmtzIHRvIE1hcnRpbiBDYXJsc3NvbikKCjAuNDR0ZXN0MyAtIEZyaSBBdWcgMjcgMjI6MjA6NTQgKzA4MDAKCi0gRml4ZWQgYSBidW5jaCBvZiB3YXJuaW5ncy4KCi0gc2NwIHdvcmtzIGNvcnJlY3RseSB3aGVuIHBhc3NlZCBhIHVzZXJuYW1lIChmaXggZm9yIHRoZSBkYmNsaWVudCBwcm9ncmFtCiAgaXRzZWxmIGFzIHdlbGwsICItbG1hdHQiIHdvcmtzIGFzIHdlbGwgYXMgIi1sIG1hdHQiKS4KCi0gUmVtb3ZlIHVucmVxdWlyZWQgZGViaWFuIGZpbGVzCgotIEV4aXQgd2l0aCB0aGUgcmVtb3RlIHByb2Nlc3MncyByZXR1cm4gY29kZSBmb3IgZGJjbGllbnQKCi0gRGlzcGxheSBzdGRlcnIgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyIGluIHRoZSBjbGllbnQKCi0gQWRkIGNpcmN1bGFyIGJ1ZmZlcmluZyB0byB0aGUgY2hhbm5lbCBjb2RlLiBUaGlzIHNob3VsZCBkcmFtYXRpY2FsbHkgcmVkdWNlCiAgdGhlIGFtb3VudCBvZiBiYWNrdHJhZmZpYyBzZW50IGluIHJlc3BvbnNlIHRvIHRyYWZmaWMgaW5jb21pbmcgdG8gdGhlCiAgRHJvcGJlYXIgZW5kIC0gaW1wcm92ZXMgaGlnaC1sYXRlbmN5IHBlcmZvcm1hbmNlIChpZSBkaWFsdXApLgoKLSBWYXJpb3VzIG90aGVyIHJlbGF0ZWQgY2hhbm5lbC1oYW5kbGluZyBmaXh1cHMuCgotIEFsbG93IGxlYWRpbmcgbGluZXMgaW4gdGhlIGJhbm5lciB3aGVuIGNvbm5lY3RpbmcgdG8gc2VydmVycwoKLSBGaXhlZCBwcmludGluZyBvdXQgZXJyb3JzIG9udG8gdGhlIG5ldHdvcmsgc29ja2V0IHdpdGggc3RkZXJyIChmb3IgaW5ldGQKICBtb2RlIHdoZW4gdXNpbmcgeGluZXRkKQoKLSBSZW1vdmUgb2JzZWxldGUgZG9jdW1lbnRhdGlvbgoKLSBGaXggYSBudWxsLXBvaW50ZXIgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIGZyZWUgbm9uLWV4aXN0YW50IGxpc3RlbmVycwogIGF0IGNsZWFudXAuCgotIERFQlVHX1RSQUNFIG5vdyBvbmx5IHdvcmtzIGlmIHlvdSBhZGQgIi12IiB0byB0aGUgcHJvZ3JhbSBjb21tYW5kbGluZQoKLSBEb24ndCBsZWF2ZSBzdGRpbiBub24tYmxvY2tpbmcgb24gZXhpdCAtIHRoaXMgY2F1c2VkIHRoZSBwYXJlbnQgc2hlbGwKICBvZiBkYmNsaWVudCB0byBjbG9zZSB3aGVuIGRiY2xpZW50IGV4aXRlZCwgZm9yIHNvbWUgc2hlbGxzIGluIEJ1c3lCb3gKCi0gU2VydmVyIGNvbm5lY3Rpb25zIG5vIGxvbmdlciB0aW1lb3V0IGFmdGVyIDUgbWludXRlcwoKLSBGaXhlZCBzdHVwaWQgRFNTIGhvc3RrZXkgdHlwbyAoc2VydmVyIGNvdWxkbid0IGxvYWQgaG9zdCBrZXlzKQoKMC40NHRlc3QyIC0gVHVlcyBBdWcgMTcgMjAwNCAxNzo0Mzo1NCArMDgwMAoKLSBGaXggdXAgZHJvcGJlYXJtdWx0aSB0YXJnZXRzIGluIHRoZSBNYWtlZmlsZSAtIHN5bWxpbmtzIGFyZSBub3cgY3JlYXRlZAoKLSBDb21waWxlIGZha2UtcmZjMjU1MyBldmVuIHdpdGggZHJvcGJlYXJjb252ZXJ0L2Ryb3BiZWFya2V5IC0gdGhpcyAKICBhbGxvd3MgdGhlbSB0byB3b3JrIG9uIHBsYXRmb3JtcyB3aXRob3V0IGEgbmF0aXZlIGdldGFkZHJpbmZvKCkKCi0gQ3JlYXRlIH4vLnNzaC9rbm93bl9ob3N0cyBwcm9wZXJseSBpZiBpdCBkb2Vzbid0IGV4aXN0CgotIEZpeCBiYXNlbmFtZSgpIGZ1bmN0aW9uIHByb3RvdHlwZQoKLSBCYWNrcG9ydCBzb21lIGxvY2FsIGNoYW5nZXMgKG1vcmUgI2lmZGVmcyBmb3IgdGVybWNvZGVzLmMsIGEgZml4IGZvciBtaXNzaW5nCiAgZGVmaW5lcyBvbiBBSVgpLgoKLSBMZXQgZGJjbGllbnQgYmUgcnVuIGFzICJzc2giCgotIEluaXRpYWxpc2UgbXBfaW50cyBieSBkZWZhdWx0CgowLjQ0dGVzdDEgLSBTdW4gQXVnIDE2IDIwMDUgMTc6NDM6NTQgKzA4MDAKCi0gVEVTVElORyBSRUxFQVNFIC0gdGhpcyBpcyB0aGUgZmlyc3QgcHVibGljIHJlbGVhc2Ugb2YgdGhlIGNsaWVudCBjb2RlYmFzZSwKICBzbyB0aGVyZSBhcmUgc3VyZSB0byBiZSBidWdzIHRvIGJlIGZvdW5kLiBJbiBhZGRpdGlvbiwgaWYgeW91J3JlIGp1c3QgdXNpbmcKICB0aGUgc2VydmVyIHBvcnRpb24sIHRoZSBmaW5hbCBiaW5hcnkgc2l6ZSBwcm9iYWJseSB3aWxsIGluY3JlYXNlIC0gSSdsbAogIGJlIHRyeWluZyB0byBnZXQgaXQgYmFjayBkb3duIGluIGZ1dHVyZSByZWxlYXNlcy4KCi0gRHJvcGJlYXIgY2xpZW50IGFkZGVkIC0gbG90cyBvZiBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIgY29kZSBhcyB3ZWxsIHRvIAogIGdlbmVyYWxpc2UgdGhpbmdzCgotIElQdjYgc3VwcG9ydCBhZGRlZCBmb3IgY2xpZW50LCBzZXJ2ZXIsIGFuZCBmb3J3YXJkaW5nCgotIE5ldyBtYWtlZmlsZSB3aXRoIG1vcmUgZ2VuZXJpYyBzdXBwb3J0IGZvciBtdWx0aXBsZS1wcm9ncmFtIGJpbmFyaWVzCgowLjQzIC0gRnJpIEp1bCAxNiAyMDA0IDE3OjQ0OjU0ICswODAwCgotIFNFQ1VSSVRZOiBEb24ndCB0cnkgdG8gZnJlZSgpIHVuaW5pdGlhbGlzZWQgdmFyaWFibGVzIGluIERTUyB2ZXJpZmljYXRpb24KICBjb2RlLiBUaGFua3MgdG8gQXJuZSBCZXJuaW4gZm9yIHBvaW50aW5nIG91dCB0aGlzIGJ1Zy4gVGhpcyBpcyBwb3NzaWJseQogIGV4cGxvaXRhYmxlLCBhbGwgdXNlcnMgd2l0aCBEU1MgYW5kIHB1YmtleS1hdXRoIGNvbXBpbGVkIGluIGFyZSBhZHZpc2VkIHRvCiAgdXBncmFkZS4KCi0gQ2xlYW4gdXAgYWdlbnQgZm9yd2FyZGluZyBzb2NrZXQgZmlsZXMgY29ycmVjdGx5LCBwYXRjaCBmcm9tIEdlcnJpdCBQYXBlLgoKLSBEb24ndCBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlbiBwb3J0Zm9yd2FyZGluZyB0byBzZXJ2ZXJzIHdoaWNoIGRvbid0CiAgc2VuZCBhbnkgaW5pdGlhbCBkYXRhL2Jhbm5lci4gUGF0Y2ggZnJvbSBOaWtvbGEgVmxhZG92CgotIEZpeCBmb3IgbmV0d29yayB2cy4gaG9zdCBieXRlIG9yZGVyIGluIGxvZ2dpbmcgcmVtb3RlIFRDUCBwb3J0cywgYWxzbwogIGZyb20gR2Vycml0IFBhcGUuCgotIEluaXRpYWxpc2UgbWFueSBwb2ludGVycyB0byBOVUxMLCBmb3IgZ2VuZXJhbCBzYWZldHkuIEFsc28gY2hlY2tlZCBjbGVhbnVwCiAgY29kZSBmb3IgbXBfaW50cyAocmVsYXRlZCB0byBzZWN1cml0eSBpc3N1ZXMgYWJvdmUpLgoKMC40MiAtIFdlZCBKdW4gMTYgMjAwNCAxMjo0NDo1NCArMDgwMAoKLSBVcGRhdGVkIHRvIEdlcnJpdCBQYXBlJ3Mgb2ZmaWNpYWwgRGViaWFuIHN1YmRpcmVjdG9yeQoKLSBGaXhlZCBiYWQgY2hlY2sgd2hlbiBvcGVuaW5nIC9kZXYvdXJhbmRvbSAtIHRoYW5rcyB0byBEYW5ueSBTdW5nLgoKLSBBZGRlZCAtaSBpbmV0ZCBtb2RlIGZsYWcsIGFuZCBhc3NvY2lhdGVkIG9wdGlvbnMgaW4gb3B0aW9ucy5oIC4gRHJvcGJlYXIKICBjYW4gYmUgY29tcGlsZWQgd2l0aCBlaXRoZXIgbm9ybWFsIG1vZGUsIGluZXRkLCBvciBib3RoIG1vZGVzLiBUaGFua3MKICB0byBHZXJyaXQgUGFwZSBmb3IgYmFzaWMgcGF0Y2ggYW5kIG1vdGl2YXRpb24uCgotIFVzZSA8ZGlyZW50Lmg+IHJhdGhlciB0aGFuIDxzeXMvZGlyLmg+IGZvciBQT1NJWCBjb21wbGlhbmNlLiBUaGFua3MgdG8gQmlsbAogIFNvbW1lcmZpZWxkLgoKLSBGaXhlZCBhIFRDUCBmb3J3YXJkaW5nIChjbGllbnQtbG9jYWwsIC1MIHN0eWxlKSBidWcgd2hpY2ggY2F1c2VkIHRoZSB3aG9sZQogIHNlc3Npb24gdG8gY2xvc2UgaWYgdGhlIFRDUCBjb25uZWN0aW9uIGZhaWxlZC4gVGhhbmtzIHRvIEFuZHJldyBCcmF1bmQgZm9yCiAgcmVwb3J0aW5nIGl0IGFuZCBoZWxwaW5nIHRyYWNrIGl0IGRvd24uCgotIFJlLWVuYWJsZSBzaWdwaXBlIGZvciBjaGlsZCBwcm9jZXNzZXMuIFRoYW5rcyB0byBHZXJyaXQgUGFwZSBmb3Igc29tZQogIHN1Z2dlc3Rpb25zLCBhbmQgQlNEIG1hbnBhZ2VzIGZvciBhIGNsZWFyZXIgZXhwbGFuYXRpb24gb2YgdGhlIGJlaGF2aW91ci4KCi0gQWRkZWQgbWFucGFnZXMsIHRoYW5rcyB0byBHZXJyaXQgUGFwZS4KCi0gQ2hhbmdlZCBsaWNlbnNlIHRleHQgZm9yIExpYlRvbUNyeXB0IGFuZCBMaWJUb21NYXRoLgoKLSBBZGRlZCBzdHJpcC1zdGF0aWMgdGFyZ2V0CgotIEZpeGVkIGEgYnVnIGluIGFnZW50LWZvcndhcmRpbmcgY2xlYW51cCBoYW5kbGVyIC0gd291bGQgc2VnZmF1bHQKICAoZGVyZWZlcmVuY2luZyBhIG51bGwgcG9pbnRlcikgaWYgYWdlbnQgZm9yd2FyZGluZyBoYWQgZmFpbGVkLgoKLSBGaXggYmVoYXZpb3VyIG9mIGF1dGhvcml6ZWRfa2V5cyBwYXJzaW5nLCBzbyBsYXJnZXIgKD4xMDI0IGJpdCkgRFNBIGtleXMgd2lsbAogIHdvcmsuIFRoYW5rcyB0byBEci4gTWFya3VzIFdhbGRlY2sgZm9yIHRoZSByZXBvcnQuIAoKLSBGaXhlZCBsb2NhbCBwb3J0IGZvcndhcmRpbmcgY29kZSBzbyB0aGF0IHRoZSAiLWoiIG9wdGlvbiB3aWxsIG1ha2UgZm9yd2FyZGluZwogIGF0dGVtcHRzIGZhaWwgbW9yZSBncmFjZWZ1bGx5LgoKLSBBbGxvdyByZXBlYXRlZCByZXF1ZXN0cyBpbiBhIHNpbmdsZSBzZXNzaW9uIGlmIHByZXZpb3VzIG9uZXMgZmFpbCAtIHRoaXMgZml4ZXMgIFB1VFRZIGFuZCBzb21lIG90aGVyIFNDUCBjbGllbnRzLCB3aGljaCB0cnkgU0ZUUCwgdGhlbiBmYWxsLWJhY2sgdG8gU0NQIGlmIGl0CiAgaXNuJ3QgYXZhaWxhYmxlLiBUaGFua3MgdG8gU3RpcmxpbmcgV2VzdHJ1cCBmb3IgdGhlIHJlcG9ydC4KCi0gVXBkYXRlZCB0byBMaWJUb21DcnlwdCAwLjk2IGFuZCBMaWJUb21NYXRoIDAuMzAuIFRoZSBBRVMgY29kZSBub3cgdXNlcwogIHNtYWxsZXIgbm9uLXByZWNvbXB1dGVkIHRhYmxlcyBpZiBEUk9QQkVBUl9TTUFMTF9DT0RFIGlzIGRlZmluZWQgaW4KICBvcHRpb25zLmgsIGxlYWRpbmcgdG8gYSBzaWduaWZpY2FudCByZWR1Y3Rpb24gaW4gdGhlIGJpbmFyeSBzaXplLgoKMC40MSAtIE1vbiBKYW4gMTkgMjAwNCAyMjo0MDoxOSArMDgwMAoKLSBGaXggaW4gY29uZmlndXJlIHNvIHRoYXQgY3Jvc3MtY29tcGlsaW5nIHdvcmtzLCB0aGFua3MgdG8gbnVtZXJvdXMgcGVvcGxlIGZvcgogIHJlcG9ydGluZyBhbmQgdGVzdGluZwoKLSBUZXJtaW5hbCBtb2RlIHBhcnNpbmcgbm93IGhhbmRsZXMgZW1wdHkgdGVybWluYWwgbW9kZSBzdHJpbmdzIChzZW50IGJ5CiAgV2luZG93cyBzc2guY29tIGNsaWVudHMpLCB0aGFua3MgdG8gUmljYXJkbyBEZXJiZXMgZm9yIHRoZSByZXBvcnQKCi0gSGFuZGxpbmcgaXMgaW1wcm92ZWQgZm9yIHVzZXJzIHdpdGggbm8gc2hlbGwgc3BlY2lmaWVkIGluIC9ldGMvcGFzc3dkLAogIHRoYW5rcyBhZ2FpbiB0byBSaWNhcmRvIERlcmJlcwoKLSBGaXggZm9yIGNvbXBpbGluZyB3aXRoIC0tZGlzYWJsZS1zeXNsb2csIHRoYW5rcyB0byBnb3Jkb25maAoKLSBWYXJpb3VzIG1pbm9yIGZpeGVzIGFsbG93IHNjcCB0byB3b3JrIHdpdGggaXJpeCwgdGhhbmtzIHRvIFBhdWwgTWFyaW5jZXUgZm9yCiAgZml4aW5nIGl0IHVwCgotIFVzZSA8c3Ryb3B0cy5oPiBub3QgPHN5cy9zdHJvcHRzLmg+LCBzaW5jZSB0aGUgZm9ybWVyIHNlZW1zIG1vcmUgY29tbW9uCgowLjQwIC0gVHVlIEphbiAxMyAyMDA0IDIxOjA1OjE5ICswODAwCgotIFJlbW90ZSBUQ1AgZm9yd2FyZGluZyAoLVIpIHN0eWxlIGltcGxlbWVudGVkCgotIExvY2FsIGFuZCByZW1vdGUgVENQIGZvcndhcmRpbmcgY2FuIGVhY2ggYmUgZGlzYWJsZWQgYXQgcnVudGltZSAoLWsgYW5kIC1qCiAgc3dpdGNoZXMpCgotIEZpeCBmb3IgcHJvYmxlbXMgZGV0ZWN0aW5nIG9wZW5wdHkoKSB3aXRoIHVDbGliYyAtIG1hbnkgdGhhbmtzIHRvIHZhcmlvdXMKICBwZW9wbGUgZm9yIHJlcG9ydGluZyBhbmQgdGVzdGluZyBmaXhlcywgaW5jbHVkaW5nIChpbiByYW5kb20gb3JkZXIpIENyaXN0aWFuCiAgSW9uZXNjdS1JZGJvaHJuLCBKYW1lcyBFd2luZywgU3RldmUgRG92ZXIsIFRob21hcyBMdW5kcXVpc3QgYW5kIEZyZWRlcmljCiAgTGF2ZXJuaGUKCi0gSW1wcm92ZWQgcG9ydGFiaWxpdHkgZm9yIElSSVgsIHRoYW5rcyB0byBQYXVsIE1hcmluY2V1CgotIEFJWCBhbmQgSFBVWCBwb3J0YWJpbGl0eSBmaXhlcywgdGhhbmtzIHRvIERhcnJlbiBUdWNrZXIgZm9yIHBhdGNoZXMKCi0gcHJuZ2Qgc2hvdWxkIG5vdyB3b3JrIGNvcnJlY3RseSwgdGhhbmtzIHRvIERhcnJlbiBUdWNrZXIgZm9yIHRoZSBwYXRjaAoKLSBzY3AgY29tcGlsYXRpb24gb24gc3lzdGVtcyB3aXRob3V0IHN0cmxjcHkoKSBpcyBmaXhlZCwgdGhhbmtzIHRvIFBldGVyCiAgSmFubmVzZW4gYW5kIERhdmlkIE11c2UgZm9yIHJlcG9ydGluZyBpdCAoaW5kZXBlbmRlbnRseSBhbmQgc2ltdWx0YW5lb3VzbHkgOikKCi0gTWVyZ2VkIGluIG5ldyBMaWJUb21DcnlwdCAwLjkyIGFuZCBMaWJUb21NYXRoIDAuMjgKCjAuMzkgLSBUdWUgRGVjIDE2IDIwMDMgMTU6MTk6MTkgKzA4MDAKCi0gQmV0dGVyIGNoZWNraW5nIG9mIGtleSBsZW5ndGhzIGFuZCBwYXJhbWV0ZXJzIGZvciBEU1MgYW5kIFJTQSBhdXRoCgotIFByaW50IGZpbmdlcnByaW50IG9mIGtleXMgdXNlZCBmb3IgcHVia2V5IGF1dGgKCi0gTW9yZSBjb25zaXN0ZW50IGxvZ2dpbmcgb2YgdXNlcm5hbWVzIGFuZCBJUHMKCi0gQWRkZWQgb3B0aW9uIHRvIGRpc2FibGUgcGFzc3dvcmQgYXV0aCAob3IganVzdCBmb3Igcm9vdCkgYXQgcnVudGltZQoKLSBBdm9pZCBpbmNsdWRpbmcgYmlnbnVtIGZ1bmN0aW9ucyB3aGljaCBkb24ndCBnaXZlIG11Y2ggc3BlZWQgYmVuZWZpdCBidXQKICB0YWtlIHVwIGJpbmFyeSBzaXplCgotIEFkZGVkIGEgc3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIE9wZW5TU0gncyBzY3AgYmluYXJ5CgotIEFkZGVkIGFkZGl0aW9uYWwgc3VwcG9ydGluZyBmdW5jdGlvbnMgZm9yIElyaXgsIHRoYW5rcyB0byBQYXVsIE1hcmluY2V1CgotIERvbid0IGNoZWNrIGZvciB1bnVzZWQgbGlicmFyaWVzIGluIGNvbmZpZ3VyZSBzY3JpcHQKCi0gUmVtb3ZlZCB0cmFpbGluZyBjb21tYSBpbiBhbGdvcml0aG0gbGlzdHMgKHRoYW5rcyB0byBNaWhuZWEgU3RvZW5lc2N1KQoKLSBGaXhlZCB1cCBjaGFubmVsIGNsb3NlIGhhbmRsaW5nLCBhbHdheXMgc2VuZCBjbG9zZSBwYWNrZXQgaW4gcmVzcG9uc2UKICAoYWxzbyB0aGFua3MgdG8gTWlobmVhIFN0b2VuZXNjdSkKCi0gVmFyaW91cyBtYWtlZmlsZSBpbXByb3ZlbWVudHMgZm9yIGNyb3NzLWNvbXBpbGluZywgdGhhbmtzIHRvIEZyaWVkcmljaAogIExvYmVuc3RvY2sgYW5kIE1paG5lYSBTdG9lbmVzY3UKCi0gVXNlIGRhZW1vbigpIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZSAob3Igb3VyIG93biBjb3B5KSByYXRoZXIgdGhhbiBzZXBhcmF0ZQogIGNvZGUgKHRoYW5rcyB0byBGculk6XJpYyBMYXZlcm5oZSBmb3IgdGhlIHJlcG9ydCBhbmQgZGVidWdnaW5nLCBhbmQgQmVybmFyZAogIEJsYWNraGFtIGZvciBoaXMgc3VnZ2VzdGlvbiBvbiB3aGF0IHRvIGxvb2sgYXQpCgotIEZpeGVkIHVwIHN1cHBvcnQgZm9yIGZpcnN0X2tleF9wYWNrZXRfZm9sbG93cywgcmVxdWlyZWQgdG8gdGFsayB0byBzc2guY29tCiAgY2xpZW50cy4gVGhhbmtzIHRvIE1hcmlhbiBTdGFnYXJlc2N1IGZvciB0aGUgYnVnIHJlcG9ydC4KCi0gQXZvaWQgdXNpbmcgTUFYUEFUSExFTiwgcG9pbnRlciBmcm9tIElhbiBNb3JyaXMKCi0gSW1wcm92ZWQgaW5wdXQgc2FuaXR5IGNoZWNraW5nCgowLjM4IC0gU2F0IE9jdCAxMSAyMDAzIDE2OjI4OjEzICswODAwCgotIERlZmF1bHQgaG9zdGtleSBwYXRoIGNoYW5nZWQgdG8gL2V0Yy9kcm9wYmVhci9kcm9wYmVhcl97cnNhLGRzc31faG9zdF9rZXkKICByYXRoZXIgdGhhbiAvZXRjL2Ryb3BiZWFyX3tyc2EsZHNzfV9ob3N0X2tleQoKLSBBZGRlZCBTTUFMTCBhbmQgTVVMVEkgdGV4dCBmaWxlcyB3aGljaCBoYXZlIGluZm8gb24gY29tcGlsaW5nIGZvciBtdWx0aXBsZQogIGJpbmFyaWVzIG9yIHNtYWxsIGJpbmFyaWVzCgotIEFsbG93IGZvciBjb21tYW5kbGluZSBkZWZpbml0aW9uIG9mIHNvbWUgb3B0aW9ucy5oIHNldHRpbmdzCiAgKHdpdGhvdXQgd2FybmluZ3MpCgotIEJlIG1vcmUgY2FyZWZ1bCBoYW5kbGluZyBFSU5UUgoKLSBNb3JlIGZpeGVzIGZvciBjaGFubmVsIGNsb3NpbmcKCi0gQWRkZWQgbXVsdGktYmluYXJ5IHN1cHBvcnQKCi0gSW1wcm92ZWQgbG9nZ2luZyBvZiBJUHMsIG5vdyBnZXQgbG9nZ2VkIGluIGFsbCBjYXNlcwoKLSBEb24ndCBjaGV3IGNwdSB3aGVuIHdhaXRpbmcgZm9yIHZlcnNpb24gaWRlbnRpZmljYXRpb24gc3RyaW5nLCBhbHNvCiAgbWFrZSBzdXJlIHRoYXQgd2Uga2ljayBvZmYgcGVvcGxlIGlmIHRoZXkgZG9uJ3QgYXV0aCB3aXRoaW4gNSBtaW51dGVzLgoKLSBWYXJpb3VzIHNtYWxsIGZpeGVzLCB3YXJuaW5ncyBldGMKCi0gRGlzcGxheSBNT1REIGlmIHJlcXVlc3RlZCAtIHN1Z2dlc3RlZCBieQogIFRyZW50IExsb3lkIDxsYXRoaWF0IGF0IHNpeGxhYnMub3JnPiBhbmQKICBaYWNoIFdoaXRlIDx6d2hpdGUgYXQgZGFya3N0YXIuZnJvcC5vcmc+CgotIHNmdHAgc3VwcG9ydCB3b3JrcyAocmVsaWVzIG9uIE9wZW5TU0ggc2Z0cCBiaW5hcnkgb3Igc2ltaWxhcikKCi0gQWRkZWQgLS1kaXNhYmxlLXNoYWRvdyBvcHRpb24gKHJlcXVlc3RlZCBieSB0aGUgZmxvcHB5ZncgZ3V5cykKCjAuMzcgLSBXZWQgU2VwdCAyNCAyMDAzIDE5OjQyOjEyICswODAwCgotIFZhcmlvdXMgcG9ydGFiaWxpdHkgZml4ZXMsIGZpeGVzIGZvciBTb2xhcmlzIDksIFRydTY0IDUuMSwgTWFjIE9TIFggMTAuMiwKICBBSVgsIEJTRHMKCi0gVXBkYXRlZCBMaWJUb21NYXRoIHRvIDAuMjcgYW5kIExpYlRvbUNyeXB0IHRvIDAuOTAKCi0gUmVuYW1lZCB1dGlsLntjLGh9IHRvIGRidXRpbC57YyxofSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBzeXN0ZW0gdXRpbC5oCgotIEFkZGVkIHNvbWUgc21hbGwgY2hhbmdlcyBzbyBpdCdsbCB3b3JrIHdpdGggQUlYIChwbHVzIExpbnV4IEFmZmluaXR5KS4KICBUaGFua3MgdG8gU2hpZyBmb3IgdGhlbS4KCi0gSW1wcm92ZWQgdGhlIGNsb3NpbmcgbWVzc2FnZXMsIHNvIGEgY2xlYW4gZXhpdCBpcyAiRXhpdGVkIG5vcm1hbGx5IgoKLSBBZGRlZCBzb21lIG1vcmUgcm9idXN0IGludGVnZXIvc2l6ZSBjaGVja2luZyBpbiBidWZmZXIuYyBhcyBhIGJhY2tzdG9wIGZvcgogIGludGVnZXIgb3ZlcmZsb3dzCgotIFgxMSBmb3J3YXJkaW5nIGZpeGVkIGZvciBPU1gsIHBhdGggZm9yIHhhdXRoIGNoYW5nZWQgdG8gL3Vzci9YMTFSNi9iaW4veGF1dGgKCi0gQ2hhbm5lbCBjb2RlIGhhbmRsZXMgY2xvc2luZyBtb3JlIG5pY2VseSwgZG9lc24ndCBzaXQgd2FpdGluZyBmb3IgYW4gZXh0cmEKICBrZXlzdHJva2Ugb24gQlNEL09TWCBwbGF0Zm9ybXMsIGFuZCBkYXRhIGlzIGZsdXNoZWQgZnVsbHkgYmVmb3JlIGNsb3NpbmcKICBjaGlsZCBwcm9jZXNzZXMgKHRoYW5rcyB0byAKICBDcmlzdGlhbiBJb25lc2N1LUlkYm9ocm4gPGNyaXN0aWFuLmlvbmVzY3UtaWRib2hybiBhdCBheGlzLmNvbT4gZm9yCiAgcG9pbnRpbmcgdGhhdCBvdXQpLgoKLSBDaGFuZ2VkICJESVNBQkxFX1RDUEZXRCIgdG8gIkVOQUJMRV9UQ1BGV0QiIChhbmQgZm9yIHgxMS9hdXRoKSBzbwogICJkaXNhYmxlIERJU0FCTEVfVENQV0QiIGlzbid0IHNvIGNvbmZ1c2luZy4KCi0gRml4IGF1dGhvcml6ZWRfa2V5cyBoYW5kbGluZyAoZG9uJ3QgY3Jhc2ggb24gdG9vLWxvbmcga2V5cywgYW5kCiAgdXNlIGZnZXRjIG5vdCBnZXRjIHRvIGF2b2lkIHN0cmFuZ2UgbWFjcm8tcmVsYXRlZCBpc3N1ZXMpLCB0aGFua3MgdG8KICBDcmlzdGlhbiBJb25lc2N1LUlkYm9ocm4gPGNyaXN0aWFuLmlvbmVzY3UtaWRib2hybiBhdCBheGlzLmNvbT4gCiAgYW5kIFN0ZXZlIFJvZGdlcnMgPGh3c3RhciBhdCBjb3gubmV0PiBmb3IgcmVwb3J0aW5nIGFuZCB0ZXN0aW5nLgoKLSBGaXhlcyB0byB0aGUgUkVBRE1FIHdpdGggcmVnYXJkIHRvIHVDbGliYyBzeXN0ZW1zLCB0aGFua3MgdG8gCiAgQ3Jpc3RpYW4gSW9uZXNjdS1JZGJvaHJuIDxjcmlzdGlhbi5pb25lc2N1LWlkYm9ocm4gYXQgYXhpcy5jb20+LAogIGFzIHdlbGwgYXMgZ2VuZXJhbCBpbXByb3ZlbWVudHMgdG8gZG9jdW1lbnRhdGlvbiAoc3BsaXQgUkVBRE1FL0lOU1RBTEwpCgotIEZpeGVkIHVwIHNvbWUgY29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBkcm9wYmVhcmNvbnZlcnQvZHJvcGJlYXJrZXkgaWYKICBEU1Mgb3IgUlNBIHdlcmUgZGlzYWJsZWQsIHJlcG9ydGVkIGJ5IFBhdHJpayBLYXJsc3NvbiA8cGF0cmlrIGF0IGNxdXJlLm5ldD4KCi0gRml4IGRvdWJsZS1mcmVlIGJ1ZyBmb3IgaG9zdGtleXMsIHJlcG9ydGVkIGJ5CiAgVmluY2VudCBTYW5kZXJzIDx2aW5jZSBhdCBreWxsaWtraS5vcmc+CgotIEZpeCB1cCBtaXNzaW5nIFxucyBmcm9tIGRyb3BiZWFyY29udmVydCBoZWxwIG1lc3NhZ2UsCiAgdGhhbmtzIHRvIE1vcmR5IE92aXRzIDxtb3ZpdHMgYXQgYmxvb21iZXJnLmNvbT4gZm9yIHRoZSBwYXRjaAoKMC4zNiAtIFR1ZSBBdWd1c3QgMTkgMjAwMyAxMjoxNjoyMyArMDgwMAoKLSBGaXggdW5pbml0aWFsaXNlZCB0ZW1wb3JhcnkgdmFyaWFibGUgaW4gRFNTIHNpZ25pbmcgY29kZQogICh0aGFua3MgdG8gTWF0dGhldyBGcmFueiA8bWRmcmFueiBhdCBpby5jb20+IGZvciByZXBvcnRpbmcsIGFuZCB0aGUgYXV0aG9ycwogIG9mIFZhbGdyaW5kIGZvciBtYWtpbmcgaXQgZWFzeSB0byB0cmFjayBkb3duKQotIEZpeCByZW1vdGUgdmVyc2lvbi1zdHJpbmcgcGFyc2luZyBlcnJvcgogICh0aGFua3MgdG8gQmVybmFyZCBCbGFja2hhbSA8YmVybmFyZCBhdCBibGFja2hhbS5jb20uYXU+IGZvciBub3RpY2luZykKLSBJbXByb3ZlZCBob3N0LWFsZ29yaXRobS1tYXRjaGluZyBhbGdvcml0aG0gaW4gYWxnby5jCi0gRGVjcmVhc2VkIE1BWF9TVFJJTkdfTEVOIHRvIGEgbW9yZSByZWFsaXN0aWMgdmFsdWUKLSBGaXggaW5jb3JyZWN0IHZlcnNpb24gKDAuMzQpIGluIHRoaXMgQ0hBTkdFUyBmaWxlIGZvciB0aGUgcHJldmlvdXMgcmVsZWFzZS4KCjAuMzUgLSBTdW4gQXVndXN0IDE3IDIwMDMgMDU6Mzc6NDcgKzA4MDAKCi0gRml4IGZvciByZW1vdGVseSBleHBsb2l0YWJsZSBmb3JtYXQgc3RyaW5nIGJ1ZmZlciBvdmVyZmxvdy4KICAodGhhbmtzIHRvIEpvZWwgRXJpa3Nzb24gPGplIGF0IGJpdG51eC5jb20+KQoKMC4zNCAtIEZyaSBBdWd1c3QgMTUgMjAwMyAxNToxMDowMCArMDgwMAoKLSBNYWRlIHN5c2xvZyBvcHRpb25hbCwgYm90aCBhdCBjb21waWxlIHRpbWUgYW5kIGFzIGEgY29tcGlsZSBvcHRpb24KICAoc3VnZ2VzdGVkIGJ5IExhdXJlbnQgQmVyY290IDxza2EgYXQgc2thcm5ldC5vcmc+KQotIEZpeHVwIGZvciBiYWQgYmFzZTY0IHBhcnNpbmcgaW4gYXV0aG9yaXplZF9rZXlzCiAgKG5vdGljZWQgYnkgRGF2eWQgTWFkZWxleSA8ZGF2eWQgYXQgemRsY29tcHV0aW5nLmNvbT4pCi0gQWRkZWQgaW5pdGlhbCB0Y3AgZm9yd2FyZGluZyBjb2RlLCBvbmx5IC1MIChsb2NhbCkgYXQgdGhpcyBzdGFnZQotIEltcHJvdmVkICJtYWtlIGluc3RhbGwiIHdpdGggREVTVERJUiBhbmQgY2hhbmdpbmcgb3duZXJzaGlwIHNlcGVyYXRlbHksCiAgZG9uJ3QgY2hlY2sgZm9yIHNldHBncnAgb24gTGludXggZm9yIGNyb3NzY29tcGlsaW5nLgogIChmcm9tIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuIGF0IGNvZGVwb2V0Lm9yZz4pCi0gTW9yZSBjb21tZW50aW5nLCBmaXggbWlub3IgY29tcGlsZSB3YXJuaW5ncywgbWFrZSByZXR1cm4gdmFsdWVzIG1vcmUKICBjb25zaXN0ZW50IGV0YwotIFZhcmlvdXMgc2lnbmVkbmVzcyBmaXhlcwotIENhbiBsaXN0ZW4gb24gbXVsdGlwbGUgcG9ydHMKLSBhZGRlZCBvcHRpb24gdG8gZGlzYWJsZSBvcGVucHR5IHdpdGggY29uZmlndXJlIHNjcmlwdCwKICAoZnJvbSBLLi1QLiBLaXJjaGT2cmZlciA8a2FwZWthIGF0IGVwb3N0LmRlPikKLSBWYXJpb3VzIGNsZWFudXBzIHRvIGJpZ251bSBjb2RlCiAgKHRoYW5rcyB0byBUb20gU3QgRGVuaXMgPHRvbXN0ZGVuaXMgYXQgaWFodS5jYT4pCi0gRml4IGNvbXBpbGUgZXJyb3Igd2hlbiBkaXNhYmxpbmcgUlNBCiAgKGZyb20gTWFyYyBLbGVpbmUtQnVkZGUgPGtsZWluZS1idWRkZSBhdCBnbXguZGU+KQotIE90aGVyIGNsZWFudXBzLCBzcGxpdHRpbmcgbGFyZ2UgZnVuY3Rpb25zIGZvciBwYWNrZXQgYW5kIGtleCBoYW5kbGluZyBldGMKCjAuMzMgLSBTdW4gSnVuZSAyMiAyMDAzIDIyOjI0OjEyICswODAwCgotIEZpeGVkIHNvbWUgaW52YWxpZCBhc3NlcnRpb25zIGluIHRoZSBjaGFubmVsIGNvZGUsIGZpeGluZyB0aGUgc2VydmVyIGR5aW5nCiAgd2hlbiBmb3J3YXJkaW5nIFgxMSBjb25uZWN0aW9ucy4KLSBBZGQgZHJvcGJlYXJjb252ZXJ0IHRvIGNvbnZlcnQgdG8vZnJvbSBPcGVuU1NIIGhvc3Qga2V5cyBhbmQgRHJvcGJlYXIga2V5cwotIFJTQSBrZXlzIG5vdyBrZWVwIHAgYW5kIHEgcGFyYW1ldGVycyBmb3IgY29tcGF0aWJpbGl0eSAtLSBvbGQgRHJvcGJlYXIga2V5cwogIHN0aWxsIHdvcmssIGJ1dCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gT3BlblNTSCBldGMuCi0gRGViaWFuIHBhY2thZ2luZyBkaXJlY3RvcnkgYWRkZWQsIHRoYW5rcyB0byAKICBHcmFoYW1lIChncmFoYW1lIGF0IGFuZ3J5Z29hdHMubmV0KQotICdpbnN0YWxsJyB0YXJnZXQgYWRkZWQgdG8gdGhlIG1ha2VmaWxlCi0gZ2VuZXJhbCB0aWR5aW5nLCBpbXByb3ZlIGNvbnNpc3RlbmN5IG9mIGZ1bmN0aW9ucyBldGMKLSBJZiBSU0Egb3IgRFNTIGhvc3RrZXlzIGRvbid0IGV4aXN0LCB0aGF0IGFsZ29yaXRobSB3b24ndCBiZSB1c2VkLgotIEltcHJvdmVkIFJTQSBhbmQgRFNTIGtleSBnZW5lcmF0aW9uLCBtb3JlIGVmZmljaWVudCBhbmQgZml4ZWQgc29tZSBtaW5vciBidWdzCiAgKHRoYW5rcyB0byBUb20gU3QgRGVuaXMgZm9yIHRoZSBhZHZpY2UpCi0gTWVyZ2VkIG5ldyB2ZXJzaW9ucyBvZiBMaWJUb21DcnlwdCAoMC44NikgYW5kIExpYlRvbU1hdGggKDAuMjEpCgowLjMyIC0gU2F0IE1heSAyNCAyMDAzIDEyOjQ0OjExICswODAwCgotIERvbid0IGNvbXBpbGUgdW51c2VkIGNvZGUgZnJvbSBsaWJ0b21jcnlwdCAodGVzdCB2ZWN0b3JzIGV0YykKLSBVcGRhdGVkIHRvIGxpYnRvbW1hdGggMC4xNyBhbmQgbGlidG9tY3J5cHQgMC44My4gTmV3IGxpYnRvbW1hdGggcmVzdWx0cwogIGluIHNtYWxsZXIgYmluYXJ5IHNpemUsIGR1ZSB0byBub3QgbGlua2luZyB1bnJlcXVpcmVkIGNvZGUKLSBYMTEgZm9yd2FyZGluZyBhZGRlZAotIEFnZW50IGZvcndhcmRpbmcgYWRkZWQgKGZvciBPcGVuU1NILmNvbSBzc2ggY2xpZW50L2FnZW50KQotIEZpeCBpbmNvcnJlY3QgYnVmZmVyIGZyZWVpbmcgd2hlbiBiYW5uZXJzIGFyZSB1c2VkCi0gSG9zdG5hbWUgcmVzb2x1dGlvbiB3b3JrcwotIFZhcmlvdXMgbWlub3IgYnVnZml4ZXMvY29kZSBzaXplIGltcHJvdmVtZW50cyBldGMKCjAuMzEgLSBGcmkgTWF5IDkgMjAwMyAxNzo1NzoxNiArMDgwMAoKLSBJbXByb3ZlZCBzeXNsb2cgbWVzc2FnZXMgLSBJUCBsb2dnaW5nIGV0YwotIFN0cmlwIGNvbnRyb2wgY2hhcmFjdGVycyBmcm9tIGxvZyBtZXNzYWdlcyAoc3BlY2lmaWVkIHVzZXJuYW1lIGN1cnJlbnRseSkKLSBMb2dpbiByZWNvcmRpbmcgKHV0bXAvd3RtcCkgc3VwcG9ydCwgc28gbGFzdC93L3dobyB3b3JrIC0gdGFrZW4gZnJvbSBPcGVuU1NICi0gU2hlbGwgaXMgc3RhcnRlZCBhcyBhIHByb3BlciBsb2dpbiBzaGVsbCwgc28gL2V0Yy9wcm9maWxlIGV0YyBpcyBzb3VyY2VkCi0gUHR5cyB3b3JrIG9uIFNvbGFyaXMgKDIuOCB4ODYgdGVzdGVkKSBub3cKLSBGaXhlZCBidWcgaW4gc3BlY2lmeWluZyB0aGUgcnNhIGhvc3RrZXkKLSBGaXhlZCBidWcgaW4gY29tcHJlc3Npb24gY29kZSwgY291bGQgdHJpZ2dlciBpZiBjb21wcmVzc2lvbiByZXN1bHRlZCBpbgogIGxhcmdlciBvdXRwdXQgdGhhbiBpbnB1dCAodW5jb21tb24gYnV0IHBvc3NpYmxlKS4KCjAuMzAgLSBUaHUgQXByIDE3IDIwMDMgMTg6NDY6MTUgKzA4MDAKCi0gU0VDVVJJVFk6IGJ1ZmZlci5jIGhhZCBiYWQgY2hlY2tpbmcgZm9yIGJ1ZmZlciBpbmNyZW1lbnQgbGVuZ3RoIC0gZml4ZWQKLSBjaGFubmVsIGNvZGUgbm93IGNsb3NlcyBwcm9wZXJseSBvbiBFT0YgLSBzY3AgcHJvY2Vzc2VzIGRvbid0IGhhbmcgYXJvdW5kCi0gc3lzbG9nIHN1cHBvcnQgYWRkZWQgLSBpbXByb3ZlZCBhdXRoL2xvZ2luL2ZhaWx1cmUgbWVzc2FnZXMKLSBnZW5lcmFsIGNvZGUgdGlkeWluZywgbWFkZSByZXR1cm4gY29kZXMgbW9yZSBjb25zaXN0ZW50Ci0gTWFrZWZpbGUgZml4ZWQgZm9yIGRlcGVuZGVuY2llcyBhbmQgbWFrZXMgbGlidG9tY3J5cHQgYXMgd2VsbAotIEltcGxlbWVudGVkIHNlbmRpbmcgU1NIX01TR19VTklNUExFTUVOVEVEIDopCgowLjI5IC0gV2VkIEFwciA5IDIwMDMKCi0gRml4ZWQgYSBzdHVwaWQgYnVnIGluIDAuMjggcmVsZWFzZSwgJ25ld3N0ciA9IHN0cmR1cChvbGRzdHIpJywKICBub3QgJ25ld3N0cj1vbGRzdHInCgowLjI4IC0gU3VuIEFwciA2IDIwMDMKCi0gSW5pdGlhbCBwdWJsaWMgcmVsZWFzZQoKRGV2ZWxvcG1lbnQgd2FzIHN0YXJ0ZWQgaW4gT2N0b2JlciAyMDAyCg==