LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAiaW1lLmgiCiNpbmNsdWRlICJ4MTFkcnYuaCIKI2luY2x1ZGUgIndpbmUvc2VydmVyLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCi8qIGxvZyBmb3JtYXQgKGFkZCAwLXBhZGRpbmcgYXMgYXBwcm9wcmlhdGUpOgogICAga2V5Y29kZSAgJXUgIGFzIGluIG91dHB1dCBmcm9tIHhldgogICAga2V5c3ltICAgJWx4IGFzIGluIFgxMS9rZXlzeW1kZWYuaAogICAgdmtleSAgICAgJVggIGFzIGluIHdpbnVzZXIuaAogICAgc2NhbmNvZGUgJXgKKi8KV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwoa2V5Ym9hcmQpOwpXSU5FX0RFQ0xBUkVfREVCVUdfQ0hBTk5FTChrZXkpOwoKc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CnN0YXRpYyBLZXlTeW0gKmtleV9tYXBwaW5nOwpzdGF0aWMgV09SRCBrZXljMnZrZXlbMjU2XSwga2V5YzJzY2FuWzI1Nl07CgpzdGF0aWMgaW50IE51bUxvY2tNYXNrLCBTY3JvbGxMb2NrTWFzaywgQWx0R3JNYXNrOyAvKiBtYXNrIGluIHRoZSBYS2V5RXZlbnQgc3RhdGUgKi8KCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGtiZF9zZWN0aW9uOwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTl9ERUJVRyBjcml0c2VjdF9kZWJ1ZyA9CnsKICAgIDAsIDAsICZrYmRfc2VjdGlvbiwKICAgIHsgJmNyaXRzZWN0X2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QsICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0IH0sCiAgICAgIDAsIDAsIHsgKERXT1JEX1BUUikoX19GSUxFX18gIjoga2JkX3NlY3Rpb24iKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGtiZF9zZWN0aW9uID0geyAmY3JpdHNlY3RfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07CgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDkKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiBcICAgICAgeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDVlLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9kdm9yYWtbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIFsgICAgXSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgxQSwweDFCLAogLyogJyAgICAsICAgIC4gICAgcCAgICB5ICAgIGYgICAgZyAgICBjICAgIHIgICAgbCAgICAvICAgID0gKi8KICAgMHgyOCwweDMzLDB4MzQsMHgxOSwweDE1LDB4MjEsMHgyMiwweDJFLDB4MTMsMHgyNiwweDM1LDB4MEQsCiAvKiBhICAgIG8gICAgZSAgICB1ICAgIGkgICAgZCAgICBoICAgIHQgICAgbiAgICBzICAgIC0gICAgXCAqLwogICAweDFFLDB4MTgsMHgxMiwweDE2LDB4MTcsMHgyMCwweDIzLDB4MTQsMHgzMSwweDFGLDB4MEMsMHgyQiwKIC8qIDsgICAgcSAgICBqICAgIGsgICAgeCAgICBiICAgIG0gICAgdyAgICB2ICAgIHogKi8KICAgMHgyNywweDEwLDB4MjQsMHgyNSwweDJELDB4MzAsMHgzMiwweDExLDB4MkYsMHgyQywKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKICAvKiB0aGlzIGlzIG15ICgxMDYta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICBeICAgIFwgKi8KICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgyOSwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgQCAgICBbICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICA6ICAgIF0gKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7CiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4N2QsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDczIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV8zLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNXzcsVktfT0VNXzUsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fMyxWS19PRU1fNCwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNX1BMVVMsVktfT0VNXzEsVktfT0VNXzYsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzUsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9QTFVTLFZLX09FTV80LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8zLFZLX09FTV83LFZLX09FTV8yLAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNX01JTlVTLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fOCxWS19PRU1fNSwKICAgVktfT0VNXzcsJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyLCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYXplcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV9QTFVTLAogICAnQScsJ1onLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdRJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLCdNJyxWS19PRU1fMyxWS19PRU1fNSwKICAgJ1cnLCdYJywnQycsJ1YnLCdCJywnTicsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzgsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2R2b3Jha1tNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfT0VNXzcsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsJ1AnLCdZJywnRicsJ0cnLCdDJywnUicsJ0wnLFZLX09FTV8yLFZLX09FTV9QTFVTLAogICAnQScsJ08nLCdFJywnVScsJ0knLCdEJywnSCcsJ1QnLCdOJywnUycsVktfT0VNX01JTlVTLFZLX09FTV81LAogICBWS19PRU1fMSwnUScsJ0onLCdLJywnWCcsJ0InLCdNJywnVycsJ1YnLCdaJywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCi8qKiogREVGSU5FIFlPVVIgTkVXIExBTkdVQUdFLVNQRUNJRklDIE1BUFBJTkdTIEJFTE9XLCBTRUUgRVhJU1RJTkcgVEFCTEVTICovCgovKiB0aGUgVksgbWFwcGluZ3MgZm9yIHRoZSBtYWluIGtleWJvYXJkIHdpbGwgYmUgYXV0by1hc3NpZ25lZCBhcyBiZWZvcmUsCiAgIHNvIHdoYXQgd2UgaGF2ZSBoZXJlIGlzIGp1c3QgdGhlIGNoYXJhY3RlciB0YWJsZXMgKi8KLyogb3JkZXI6IE5vcm1hbCwgU2hpZnQsIEFsdEdyLCBTaGlmdC1BbHRHciAqLwovKiBXZSByZWNvbW1lbmQgeW91IHdyaXRlIGp1c3Qgd2hhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgKGkuZS4gd2hhdCdzCiAgIHdyaXR0ZW4gb24gdGhlIGtleWNhcHMpLCBub3QgdGhlIGJ1bmNoIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBiZWhpbmQgQWx0R3IKICAgYW5kIFNoaWZ0LUFsdEdyIGlmIGl0IGNhbiB2YXJ5IGFtb25nIGRpZmZlcmVudCBYIHNlcnZlcnMgKi8KLyogVGhlc2UgdGFibGVzIHNlcnZlIHRvIGd1ZXNzIHRoZSBrZXlib2FyZCB0eXBlIGFuZCBzY2FuY29kZSBtYXBwaW5nLgogICBDb21wbGV0ZSBtb2RlbGluZyBpcyBub3QgaW1wb3J0YW50LCBpZGVudGlmaWNhdGlvbi9kaXNjcmltaW5hdGlvbiBpcy4gKi8KLyogUmVtZW1iZXIgdGhhdCB5b3VyIDEwMm5kIGtleSAodG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpIHNob3VsZCBiZSBvbiBhCiAgIHNlcGFyYXRlIGxpbmUsIHNlZSBleGlzdGluZyB0YWJsZXMgKi8KLyogSWYgV2luZSBmYWlscyB0byBtYXRjaCB5b3VyIG5ldyB0YWJsZSwgdXNlIFdJTkVERUJVRz0ra2V5IHRvIGZpbmQgb3V0IHdoeSAqLwovKiBSZW1lbWJlciB0byBhbHNvIGFkZCB5b3VyIG5ldyB0YWJsZSB0byB0aGUgbGF5b3V0IGluZGV4IHRhYmxlIGZhciBiZWxvdyEgKi8KCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKG1vc3RseSBjb250cmlidXRlZCBieSBVd2UgQm9ubmVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/Igp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8KLyogKFhGcmVlODYgcmVwb3J0cyB0aGUgPD4ga2V5IGV2ZW4gaWYgaXQncyBub3QgcGh5c2ljYWxseSB0aGVyZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWsgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfZHZvcmFrW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiW3siLCJdfSIsCiAiJ1wiIiwiLDwiLCIuPiIsInBQIiwieVkiLCJmRiIsImdHIiwiY0MiLCJyUiIsImxMIiwiLz8iLCI9KyIsCiAiYUEiLCJvTyIsImVFIiwidVUiLCJpSSIsImREIiwiaEgiLCJ0VCIsIm5OIiwic1MiLCItXyIsIlxcfCIsCiAiOzoiLCJxUSIsImpKIiwia0siLCJ4WCIsImJCIiwibU0iLCJ3VyIsInZWIiwieloiCn07CgovKioqIEJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VLW01BSU5fTEVOXVs0XSA9CnsKICJgIiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidAIiwiI34iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXHwiCn07CgovKioqIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyIiwiXCIzIiwiJzQiLCIoNSIsIi02Iiwi6DciLCJfOCIsIuc5Iiwi4DAiLCIpsCIsIj0rIiwKICJhQSIsInpaIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oIiwiJKMiLAogInFRIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi9tYiLCItXyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLw0CIsIic/IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIrTEIiwiKyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PiIKfTsKCi8qIEFsbCBnZXJtYW4ga2V5YiBsYXlvdXQgdGFibGVzIGhhdmUgdGhlIGFjdXRlL2Fwb3N0cm9waGUgc3ltYm9sIG5leHQgdG8KICogdGhlIEJBQ0tTUEFDRSBrZXkgcmVtb3ZlZCAocmVwbGFjZWQgd2l0aCBOVUxMIHdoaWNoIGlzIGlnbm9yZWQgYnkgdGhlCiAqIGRldGVjdGlvbiBjb2RlKS4KICogVGhpcyB3YXMgZG9uZSBiZWNhdXNlIHRoZSBtYXBwaW5nIG9mIHRoZSBhY3V0ZSAoYW5kIGFwb3N0cm9waGUpIGlzIGRvbmUKICogZGlmZmVyZW50bHkgaW4gdmFyaW91cyB4a2ItZGF0YS94a2V5Ym9hcmQtY29uZmlnIHZlcnNpb25zLiBTb21lIHJlcGxhY2UKICogdGhlIGFjdXRlIHdpdGggYSBub3JtYWwgYXBvc3Ryb3BoZSwgc28gdGhhdCB0aGUgYXBvc3Ryb3BoZSBpcyBmb3VuZCB0d2ljZQogKiBvbiB0aGUga2V5Ym9hcmQgKG9uZSBuZXh0IHRvIEJBQ0tTUEFDRSBhbmQgb25lIG5leHQgdG8gRU5URVIpLgogKiBPdGhlcnMgcHV0IHRoZSBhY3V0ZSBhbmQgZ3JhdmUgYWNjZW50cyBvbiB0aGUga2V5IGxlZnQgb2YgQkFDS1NQQUNFLgogKiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBmZC5vIGJ1Z3RyYWNrZXI6CiAqIGh0dHBzOi8vYnVncy5mcmVlZGVza3RvcC5vcmcvc2hvd19idWcuY2dpP2lkPTExNTE0CiAqIEtleXMgcmVhY2hhYmxlIHZpYSBBbHRHciAoQCwgW10sIH4sIFwsIHwsIHt9KSBkaWZmZXIgY29tcGxldGVseQogKiBhbW9uZyBQQyBhbmQgTWFjIGtleWJvYXJkcywgc28gdGhlc2UgYXJlIG5vdCBsaXN0ZWQuCiAqLwoKLyoqKiBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGUgWy12YXJpYW50IG5vZGVhZGtleXN8ZGVhZGFjdXRlIGV0Yy5dKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCLfPyIsIiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoIiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OAiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PwiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkaykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11SIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYV9lbmhhbmNlZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FfZnJbTUFJTl9MRU5dWzRdID0KewogIiN8IiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNSUiLCI2PyIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeXiIsIrioIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsImBgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCciLCIuIiwi6ckiLAogIqu7Igp9OwoKLyoqKiBDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FbTUFJTl9MRU5dWzRdID0KewogIi9cXCIsIjEhuaEiLCIyQLIiLCIzI7OjIiwiNCS8pCIsIjUlvSIsIjY/viIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+NgiLCJwUP7eIiwiXqioIiwi58d+IiwKICJhQebGIiwic1PfpyIsImRE8NAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OrQiLCLoyCIsIuDAIiwKICJ6WiIsInhYIiwiY0OiqSIsInZWIiwiYkIiLCJuTiIsIm1NtboiLCIsJyIsIi5cIrf3Iiwi6ckiLAogIvnZIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHB0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKruyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIrKiIsIrRgIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIrqqIiwifl4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwi7F4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi6OkiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8uciLCLgsCIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZmkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBCZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2NwMTI1MVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR6ckiLCJ3V/bWIiwiZUXz0yIsInJS6soiLCJ0VOXFIiwieVntzSIsInVV48MiLCJpSfjYIiwib0/52SIsInBQ58ciLCJbe/XVIiwiXX362iIsCiAiYUH01CIsInNT+9siLCJkROLCIiwiZkbgwCIsImdH788iLCJoSPDQIiwiakruziIsImtL68siLCJsTOTEIiwiOzrmxiIsIidcIv3dIiwiXFx8IiwKICJ6Wv/fIiwieFj31yIsImND8dEiLCJ2VuzMIiwiYkLoyCIsIm5O8tIiLCJtTfzcIiwiLDzhwSIsIi4+/t4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR0fEiLCJ3V9f3IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVnZ+SIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX3d/SIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakrK6iIsImtLy+siLCJsTMzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa2voiLCJ4WNj4IiwiY0PD4yIsInZW1vYiLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSBieSBPLiBOeWt5Zm9yY2h5biAqLwovKioqICAoYXMgaXQgYXBwZWFycyBvbiBtb3N0IG9mIGtleWJvYXJkcyBzb2xkIHRvZGF5KSAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAirb0iLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwip7ciLAogIsbmIiwiprYiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2IiwipLQiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAocGFpciB0byB0aGUgcHJldmlvdXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAio7MiLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBodSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSciLCIyXCIiLCIzKyIsIjQhIiwiNSUiLCI2LyIsIjc9IiwiOCgiLCI5KSIsIvbWIiwi/NwiLCLz0yIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL11SIsIvraIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLpySIsIuHBIiwi+9siLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICLtzSIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzaSkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TSVtNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogIqm5IiwiqroiLCLF5SIsItLyIiwi1PQiLCLa+iIsItX1IiwiyekiLCLP7yIsItDwIiwi2/siLCJbXSIsCiAiweEiLCLT8yIsIsTkIiwixuYiLCLH5yIsIsjoIiwiqLgiLCLL6yIsIszsIiwi3v4iLCKruyIsIi1fIiwKICKhsSIsIq+/Iiwiw+MiLCLX9yIsIsLiIiwizu4iLCLN7SIsIiw7IiwiLjoiLCLW9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAyXCIiLCIzIyIsIjQkIiwiNSUiLCI2XjYmIiwiNyY3LyIsIjgqOCgiLCI5KDkpIiwiMCkwPSIsIi1fJz8iLCI9KysqIiwKICJxUam5Iiwid1equiIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2voiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl19W10iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKqLgiLCJrS8vrIiwibEzM7CIsIjs63v4iLCInXCKruyIsIlxcfC1fIiwKICJ6WqGxIiwieFivvyIsImNDw+MiLCJ2Vtf3IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwsOyIsIi4+LjoiLCIvP9b2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHIpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9tYWNqcFtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIl9fIiwKfTsKCi8qKiogSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX3BjOTh4MVtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5gIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkB+IiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBSYXVsIEdvbWVzIEZlcm5hbmRlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2qCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0YCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIn5eIiwiXX0iLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCB3aXRoIDxBTFQgR1I+IChjb250cmlidXRlZCBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyX2FsdF9ncltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSE5IiwiMkAyIiwiMyMzIiwiNCQjIiwiNSVcIiIsIjYoLCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiNGAiLCJbeyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsImdHIiwifl4iLCJdfToiLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8wIgp9OwoKLyoqKiBVUyBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR3VzdGF2byBOb3JvbmhhIChrb3ZAZGViaWFuLm9yZykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2ludGxbTUFJTl9MRU5dWzRdID0KewogICJgfiIsICIxISIsICIyQCIsICIzIyIsICI0JCIsICI1JSIsICI2XiIsICI3JiIsICI4KiIsICI5KCIsICIwKSIsICItXyIsICI9KyIsICJcXHwiLAogICJxUSIsICJ3VyIsICJlRSIsICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICJbeyIsICJdfSIsCiAgImFBIiwgInNTIiwgImREIiwgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIjs6IiwgIidcIiIsCiAgInpaIiwgInhYIiwgImNDIiwgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw8IiwgIi4+IiwgIi8/Igp9OwoKLyoqKiBTbG92YWsga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oc2tfcXdlcnR5KSBpbiB4a2JzZWwpCiAgLSBkZWFkX2Fib3ZlcmluZyByZXBsYWNlZCB3aXRoIGRlZ3JlZSAtIG5vIHN5bWJvbCBpbiBpc284ODU5LTIKICAtIGJyb2tlbmJhciByZXBsYWNlZCB3aXRoIGJhcgkJCQkJKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tbTUFJTl9MRU5dWzRdID0KewogIjswIiwiKzEiLCK1MiIsIrkzIiwi6DQiLCK7NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIid2IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwi5CgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvRcIiIsIqchIiwi8ikiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3opICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3pfcXdlcnR5KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWl9xd2VydHlbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIr+hIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIntbXiIsIn1dIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIExpdGh1YW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiqqwiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSW01BSU5fTEVOXVs0XSA9CnsKIlwiXFwiLCIxISIsIjInIiwiM14iLCI0KyIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIio/IiwiLV8iLAoicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJceGI5SSIsIm9PIiwicFAiLCJceGJiXHhhYiIsIvzcIiwKImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4YmFceGFhIiwiaVwwIiwiLDsiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiLAoiPD4iCn07CgovKioqIFR1cmtpc2ggRiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cmYpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSX0ZbTUFJTl9MRU5dWzRdID0KewoiKyoiLCIxISIsIjJcIiIsIjNeIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjA9IiwiLz8iLCItXyIsCiJmRiIsImdHIiwiXHhiYlx4YWIiLCJceGI5SSIsIm9PIiwiZEQiLCJyUiIsIm5OIiwiaEgiLCJwUCIsInFRIiwid1ciLAoidVUiLCJpXDAiLCJlRSIsImFBIiwi/NwiLCJ0VCIsImtLIiwibU0iLCJsTCIsInlZIiwiXHhiYVx4YWEiLCJ4WCIsCiJqSiIsIvbWIiwidlYiLCJjQyIsIufHIiwieloiLCJzUyIsImJCIiwiLjoiLCIsOyIsCiI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH47IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUS8iLCJ3VyciLCJlRfciLCJyUvgiLCJ0VOAiLCJ5WegiLCJ1VeUiLCJpSe8iLCJvT+0iLCJwUPQiLCJbeyIsIl19IiwKICJhQfkiLCJzU+MiLCJkROIiLCJmRusiLCJnR/IiLCJoSOkiLCJqSuciLCJrS+wiLCJsTOoiLCI7OvMiLCJcJ1wiLCIsIlxcfCIsCiAielrmIiwieFjxIiwiY0PhIiwidlbkIiwiYkLwIiwibk7uIiwibU32IiwiLDz6IiwiLj71IiwiLz8uIiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsX3Bob25ldGljKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX5SIsImVF4CIsInJS+CIsInRU+iIsInlZ8iIsInVV5SIsImlJ6SIsIm9P8SIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT+SIsImRE4yIsImZG9CIsImdH4iIsImhI5CIsImpK6SIsImtL6yIsImxM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VuUiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCAtc3ltYm9scyAidXMocGMxMDUpK2lsX3NhaGFyb24iKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9zYWhhcm9uW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1fxIiwiZUUiLCJyUvgiLCJ0VOgiLCJ5WeMiLCJ1VSIsImlJIiwib08iLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU+UiLCJkROwiLCJmRvoiLCJnR+IiLCJoSOQiLCJqSvkiLCJrS+siLCJsTOkiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlbyIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogR3JlZWsga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBLcml0b24gS3lyaW1pcyA8a3lyaW1pc0BjdGkuZ3I+KQogIEdyZWVrIGNoYXJhY3RlcnMgZm9yICJ3VyIgYW5kICJzUyIgYXJlIG9taXR0ZWQgdG8gbm90IHByb2R1Y2UgYSBtaXNtYXRjaAogIG1lc3NhZ2Ugc2luY2UgdGhleSBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIGluIGdyIGFuZCBlbCBYRnJlZTg2IGxheW91dHMuICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVE7OiIsIndXIiwiZUXlxSIsInJS8dEiLCJ0VPTUIiwieVn11SIsInVV6MgiLCJpSenJIiwib0/vzyIsInBQ8NAiLCJbeyIsIl19IiwKICJhQeHBIiwic1MiLCJkROTEIiwiZkb21iIsImdH48MiLCJoSOfHIiwiakruziIsImtL6soiLCJsTOvLIiwiOzq0qCIsIidcIiIsIlxcfCIsCiAielrmxiIsInhY99ciLCJjQ/jYIiwidlb52SIsImJC4sIiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIFRoYWkgKEtlZG1hbmVlKSBrZXlib2FyZCBsYXlvdXQgYnkgU3VwcGhhY2hva2UgU3VudGl3aWNoYXlhIDxtcmNob2tlQG9wZW50bGUub3JnPiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV90aFtNQUlOX0xFTl1bNF0gPQp7CiAiYH5fJSIsIjEh5SsiLCIyQC/xIiwiMyMt8iIsIjQkwPMiLCI1Jbb0IiwiNl7Y2SIsIjcm1t8iLCI4KqT1IiwiOSi19iIsIjApqPciLCItX6L4IiwiPSuq+SIsCiAicVHm8CIsIndX5FwiIiwiZUXTriIsInJSvrEiLCJ0VNC4IiwieVnR7SIsInVV1eoiLCJpScOzIiwib0+5zyIsInBQwq0iLCJbe7qwIiwiXX3FLCIsCiAiYUG/xCIsInNTy6YiLCJkRKGvIiwiZka04iIsImdH4KwiLCJoSOnnIiwiakro6yIsImtL0skiLCJsTMrIIiwiOzrHqyIsIlwnXCKnLiIsIlxcfKOlIiwKICJ6WrwoIiwieFi7KSIsImND4akiLCJ2Vs3OIiwiYkLaIiwibk7X7CIsIm1Ntz8iLCIsPMGyIiwiLj7jzCIsIi8/vcYiCn07IAoKLyoqKiBWTkMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fdm5jW01BSU5fTEVOXSA9CnsKICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgxQSwweDFCLDB4MjcsMHgyOCwweDI5LDB4MzMsMHgzNCwweDM1LDB4MkIsCiAgIDB4MUUsMHgzMCwweDJFLDB4MjAsMHgxMiwweDIxLDB4MjIsMHgyMywweDE3LDB4MjQsMHgyNSwweDI2LDB4MzIsMHgzMSwweDE4LDB4MTksMHgxMCwweDEzLDB4MUYsMHgxNCwweDE2LDB4MkYsMHgxMSwweDJELDB4MTUsMHgyQywKICAgMHg1Ngp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV92bmNbTUFJTl9MRU5dID0KewogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV80LFZLX09FTV82LFZLX09FTV8xLFZLX09FTV83LFZLX09FTV8zLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV81LAogICAnQScsJ0InLCdDJywnRCcsJ0UnLCdGJywnRycsJ0gnLCdJJywnSicsJ0snLCdMJywnTScsJ04nLCdPJywnUCcsJ1EnLCdSJywnUycsJ1QnLCdVJywnVicsJ1cnLCdYJywnWScsJ1onLAogICBWS19PRU1fMTAyCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV92bmNbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsIlt7IiwiXX0iLCI7OiIsIidcIiIsImB+IiwiLDwiLCIuPiIsIi8/IiwiXFx8IiwKICJhQSIsImJCIiwiY0MiLCJkRCIsImVFIiwiZkYiLCJnRyIsImhIIiwiaUkiLCJqSiIsImtLIiwibEwiLCJtTSIsIm5OIiwib08iLCJwUCIsInFRIiwiclIiLCJzUyIsInRUIiwidVUiLCJ2ViIsIndXIiwieFgiLCJ5WSIsInpaIgp9OwoKLyoqKiBEdXRjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBubCkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OTFtNQUlOX0xFTl1bNF0gPQp7CiAiQKciLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiN18iLCI4KCIsIjkpIiwiMCciLCIvPyIsIrB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIqh+IiwiKnwiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiuxIiwiJ2AiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLT0iLAogIltdIgp9OwoKCgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgTENJRCBsY2lkOyAvKiBpbnB1dCBsb2NhbGUgaWRlbnRpZmllciwgbG9vayBmb3IgTE9DQUxFX0lMQU5HVUFHRQogICAgICAgICAgICAgICAgIGluIHRoZSBhcHByb3ByaWF0ZSBkbGxzL2tlcm5lbC9ubHMvLm5scyBmaWxlICovCiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwogICAgY29uc3QgV09SRCAoKnNjYW4pW01BSU5fTEVOXTsgLyogc2NhbiBjb2RlcyBtYXBwaW5nICovCiAgICBjb25zdCBXT1JEICgqdmtleSlbTUFJTl9MRU5dOyAvKiB2aXJ0dWFsIGtleSBjb2RlcyBtYXBwaW5nICovCn0gbWFpbl9rZXlfdGFiW109ewogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1VTX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsICZtYWluX2tleV9VU19kdm9yYWssICZtYWluX2tleV9zY2FuX2R2b3JhaywgJm1haW5fa2V5X3ZrZXlfZHZvcmFrfSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTX2ludGwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MDksICJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA4MDcsICJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgxMDBjLCAiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxZCwgIlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eV92Mn0sCiB7MHgwNDI1LCAiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE0LCAiTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNiwgIkRhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGMsICJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKENBX2ZyKSIsICZtYWluX2tleV9DQV9mciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwYywgIkJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwODE2LCAiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCBBTFQgR1IiLCAmbWFpbl9rZXlfUFRfYnJfYWx0X2dyLCZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDBiLCAiRmlubmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19iZHMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIzLCAiQmVsYXJ1c2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQlksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9SVV9waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIiwgJm1haW5fa2V5X1JVX2tvaThyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxIiwgJm1haW5fa2V5X1JVX2NwMTI1MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUiLCAmbWFpbl9rZXlfVUEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfVUFfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9SVV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJTcGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMCwgIkl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBmLCAiSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZSwgIkh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MTUsICJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI0LCAiU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHNyIiwgJm1haW5fa2V5X1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCB1cyxzciIsICZtYWluX2tleV9VU19TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTEsICJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfanAxMDYsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9qcDEwNn0sCiB7MHgwNDExLCAiSmFwYW5lc2UgTWFjIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9tYWNqcCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X21hY2pwLCAmbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanB9LAogezB4MDQxMSwgIkphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfcGM5OHgxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBhbmQgQ3plY2gga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X1NLX3Byb2csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ1MsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3oiLCAmbWFpbl9rZXlfQ1osICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3pfcXdlcnR5IiwgJm1haW5fa2V5X0NaX3F3ZXJ0eSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIkxhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNywgIkxpdGh1YW5pYW4gKEJhbHRpYykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xUX0IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9USywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyIiwgJm1haW5fa2V5X1RSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHJmIiwgJm1haW5fa2V5X1RSX0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9zYWhhcm9uLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVk5DIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKIHsweDA0MDgsICJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWUsICJUaGFpIChLZWRtYW5lZSkgIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV90aCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMywgIkR1dGNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAoKIHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwp9OwpzdGF0aWMgdW5zaWduZWQga2JkX2xheW91dD0wOyAvKiBpbmRleCBpbnRvIGFib3ZlIHRhYmxlIG9mIGxheW91dHMgKi8KCi8qIG1heWJlIG1vcmUgb2YgdGhlc2Ugc2NhbmNvZGVzIHNob3VsZCBiZSBleHRlbmRlZD8gKi8KICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIG11c3QgYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAogICAgICAgICAgICAgICAgICAgSU5TLCBERUwsIEhPTUUsIEVORCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBBUlJPVyBrZXlzLAogICAgICAgICAgICAgICAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKICAgICAgICAgICAgICAgICAqIFdpbmRvd3MgZG9lcyAuLi4gREYgKi8KICAgICAgICAgICAgICAgIC8qIFllcywgdG8gZGlzdGluZ3Vpc2ggYmFzZWQgb24gc2NhbiBjb2RlcywgYWxzbwogICAgICAgICAgICAgICAgICAgZm9yIFBydFNjbiBrZXkgLi4uIEdBICovCgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV92a2V5WzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogSmFwYW5lc2Ugc3BlY2lhbCBrZXlzICovCiAgICAwLCBWS19LQU5KSSwgVktfTk9OQ09OVkVSVCwgVktfQ09OVkVSVCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICBWS19EQkVfUk9NQU4sIDAsIDAsIFZLX0RCRV9ISVJBR0FOQSwKICAgIDAsIDAsIFZLX0RCRV9TQkNTQ0hBUiwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIC8qIEtvcmVhbiBzcGVjaWFsIGtleXMgKEZGMzEtKSAqLwogICAgVktfREJFX0FMUEhBTlVNRVJJQywgVktfSEFOR1VMLCAwLCAwLCBWS19IQU5KQSwgMCwgMCwgMCwgICAgLyogRkYzMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1MCAqLwogICAgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsIFZLX0VORCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLDAsMCwgVktfQVBQUywgLyogRkY2MCAqLwogICAgMCwgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogRkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIFZLX0VORCwgVktfQ0xFQVIsIFZLX0lOU0VSVCwgVktfREVMRVRFLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgLyogV2luZG93cyBhbHdheXMgZ2VuZXJhdGVzIFZLX0RFQ0lNQUwgZm9yIERlbC8uIG9uIGtleXBhZCB3aGlsZSBzb21lCiAgICAgKiBYMTEga2V5Ym9hcmQgbGF5b3V0cyBnZW5lcmF0ZSBYS19LUF9TZXBhcmF0b3IgaW5zdGVhZCBvZiBYS19LUF9EZWNpbWFsCiAgICAgKiBpbiBvcmRlciB0byBwcm9kdWNlIGEgbG9jYWxlIGRlcGVuZGVudCBudW1lcmljIHNlcGFyYXRvci4KICAgICAqLwogICAgVktfREVDSU1BTCwgVktfU1VCVFJBQ1QsIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwKICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIFZLX05VTVBBRDQsIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsCiAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5LCAwLCAwLCAwLCBWS19PRU1fTkVDX0VRVUFMLCAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICBWS19GMSwgVktfRjIsCiAgICBWS19GMywgVktfRjQsIFZLX0Y1LCBWS19GNiwgVktfRjcsIFZLX0Y4LCBWS19GOSwgVktfRjEwLCAgICAvKiBGRkMwICovCiAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2LCBWS19GMTcsIFZLX0YxOCwgLyogRkZDOCAqLwogICAgVktfRjE5LCBWS19GMjAsIFZLX0YyMSwgVktfRjIyLCBWS19GMjMsIFZLX0YyNCwgMCwgMCwgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfTFNISUZULCBWS19SU0hJRlQsIFZLX0xDT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfUkNPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX0xNRU5VLAogICAgVktfUk1FTlUsIFZLX0xNRU5VLCBWS19STUVOVSwgVktfTFdJTiwgVktfUldJTiwgMCwgMCwgMCwgICAgLyogRkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfc2NhblsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICAweDBFLCAweDBGLCAweDAwLCAvKj8qLyAwLCAweDAwLCAweDFDLCAweDAwLCAweDAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiBKYXBhbmVzZSBzcGVjaWFsIGtleXMgKi8KICAgIDB4MDAsIDB4MjksIDB4N0IsIDB4NzksIDB4NzAsIDB4MDAsIDB4MDAsIDB4NzAsICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgLyogS29yZWFuIHNwZWNpYWwga2V5cyAoRkYzMS0pICovCiAgICAweDNBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNUQsICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0NSwgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAweDUzLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4NUIsIDB4NUMsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MTM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MTViLCAweDE1YywgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjA4ICovCiAgICAwLCBWS19WT0xVTUVfRE9XTiwgVktfVk9MVU1FX01VVEUsIFZLX1ZPTFVNRV9VUCwgICAgICAgICAgICAvKiAxMDA4RkYxMCAqLwogICAgVktfTUVESUFfUExBWV9QQVVTRSwgVktfTUVESUFfU1RPUCwKICAgIFZLX01FRElBX1BSRVZfVFJBQ0ssIFZLX01FRElBX05FWFRfVFJBQ0ssCiAgICAwLCBWS19MQVVOQ0hfTUFJTCwgMCwgVktfQlJPV1NFUl9TRUFSQ0gsICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYxOCAqLwogICAgMCwgMCwgMCwgVktfQlJPV1NFUl9IT01FLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgVktfQlJPV1NFUl9CQUNLLCBWS19CUk9XU0VSX0ZPUldBUkQsICAgICAgLyogMTAwOEZGMjAgKi8KICAgIFZLX0JST1dTRVJfU1RPUCwgVktfQlJPV1NFUl9SRUZSRVNILCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIDEwMDhGRjI4ICovCiAgICBWS19CUk9XU0VSX0ZBVk9SSVRFUywgMCwgVktfTEFVTkNIX01FRElBX1NFTEVDVCwgMCwgICAgICAgICAvKiAxMDA4RkYzMCAqLwogICAgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkY4ICovCn07CgpzdGF0aWMgaW5saW5lIEtleVN5bSBrZXljb2RlX3RvX2tleXN5bSggRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrZXljb2RlLCBpbnQgaW5kZXggKQp7CiNpZmRlZiBIQVZFX1hLQgogICAgaWYgKHVzZV94a2IpIHJldHVybiBYa2JLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgMCwgaW5kZXgpOwojZW5kaWYKICAgIHJldHVybiBrZXlfbWFwcGluZ1soa2V5Y29kZSAtIG1pbl9rZXljb2RlKSAqIGtleXN5bXNfcGVyX2tleWNvZGUgKyBpbmRleF07Cn0KCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCi8qIGtiZF9zZWN0aW9uIG11c3QgYmUgaGVsZCAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYSUMgeGljLCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgU3RhdHVzIHN0YXR1czsKICAgIGNoYXIgYnVmWzI0XTsKCiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBlLT50eXBlID09IEtleVByZXNzKQogICAgICAgIFhtYkxvb2t1cFN0cmluZyh4aWMsIGUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIFhMb29rdXBTdHJpbmcoZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CgogICAgaWYgKChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgIChrZXlzeW0gPT0gWEtfS1BfU2VwYXJhdG9yIHx8IGtleXN5bSA9PSBYS19LUF9EZWNpbWFsIHx8CiAgICAgICAgIChrZXlzeW0gPj0gWEtfS1BfMCAmJiBrZXlzeW0gPD0gWEtfS1BfOSkpKQogICAgICAgIC8qIE9ubHkgdGhlIEtleXBhZCBrZXlzIDAtOSBhbmQgLiBzZW5kIGRpZmZlcmVudCBrZXlzeW1zCiAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBOdW1Mb2NrIHN0YXRlICovCiAgICAgICAgcmV0dXJuIG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhGRl07CgogICAgLyogUHJlc3NpbmcgdGhlIFBhdXNlL0JyZWFrIGtleSBhbG9uZSBwcm9kdWNlcyBWS19QQVVTRSB2a2V5LCB3aGlsZQogICAgICogcHJlc3NpbmcgQ3RybCtQYXVzZS9CcmVhayBwcm9kdWNlcyBWS19DQU5DRUwuICovCiAgICBpZiAoKGUtPnN0YXRlICYgQ29udHJvbE1hc2spICYmIChrZXlzeW0gPT0gWEtfQnJlYWspKQogICAgICAgIHJldHVybiBWS19DQU5DRUw7CgogICAgVFJBQ0VfKGtleSkoImUtPmtleWNvZGUgPSAldVxuIiwgZS0+a2V5Y29kZSk7CgogICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQKICovCnN0YXRpYyB2b2lkIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBIV05EIGh3bmQsIFdPUkQgdmtleSwgV09SRCBzY2FuLCBEV09SRCBmbGFncywgRFdPUkQgdGltZSApCnsKICAgIElOUFVUIGlucHV0OwoKICAgIFRSQUNFXyhrZXkpKCAiaHduZCAlcCB2a2V5PSUwNHggc2Nhbj0lMDR4IGZsYWdzPSUwNHhcbiIsIGh3bmQsIHZrZXksIHNjYW4sIGZsYWdzICk7CgogICAgaW5wdXQudHlwZSAgICAgICAgICAgICA9IElOUFVUX0tFWUJPQVJEOwogICAgaW5wdXQudS5raS53VmsgICAgICAgICA9IHZrZXk7CiAgICBpbnB1dC51LmtpLndTY2FuICAgICAgID0gc2NhbjsKICAgIGlucHV0LnUua2kuZHdGbGFncyAgICAgPSBmbGFnczsKICAgIGlucHV0LnUua2kudGltZSAgICAgICAgPSB0aW1lOwogICAgaW5wdXQudS5raS5kd0V4dHJhSW5mbyA9IDA7CgogICAgX193aW5lX3NlbmRfaW5wdXQoIGh3bmQsICZpbnB1dCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBnZXRfYXN5bmNfa2V5X3N0YXRlCiAqLwpzdGF0aWMgQk9PTCBnZXRfYXN5bmNfa2V5X3N0YXRlKCBCWVRFIHN0YXRlWzI1Nl0gKQp7CiAgICBCT09MIHJldDsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBnZXRfa2V5X3N0YXRlICkKICAgIHsKICAgICAgICByZXEtPnRpZCA9IDA7CiAgICAgICAgcmVxLT5rZXkgPSAtMTsKICAgICAgICB3aW5lX3NlcnZlcl9zZXRfcmVwbHkoIHJlcSwgc3RhdGUsIDI1NiApOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBzZXRfYXN5bmNfa2V5X3N0YXRlCiAqLwpzdGF0aWMgdm9pZCBzZXRfYXN5bmNfa2V5X3N0YXRlKCBjb25zdCBCWVRFIHN0YXRlWzI1Nl0gKQp7CiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfa2V5X3N0YXRlICkKICAgIHsKICAgICAgICByZXEtPnRpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwogICAgICAgIHJlcS0+YXN5bmMgPSAxOwogICAgICAgIHdpbmVfc2VydmVyX2FkZF9kYXRhKCByZXEsIHN0YXRlLCAyNTYgKTsKICAgICAgICB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfa2V5X3N0YXRlKCBCWVRFICprZXlzdGF0ZSwgQllURSBrZXksIGludCBkb3duICkKewogICAgaWYgKGRvd24pCiAgICB7CiAgICAgICAgaWYgKCEoa2V5c3RhdGVba2V5XSAmIDB4ODApKSBrZXlzdGF0ZVtrZXldIF49IDB4MDE7CiAgICAgICAga2V5c3RhdGVba2V5XSB8PSAweDgwOwogICAgfQogICAgZWxzZSBrZXlzdGF0ZVtrZXldICY9IH4weDgwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8KQk9PTCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgajsKICAgIEJZVEUga2V5c3RhdGVbMjU2XTsKICAgIFdPUkQgdmtleTsKICAgIEJPT0wgY2hhbmdlZCA9IEZBTFNFOwogICAgc3RydWN0IHsKICAgICAgICBXT1JEIHZrZXk7CiAgICAgICAgQk9PTCBwcmVzc2VkOwogICAgfSBtb2RpZmllcnNbNl07IC8qIFZLX0xTSElGVCB0aHJvdWdoIFZLX1JNRU5VIGFyZSBjb250aWd1b3VzICovCiAgICBCT09MIGx3aW5fcHJlc3NlZCA9IEZBTFNFLCByd2luX3ByZXNzZWQgPSBGQUxTRTsKCiAgICBpZiAoIWdldF9hc3luY19rZXlfc3RhdGUoIGtleXN0YXRlICkpIHJldHVybiBGQUxTRTsKCiAgICBtZW1zZXQobW9kaWZpZXJzLCAwLCBzaXplb2YobW9kaWZpZXJzKSk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIC8qIHRoZSBtaW5pbXVtIGtleWNvZGUgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gOCwgc28gd2UgY2FuCiAgICAgKiBza2lwIHRoZSBmaXJzdCA4IHZhbHVlcywgaGVuY2Ugc3RhcnQgYXQgMQogICAgICovCiAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykKICAgIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IG07CgogICAgICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5WyhpICogOCkgKyBqXTsKCiAgICAgICAgICAgIHN3aXRjaCh2a2V5ICYgMHhmZikKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICBtID0gKHZrZXkgJiAweGZmKSAtIFZLX0xTSElGVDsKICAgICAgICAgICAgICAgIC8qIFRha2UgdGhlIHZrZXkgZnJvbSB0aGUgZmlyc3Qga2V5Y29kZSB3ZSBlbmNvdW50ZXIgZm9yIHRoaXMgbW9kaWZpZXIgKi8KICAgICAgICAgICAgICAgIGlmICghbW9kaWZpZXJzW21dLnZrZXkpIG1vZGlmaWVyc1ttXS52a2V5ID0gdmtleTsKICAgICAgICAgICAgICAgIGlmIChldmVudC0+eGtleW1hcC5rZXlfdmVjdG9yW2ldICYgKDE8PGopKSBtb2RpZmllcnNbbV0ucHJlc3NlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19MV0lOOgogICAgICAgICAgICAgICAgaWYgKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpIGx3aW5fcHJlc3NlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19SV0lOOgogICAgICAgICAgICAgICAgaWYgKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpIHJ3aW5fcHJlc3NlZCA9IFRSVUU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmb3IgKHZrZXkgPSBWS19MU0hJRlQ7IHZrZXkgPD0gVktfUk1FTlU7IHZrZXkrKykKICAgIHsKICAgICAgICBpbnQgbSA9IHZrZXkgLSBWS19MU0hJRlQ7CiAgICAgICAgaWYgKG1vZGlmaWVyc1ttXS52a2V5ICYmICEoa2V5c3RhdGVbdmtleV0gJiAweDgwKSAhPSAhbW9kaWZpZXJzW21dLnByZXNzZWQpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSggIkFkanVzdGluZyBzdGF0ZSBmb3IgdmtleSAlIy4yeC4gU3RhdGUgYmVmb3JlICUjLjJ4XG4iLAogICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzW21dLnZrZXksIGtleXN0YXRlW3ZrZXldKTsKCiAgICAgICAgICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCB2a2V5LCBtb2RpZmllcnNbbV0ucHJlc3NlZCApOwogICAgICAgICAgICBjaGFuZ2VkID0gVFJVRTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCEoa2V5c3RhdGVbVktfTFdJTl0gJiAweDgwKSAhPSAhbHdpbl9wcmVzc2VkKQogICAgewogICAgICAgIFRSQUNFKCAiQWRqdXN0aW5nIHN0YXRlIGZvciBWS19MV0lOLiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsIGtleXN0YXRlW1ZLX0xXSU5dKTsKICAgICAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTFdJTiwgbHdpbl9wcmVzc2VkICk7CiAgICAgICAgY2hhbmdlZCA9IFRSVUU7CiAgICB9CiAgICBpZiAoIShrZXlzdGF0ZVtWS19SV0lOXSAmIDB4ODApICE9ICFyd2luX3ByZXNzZWQpCiAgICB7CiAgICAgICAgVFJBQ0UoICJBZGp1c3Rpbmcgc3RhdGUgZm9yIFZLX1JXSU4uIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwga2V5c3RhdGVbVktfUldJTl0pOwogICAgICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCBWS19SV0lOLCByd2luX3ByZXNzZWQgKTsKICAgICAgICBjaGFuZ2VkID0gVFJVRTsKICAgIH0KCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICBpZiAoIWNoYW5nZWQpIHJldHVybiBGQUxTRTsKCiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfQ09OVFJPTCwgKGtleXN0YXRlW1ZLX0xDT05UUk9MXSB8IGtleXN0YXRlW1ZLX1JDT05UUk9MXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTUVOVSwgKGtleXN0YXRlW1ZLX0xNRU5VXSB8IGtleXN0YXRlW1ZLX1JNRU5VXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfU0hJRlQsIChrZXlzdGF0ZVtWS19MU0hJRlRdIHwga2V5c3RhdGVbVktfUlNISUZUXSkgJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfTFdJTiwga2V5c3RhdGVbVktfTFdJTl0gJiAweDgwICk7CiAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgVktfUldJTiwga2V5c3RhdGVbVktfUldJTl0gJiAweDgwICk7CiAgICBzZXRfYXN5bmNfa2V5X3N0YXRlKCBrZXlzdGF0ZSApOwogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyB2b2lkIHVwZGF0ZV9sb2NrX3N0YXRlKCBIV05EIGh3bmQsIFdPUkQgdmtleSwgVUlOVCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIEJZVEUga2V5c3RhdGVbMjU2XTsKCiAgICAvKiBOb3RlOiBYIHNldHMgdGhlIGJlbG93IHN0YXRlcyBvbiBrZXkgZG93biBhbmQgY2xlYXJzIHRoZW0gb24ga2V5IHVwLgogICAgICAgV2luZG93cyB0cmlnZ2VycyB0aGVtIG9uIGtleSBkb3duLiAqLwoKICAgIGlmICghZ2V0X2FzeW5jX2tleV9zdGF0ZSgga2V5c3RhdGUgKSkgcmV0dXJuOwoKICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleXN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShzdGF0ZSAmIExvY2tNYXNrKSAmJiB2a2V5ICE9IFZLX0NBUElUQUwpCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSAwOwogICAgICAgIGlmIChrZXlzdGF0ZVtWS19DQVBJVEFMXSAmIDB4ODApIGZsYWdzIF49IEtFWUVWRU5URl9LRVlVUDsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHNMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleXN0YXRlW1ZLX0NBUElUQUxdKTsKICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgVktfQ0FQSVRBTCwgMHgzYSwgZmxhZ3MsIHRpbWUgKTsKICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgVktfQ0FQSVRBTCwgMHgzYSwgZmxhZ3MgXiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleXN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkgIT0gIShzdGF0ZSAmIE51bUxvY2tNYXNrKSAmJiAodmtleSAmIDB4ZmYpICE9IFZLX05VTUxPQ0spCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSBLRVlFVkVOVEZfRVhURU5ERURLRVk7CiAgICAgICAgaWYgKGtleXN0YXRlW1ZLX05VTUxPQ0tdICYgMHg4MCkgZmxhZ3MgXj0gS0VZRVZFTlRGX0tFWVVQOwogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlzdGF0ZVtWS19OVU1MT0NLXSk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX05VTUxPQ0ssIDB4NDUsIGZsYWdzLCB0aW1lICk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX05VTUxPQ0ssIDB4NDUsIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lICk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBTQ1JPTExMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlzdGF0ZVtWS19TQ1JPTExdICYgMHgwMSkgIT0gIShzdGF0ZSAmIFNjcm9sbExvY2tNYXNrKSAmJiB2a2V5ICE9IFZLX1NDUk9MTCkKICAgIHsKICAgICAgICBEV09SRCBmbGFncyA9IDA7CiAgICAgICAgaWYgKGtleXN0YXRlW1ZLX1NDUk9MTF0gJiAweDgwKSBmbGFncyBePSBLRVlFVkVOVEZfS0VZVVA7CiAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBTY3JMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleXN0YXRlW1ZLX1NDUk9MTF0pOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19TQ1JPTEwsIDB4NDYsIGZsYWdzLCB0aW1lICk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX1NDUk9MTCwgMHg0NiwgZmxhZ3MgXiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCkJPT0wgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhFdmVudCAqeGV2ICkKewogICAgWEtleUV2ZW50ICpldmVudCA9ICZ4ZXYtPnhrZXk7CiAgICBjaGFyIGJ1ZlsyNF07CiAgICBjaGFyICpTdHIgPSBidWY7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFdPUkQgdmtleSA9IDAsIGJTY2FuOwogICAgRFdPUkQgZHdGbGFnczsKICAgIGludCBhc2NpaV9jaGFyczsKICAgIFhJQyB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBod25kICk7CiAgICBEV09SRCBldmVudF90aW1lID0gRVZFTlRfeDExX3RpbWVfdG9fd2luMzJfdGltZShldmVudC0+dGltZSk7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlICV1XG4iLAoJCWV2ZW50LT50eXBlLCBldmVudC0+d2luZG93LCBldmVudC0+c3RhdGUsIGV2ZW50LT5rZXljb2RlKTsKCiAgICBpZiAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpIHVwZGF0ZV91c2VyX3RpbWUoIGV2ZW50LT50aW1lICk7CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICB7CiAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0VfKGtleSkoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlaSBieXRlKHMpXG4iLCBhc2NpaV9jaGFycyk7CiAgICAgICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgewogICAgICAgICAgICBTdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYXNjaWlfY2hhcnMpOwogICAgICAgICAgICBpZiAoU3RyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUl8oa2V5KSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIFN0ciwgYXNjaWlfY2hhcnMsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwoKICAgIFRSQUNFXyhrZXkpKCJuYnl0ZSA9ICVkLCBzdGF0dXMgJWRcbiIsIGFzY2lpX2NoYXJzLCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWExvb2t1cENoYXJzKQogICAgewogICAgICAgIFgxMURSVl9YSU1Mb29rdXBDaGFycyggU3RyLCBhc2NpaV9jaGFycyApOwogICAgICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBTdHIpOwogICAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICAvKiBJZiBYS0IgZXh0ZW5zaW9ucyBhcmUgdXNlZCwgdGhlIHN0YXRlIG1hc2sgZm9yIEFsdEdyIHdpbGwgdXNlIHRoZSBncm91cAogICAgICAgaW5kZXggaW5zdGVhZCBvZiB0aGUgbW9kaWZpZXIgbWFzay4gVGhlIGdyb3VwIGluZGV4IGlzIHNldCBpbiBiaXRzCiAgICAgICAxMy0xNCBvZiB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIFhLZXlFdmVudCBzdHJ1Y3R1cmUuIFNvIGlmIEFsdEdyIGlzCiAgICAgICBwcmVzc2VkLCBsb29rIGlmIHRoZSBncm91cCBpbmRleCBpcyBkaWZmZXJlbnQgdGhhbiAwLiBGcm9tIFhLQgogICAgICAgZXh0ZW5zaW9uIGRvY3VtZW50YXRpb24sIHRoZSBncm91cCBpbmRleCBmb3IgQWx0R3Igc2hvdWxkIGJlIDIKICAgICAgIChldmVudC0+c3RhdGUgPSAweDIwMDApLiBJdCdzIHByb2JhYmx5IGJldHRlciB0byBub3QgYXNzdW1lIGEKICAgICAgIHByZWRlZmluZWQgZ3JvdXAgaW5kZXggYW5kIGZpbmQgaXQgZHluYW1pY2FsbHkKCiAgICAgICBSZWY6IFggS2V5Ym9hcmQgRXh0ZW5zaW9uOiBMaWJyYXJ5IHNwZWNpZmljYXRpb24gKHNlY3Rpb24gMTQuMS4xIGFuZCAxNy4xLjEpICovCiAgICAvKiBTYXZlIGFsc28gYWxsIHBvc3NpYmxlIG1vZGlmaWVyIHN0YXRlcy4gKi8KICAgIEFsdEdyTWFzayA9IGV2ZW50LT5zdGF0ZSAmICgweDYwMDAgfCBNb2QxTWFzayB8IE1vZDJNYXNrIHwgTW9kM01hc2sgfCBNb2Q0TWFzayB8IE1vZDVNYXNrKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSl7Cgljb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpCgkgIGtzbmFtZSA9ICJObyBOYW1lIjsKCVRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbHggKCVzKSwgIyBvZiBjaGFycz0lZCAvICVzXG4iLAogICAgICAgICAgICAgICAgICAgIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgZGVidWdzdHJfYW4oU3RyLCBhc2NpaV9jaGFycykpOwogICAgfQogICAgaWYgKGJ1ZiAhPSBTdHIpCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgU3RyKTsKCiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsZXZlbnQpOwogICAgLyogWCByZXR1cm5zIGtleWNvZGUgMCBmb3IgY29tcG9zZWQgY2hhcmFjdGVycyAqLwogICAgaWYgKCF2a2V5ICYmIGFzY2lpX2NoYXJzKSB2a2V5ID0gVktfTk9OQU1FOwogICAgYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKCiAgICBUUkFDRV8oa2V5KSgia2V5Y29kZSAldSBjb252ZXJ0ZWQgdG8gdmtleSAweCVYIHNjYW4gJTAyeFxuIiwKICAgICAgICAgICAgICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5LCBiU2Nhbik7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIGlmICghdmtleSkgcmV0dXJuIEZBTFNFOwoKICAgIGR3RmxhZ3MgPSAwOwogICAgaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CiAgICBpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCiAgICB1cGRhdGVfbG9ja19zdGF0ZSggaHduZCwgdmtleSwgZXZlbnQtPnN0YXRlLCBldmVudF90aW1lICk7CgogICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIHZrZXkgJiAweGZmLCBiU2NhbiwgZHdGbGFncywgZXZlbnRfdGltZSApOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICoga2JkX3NlY3Rpb24gbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggRGlzcGxheSAqZGlzcGxheSApCnsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bSA9IDA7CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzI1Nl1bNF07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CgogIG1lbXNldCggY2tleSwgMCwgc2l6ZW9mKGNrZXkpICk7CiAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKICAgICAgICBpZiAoIShrZXlzeW0gPSBrZXljb2RlX3RvX2tleXN5bSAoZGlzcGxheSwga2V5YywgaSkpKSBjb250aW51ZTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDAwKSAmJiAoa2V5c3ltICE9ICcgJykpCiAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlba2V5Y11baV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIlhLQiBjb3VsZCBub3QgdHJhbnNsYXRlIGtleXN5bSAlMDRseFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlba2V5Y11baV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlba2V5Y11baV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICB9CgogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIGlmIChja2V5W2tleWNdWzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI8KjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgY2hhciBzdHJbNV07CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBzdHJbaV0gPSBja2V5W2tleWNdW2ldID8gY2tleVtrZXljXVtpXSA6ICcgJzsKICAgICAgICAgIHN0cls0XSA9IDA7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleWNvZGUgJXUsIGdvdCAlc1xuIiwga2V5Yywgc3RyKTsKICAgICAgICAgIG1pc21hdGNoKys7CiAgICAgICAgICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCnN0YXRpYyBIS0wgZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KHZvaWQpCnsKICAgIFVMT05HX1BUUiBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIC8qIEZJWE1FOgogICAgICoKICAgICAqIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgICoKICAgICAqIFdpbndvcmQgdXNlcyByZXR1cm4gdmFsdWUgb2YgR2V0S2V5Ym9hcmRMYXlvdXQgYXMgYSBjb2RlcGFnZQogICAgICogdG8gdHJhbnNsYXRlIEFOU0kga2V5Ym9hcmQgbWVzc2FnZXMgdG8gdW5pY29kZS4gQnV0IHdlIGhhdmUKICAgICAqIGEgcHJvYmxlbSB3aXRoIGl0OiBmb3IgaW5zdGFuY2UgUG9saXNoIGtleWJvYXJkIGxheW91dCBpcwogICAgICogaWRlbnRpY2FsIHRvIHRoZSBVUyBvbmUsIGFuZCB0aGVyZWZvcmUgaW5zdGVhZCBvZiB0aGUgUG9saXNoCiAgICAgKiBsb2NhbGUgaWQgd2UgcmV0dXJuIHRoZSBVUyBvbmUuCiAgICAgKi8KCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCiAgICAvKgogICAgICogTWljcm9zb2Z0IE9mZmljZSBleHBlY3RzIHRoaXMgdmFsdWUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljCiAgICAgKiBmb3IgSmFwYW5lc2UgYW5kIEtvcmVhbiBXaW5kb3dzIHdpdGggYW4gSU1FIHRoZSB2YWx1ZSBpcyAweGUwMDEKICAgICAqIFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0byBzZWUgaWYgYW4gSU1FIGV4aXN0cyBhbmQgaWYgc28gdGhlbgogICAgICogc2V0IHRoaXMgd29yZCBwcm9wZXJseS4KICAgICAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgPSBNQUtFTE9ORyggbGF5b3V0LCAweGUwMDEgKTsgLyogSU1FICovCiAgICBlbHNlCiAgICAgICAgbGF5b3V0IHw9IGxheW91dCA8PCAxNjsKCiAgICByZXR1cm4gKEhLTClsYXlvdXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgR2V0S2V5Ym9hcmRMYXlvdXROYW1lIChYMTFEUlYuQCkKICovCkJPT0wgQ0RFQ0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShMUFdTVFIgbmFtZSkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIGZvcm1hdFdbXSA9IHsnJScsJzAnLCc4JywneCcsMH07CiAgICBEV09SRCBsYXlvdXQ7CgogICAgbGF5b3V0ID0gSGFuZGxlVG9VbG9uZyggZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCkgKTsKICAgIGlmIChISVdPUkQobGF5b3V0KSA9PSBMT1dPUkQobGF5b3V0KSkgbGF5b3V0ID0gTE9XT1JEKGxheW91dCk7CiAgICBzcHJpbnRmVyhuYW1lLCBmb3JtYXRXLCBsYXlvdXQpOwogICAgVFJBQ0UoInJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhuYW1lKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKc3RhdGljIHZvaWQgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkodm9pZCkKewogICAgc3RhdGljIGNvbnN0IFdDSEFSIHByZWxvYWRbXSA9CiAgICAgICAgeydLJywnZScsJ3knLCdiJywnbycsJ2EnLCdyJywnZCcsJyAnLCdMJywnYScsJ3knLCdvJywndScsJ3QnLCdcXCcsJ1AnLCdyJywnZScsJ2wnLCdvJywnYScsJ2QnLDB9OwogICAgc3RhdGljIGNvbnN0IFdDSEFSIG9uZVtdID0geycxJywwfTsKCiAgICBIS0VZIGhrZXk7CiAgICBXQ0hBUiBsYXlvdXRbS0xfTkFNRUxFTkdUSF07CgogICAgaWYgKFJlZ0NyZWF0ZUtleUV4VyhIS0VZX0NVUlJFTlRfVVNFUiwgcHJlbG9hZCwgMCwgTlVMTCwgMCwgS0VZX0FMTF9BQ0NFU1MsIE5VTEwsICZoa2V5LCBOVUxMKSkKICAgICAgICByZXR1cm47CgogICAgaWYgKCFSZWdRdWVyeVZhbHVlRXhXKGhrZXksIG9uZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKFgxMURSVl9HZXRLZXlib2FyZExheW91dE5hbWUobGF5b3V0KSkKICAgICAgICBSZWdTZXRWYWx1ZUV4Vyhoa2V5LCBvbmUsIDAsIFJFR19TWiwgKGNvbnN0IEJZVEUgKilsYXlvdXQsIHNpemVvZihsYXlvdXQpKTsKCiAgICBSZWdDbG9zZUtleShoa2V5KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9Jbml0S2V5Ym9hcmQKICovCnZvaWQgWDExRFJWX0luaXRLZXlib2FyZCggRGlzcGxheSAqZGlzcGxheSApCnsKICAgIFhNb2RpZmllcktleW1hcCAqbW1wOwogICAgS2V5U3ltIGtleXN5bTsKICAgIEtleUNvZGUgKmtjcDsKICAgIFhLZXlFdmVudCBlMjsKICAgIFdPUkQgc2NhbiwgdmtleTsKICAgIGludCBrZXljLCBpLCBrZXluLCBzeW1zOwogICAgY2hhciBja2V5WzRdPXswLDAsMCwwfTsKICAgIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgICBjaGFyIHZrZXlfdXNlZFsyNTZdID0geyAwIH07CgogICAgLyogUmFuZ2VzIG9mIE9FTSwgZnVuY3Rpb24ga2V5LCBhbmQgY2hhcmFjdGVyIHZpcnR1YWwga2V5IGNvZGVzLgogICAgICogRG9uJ3QgaW5jbHVkZSB0aG9zZSBoYW5kbGVkIHNwZWNpYWxseSBpbiBYMTFEUlZfVG9Vbmljb2RlRXggYW5kCiAgICAgKiBYMTFEUlZfTWFwVmlydHVhbEtleUV4LCBsaWtlIFZLX05VTVBBRDAgLSBWS19ESVZJREUuICovCiAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgICAgICBXT1JEIGZpcnN0LCBsYXN0OwogICAgfSB2a2V5X3Jhbmdlc1tdID0gewogICAgICAgIHsgVktfT0VNXzEsIFZLX09FTV8zIH0sCiAgICAgICAgeyBWS19PRU1fNCwgVktfSUNPXzAwIH0sCiAgICAgICAgeyAweGU2LCAweGU2IH0sCiAgICAgICAgeyAweGU5LCAweGY1IH0sCiAgICAgICAgeyBWS19PRU1fTkVDX0VRVUFMLCBWS19PRU1fTkVDX0VRVUFMIH0sCiAgICAgICAgeyBWS19GMSwgVktfRjI0IH0sCiAgICAgICAgeyAweDMwLCAweDM5IH0sIC8qIFZLXzAgLSBWS185ICovCiAgICAgICAgeyAweDQxLCAweDVhIH0sIC8qIFZLX0EgLSBWS19aICovCiAgICAgICAgeyAwLCAwIH0KICAgIH07CiAgICBpbnQgdmtleV9yYW5nZTsKCiAgICBzZXRfa2JkX2xheW91dF9wcmVsb2FkX2tleSgpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAgaWYgKGtleV9tYXBwaW5nKSBYRnJlZSgga2V5X21hcHBpbmcgKTsKICAgIGtleV9tYXBwaW5nID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOwoKICAgIG1tcCA9IFhHZXRNb2RpZmllck1hcHBpbmcoZGlzcGxheSk7CiAgICBrY3AgPSBtbXAtPm1vZGlmaWVybWFwOwogICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMSkgLyogVGhlcmUgYXJlIDggbW9kaWZpZXIga2V5cyAqLwogICAgewogICAgICAgIGludCBqOwoKICAgICAgICBmb3IgKGogPSAwOyBqIDwgbW1wLT5tYXhfa2V5cGVybW9kOyBqICs9IDEsIGtjcCArPSAxKQoJICAgIGlmICgqa2NwKQogICAgICAgICAgICB7CgkJaW50IGs7CgoJCWZvciAoayA9IDA7IGsgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBrICs9IDEpCiAgICAgICAgICAgICAgICAgICAgaWYgKGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE51bUxvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX1Njcm9sbF9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbExvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiU2Nyb2xsTG9ja01hc2sgaXMgJXhcbiIsIFNjcm9sbExvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoIGRpc3BsYXkgKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CiAgICBlMi50eXBlID0gS2V5UHJlc3M7CgogICAgbWVtc2V0KGtleWMydmtleSwgMCwgc2l6ZW9mKGtleWMydmtleSkpOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBjaGFyIGJ1ZlszMF07CiAgICAgICAgaW50IGhhdmVfY2hhcnM7CgogICAgICAgIGtleXN5bSA9IDA7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgaGF2ZV9jaGFycyA9IFhMb29rdXBTdHJpbmcoJmUyLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5ID0gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIHNjYW4gPSBub25jaGFyX2tleV9zY2FuW2tleXN5bSAmIDB4ZmZdOwoJCS8qIHNldCBleHRlbmRlZCBiaXQgd2hlbiBuZWNlc3NhcnkgKi8KCQlpZiAoc2NhbiAmIDB4MTAwKSB2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsgLyogWEZyZWU4NiB2ZW5kb3Iga2V5cyAqLwogICAgICAgICAgICAgICAgdmtleSA9IHhmcmVlODZfdmVuZG9yX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgLyogQWxsIHZlbmRvciBrZXlzIGFyZSBleHRlbmRlZCB3aXRoIGEgc2NhbiBjb2RlIG9mIDAgcGVyIHRlc3Rpbmcgb24gV2luWFAgKi8KICAgICAgICAgICAgICAgIHNjYW4gPSAweDEwMDsKCQl2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSAweDIwKSB7ICAgICAgICAgICAgICAgICAvKiBTcGFjZWJhciAqLwoJICAgICAgICB2a2V5ID0gVktfU1BBQ0U7CgkJc2NhbiA9IDB4Mzk7CgkgICAgfSBlbHNlIGlmIChoYXZlX2NoYXJzKSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIGkpOwoJCWlmICgoa2V5c3ltPDB4ODAwMCkgJiYgKGtleXN5bSE9JyAnKSkKICAgICAgICAgICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlbaV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY2tleVtpXSA9IChrZXlzeW0gPD0gMHg3RikgPyBrZXlzeW0gOiAwOwogICAgICAgICAgICAgICAgICAgIH0KCQl9IGVsc2UgewoJCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCQl9CgkgICAgICB9CgkgICAgICAvKiBmaW5kIGtleSB3aXRoIGxvbmdlc3QgbWF0Y2ggc3RyZWFrICovCgkgICAgICBmb3IgKGtleW49MDsga2V5bjxNQUlOX0xFTjsga2V5bisrKSB7CgkJZm9yIChvaz0oKmxrZXkpW2tleW5dW2k9MF07IG9rJiYoaTw0KTsgaSsrKQoJCSAgaWYgKCgqbGtleSlba2V5bl1baV0gJiYgKCpsa2V5KVtrZXluXVtpXSE9Y2tleVtpXSkgb2s9MDsKCQlpZiAoIW9rKSBpLS07IC8qIHdlIG92ZXJzaG90ICovCgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJY29uc3QgV09SRCAoKmxzY2FuKVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0uc2NhbjsKCQljb25zdCBXT1JEICgqbHZrZXkpW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS52a2V5OwoJCXNjYW4gPSAoKmxzY2FuKVttYXh2YWxdOwoJCXZrZXkgPSAoKmx2a2V5KVttYXh2YWxdOwoJICAgICAgfQoJICAgIH0KICAgICAgICB9CiAgICAgICAgVFJBQ0UoImtleWNvZGUgJXUgPT4gdmtleSAlMDRYXG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICAgICAgaWYgKCh2a2V5ICYgMHhmZikgJiYgdmtleV91c2VkWyh2a2V5ICYgMHhmZildKQogICAgICAgICAgICBXQVJOKCJ2a2V5ICUwNFggaXMgYmVpbmcgdXNlZCBieSBtb3JlIHRoYW4gb25lIGtleWNvZGVcbiIsIHZrZXkpOwogICAgICAgIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSA9IDE7CiAgICB9IC8qIGZvciAqLwoKI2RlZmluZSBWS0VZX0lGX05PVF9VU0VEKHZrZXkpICh2a2V5X3VzZWRbKHZrZXkpXSA/IDAgOiAodmtleV91c2VkWyh2a2V5KV0gPSAxLCAodmtleSkpKQogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhmZjsKICAgICAgICBpZiAodmtleSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwogICAgICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gWEtfMCAmJiBrZXlzeW0gPD0gWEtfOSkKICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gWEtfQSAmJiBrZXlzeW0gPD0gWEtfWikpIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKGtleXN5bSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBzd2l0Y2ggKGtleXN5bSkKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8yKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2AnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzQpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV81KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ10nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9DT01NQSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcuJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BFUklPRCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX01JTlVTKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUExVUyk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodmtleSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgfQogICAgfSAvKiBmb3IgKi8KCiAgICAvKiBGb3IgYW55IGtleWNvZGVzIHdoaWNoIHN0aWxsIGRvbid0IGhhdmUgYSB2a2V5LCBhc3NpZ24gYW55IHNwYXJlCiAgICAgKiBjaGFyYWN0ZXIsIGZ1bmN0aW9uIGtleSwgb3IgT0VNIHZpcnR1YWwga2V5IGNvZGUuICovCiAgICB2a2V5X3JhbmdlID0gMDsKICAgIHZrZXkgPSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5maXJzdDsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgaWYgKGtleWMydmtleVtrZXljXSAmIDB4ZmYpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIHdoaWxlICh2a2V5ICYmIHZrZXlfdXNlZFt2a2V5XSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICh2a2V5ID09IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmxhc3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZrZXlfcmFuZ2UrKzsKICAgICAgICAgICAgICAgIHZrZXkgPSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5maXJzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2a2V5Kys7CiAgICAgICAgfQoKICAgICAgICBpZiAoIXZrZXkpCiAgICAgICAgewogICAgICAgICAgICBXQVJOKCJObyBtb3JlIHZrZXlzIGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmIChUUkFDRV9PTihrZXlib2FyZCkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgic3BhcmUgdmlydHVhbCBrZXkgJTA0WCBhc3NpZ25lZCB0byBrZXljb2RlICV1OlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5LCBlMi5rZXljb2RlKTsKICAgICAgICAgICAgVFJBQ0UoIigiKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCiAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgIFRSQUNFKCAiJWx4ICglcykgIiwga2V5c3ltLCBrc25hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFKCIpXG4iKTsKICAgICAgICB9CgogICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICB2a2V5X3VzZWRbdmtleV0gPSAxOwogICAgfSAvKiBmb3IgKi8KI3VuZGVmIFZLRVlfSUZfTk9UX1VTRUQKCiAgICAvKiBJZiBzb21lIGtleXMgc3RpbGwgbGFjayBzY2FuY29kZXMsIGFzc2lnbiBzb21lIGFyYml0cmFyeSBvbmVzIHRvIHRoZW0gbm93ICovCiAgICBmb3IgKHNjYW4gPSAweDYwLCBrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKGtleWMydmtleVtrZXljXSYmIWtleWMyc2NhbltrZXljXSkgewoJY29uc3QgY2hhciAqa3NuYW1lOwoJa2V5c3ltID0ga2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5YywgMCk7Cglrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKSBrc25hbWUgPSAiTm9TeW1ib2wiOwoKCS8qIHNob3VsZCBtYWtlIHN1cmUgdGhlIHNjYW5jb2RlIGlzIHVuYXNzaWduZWQgaGVyZSwgYnV0ID49MHg2MCBjdXJyZW50bHkgYWx3YXlzIGlzICovCgoJVFJBQ0VfKGtleSkoImFzc2lnbmluZyBzY2FuY29kZSAlMDJ4IHRvIHVuaWRlbnRpZmllZCBrZXljb2RlICV1ICglcylcbiIsc2NhbixrZXljLGtzbmFtZSk7CglrZXljMnNjYW5ba2V5Y109c2NhbisrOwogICAgICB9CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwp9CgpzdGF0aWMgQk9PTCBtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KEhLTCBoa2wpCnsKICAgIGNvbnN0IERXT1JEIGlzSU1FID0gMHhFMDAwMDAwMDsKICAgIEhLTCB4SGtsID0gZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCk7CgogICAgLyogaWYgdGhlIGxheW91dCBpcyBhbiBJTUUsIG9ubHkgbWF0Y2ggdGhlIGxvdyB3b3JkIChMQ0lEKSAqLwogICAgaWYgKCgoVUxPTkdfUFRSKWhrbCAmIGlzSU1FKSA9PSBpc0lNRSkKICAgICAgICByZXR1cm4gKExPV09SRChoa2wpID09IExPV09SRCh4SGtsKSk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIChoa2wgPT0geEhrbCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgaWYgKCFkd1RocmVhZGlkIHx8IGR3VGhyZWFkaWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCiAgICB7CiAgICAgICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKTsKICAgICAgICBpZiAodGhyZWFkX2RhdGEgJiYgdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQpIHJldHVybiB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIH0KICAgIGVsc2UKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKICAgIHJldHVybiBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzZW1pLXN0dWIhIFJldHVybmluZyBkZWZhdWx0IGxheW91dC5cbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIHJldHVybiBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBDREVDTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIENERUNMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEhLTCBvbGRIa2wgPSAwOwogICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfaW5pdF90aHJlYWRfZGF0YSgpOwoKICAgIEZJWE1FKCIlcCwgJTA0eDogc2VtaS1zdHViIVxuIiwgaGtsLCBmbGFncyk7CiAgICBpZiAoZmxhZ3MgJiBLTEZfU0VURk9SUFJPQ0VTUykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJLTEZfU0VURk9SUFJPQ0VTUyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoZmxhZ3MpCiAgICAgICAgRklYTUUoImZsYWdzICV4IG5vdCBzdXBwb3J0ZWRcbiIsZmxhZ3MpOwoKICAgIGlmIChoa2wgPT0gKEhLTClIS0xfTkVYVCB8fCBoa2wgPT0gKEhLTClIS0xfUFJFVikKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJIS0xfTkVYVCBhbmQgSEtMX1BSRVYgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICAgICBGSVhNRSgic2V0dGluZyBrZXlib2FyZCBvZiBkaWZmZXJlbnQgbG9jYWxlcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBvbGRIa2wgPSB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIGlmICghb2xkSGtsKSBvbGRIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICB0aHJlYWRfZGF0YS0+a2JkX2xheW91dCA9IGhrbDsKCiAgICByZXR1cm4gb2xkSGtsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8KQk9PTCBYMTFEUlZfTWFwcGluZ05vdGlmeSggSFdORCBkdW1teSwgWEV2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICBYUmVmcmVzaEtleWJvYXJkTWFwcGluZygmZXZlbnQtPnhtYXBwaW5nKTsKICAgIFgxMURSVl9Jbml0S2V5Ym9hcmQoIGV2ZW50LT54bWFwcGluZy5kaXNwbGF5ICk7CgogICAgaHduZCA9IEdldEZvY3VzKCk7CiAgICBpZiAoIWh3bmQpIGh3bmQgPSBHZXRBY3RpdmVXaW5kb3coKTsKICAgIFBvc3RNZXNzYWdlVyhod25kLCBXTV9JTlBVVExBTkdDSEFOR0VSRVFVRVNULAogICAgICAgICAgICAgICAgIDAgLypGSVhNRSovLCAoTFBBUkFNKVgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgLyogRklYTUU6IHdoYXQgaGFwcGVucyBpZiB3Q2hhciBpcyBub3QgYSBMYXRpbjEgY2hhcmFjdGVyIGFuZCBDUF9VTklYQ1AKICAgICAqIGlzIFVURi04IChtdWx0aWJ5dGUgZW5jb2RpbmcpPwogICAgICovCiAgICBpZiAoIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVU5JWENQLCAwLCAmd0NoYXIsIDEsICZjQ2hhciwgMSwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgV0FSTigibm8gdHJhbnNsYXRpb24gZnJvbSB1bmljb2RlIHRvIENQX1VOSVhDUCBmb3IgMHglMDJ4XG4iLCB3Q2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFRSQUNFKCJ3Q2hhciAweCUwMnggLT4gY0NoYXIgJyVjJ1xuIiwgd0NoYXIsIGNDaGFyKTsKCiAgICAvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCiAgICBrZXlzeW0gPSAodW5zaWduZWQgY2hhciljQ2hhcjsgLyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwogICAgaWYgKGtleXN5bSA8PSAyNykga2V5c3ltICs9IDB4RkYwMDsgLyogc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uICovCgogICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltKTsgIC8qIGtleXN5bSAtPiBrZXljb2RlICovCiAgICBpZiAoIWtleWNvZGUpCiAgICB7CiAgICAgICAgaWYgKGtleXN5bSA+PSAweEZGMDApIC8qIFdpbmRvd3MgcmV0dXJucyAweDAyNDAgKyBjQ2hhciBpbiB0aGlzIGNhc2UgKi8KICAgICAgICB7CiAgICAgICAgICAgIHJldCA9IDB4MDI0MCArIGNDaGFyOyAvKiAweDAyMDAgaW5kaWNhdGVzIGEgY29udHJvbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nIGN0cmwgY2hhciAlIy4yeFxuIiwgcmV0KTsKICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CiAgICAgICAgLyogSXQgZGlkbid0IHdvcmsgLi4uIGxldCdzIHRyeSB3aXRoIGRlYWRjaGFyIGNvZGUuICovCiAgICAgICAgVFJBQ0UoInJldHJ5aW5nIHdpdGggfCAweEZFMDBcbiIpOwogICAgICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSB8IDB4RkUwMCk7CiAgICB9CgogICAgVFJBQ0UoIiclYycoJWx4KTogZ290IGtleWNvZGUgJXVcbiIsIGNDaGFyLCBrZXlzeW0sIGtleWNvZGUpOwogICAgaWYgKCFrZXljb2RlKSByZXR1cm4gLTE7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNvZGVdOwogICAgaWYgKCFyZXQpCiAgICB7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwogICAgICAgIFRSQUNFKCJrZXljb2RlIGZvciAnJWMnIG5vdCBmb3VuZCwgcmV0dXJuaW5nIC0xXG4iLCBjQ2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KICAgICAgICBpZiAoa2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgaW5kZXgpID09IGtleXN5bSkgYnJlYWs7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIHN3aXRjaCAoaW5kZXgpCiAgICB7CiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHJldCArPSAweDAxMDA7IGJyZWFrOwogICAgICAgIGNhc2UgMjogcmV0ICs9IDB4MDYwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiByZXQgKz0gMHgwNzAwOyBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLCBrZXlzeW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAvKgogICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCiAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQogICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCiAgICAgKi8KCiAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXlFeCAoWDExRFJWLkApCiAqLwpVSU5UIENERUNMIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSwgSEtMIGhrbCkKewogICAgVUlOVCByZXQgPSAwOwogICAgaW50IGtleWM7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIHN3aXRjaCh3TWFwVHlwZSkKICAgIHsKICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX1ZTQzogLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDX0VYOgogICAgICAgICAgICBzd2l0Y2ggKHdDb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFZLX1NISUZUOiB3Q29kZSA9IFZLX0xTSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IHdDb2RlID0gVktfTENPTlRST0w7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBWS19NRU5VOiB3Q29kZSA9IFZLX0xNRU5VOyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXQgPSBrZXljMnNjYW5ba2V5Y10gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WSzogLyogc2Nhbi1jb2RlIHRvIHZrZXktY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVlNDX1RPX1ZLX0VYOgoKICAgICAgICAgICAgLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICAvKiBPbmx5IHN0b3AgaWYgaXQncyBub3QgYSBudW1wYWQgdmtleTsgb3RoZXJ3aXNlIGtlZXAKICAgICAgICAgICAgICAgICAgICAgICBsb29raW5nIGZvciBhIHBvdGVudGlhbCBiZXR0ZXIgdmtleS4gKi8KICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICYmIChyZXQgPCBWS19OVU1QQUQwIHx8IFZLX0RJVklERSA8IHJldCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdNYXBUeXBlID09IE1BUFZLX1ZTQ19UT19WSykKICAgICAgICAgICAgICAgIHN3aXRjaCAocmV0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBWS19TSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBWS19DT05UUk9MOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFZLX01FTlU7IGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgTUFQVktfVktfVE9fQ0hBUjogLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwcGVyY2FzZSAnVycuIFNvIHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB1cHBlcmNhc2UKICAgICAgICAgICAgICoga2V5Li4gTG9va3MgbGlrZSBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgTVMgZG9jcz8KICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHRydWUgZm9yIGxldHRlcnMsIGZvciBleGFtcGxlIFZLXzAgcmV0dXJucyAnMCcgbm90ICcpJy4KICAgICAgICAgICAgICogLSBoZW5jZSB3ZSB1c2UgdGhlIGxvY2sgbWFzayB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KICAgICAgICAgICAgWEtleUV2ZW50IGU7CiAgICAgICAgICAgIEtleVN5bSBrZXlzeW07CiAgICAgICAgICAgIGludCBsZW47CiAgICAgICAgICAgIGNoYXIgc1sxMF07CgogICAgICAgICAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgICAgICAgICBlLnN0YXRlID0gMDsKICAgICAgICAgICAgZS5rZXljb2RlID0gMDsKICAgICAgICAgICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgICAgICAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICAgICAgICAgIGZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCiAgICAgICAgICAgIHsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCiAgICAgICAgICAgICAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKICAgICAgICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSgwLCZlKSAmIDB4RkYpICE9IHdDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwoKICAgICAgICAgICAgLyogV2luZG93cyBhbHdheXMgZ2VuZXJhdGVzIFZLX0RFQ0lNQUwgZm9yIERlbC8uIG9uIGtleXBhZCB3aGlsZSBzb21lCiAgICAgICAgICAgICAqIFgxMSBrZXlib2FyZCBsYXlvdXRzIGdlbmVyYXRlIFhLX0tQX1NlcGFyYXRvciBpbnN0ZWFkIG9mIFhLX0tQX0RlY2ltYWwKICAgICAgICAgICAgICogaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGxvY2FsZSBkZXBlbmRlbnQgbnVtZXJpYyBzZXBhcmF0b3IuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAod0NvZGUgPT0gVktfREVDSU1BTCB8fCB3Q29kZSA9PSBWS19TRVBBUkFUT1IpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9TZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgaWYgKCFlLmtleWNvZGUpCiAgICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX0RlY2ltYWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWUua2V5Y29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFKCJGb3VuZCBrZXljb2RlICV1XG4iLGUua2V5Y29kZSk7CgogICAgICAgICAgICBsZW4gPSBYTG9va3VwU3RyaW5nKCZlLCBzLCBzaXplb2YocyksICZrZXlzeW0sIE5VTEwpOwogICAgICAgICAgICBpZiAobGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBXQ0hBUiB3Y2g7CiAgICAgICAgICAgICAgICBpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIHMsIGxlbiwgJndjaCwgMSkpIHJldCA9IHRvdXBwZXJXKHdjaCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwogICAgICAgICAgICBGSVhNRSgiVW5rbm93biB3TWFwVHlwZSAlZCAhXG4iLCB3TWFwVHlwZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgIFRSQUNFKCAicmV0dXJuaW5nIDB4JXguXG4iLCByZXQgKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5TmFtZVRleHQgKFgxMURSVi5AKQogKi8KSU5UIENERUNMIFgxMURSVl9HZXRLZXlOYW1lVGV4dChMT05HIGxQYXJhbSwgTFBXU1RSIGxwQnVmZmVyLCBJTlQgblNpemUpCnsKICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgaW50IGtleWk7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHNjYW5Db2RlLCBNQVBWS19WU0NfVE9fVktfRVgsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFItU2hpZnQgaXMgInNwZWNpYWwiIC0gaXQgaXMgYW4gZXh0ZW5kZWQga2V5IHdpdGggc2VwYXJhdGUgc2NhbiBjb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUgfD0gMHgxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeCh2a2V5LCBNQVBWS19WS19UT19DSEFSLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNFgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKG5TaXplID49IDIpCgl7CiAgICAgICAgICAqbHBCdWZmZXIgPSB0b3VwcGVyVygoV0NIQVIpYW5zaSk7CiAgICAgICAgICAqKGxwQnVmZmVyKzEpID0gMDsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICBlbHNlCiAgICAgICAgcmV0dXJuIDA7CiAgfQoKICAvKiBGSVhNRTogaG9ycmlibGUgaGFjayB0byBmaXggZnVuY3Rpb24ga2V5cy4gV2luZG93cyByZXBvcnRzIHNjYW5jb2RlCiAgICAgICAgICAgIHdpdGhvdXQgImV4dGVuZGVkLWtleSIgZmxhZy4gSG93ZXZlciBXaW5lIGdlbmVyYXRlcyBzY2FuY29kZQogICAgICAgICAgICAqd2l0aCogImV4dGVuZGVkLWtleSIgZmxhZy4gU2VlbXMgdG8gb2NjdXIgKm9ubHkqIGZvciB0aGUKICAgICAgICAgICAgZnVuY3Rpb24ga2V5cy4gU29vb28uLiBXZSB3aWxsIGxlYXZlIHRoZSB0YWJsZSBhbG9uZSBhbmQKICAgICAgICAgICAgZnVkZ2UgdGhlIGxvb2t1cCBoZXJlIHRpbGwgdGhlIG90aGVyIHBhcnQgaXMgZm91bmQgYW5kIGZpeGVkISEhICovCgogIGlmICggKChzY2FuQ29kZSA+PSAweDEzYikgJiYgKHNjYW5Db2RlIDw9IDB4MTQ0KSkgfHwKICAgICAgIChzY2FuQ29kZSA9PSAweDE1NykgfHwgKHNjYW5Db2RlID09IDB4MTU4KSkKICAgIHNjYW5Db2RlICY9IDB4ZmY7ICAgLyogcmVtb3ZlICJleHRlbmRlZC1rZXkiIGZsYWcgZm9yIEZ4IGtleXMgKi8KCiAgLyogbGV0J3MgZG8gc2NhbmNvZGUgLT4ga2V5Y29kZSAtPiBrZXlzeW0gLT4gU3RyaW5nICovCgogIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgSU5UIHJjOwoKICAgICAga2V5YyA9IChLZXlDb2RlKSBrZXlpOwogICAgICBrZXlzID0ga2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CgogICAgICBpZiAobmFtZSAmJiAodmtleSA9PSBWS19TSElGVCB8fCB2a2V5ID09IFZLX0NPTlRST0wgfHwgdmtleSA9PSBWS19NRU5VKSkKICAgICAgewogICAgICAgICAgY2hhciogaWR4ID0gc3RycmNocihuYW1lLCAnXycpOwogICAgICAgICAgaWYgKGlkeCAmJiAoc3RyY2FzZWNtcChpZHgsICJfciIpID09IDAgfHwgc3RyY2FzZWNtcChpZHgsICJfbCIpID09IDApKQogICAgICAgICAgewogICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgICAgICAgICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JXUga2V5c3ltPSVseCBtb2RpZmllZF9zdHJpbmc9JXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIGtleXMsIGRlYnVnc3RyX2FuKG5hbWUsaWR4LW5hbWUpKTsKICAgICAgICAgICAgICByYyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCBpZHgtbmFtZSsxLCBscEJ1ZmZlciwgblNpemUpOwogICAgICAgICAgICAgIGlmICghcmMpIHJjID0gblNpemU7CiAgICAgICAgICAgICAgbHBCdWZmZXJbLS1yY10gPSAwOwogICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG5hbWUpCiAgICAgIHsKICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgICAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0ldSBrZXlzeW09JTA0eCB2a2V5PSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgdmtleSwgZGVidWdzdHJfYShuYW1lKSk7CiAgICAgICAgICByYyA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCAtMSwgbHBCdWZmZXIsIG5TaXplKTsKICAgICAgICAgIGlmICghcmMpIHJjID0gblNpemU7CiAgICAgICAgICBscEJ1ZmZlclstLXJjXSA9IDA7CiAgICAgICAgICByZXR1cm4gcmM7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgV0FSTiBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwogIFdBUk4oIiglMDh4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5LCB2a2V5PSUwNFgsIGFuc2k9JTA0eFxuIixsUGFyYW0sbHBCdWZmZXIsblNpemUsdmtleSxhbnNpKTsKICAqbHBCdWZmZXIgPSAwOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBEZWFkS2V5c3ltCiAqLwpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pCnsKCXN3aXRjaCAoa2V5c3ltKQoJICAgIHsKCS8qIHN5bWJvbGljIEFTQ0lJIGlzIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gcmZjMTM0NSAqLwojaWZkZWYgWEtfZGVhZF90aWxkZQoJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCgkJcmV0dXJuICd+JzsJLyogJz8gKi8KI2lmZGVmIFhLX2RlYWRfYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KCQlyZXR1cm4gMHhiNDsJLyogJycgKi8KI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAoJICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4OgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLwoJCXJldHVybiAnXic7CS8qICc+ICovCiNpZmRlZiBYS19kZWFkX2dyYXZlCgkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCgkJcmV0dXJuICdgJzsJLyogJyEgKi8KI2lmZGVmIFhLX2RlYWRfZGlhZXJlc2lzCgkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwoJCXJldHVybiAweGE4OwkvKiAnOiAqLwojaWZkZWYgWEtfZGVhZF9jZWRpbGxhCgkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgoJICAgICAgICByZXR1cm4gMHhiODsJLyogJywgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX21hY3JvbgoJICAgIGNhc2UgWEtfZGVhZF9tYWNyb24gOgoJICAgICAgICByZXR1cm4gJy0nOwkvKiAnbSBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2JyZXZlCgkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKCSAgICAgICAgcmV0dXJuIDB4YTI7CS8qICcoICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZWRvdAoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZWRvdCA6CgkgICAgICAgIHJldHVybiAweGZmOwkvKiAnLiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVyaW5nCgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CgkgICAgICAgIHJldHVybiAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfZG91YmxlYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfZG91YmxlYWN1dGUgOgoJICAgICAgICByZXR1cm4gMHhiZDsJLyogJyIgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Nhcm9uCgkgICAgY2FzZSBYS19kZWFkX2Nhcm9uIDoKCSAgICAgICAgcmV0dXJuIDB4Yjc7CS8qICc8ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9vZ29uZWsKCSAgICBjYXNlIFhLX2RlYWRfb2dvbmVrIDoKCSAgICAgICAgcmV0dXJuIDB4YjI7CS8qICc7ICovCiNlbmRpZgovKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgdGhyZWUuCgkgICAgY2FzZSBYS19kZWFkX2lvdGEgOgoJICAgICAgICByZXR1cm4gJ2knOwoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUb1VuaWNvZGVFeCAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgQ0RFQ0wgWDExRFJWX1RvVW5pY29kZUV4KFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgY29uc3QgQllURSAqbHBLZXlTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncywgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICAgIFhLZXlFdmVudCBlOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CiAgICBjaGFyIGJ1ZlsxMF07CiAgICBjaGFyICpscENoYXIgPSBidWY7CiAgICBIV05EIGZvY3VzOwogICAgWElDIHhpYzsKICAgIFN0YXR1cyBzdGF0dXMgPSAwOwoKICAgIGlmIChzY2FuQ29kZSAmIDB4ODAwMCkKICAgIHsKICAgICAgICBUUkFDRV8oa2V5KSgiS2V5IFVQLCBkb2luZyBub3RoaW5nXG4iICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICAgICAgRklYTUVfKGtleSkoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIGlmICgobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApICYmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkpCiAgICB7CiAgICAgICAgVFJBQ0VfKGtleSkoIkN0cmwrQWx0K1trZXldIHdvbid0IGdlbmVyYXRlIGEgY2hhcmFjdGVyXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZS5rZXljb2RlID0gMDsKICAgIGUuc3RhdGUgPSAwOwogICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgZm9jdXMgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKS0+bGFzdF94aWNfaHduZDsKICAgIGlmICghZm9jdXMpCiAgICB7CiAgICAgICAgZm9jdXMgPSBHZXRGb2N1cygpOwogICAgICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgICAgICBpZiAoIWZvY3VzKSBmb2N1cyA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgfQogICAgZS53aW5kb3cgPSBYMTFEUlZfZ2V0X3dob2xlX3dpbmRvdyggZm9jdXMgKTsKICAgIHhpYyA9IFgxMURSVl9nZXRfaWMoIGZvY3VzICk7CgogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoKICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAgICB7CglUUkFDRV8oa2V5KSgiU2hpZnRNYXNrID0gJTA0eFxuIiwgU2hpZnRNYXNrKTsKCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQogICAgewoJVFJBQ0VfKGtleSkoIkxvY2tNYXNrID0gJTA0eFxuIiwgTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKICAgIHsKCVRSQUNFXyhrZXkpKCJDb250cm9sTWFzayA9ICUwNHhcbiIsIENvbnRyb2xNYXNrKTsKCWUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCiAgICB7CglUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgPSAlMDR4XG4iLCBOdW1Mb2NrTWFzayk7CgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgfQoKICAgIC8qIFJlc3RvcmUgc2F2ZWQgQWx0R3Igc3RhdGUgKi8KICAgIFRSQUNFXyhrZXkpKCJBbHRHck1hc2sgPSAlMDR4XG4iLCBBbHRHck1hc2spOwogICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CgogICAgVFJBQ0VfKGtleSkoIiglMDRYLCAlMDRYKSA6IGZha2VkIHN0YXRlID0gMHglMDR4XG4iLAoJCXZpcnRLZXksIHNjYW5Db2RlLCBlLnN0YXRlKTsKCiAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gdmlydEtleSkKICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsJmUpICYgMHhGRikgIT0gdmlydEtleSkgewogICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCiAgICAgICAgICAgICAgfQoJICB9CiAgICAgIH0KCiAgICBpZiAodmlydEtleSA+PSBWS19MRUZUICYmIHZpcnRLZXkgPD0gVktfRE9XTikKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleSAtIFZLX0xFRlQgKyBYS19MZWZ0KTsKCiAgICBpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleS1WS19OVU1QQUQwK1hLX0tQXzApOwoKICAgIC8qIFdpbmRvd3MgYWx3YXlzIGdlbmVyYXRlcyBWS19ERUNJTUFMIGZvciBEZWwvLiBvbiBrZXlwYWQgd2hpbGUgc29tZQogICAgICogWDExIGtleWJvYXJkIGxheW91dHMgZ2VuZXJhdGUgWEtfS1BfU2VwYXJhdG9yIGluc3RlYWQgb2YgWEtfS1BfRGVjaW1hbAogICAgICogaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGxvY2FsZSBkZXBlbmRlbnQgbnVtZXJpYyBzZXBhcmF0b3IuCiAgICAgKi8KICAgIGlmICh2aXJ0S2V5ID09IFZLX0RFQ0lNQUwgfHwgdmlydEtleSA9PSBWS19TRVBBUkFUT1IpCiAgICB7CiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIFhLX0tQX1NlcGFyYXRvcik7CiAgICAgICAgaWYgKCFlLmtleWNvZGUpCiAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKICAgIH0KCiAgICAvKiBDdHJsLVNwYWNlIGdlbmVyYXRlcyBzcGFjZSBvbiBXaW5kb3dzICovCiAgICBpZiAoZS5zdGF0ZSA9PSBDb250cm9sTWFzayAmJiB2aXJ0S2V5ID09IFZLX1NQQUNFKQogICAgewogICAgICAgIGJ1ZldbMF0gPSAnICc7CiAgICAgICAgcmV0ID0gMTsKICAgICAgICBnb3RvIGZvdW5kOwogICAgfQoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOXyhrZXkpKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgdmlydEtleSk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZrYmRfc2VjdGlvbiApOwoJcmV0dXJuIDA7CiAgICAgIH0KICAgIGVsc2UgVFJBQ0VfKGtleSkoIkZvdW5kIGtleWNvZGUgJXVcbiIsZS5rZXljb2RlKTsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlICV1XG4iLAoJCWUudHlwZSwgZS53aW5kb3csIGUuc3RhdGUsIGUua2V5Y29kZSk7CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcsCiAgICAgKiBlLnR5cGUgd2FzIHNldCB0byBLZXlQcmVzcyBhYm92ZS4KICAgICAqLwogICAgaWYgKHhpYykKICAgIHsKICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0VfKGtleSkoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlZCBieXRlKHMpXG4iLCByZXQpOwogICAgICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHJldCk7CiAgICAgICAgICAgIGlmIChscENoYXIgPT0gTlVMTCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRVJSXyhrZXkpKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IVxuIik7CiAgICAgICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgbHBDaGFyLCByZXQsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIGlmICgha3NuYW1lKSBrc25hbWUgPSAiTm8gTmFtZSI7CiAgICAgICAgVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVseCAoJXMpLCAjIG9mIGNoYXJzPSVkIC8gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgKGUudHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCByZXQsIGRlYnVnc3RyX2FuKGxwQ2hhciwgcmV0KSk7CiAgICB9CgogICAgaWYgKHJldCA9PSAwKQogICAgewoJY2hhciBkZWFkX2NoYXI7CgojaWZkZWYgWEtfRXVyb1NpZ24KICAgICAgICAvKiBBbiB1Z2x5IGhhY2sgZm9yIEV1cm9TaWduOiBYIGNhbid0IHRyYW5zbGF0ZSBpdCB0byBhIGNoYXJhY3RlcgogICAgICAgICAgIGZvciBzb21lIGxvY2FsZXMuICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19FdXJvU2lnbikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDIwQUM7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQojZW5kaWYKICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IFggdHVybnMgc2hpZnQtdGFiIGludG8gSVNPX0xlZnRfVGFiLiAqLwogICAgICAgIC8qIEhlcmUgd2UgY2hhbmdlIGl0IGJhY2suICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19JU09fTGVmdF9UYWIgJiYgIShlLnN0YXRlICYgQ29udHJvbE1hc2spKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MDk7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCWRlYWRfY2hhciA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCWlmIChkZWFkX2NoYXIpCiAgICAgICAgewoJICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleXN5bSA+PSAweDAxMDAwMTAwICYmIGtleXN5bSA8PSAweDAxMDBmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgLyogVW5pY29kZSBkaXJlY3QgbWFwcGluZyAqLwogICAgICAgICAgICBidWZXWzBdID0ga2V5c3ltICYgMHhmZmZmOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCSAgICBpZiAoIWtzbmFtZSkKCQlrc25hbWUgPSAiTm8gTmFtZSI7CgkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKCQl7CgkJV0FSTl8oa2V5KSgibm8gY2hhciBmb3Iga2V5c3ltICUwNGx4ICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJV0FSTl8oa2V5KSgidmlydEtleT0lWCwgc2NhbkNvZGU9JVgsIGtleWNvZGU9JXUsIHN0YXRlPSVYXG4iLAogICAgICAgICAgICAgICAgICAgIHZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwoJCX0KCSAgICB9Cgl9CiAgICBlbHNlIHsgIC8qIHJldCAhPSAwICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEoZS5zdGF0ZSAmIE51bUxvY2tNYXNrKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGUuc3RhdGUgJiBTaGlmdE1hc2spIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KICAgICAgICAgICAgJiYgKGtleXN5bT49WEtfS1BfMCkgJiYgKGtleXN5bTw9WEtfS1BfOSkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogbW9yZSBhcmVhcyB3aGVyZSBYIHJldHVybnMgY2hhcmFjdGVycyBidXQgV2luZG93cyBkb2VzIG5vdAogICAgICAgICAgIENUUkwgKyBudW1iZXIgb3IgQ1RSTCArIHN5bWJvbCAqLwogICAgICAgIGlmIChlLnN0YXRlICYgQ29udHJvbE1hc2spCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0AnKSkgfHwKICAgICAgICAgICAgICAgIChrZXlzeW0gPT0gJ2AnKSB8fAogICAgICAgICAgICAgICAgKGtleXN5bSA9PSBYS19UYWIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApIC8qIENvbnRyb2wgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfUmV0dXJuIHx8IGtleXN5bSA9PSBYS19LUF9FbnRlcikpCiAgICAgICAgewogICAgICAgICAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxwQ2hhclswXSA9ICdcbic7CiAgICAgICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBIYWNrIHRvIGRldGVjdCBhbiBYTG9va3VwU3RyaW5nIGhhcmQtY29kZWQgdG8gTGF0aW4xICovCiAgICAgICAgaWYgKHJldCA9PSAxICYmIGtleXN5bSA+PSAweDAwYTAgJiYga2V5c3ltIDw9IDB4MDBmZiAmJiAoQllURSlscENoYXJbMF0gPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IChCWVRFKWxwQ2hhclswXTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJLyogcGVyZm9ybSB0cmFuc2xhdGlvbiB0byB1bmljb2RlICovCglpZihyZXQpCgl7CgkgICAgVFJBQ0VfKGtleSkoIlRyYW5zbGF0aW5nIGNoYXIgMHglMDJ4IHRvIHVuaWNvZGVcbiIsICooQllURSAqKWxwQ2hhcik7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIGxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKZm91bmQ6CiAgICBpZiAoYnVmICE9IGxwQ2hhcikKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscENoYXIpOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICAvKiBOdWxsLXRlcm1pbmF0ZSB0aGUgYnVmZmVyLCBpZiB0aGVyZSdzIHJvb20uICBNU0ROIGNsZWFybHkgc3RhdGVzIHRoYXQgdGhlCiAgICAgICBjYWxsZXIgbXVzdCBub3QgYXNzdW1lIHRoaXMgaXMgZG9uZSwgYnV0IHNvbWUgcHJvZ3JhbXMgKGUuZy4gQXVkaW9zdXJmKSBkby4gKi8KICAgIGlmICgxIDw9IHJldCAmJiByZXQgPCBidWZXX3NpemUpCiAgICAgICAgYnVmV1tyZXRdID0gMDsKCiAgICBUUkFDRV8oa2V5KSgicmV0dXJuaW5nICVkIHdpdGggJXNcbiIsIHJldCwgZGVidWdzdHJfd24oYnVmVywgcmV0KSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBDREVDTCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgICBYQmVsbChnZGlfZGlzcGxheSwgMCk7Cn0K