V2luZSBub3cgbmVlZHMgdG8ga25vdyBhYm91dCB5b3VyIGtleWJvYXJkIGxheW91dC4gVGhpcyByZXF1aXJlbWVudCBjb21lcyBmcm9tCmEgbmVlZCBmcm9tIG1hbnkgYXBwcyB0byBoYXZlIHRoZSBjb3JyZWN0IHNjYW5jb2RlcyBhdmFpbGFibGUsIHNpbmNlIHRoZXkgcmVhZAp0aGVzZSBkaXJlY3RseSwgaW5zdGVhZCBvZiBqdXN0IHRha2luZyB0aGUgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgWCBzZXJ2ZXIuClRoaXMgbWVhbnMgdGhhdCBXaW5lIG5vdyBuZWVkcyB0byBoYXZlIGEgbWFwcGluZyBmcm9tIFgga2V5cyB0byB0aGUgc2NhbmNvZGVzCnRoZXNlIGFwcGxpY2F0aW9ucyBleHBlY3QuCgpPbiBzdGFydHVwLCBXaW5lIHdpbGwgdHJ5IHRvIHJlY29nbml6ZSB0aGUgYWN0aXZlIFggbGF5b3V0IGJ5IHNlZWluZyBpZiBpdAptYXRjaGVzIGFueSBvZiB0aGUgZGVmaW5lZCB0YWJsZXMuIElmIGl0IGRvZXMsIGV2ZXJ5dGhpbmcgaXMgYWxscmlnaHQuIElmIG5vdCwKeW91IG5lZWQgdG8gZGVmaW5lIGl0LgoKVG8gZG8gdGhpcywgb3BlbiB0aGUgZmlsZSB3aW5kb3dzL3gxMWRydi9rZXlib2FyZC5jIGFuZCB0YWtlIGEgbG9vayBhdCB0aGUKZXhpc3RpbmcgdGFibGVzLiBNYWtlIGEgYmFja3VwIGNvcHkgb2YgaXQsIGVzcGVjaWFsbHkgaWYgeW91IGRvbid0IHVzZSBDVlMuCgpXaGF0IHlvdSByZWFsbHkgd291bGQgbmVlZCB0byBkbywgaXMgdG8gZmluZCBvdXQgd2hpY2ggc2NhbmNvZGUgZWFjaCBrZXkgbmVlZHMKdG8gZ2VuZXJhdGUsIGZpbmQgaXQgaW4gdGhlIG1haW5fa2V5X3NjYW4gdGFibGUsIHdoaWNoIGxvb2tzIGxpa2UgdGhpcwoKc3RhdGljIGNvbnN0IGludCBtYWluX2tleV9zY2FuW01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCmFuZCB0aGVuIGFzc2lnbiBlYWNoIHNjYW5jb2RlIHRoZSBjaGFyYWN0ZXJzIGltcHJpbnRlZCBvbiB0aGUga2V5Y2Fwcy4gVGhpcwp3YXMgZG9uZSAoc29ydCBvZikgZm9yIHRoZSBVUyAxMDEta2V5IGtleWJvYXJkLCB3aGljaCB5b3UgY2FuIGZpbmQgbmVhciB0aGUKdG9wIGluIGtleWJvYXJkLmMuIEl0IGFsc28gc2hvd3MgdGhhdCBpZiB0aGVyZSBpcyBubyAxMDJuZCBrZXksIHlvdSBjYW4gc2tpcAp0aGF0LgoKSG93ZXZlciwgZm9yIG1vc3QgaW50ZXJuYXRpb25hbCAxMDIta2V5IGtleWJvYXJkcywgd2UgaGF2ZSBkb25lIGl0IGVhc3kgZm9yIHlvdS4KVGhlIHNjYW5jb2RlIGxheW91dCBmb3IgdGhlc2UgYWxyZWFkeSBwcmV0dHkgbXVjaCBtYXRjaGVzIHRoZSBwaHlzaWNhbCBsYXlvdXQKaW4gdGhlIG1haW5fa2V5X3NjYW4sIHNvIGFsbCB5b3UgbmVlZCB0byBkbyBpcyB0byBnbyB0aHJvdWdoIGFsbCB0aGUga2V5cyB0aGF0CmdlbmVyYXRlIGNoYXJhY3RlcnMgb24geW91ciBtYWluIGtleWJvYXJkIChleGNlcHQgc3BhY2ViYXIpLCBhbmQgc3R1ZmYgdGhvc2UKaW50byBhbiBhcHByb3ByaWF0ZSB0YWJsZS4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIHRoYXQgdGhlIDEwMm5kIGtleSwgd2hpY2ggaXMKdXN1YWxseSB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qga2V5IG9mIHRoZSBsYXN0IGxpbmUgKHVzdWFsbHkgWiksIG11c3QgYmUKcGxhY2VkIG9uIGEgc2VwYXJhdGUgbGluZSBhZnRlciB0aGUgbGFzdCBsaW5lLgoKRm9yIGV4YW1wbGUsIG15IE5vcndlZ2lhbiBrZXlib2FyZCBsb29rcyBsaWtlIHRoaXMKCqcgICEgICIgICMgIKQgICUgICYgIC8gICggICkgID0gID8gIGAgIEJhY2stCnwgIDEgIDJAIDOjIDQkIDUgIDYgIDd7IDhbIDldIDB9ICsgIFy0IHNwYWNlCgpUYWIgUSAgVyAgRSAgUiAgVCAgWSAgVSAgSSAgTyAgUCAgxSAgXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgqH4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGVyCkNhcHMgQSAgUyAgRCAgRiAgRyAgSCAgSiAgSyAgTCAg2CAgxiAgKgpMb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKClNoLSA+IFogIFggIEMgIFYgIEIgIE4gIE0gIDsgIDogIF8gIFNoaWZ0CmlmdCA8ICAgICAgICAgICAgICAgICAgICAgICwgIC4gIC0KCkN0cmwgIEFsdCAgICAgICBTcGFjZWJhciAgICAgICBBbHRHciAgQ3RybAoKCk5vdGUgdGhlIDEwMm5kIGtleSwgd2hpY2ggaXMgdGhlICI8PiIga2V5LCB0byB0aGUgbGVmdCBvZiBaLiBUaGUgY2hhcmFjdGVyCnRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiBjaGFyYWN0ZXIgaXMgdGhlIGNoYXJhY3RlciBnZW5lcmF0ZWQgYnkgQWx0R3IuCgpUaGlzIGtleWJvYXJkIGlzIGRlZmluZWQgYXMgZm9sbG93czoKCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxctCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07ICAgCgpFeGNlcHQgdGhhdCAiIGFuZCBcIG5lZWRzIHRvIGJlIHF1b3RlZCB3aXRoIGEgYmFja3NsYXNoLCBhbmQgdGhhdCB0aGUgMTAybmQKa2V5IGlzIG9uIGEgc2VwYXJhdGUgbGluZSwgaXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLgoKQWZ0ZXIgeW91IGhhdmUgd3JpdHRlbiBzdWNoIGEgdGFibGUsIHlvdSBuZWVkIHRvIGFkZCBpdCB0byB0aGUgbWFpbl9rZXlfdGFiW10KbGF5b3V0IGluZGV4IHRhYmxlLiBUaGlzIHdpbGwgbG9vayBsaWtlIHRoaXM6CgpzdGF0aWMgc3RydWN0IHsKIFdPUkQgbGFuZywgYW5zaV9jb2RlcGFnZSwgb2VtX2NvZGVwYWdlOwogY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwp9IG1haW5fa2V5X3RhYltdPXsKLi4uCi4uLgoge01BS0VMQU5HSUQoTEFOR19OT1JXRUdJQU4sU1VCTEFOR19ERUZBVUxUKSwgIDEyNTIsIDg2NSwgJm1haW5fa2V5X05PfSwgIAouLi4KCkFmdGVyIHlvdSBoYXZlIGFkZGVkIHlvdXIgdGFibGUsIHJlY29tcGlsZSBXaW5lIGFuZCB0ZXN0IHRoYXQgaXQgd29ya3MuCklmIGl0IGZhaWxzIHRvIGRldGVjdCB5b3VyIHRhYmxlLCB0cnkgcnVubmluZwoKd2luZSAtZGVidWdtc2cgK2tleSwra2V5Ym9hcmQgPiYga2V5LmxvZwoKYW5kIGxvb2sgaW4gdGhlIHJlc3VsdGluZyBrZXkubG9nIGZpbGUgdG8gZmluZCB0aGUgZXJyb3IgbWVzc2FnZXMgaXQKZ2l2ZXMgZm9yIHlvdXIgbGF5b3V0LgoKTm90ZSB0aGF0IHRoZSBMQU5HXyogYW5kIFNVQkxBTkdfKiBkZWZpbml0aW9ucyBhcmUgaW4gaW5jbHVkZS93aW5ubHMuaCwKd2hpY2ggeW91IG1pZ2h0IG5lZWQgdG8ga25vdyB0byBmaW5kIG91dCB3aGljaCBudW1iZXJzIHlvdXIgbGFuZ3VhZ2UKaXMgYXNzaWduZWQsIGFuZCBmaW5kIGl0IGluIHRoZSBkZWJ1Z21zZyBvdXRwdXQuIFRoZSBudW1iZXJzIHdpbGwKYmUgU1VCTEFORyAqIDB4NDAwICsgTEFORywgc28sIGZvciBleGFtcGxlIHRoZSBjb21iaW5hdGlvbgpMQU5HX05PUldFR0lBTiAoMHgxNCkgYW5kIFNVQkxBTkdfREVGQVVMVCAoMHgxKSB3aWxsIGJlIChpbiBoZXgpCjE0ICsgMSo0MDAgPSA0MTQsIHNvIHNpbmNlIEknbSBOb3J3ZWdpYW4sIEkgY291bGQgbG9vayBmb3IgMDQxNCBpbgp0aGUgZGVidWdtc2cgb3V0cHV0IHRvIGZpbmQgb3V0IHdoeSBteSBrZXlib2FyZCB3b24ndCBkZXRlY3QuCgpPbmNlIGl0IHdvcmtzLCBzdWJtaXQgaXQgdG8gdGhlIFdpbmUgcHJvamVjdC4gSWYgeW91IHVzZSBDVlMsIHlvdQp3aWxsIGp1c3QgaGF2ZSB0byBkbwoKY3ZzIC16MyBkaWZmIC11IHdpbmRvd3MveDExZHJ2L2tleWJvYXJkLmMgPiBsYXlvdXQuZGlmZgoKZnJvbSB5b3VyIG1haW4gV2luZSBkaXJlY3RvcnksIHRoZW4gc3VibWl0IGxheW91dC5kaWZmIHRvCndpbmUtcGF0Y2hlc0B3aW5laHEuY29tIGFsb25nIHdpdGggYSBicmllZiBub3RlIG9mIHdoYXQgaXQgaXMuCgpJZiB5b3UgZG9uJ3QgdXNlIENWUywgeW91IG5lZWQgdG8gZG8KCmRpZmYgLXUgdGhlX2JhY2t1cF9maWxlX3lvdV9tYWRlIHdpbmRvd3MveDExZHJ2L2tleWJvYXJkLmMgPiBsYXlvdXQuZGlmZgoKYW5kIHN1Ym1pdCBpdCBhcyBleHBsYWluZWQgYWJvdmUuCgpJZiB5b3UgZGlkIGl0IHJpZ2h0LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBuZXh0IFdpbmUgcmVsZWFzZSwgYW5kIGFsbAp0aGUgdHJvdWJsZXNvbWUgYXBwbGljYXRpb25zIChlc3BlY2lhbGx5IHJlbW90ZS1jb250cm9sIGFwcGxpY2F0aW9ucykgYW5kCmdhbWVzIHRoYXQgdXNlIHNjYW5jb2RlcyB3aWxsIGJlIGhhcHBpbHkgdXNpbmcgeW91ciBrZXlib2FyZCBsYXlvdXQsIGFuZCB5b3UKd29uJ3QgZ2V0IHRob3NlIGFubm95aW5nIGZpeG1lIG1lc3NhZ2VzIGVpdGhlci4KCkdvb2QgbHVjay4KCi1PdmUgS+V2ZW4gPG92ZWtAYXJjdGljbmV0Lm5vPgo=