LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBsb2cgZm9ybWF0IChhZGQgMC1wYWRkaW5nIGFzIGFwcHJvcHJpYXRlKToKICAgIGtleWNvZGUgICV1ICBhcyBpbiBvdXRwdXQgZnJvbSB4ZXYKICAgIGtleXN5bSAgICVseCBhcyBpbiBYMTEva2V5c3ltZGVmLmgKICAgIHZrZXkgICAgICVYICBhcyBpbiB3aW51c2VyLmgKICAgIHNjYW5jb2RlICV4CiovCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKCi8qIGtleSBzdGF0ZSB0YWJsZSBiaXRzOgogIDB4ODAgLT4ga2V5IGlzIHByZXNzZWQKICAweDQwIC0+IGtleSBnb3QgcHJlc3NlZCBzaW5jZSBsYXN0IHRpbWUKICAweDAxIC0+IGtleSBpcyB0b2dnbGVkCiovCkJZVEUga2V5X3N0YXRlX3RhYmxlWzI1Nl07CgpzdGF0aWMgQllURSBUcmFja1N5c0tleSA9IDA7IC8qIGRldGVybWluZSB3aGV0aGVyIEFMVCBrZXkgdXAgd2lsbCBjYXVzZSBhIFdNX1NZU0tFWVVQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSBXTV9LRVlVUCBtZXNzYWdlICovCgpzdGF0aWMgaW50IG1pbl9rZXljb2RlLCBtYXhfa2V5Y29kZSwga2V5c3ltc19wZXJfa2V5Y29kZTsKc3RhdGljIFdPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgU2Nyb2xsTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDkKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiBcICAgICAgeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDVlLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9kdm9yYWtbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIFsgICAgXSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgxQSwweDFCLAogLyogJyAgICAsICAgIC4gICAgcCAgICB5ICAgIGYgICAgZyAgICBjICAgIHIgICAgbCAgICAvICAgID0gKi8KICAgMHgyOCwweDMzLDB4MzQsMHgxOSwweDE1LDB4MjEsMHgyMiwweDJFLDB4MTMsMHgyNiwweDM1LDB4MEQsCiAvKiBhICAgIG8gICAgZSAgICB1ICAgIGkgICAgZCAgICBoICAgIHQgICAgbiAgICBzICAgIC0gICAgXCAqLwogICAweDFFLDB4MTgsMHgxMiwweDE2LDB4MTcsMHgyMCwweDIzLDB4MTQsMHgzMSwweDFGLDB4MEMsMHgyQiwKIC8qIDsgICAgcSAgICBqICAgIGsgICAgeCAgICBiICAgIG0gICAgdyAgICB2ICAgIHogKi8KICAgMHgyNywweDEwLDB4MjQsMHgyNSwweDJELDB4MzAsMHgzMiwweDExLDB4MkYsMHgyQywKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKICAvKiB0aGlzIGlzIG15ICgxMDYta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICBeICAgIFwgKi8KICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgyOSwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgQCAgICBbICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICA6ICAgIF0gKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7CiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4N2QsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDczIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV8zLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV9tYWNqcFtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNXzcsVktfT0VNXzUsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fMyxWS19PRU1fNCwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNX1BMVVMsVktfT0VNXzEsVktfT0VNXzYsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzUsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9QTFVTLFZLX09FTV80LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8zLFZLX09FTV83LFZLX09FTV8yLAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNX01JTlVTLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fOCxWS19PRU1fNSwKICAgVktfT0VNXzcsJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyLCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfYXplcnR5W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV80LFZLX09FTV9QTFVTLAogICAnQScsJ1onLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdRJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLCdNJyxWS19PRU1fMyxWS19PRU1fNSwKICAgJ1cnLCdYJywnQycsJ1YnLCdCJywnTicsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsVktfT0VNXzgsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2R2b3Jha1tNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fNiwKICAgVktfT0VNXzcsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsJ1AnLCdZJywnRicsJ0cnLCdDJywnUicsJ0wnLFZLX09FTV8yLFZLX09FTV9QTFVTLAogICAnQScsJ08nLCdFJywnVScsJ0knLCdEJywnSCcsJ1QnLCdOJywnUycsVktfT0VNX01JTlVTLFZLX09FTV81LAogICBWS19PRU1fMSwnUScsJ0onLCdLJywnWCcsJ0InLCdNJywnVycsJ1YnLCdaJywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCi8qKiogREVGSU5FIFlPVVIgTkVXIExBTkdVQUdFLVNQRUNJRklDIE1BUFBJTkdTIEJFTE9XLCBTRUUgRVhJU1RJTkcgVEFCTEVTICovCgovKiB0aGUgVksgbWFwcGluZ3MgZm9yIHRoZSBtYWluIGtleWJvYXJkIHdpbGwgYmUgYXV0by1hc3NpZ25lZCBhcyBiZWZvcmUsCiAgIHNvIHdoYXQgd2UgaGF2ZSBoZXJlIGlzIGp1c3QgdGhlIGNoYXJhY3RlciB0YWJsZXMgKi8KLyogb3JkZXI6IE5vcm1hbCwgU2hpZnQsIEFsdEdyLCBTaGlmdC1BbHRHciAqLwovKiBXZSByZWNvbW1lbmQgeW91IHdyaXRlIGp1c3Qgd2hhdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgKGkuZS4gd2hhdCdzCiAgIHdyaXR0ZW4gb24gdGhlIGtleWNhcHMpLCBub3QgdGhlIGJ1bmNoIG9mIHNwZWNpYWwgY2hhcmFjdGVycyBiZWhpbmQgQWx0R3IKICAgYW5kIFNoaWZ0LUFsdEdyIGlmIGl0IGNhbiB2YXJ5IGFtb25nIGRpZmZlcmVudCBYIHNlcnZlcnMgKi8KLyogVGhlc2UgdGFibGVzIHNlcnZlIHRvIGd1ZXNzIHRoZSBrZXlib2FyZCB0eXBlIGFuZCBzY2FuY29kZSBtYXBwaW5nLgogICBDb21wbGV0ZSBtb2RlbGluZyBpcyBub3QgaW1wb3J0YW50LCBpZGVudGlmaWNhdGlvbi9kaXNjcmltaW5hdGlvbiBpcy4gKi8KLyogUmVtZW1iZXIgdGhhdCB5b3VyIDEwMm5kIGtleSAodG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpIHNob3VsZCBiZSBvbiBhCiAgIHNlcGFyYXRlIGxpbmUsIHNlZSBleGlzdGluZyB0YWJsZXMgKi8KLyogSWYgV2luZSBmYWlscyB0byBtYXRjaCB5b3VyIG5ldyB0YWJsZSwgdXNlIFdJTkVERUJVRz0ra2V5IHRvIGZpbmQgb3V0IHdoeSAqLwovKiBSZW1lbWJlciB0byBhbHNvIGFkZCB5b3VyIG5ldyB0YWJsZSB0byB0aGUgbGF5b3V0IGluZGV4IHRhYmxlIGZhciBiZWxvdyEgKi8KCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKG1vc3RseSBjb250cmlidXRlZCBieSBVd2UgQm9ubmVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/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/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBiZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+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+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiqqwiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSW01BSU5fTEVOXVs0XSA9CnsKIlwiXFwiLCIxISIsIjInIiwiM14iLCI0KyIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIio/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+IiwiKnwiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiuxIiwiJ2AiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLT0iLAogIltdIgp9OwoKCgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgTENJRCBsY2lkOyAvKiBpbnB1dCBsb2NhbGUgaWRlbnRpZmllciwgbG9vayBmb3IgTE9DQUxFX0lMQU5HVUFHRQogICAgICAgICAgICAgICAgIGluIHRoZSBhcHByb3ByaWF0ZSBkbGxzL2tlcm5lbC9ubHMvLm5scyBmaWxlICovCiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwogICAgY29uc3QgV09SRCAoKnNjYW4pW01BSU5fTEVOXTsgLyogc2NhbiBjb2RlcyBtYXBwaW5nICovCiAgICBjb25zdCBXT1JEICgqdmtleSlbTUFJTl9MRU5dOyAvKiB2aXJ0dWFsIGtleSBjb2RlcyBtYXBwaW5nICovCn0gbWFpbl9rZXlfdGFiW109ewogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1VTX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsICZtYWluX2tleV9VU19kdm9yYWssICZtYWluX2tleV9zY2FuX2R2b3JhaywgJm1haW5fa2V5X3ZrZXlfZHZvcmFrfSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTX2ludGwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MDksICJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA4MDcsICJTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NHLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgxMDBjLCAiU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxZCwgIlN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eV92Mn0sCiB7MHgwNDI1LCAiRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE0LCAiTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNiwgIkRhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGMsICJGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKENBX2ZyKSIsICZtYWluX2tleV9DQV9mciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDgwYywgIkJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X2F6ZXJ0eX0sCiB7MHgwODE2LCAiUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVF9iciwgJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MTYsICJCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCBBTFQgR1IiLCAmbWFpbl9rZXlfUFRfYnJfYWx0X2dyLCZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDBiLCAiRmlubmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRkksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19iZHMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDIsICJCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIzLCAiQmVsYXJ1c2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQlksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9SVV9waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIiwgJm1haW5fa2V5X1JVX2tvaThyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxIiwgJm1haW5fa2V5X1JVX2NwMTI1MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUiLCAmbWFpbl9rZXlfVUEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfVUFfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9SVV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJTcGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMCwgIkl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBmLCAiSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZSwgIkh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MTUsICJQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI0LCAiU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHNyIiwgJm1haW5fa2V5X1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCB1cyxzciIsICZtYWluX2tleV9VU19TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFhLCAiQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzcGVjaWZpYykiLCAmbWFpbl9rZXlfSFJfamVsbHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTEsICJKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX2pwMTA2LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfanAxMDYsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9qcDEwNn0sCiB7MHgwNDExLCAiSmFwYW5lc2UgTWFjIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9tYWNqcCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X21hY2pwLCAmbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanB9LAogezB4MDQxMSwgIkphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfcGM5OHgxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBhbmQgQ3plY2gga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X1NLX3Byb2csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ1MsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3oiLCAmbWFpbl9rZXlfQ1osICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3pfcXdlcnR5IiwgJm1haW5fa2V5X0NaX3F3ZXJ0eSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIkxhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNywgIkxpdGh1YW5pYW4gKEJhbHRpYykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xUX0IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9USywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyIiwgJm1haW5fa2V5X1RSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHJmIiwgJm1haW5fa2V5X1RSX0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9zYWhhcm9uLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVk5DIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKIHsweDA0MDgsICJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWUsICJUaGFpIChLZWRtYW5lZSkgIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV90aCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMywgIkR1dGNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAoKIHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwp9OwpzdGF0aWMgdW5zaWduZWQga2JkX2xheW91dD0wOyAvKiBpbmRleCBpbnRvIGFib3ZlIHRhYmxlIG9mIGxheW91dHMgKi8KCi8qIG1heWJlIG1vcmUgb2YgdGhlc2Ugc2NhbmNvZGVzIHNob3VsZCBiZSBleHRlbmRlZD8gKi8KICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIG11c3QgYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAogICAgICAgICAgICAgICAgICAgSU5TLCBERUwsIEhPTUUsIEVORCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBBUlJPVyBrZXlzLAogICAgICAgICAgICAgICAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKICAgICAgICAgICAgICAgICAqIFdpbmRvd3MgZG9lcyAuLi4gREYgKi8KICAgICAgICAgICAgICAgIC8qIFllcywgdG8gZGlzdGluZ3Vpc2ggYmFzZWQgb24gc2NhbiBjb2RlcywgYWxzbwogICAgICAgICAgICAgICAgICAgZm9yIFBydFNjbiBrZXkgLi4uIEdBICovCgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV92a2V5WzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAwLCBWS19IQU5HVUwsIDAsIDAsIFZLX0hBTkpBLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1MCAqLwogICAgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsIFZLX0VORCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLDAsMCwgVktfQVBQUywgLyogRkY2MCAqLwogICAgMCwgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogRkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIFZLX0VORCwgVktfQ0xFQVIsIFZLX0lOU0VSVCwgVktfREVMRVRFLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfU0VQQVJBVE9SLCBWS19TVUJUUkFDVCwgVktfREVDSU1BTCwgVktfRElWSURFLAogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgVktfTlVNUEFENCwgVktfTlVNUEFENSwgVktfTlVNUEFENiwgVktfTlVNUEFENywKICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDksIDAsIDAsIDAsIFZLX09FTV9ORUNfRVFVQUwsICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIFZLX0YxLCBWS19GMiwKICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KICAgIFZLX0YxMSwgVktfRjEyLCBWS19GMTMsIFZLX0YxNCwgVktfRjE1LCBWS19GMTYsIFZLX0YxNywgVktfRjE4LCAvKiBGRkM4ICovCiAgICBWS19GMTksIFZLX0YyMCwgVktfRjIxLCBWS19GMjIsIFZLX0YyMywgVktfRjI0LCAwLCAwLCAgICAgICAvKiBGRkQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAwLCBWS19MU0hJRlQsIFZLX1JTSElGVCwgVktfTENPTlRST0wsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkUwICovCiAgICBWS19SQ09OVFJPTCwgVktfQ0FQSVRBTCwgMCwgVktfTUVOVSwKICAgIFZLX01FTlUsIFZLX0xNRU5VLCBWS19STUVOVSwgVktfTFdJTiwgVktfUldJTiwgMCwgMCwgMCwgICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNUQsICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0NSwgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAweDUzLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4NUIsIDB4NUMsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MTM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MTViLCAweDE1YywgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjA4ICovCiAgICAwLCBWS19WT0xVTUVfRE9XTiwgVktfVk9MVU1FX01VVEUsIFZLX1ZPTFVNRV9VUCwgICAgICAgICAgICAvKiAxMDA4RkYxMCAqLwogICAgVktfTUVESUFfUExBWV9QQVVTRSwgVktfTUVESUFfU1RPUCwKICAgIFZLX01FRElBX1BSRVZfVFJBQ0ssIFZLX01FRElBX05FWFRfVFJBQ0ssCiAgICAwLCBWS19MQVVOQ0hfTUFJTCwgMCwgVktfQlJPV1NFUl9TRUFSQ0gsICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYxOCAqLwogICAgMCwgMCwgMCwgVktfQlJPV1NFUl9IT01FLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgVktfQlJPV1NFUl9CQUNLLCBWS19CUk9XU0VSX0ZPUldBUkQsICAgICAgLyogMTAwOEZGMjAgKi8KICAgIFZLX0JST1dTRVJfU1RPUCwgVktfQlJPV1NFUl9SRUZSRVNILCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIDEwMDhGRjI4ICovCiAgICBWS19CUk9XU0VSX0ZBVk9SSVRFUywgMCwgVktfTEFVTkNIX01FRElBX1NFTEVDVCwgMCwgICAgICAgICAvKiAxMDA4RkYzMCAqLwogICAgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkY4ICovCn07CgpzdGF0aWMgaW5saW5lIEtleVN5bSBrZXljb2RlX3RvX2tleXN5bSggRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrZXljb2RlLCBpbnQgaW5kZXggKQp7CiNpZmRlZiBIQVZFX1hLQgogICAgaWYgKHVzZV94a2IpIHJldHVybiBYa2JLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgMCwgaW5kZXgpOwojZW5kaWYKICAgIHJldHVybiBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWNvZGUsIGluZGV4KTsKfQoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBTdGF0dXMgc3RhdHVzOwogICAgY2hhciBidWZbMjRdOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGUtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGUtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKGtleXN5bSA9PSBYS19LUF9TZXBhcmF0b3IgfHwga2V5c3ltID09IFhLX0tQX0RlY2ltYWwgfHwKICAgICAgICAgKGtleXN5bSA+PSBYS19LUF8wICYmIGtleXN5bSA8PSBYS19LUF85KSkpCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweEZGXTsKCiAgICAvKiBQcmVzc2luZyB0aGUgUGF1c2UvQnJlYWsga2V5IGFsb25lIHByb2R1Y2VzIFZLX1BBVVNFIHZrZXksIHdoaWxlCiAgICAgKiBwcmVzc2luZyBDdHJsK1BhdXNlL0JyZWFrIHByb2R1Y2VzIFZLX0NBTkNFTC4gKi8KICAgIGlmICgoZS0+c3RhdGUgJiBDb250cm9sTWFzaykgJiYgKGtleXN5bSA9PSBYS19CcmVhaykpCiAgICAgICAgcmV0dXJuIFZLX0NBTkNFTDsKCiAgICBUUkFDRV8oa2V5KSgiZS0+a2V5Y29kZSA9ICV1XG4iLCBlLT5rZXljb2RlKTsKCiAgICByZXR1cm4ga2V5YzJ2a2V5W2UtPmtleWNvZGVdOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dAogKi8Kdm9pZCBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggV09SRCB3VmssIFdPUkQgd1NjYW4sIERXT1JEIGV2ZW50X2ZsYWdzLCBEV09SRCB0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0V4dHJhSW5mbywgVUlOVCBpbmplY3RlZF9mbGFncyApCnsKICAgIFVJTlQgbWVzc2FnZTsKICAgIEtCRExMSE9PS1NUUlVDVCBob29rOwogICAgV09SRCBmbGFncywgd1ZrU3RyaXBwZWQsIHdWa0wsIHdWa1IsIHZrX2hvb2sgPSB3Vms7CiAgICBMUEFSQU0gbFBhcmFtID0gMDsKCiAgICBpZiAoIXRpbWUpIHRpbWUgPSBHZXRUaWNrQ291bnQoKTsKCiAgICB3VmsgPSBMT0JZVEUod1ZrKTsKICAgIGZsYWdzID0gTE9CWVRFKHdTY2FuKTsKCiAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpIGZsYWdzIHw9IEtGX0VYVEVOREVEOwogICAgLyogRklYTUU6IHNldCBLRl9ETEdNT0RFIGFuZCBLRl9NRU5VTU9ERSB3aGVuIG5lZWRlZCAqLwoKICAgIC8qIHN0cmlwIGxlZnQvcmlnaHQgZm9yIG1lbnUsIGNvbnRyb2wsIHNoaWZ0ICovCiAgICBzd2l0Y2ggKHdWaykKICAgIHsKICAgIGNhc2UgVktfTUVOVToKICAgIGNhc2UgVktfTE1FTlU6CiAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgIHdWayA9IChldmVudF9mbGFncyAmIEtFWUVWRU5URl9FWFRFTkRFREtFWSkgPyBWS19STUVOVSA6IFZLX0xNRU5VOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfTUVOVTsKICAgICAgICB3VmtMID0gVktfTE1FTlU7CiAgICAgICAgd1ZrUiA9IFZLX1JNRU5VOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DT05UUk9MOgogICAgY2FzZSBWS19MQ09OVFJPTDoKICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgd1ZrID0gKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSA/IFZLX1JDT05UUk9MIDogVktfTENPTlRST0w7CiAgICAgICAgd1ZrU3RyaXBwZWQgPSBWS19DT05UUk9MOwogICAgICAgIHdWa0wgPSBWS19MQ09OVFJPTDsKICAgICAgICB3VmtSID0gVktfUkNPTlRST0w7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX1NISUZUOgogICAgY2FzZSBWS19MU0hJRlQ6CiAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICB3VmsgPSAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpID8gVktfUlNISUZUIDogVktfTFNISUZUOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfU0hJRlQ7CiAgICAgICAgd1ZrTCA9IFZLX0xTSElGVDsKICAgICAgICB3VmtSID0gVktfUlNISUZUOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICB3VmtTdHJpcHBlZCA9IHdWa0wgPSB3VmtSID0gd1ZrOwogICAgfQoKICAgIGlmIChldmVudF9mbGFncyAmIEtFWUVWRU5URl9LRVlVUCkKICAgIHsKICAgICAgICBtZXNzYWdlID0gV01fS0VZVVA7CiAgICAgICAgaWYgKCgoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgJiYKICAgICAgICAgICAgICgod1ZrU3RyaXBwZWQgPT0gVktfTUVOVSkgfHwgKHdWa1N0cmlwcGVkID09IFZLX0NPTlRST0wpCiAgICAgICAgICAgICAgfHwgIShrZXlfc3RhdGVfdGFibGVbVktfQ09OVFJPTF0gJiAweDgwKSkpCiAgICAgICAgICAgIHx8ICh3VmtTdHJpcHBlZCA9PSBWS19GMTApKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIFRyYWNrU3lzS2V5ID09IFZLX01FTlUgfHwgLyogPEFMVD4tZG93bi88QUxUPi11cCBzZXF1ZW5jZSAqLwogICAgICAgICAgICAgICAgKHdWa1N0cmlwcGVkICE9IFZLX01FTlUpKSAvKiA8QUxUPi1kb3duLi4uPHNvbWV0aGluZyBlbHNlPi11cCAqLwogICAgICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWVVQOwogICAgICAgICAgICBUcmFja1N5c0tleSA9IDA7CiAgICAgICAgfQogICAgICAgIGZsYWdzIHw9IEtGX1JFUEVBVCB8IEtGX1VQOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG1lc3NhZ2UgPSBXTV9LRVlET1dOOwogICAgICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODAgfHwgd1ZrU3RyaXBwZWQgPT0gVktfTUVOVSkgJiYKICAgICAgICAgICAgICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCB8fCB3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKSkgfHwKICAgICAgICAgICAgKHdWa1N0cmlwcGVkID09IFZLX0YxMCkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gV01fU1lTS0VZRE9XTjsKICAgICAgICAgICAgVHJhY2tTeXNLZXkgPSB3VmtTdHJpcHBlZDsKICAgICAgICB9CiAgICAgICAgaWYgKCEoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfVU5JQ09ERSkgJiYga2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSBmbGFncyB8PSBLRl9SRVBFQVQ7CiAgICB9CgogICAgaWYgKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX1VOSUNPREUpCiAgICB7CiAgICAgICAgdmtfaG9vayA9IHdWayA9IFZLX1BBQ0tFVDsKICAgICAgICBsUGFyYW0gPSBNQUtFTFBBUkFNKDEgLyogcmVwZWF0IGNvdW50ICovLCB3U2Nhbik7CiAgICAgICAgVFJBQ0VfKGtleSkoIm1lc3NhZ2U9MHglMDR4IHdQYXJhbT0weCUwNFggbFBhcmFtPTB4JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgd1ZrLCBsUGFyYW0pOwogICAgfQoKICAgIC8qIEhvb2sgZ2V0cyB3aGF0ZXZlciBrZXkgd2FzIHNlbnQuICovCiAgICBob29rLnZrQ29kZSAgICAgID0gdmtfaG9vazsKICAgIGhvb2suc2NhbkNvZGUgICAgPSB3U2NhbjsKICAgIGhvb2suZmxhZ3MgICAgICAgPSAoZmxhZ3MgPj4gOCkgfCBpbmplY3RlZF9mbGFnczsKICAgIGhvb2sudGltZSAgICAgICAgPSB0aW1lOwogICAgaG9vay5kd0V4dHJhSW5mbyA9IGR3RXh0cmFJbmZvOwogICAgaWYgKEhPT0tfQ2FsbEhvb2tzKCBXSF9LRVlCT0FSRF9MTCwgSENfQUNUSU9OLCBtZXNzYWdlLCAoTFBBUkFNKSZob29rLCBUUlVFICkpIHJldHVybjsKCiAgICBpZiAoIShldmVudF9mbGFncyAmIEtFWUVWRU5URl9VTklDT0RFKSkKICAgIHsKICAgICAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfS0VZVVApCiAgICAgICAgewogICAgICAgICAgICBrZXlfc3RhdGVfdGFibGVbd1ZrXSAmPSB+MHg4MDsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSA9IGtleV9zdGF0ZV90YWJsZVt3VmtMXSB8IGtleV9zdGF0ZV90YWJsZVt3VmtSXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEoa2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSkga2V5X3N0YXRlX3RhYmxlW3dWa10gXj0gMHgwMTsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa10gfD0gMHhjMDsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa1N0cmlwcGVkXSA9IGtleV9zdGF0ZV90YWJsZVt3VmtMXSB8IGtleV9zdGF0ZV90YWJsZVt3VmtSXTsKICAgICAgICB9CgogICAgICAgIGlmIChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSBmbGFncyB8PSBLRl9BTFRET1dOOwoKICAgICAgICBpZiAod1ZrU3RyaXBwZWQgPT0gVktfU0hJRlQpIGZsYWdzICY9IH5LRl9FWFRFTkRFRDsKCiAgICAgICAgbFBhcmFtID0gTUFLRUxQQVJBTSgxIC8qIHJlcGVhdCBjb3VudCAqLywgZmxhZ3MpOwoKICAgICAgICBUUkFDRV8oa2V5KSgiIG1lc3NhZ2U9MHglMDR4IHdQYXJhbT0weCUwNFgsIGxQYXJhbT0weCUwOGx4LCBJbnB1dEtleVN0YXRlPTB4JXhcbiIsCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgd1ZrLCBsUGFyYW0sIGtleV9zdGF0ZV90YWJsZVt3VmtdKTsKICAgIH0KCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZW5kX2hhcmR3YXJlX21lc3NhZ2UgKQogICAgewogICAgICAgIHJlcS0+aWQgICAgICAgPSAoaW5qZWN0ZWRfZmxhZ3MgJiBMTEtIRl9JTkpFQ1RFRCkgPyAwIDogR2V0Q3VycmVudFRocmVhZElkKCk7CiAgICAgICAgcmVxLT53aW4gICAgICA9IDA7CiAgICAgICAgcmVxLT5tc2cgICAgICA9IG1lc3NhZ2U7CiAgICAgICAgcmVxLT53cGFyYW0gICA9IHdWazsKICAgICAgICByZXEtPmxwYXJhbSAgID0gbFBhcmFtOwogICAgICAgIHJlcS0+eCAgICAgICAgPSBjdXJzb3JfcG9zLng7CiAgICAgICAgcmVxLT55ICAgICAgICA9IGN1cnNvcl9wb3MueTsKICAgICAgICByZXEtPnRpbWUgICAgID0gdGltZTsKICAgICAgICByZXEtPmluZm8gICAgID0gZHdFeHRyYUluZm87CiAgICAgICAgd2luZV9zZXJ2ZXJfY2FsbCggcmVxICk7CiAgICB9CiAgICBTRVJWRVJfRU5EX1JFUTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUKICoKICogVXBkYXRlcyBpbnRlcm5hbCBzdGF0ZSBmb3IgPHZrZXk+LCBkZXBlbmRpbmcgb24ga2V5IDxzdGF0ZT4gdW5kZXIgWAogKgogKi8Kc3RhdGljIGlubGluZSB2b2lkIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlICggV09SRCB2a2V5LCBXT1JEIHNjYW4sIGludCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIC8qIERvIHNvbWV0aGluZyBpZiBpbnRlcm5hbCB0YWJsZSBzdGF0ZSAhPSBYIHN0YXRlIGZvciBrZXljb2RlICovCiAgICBpZiAoKChrZXlfc3RhdGVfdGFibGVbdmtleSAmIDB4ZmZdICYgMHg4MCkhPTApICE9IHN0YXRlKQogICAgewogICAgICAgIERXT1JEIGZsYWdzID0gdmtleSAmIDB4MTAwID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMDsKCiAgICAgICAgaWYgKCFzdGF0ZSkgZmxhZ3MgfD0gS0VZRVZFTlRGX0tFWVVQOwoKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIHN0YXRlIGZvciB2a2V5ICUjLjJ4LiBTdGF0ZSBiZWZvcmUgJSMuMnhcbiIsCiAgICAgICAgICAgICAgdmtleSwga2V5X3N0YXRlX3RhYmxlW3ZrZXkgJiAweGZmXSk7CgogICAgICAgIC8qIEZha2Uga2V5IGJlaW5nIHByZXNzZWQgaW5zaWRlIHdpbmUgKi8KICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIHNjYW4gJiAweGZmLCBmbGFncywgdGltZSwgMCwgMCApOwoKICAgICAgICBUUkFDRSgiU3RhdGUgYWZ0ZXIgJSMuMnhcbiIsIGtleV9zdGF0ZV90YWJsZVt2a2V5ICYgMHhmZl0pOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8Kdm9pZCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgajsKICAgIERXT1JEIHRpbWUgPSBHZXRDdXJyZW50VGltZSgpOwoKICAgIC8qIHRoZSBtaW5pbXVtIGtleWNvZGUgaXMgYWx3YXlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gOCwgc28gd2UgY2FuCiAgICAgKiBza2lwIHRoZSBmaXJzdCA4IHZhbHVlcywgaGVuY2Ugc3RhcnQgYXQgMQogICAgICovCiAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykKICAgIHsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgV09SRCB2a2V5ID0ga2V5YzJ2a2V5WyhpICogOCkgKyBqXTsKICAgICAgICAgICAgV09SRCBzY2FuID0ga2V5YzJzY2FuWyhpICogOCkgKyBqXTsKICAgICAgICAgICAgaW50IHN0YXRlID0gKGV2ZW50LT54a2V5bWFwLmtleV92ZWN0b3JbaV0gJiAoMTw8aikpICE9IDA7CgogICAgICAgICAgICBzd2l0Y2godmtleSAmIDB4ZmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgS0VZQk9BUkRfVXBkYXRlT25lU3RhdGUoIHZrZXksIHNjYW4sIHN0YXRlLCB0aW1lICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgdXBkYXRlX2xvY2tfc3RhdGUoQllURSB2a2V5LCBXT1JEIHNjYW4sIERXT1JEIHRpbWUpCnsKICAgIERXT1JEIGZsYWdzID0gdmtleSA9PSBWS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMDsKCiAgICBpZiAoa2V5X3N0YXRlX3RhYmxlW3ZrZXldICYgMHg4MCkgZmxhZ3MgXj0gS0VZRVZFTlRGX0tFWVVQOwoKICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBmbGFncywgdGltZSwgMCwgMCApOwogICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIHNjYW4sIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lLCAwLCAwICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYRXZlbnQgKnhldiApCnsKICAgIFhLZXlFdmVudCAqZXZlbnQgPSAmeGV2LT54a2V5OwogICAgY2hhciBidWZbMjRdOwogICAgY2hhciAqU3RyID0gYnVmOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CiAgICBYSUMgeGljID0gWDExRFJWX2dldF9pYyggaHduZCApOwogICAgRFdPUkQgZXZlbnRfdGltZSA9IEVWRU5UX3gxMV90aW1lX3RvX3dpbjMyX3RpbWUoZXZlbnQtPnRpbWUpOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAldVxuIiwKCQlldmVudC0+dHlwZSwgZXZlbnQtPndpbmRvdywgZXZlbnQtPnN0YXRlLCBldmVudC0+a2V5Y29kZSk7CgogICAgaWYgKGV2ZW50LT50eXBlID09IEtleVByZXNzKSB1cGRhdGVfdXNlcl90aW1lKCBldmVudC0+dGltZSApOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICB7CiAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0UoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlaSBieXRlKHMpXG4iLCBhc2NpaV9jaGFycyk7CiAgICAgICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgewogICAgICAgICAgICBTdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYXNjaWlfY2hhcnMpOwogICAgICAgICAgICBpZiAoU3RyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhc2NpaV9jaGFycyA9IFhtYkxvb2t1cFN0cmluZyh4aWMsIGV2ZW50LCBTdHIsIGFzY2lpX2NoYXJzLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoIm5ieXRlID0gJWQsIHN0YXR1cyAlZFxuIiwgYXNjaWlfY2hhcnMsIHN0YXR1cyk7CgogICAgaWYgKHN0YXR1cyA9PSBYTG9va3VwQ2hhcnMpCiAgICB7CiAgICAgICAgWDExRFJWX1hJTUxvb2t1cENoYXJzKCBTdHIsIGFzY2lpX2NoYXJzICk7CiAgICAgICAgaWYgKGJ1ZiAhPSBTdHIpCiAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGFyZSB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2UgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IGZvciBBbHRHciBzaG91bGQgYmUgMgogICAgICAgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIC8qIFNhdmUgYWxzbyBhbGwgcG9zc2libGUgbW9kaWZpZXIgc3RhdGVzLiAqLwogICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgKDB4NjAwMCB8IE1vZDFNYXNrIHwgTW9kMk1hc2sgfCBNb2QzTWFzayB8IE1vZDRNYXNrIHwgTW9kNU1hc2spOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWx4ICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIGRlYnVnc3RyX2FuKFN0ciwgYXNjaWlfY2hhcnMpKTsKICAgIH0KICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsZXZlbnQpOwogICAgLyogWCByZXR1cm5zIGtleWNvZGUgMCBmb3IgY29tcG9zZWQgY2hhcmFjdGVycyAqLwogICAgaWYgKCF2a2V5ICYmIGFzY2lpX2NoYXJzKSB2a2V5ID0gVktfTk9OQU1FOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgia2V5Y29kZSAldSBjb252ZXJ0ZWQgdG8gdmtleSAweCVYXG4iLAogICAgICAgICAgICAgICAgZXZlbnQtPmtleWNvZGUsIHZrZXkpOwoKICAgIGlmICghdmtleSkgcmV0dXJuOwoKICAgIGR3RmxhZ3MgPSAwOwogICAgaWYgKCBldmVudC0+dHlwZSA9PSBLZXlSZWxlYXNlICkgZHdGbGFncyB8PSBLRVlFVkVOVEZfS0VZVVA7CiAgICBpZiAoIHZrZXkgJiAweDEwMCApICAgICAgICAgICAgICBkd0ZsYWdzIHw9IEtFWUVWRU5URl9FWFRFTkRFREtFWTsKCgogICAgLyogTm90ZTogWCBzZXRzIHRoZSBiZWxvdyBzdGF0ZXMgb24ga2V5IGRvd24gYW5kIGNsZWFycyB0aGVtIG9uIGtleSB1cC4KICAgICAgIFdpbmRvd3MgdHJpZ2dlcnMgdGhlbSBvbiBrZXkgZG93bi4gKi8KCiAgICAvKiBBZGp1c3QgdGhlIENBUFNMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbVktfQ0FQSVRBTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIExvY2tNYXNrKSAmJgogICAgICAgIHZrZXkgIT0gVktfQ0FQSVRBTCkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHNMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSk7CiAgICAgICAgdXBkYXRlX2xvY2tfc3RhdGUoVktfQ0FQSVRBTCwgMHgzQSwgZXZlbnRfdGltZSk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBOVU1MT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlfc3RhdGVfdGFibGVbVktfTlVNTE9DS10gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgICh2a2V5ICYgMHhmZikgIT0gVktfTlVNTE9DSykKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIE51bUxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX05VTUxPQ0tdKTsKICAgICAgICB1cGRhdGVfbG9ja19zdGF0ZShWS19OVU1MT0NLLCAweDQ1LCBldmVudF90aW1lKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIFNDUk9MTExPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19TQ1JPTExdICYgMHgwMSkgIT0gIShldmVudC0+c3RhdGUgJiBTY3JvbGxMb2NrTWFzaykgJiYKICAgICAgICB2a2V5ICE9IFZLX1NDUk9MTCkKICAgIHsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIFNjckxvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX1NDUk9MTF0pOwogICAgICAgIHVwZGF0ZV9sb2NrX3N0YXRlKFZLX1NDUk9MTCwgMHg0NiwgZXZlbnRfdGltZSk7CiAgICB9CgogICAgYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKICAgIFRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSAmIDB4ZmYsIGJTY2FuLCBkd0ZsYWdzLCBldmVudF90aW1lLCAwLCAwICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0CiAqCiAqIENhbGxlZCBmcm9tIFgxMURSVl9Jbml0S2V5Ym9hcmQKICogIFRoaXMgcm91dGluZSB3YWxrcyB0aHJvdWdoIHRoZSBkZWZpbmVkIGtleWJvYXJkIGxheW91dHMgYW5kIHNlbGVjdHMKICogIHdoaWNoZXZlciBtYXRjaGVzIG1vc3QgY2xvc2VseS4KICogWDExIGxvY2sgbXVzdCBiZSBoZWxkLgogKi8Kc3RhdGljIHZvaWQKWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggRGlzcGxheSAqZGlzcGxheSApCnsKICB1bnNpZ25lZCBjdXJyZW50LCBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgaSwgc3ltczsKICBpbnQgc2NvcmUsIGtleWMsIGtleSwgcGtleSwgb2s7CiAgS2V5U3ltIGtleXN5bSA9IDA7CiAgY29uc3QgY2hhciAoKmxrZXkpW01BSU5fTEVOXVs0XTsKICB1bnNpZ25lZCBtYXhfc2VxID0gMDsKICBpbnQgbWF4X3Njb3JlID0gMCwgaXNtYXRjaCA9IDA7CiAgY2hhciBja2V5WzI1Nl1bNF07CgogIHN5bXMgPSBrZXlzeW1zX3Blcl9rZXljb2RlOwogIGlmIChzeW1zID4gNCkgewogICAgV0FSTigiJWQga2V5c3ltcyBwZXIga2V5Y29kZSBub3Qgc3VwcG9ydGVkLCBzZXQgdG8gNFxuIiwgc3ltcyk7CiAgICBzeW1zID0gNDsKICB9CgogIG1lbXNldCggY2tleSwgMCwgc2l6ZW9mKGNrZXkpICk7CiAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICAvKiBnZXQgZGF0YSBmb3Iga2V5Y29kZSBmcm9tIFggc2VydmVyICovCiAgICAgIGZvciAoaSA9IDA7IGkgPCBzeW1zOyBpKyspIHsKICAgICAgICBpZiAoIShrZXlzeW0gPSBrZXljb2RlX3RvX2tleXN5bSAoZGlzcGxheSwga2V5YywgaSkpKSBjb250aW51ZTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDAwKSAmJiAoa2V5c3ltICE9ICcgJykpCiAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlba2V5Y11baV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIlhLQiBjb3VsZCBub3QgdHJhbnNsYXRlIGtleXN5bSAlMDRseFxuIiwga2V5c3ltKTsKICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBxdWVyeSB3aGF0IGtleXN5bSBpcyB1c2VkIGFzIE1vZGVfc3dpdGNoLCBmaWxsIFhLZXlFdmVudAogICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNrZXlba2V5Y11baV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICB9CiAgICAgICAgfQoJZWxzZSB7CgkgIGNrZXlba2V5Y11baV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7Cgl9CiAgICAgIH0KICB9CgogIGZvciAoY3VycmVudCA9IDA7IG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50OyBjdXJyZW50KyspIHsKICAgIFRSQUNFKCJBdHRlbXB0aW5nIHRvIG1hdGNoIGFnYWluc3QgXCIlc1wiXG4iLCBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudCk7CiAgICBtYXRjaCA9IDA7CiAgICBtaXNtYXRjaCA9IDA7CiAgICBzY29yZSA9IDA7CiAgICBzZXEgPSAwOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltjdXJyZW50XS5rZXk7CiAgICBwa2V5ID0gLTE7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIGlmIChja2V5W2tleWNdWzBdKSB7CgkvKiBzZWFyY2ggZm9yIGEgbWF0Y2ggaW4gbGF5b3V0IHRhYmxlICovCgkvKiByaWdodCBub3csIHdlIGp1c3QgZmluZCBhbiBhYnNvbHV0ZSBtYXRjaCBmb3IgZGVmaW5lZCBwb3NpdGlvbnMgKi8KCS8qICh1bmRlZmluZWQgcG9zaXRpb25zIGFyZSBpZ25vcmVkLCBzbyBpZiBpdCdzIGRlZmluZWQgYXMgIjMjIiBpbiAqLwoJLyogdGhlIHRhYmxlLCBpdCdzIG9rYXkgdGhhdCB0aGUgWCBzZXJ2ZXIgaGFzICIzI8KjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgY2hhciBzdHJbNV07CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBzdHJbaV0gPSBja2V5W2tleWNdW2ldID8gY2tleVtrZXljXVtpXSA6ICcgJzsKICAgICAgICAgIHN0cls0XSA9IDA7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleWNvZGUgJXUsIGdvdCAlc1xuIiwga2V5Yywgc3RyKTsKICAgICAgICAgIG1pc21hdGNoKys7CiAgICAgICAgICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCnN0YXRpYyBIS0wgZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KHZvaWQpCnsKICAgIFVMT05HX1BUUiBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIC8qIEZJWE1FOgogICAgICoKICAgICAqIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgICoKICAgICAqIFdpbndvcmQgdXNlcyByZXR1cm4gdmFsdWUgb2YgR2V0S2V5Ym9hcmRMYXlvdXQgYXMgYSBjb2RlcGFnZQogICAgICogdG8gdHJhbnNsYXRlIEFOU0kga2V5Ym9hcmQgbWVzc2FnZXMgdG8gdW5pY29kZS4gQnV0IHdlIGhhdmUKICAgICAqIGEgcHJvYmxlbSB3aXRoIGl0OiBmb3IgaW5zdGFuY2UgUG9saXNoIGtleWJvYXJkIGxheW91dCBpcwogICAgICogaWRlbnRpY2FsIHRvIHRoZSBVUyBvbmUsIGFuZCB0aGVyZWZvcmUgaW5zdGVhZCBvZiB0aGUgUG9saXNoCiAgICAgKiBsb2NhbGUgaWQgd2UgcmV0dXJuIHRoZSBVUyBvbmUuCiAgICAgKi8KCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCiAgICAvKgogICAgICogTWljcm9zb2Z0IE9mZmljZSBleHBlY3RzIHRoaXMgdmFsdWUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljCiAgICAgKiBmb3IgSmFwYW5lc2UgYW5kIEtvcmVhbiBXaW5kb3dzIHdpdGggYW4gSU1FIHRoZSB2YWx1ZSBpcyAweGUwMDEKICAgICAqIFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0byBzZWUgaWYgYW4gSU1FIGV4aXN0cyBhbmQgaWYgc28gdGhlbgogICAgICogc2V0IHRoaXMgd29yZCBwcm9wZXJseS4KICAgICAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBJTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICBHZXRLZXlib2FyZExheW91dE5hbWUgKFgxMURSVi5AKQogKi8KQk9PTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXROYW1lKExQV1NUUiBuYW1lKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geyclJywnMCcsJzgnLCd4JywwfTsKICAgIERXT1JEIGxheW91dDsKCiAgICBsYXlvdXQgPSBIYW5kbGVUb1Vsb25nKCBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKSApOwogICAgaWYgKEhJV09SRChsYXlvdXQpID09IExPV09SRChsYXlvdXQpKSBsYXlvdXQgPSBMT1dPUkQobGF5b3V0KTsKICAgIHNwcmludGZXKG5hbWUsIGZvcm1hdFcsIGxheW91dCk7CiAgICBUUkFDRSgicmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG5hbWUpKTsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBzZXRfa2JkX2xheW91dF9wcmVsb2FkX2tleSh2b2lkKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgcHJlbG9hZFtdID0KICAgICAgICB7J0snLCdlJywneScsJ2InLCdvJywnYScsJ3InLCdkJywnICcsJ0wnLCdhJywneScsJ28nLCd1JywndCcsJ1xcJywnUCcsJ3InLCdlJywnbCcsJ28nLCdhJywnZCcsMH07CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgb25lW10gPSB7JzEnLDB9OwoKICAgIEhLRVkgaGtleTsKICAgIFdDSEFSIGxheW91dFtLTF9OQU1FTEVOR1RIXTsKCiAgICBpZiAoUmVnQ3JlYXRlS2V5RXhXKEhLRVlfQ1VSUkVOVF9VU0VSLCBwcmVsb2FkLCAwLCBOVUxMLCAwLCBLRVlfQUxMX0FDQ0VTUywgTlVMTCwgJmhrZXksIE5VTEwpKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoIVJlZ1F1ZXJ5VmFsdWVFeFcoaGtleSwgb25lLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKICAgIHsKICAgICAgICBSZWdDbG9zZUtleShoa2V5KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShsYXlvdXQpKQogICAgICAgIFJlZ1NldFZhbHVlRXhXKGhrZXksIG9uZSwgMCwgUkVHX1NaLCAoY29uc3QgQllURSAqKWxheW91dCwgc2l6ZW9mKGxheW91dCkpOwoKICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0luaXRLZXlib2FyZAogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKCBEaXNwbGF5ICpkaXNwbGF5ICkKewogICAgS2V5U3ltICprc3A7CiAgICBYTW9kaWZpZXJLZXltYXAgKm1tcDsKICAgIEtleVN5bSBrZXlzeW07CiAgICBLZXlDb2RlICprY3A7CiAgICBYS2V5RXZlbnQgZTI7CiAgICBXT1JEIHNjYW4sIHZrZXk7CiAgICBpbnQga2V5YywgaSwga2V5biwgc3ltczsKICAgIGNoYXIgY2tleVs0XT17MCwwLDAsMH07CiAgICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogICAgY2hhciB2a2V5X3VzZWRbMjU2XSA9IHsgMCB9OwoKICAgIC8qIFJhbmdlcyBvZiBPRU0sIGZ1bmN0aW9uIGtleSwgYW5kIGNoYXJhY3RlciB2aXJ0dWFsIGtleSBjb2Rlcy4KICAgICAqIERvbid0IGluY2x1ZGUgdGhvc2UgaGFuZGxlZCBzcGVjaWFsbHkgaW4gWDExRFJWX1RvVW5pY29kZUV4IGFuZAogICAgICogWDExRFJWX01hcFZpcnR1YWxLZXlFeCwgbGlrZSBWS19OVU1QQUQwIC0gVktfRElWSURFLiAqLwogICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgICAgV09SRCBmaXJzdCwgbGFzdDsKICAgIH0gdmtleV9yYW5nZXNbXSA9IHsKICAgICAgICB7IFZLX09FTV8xLCBWS19PRU1fMyB9LAogICAgICAgIHsgVktfT0VNXzQsIFZLX0lDT18wMCB9LAogICAgICAgIHsgMHhlNiwgMHhlNiB9LAogICAgICAgIHsgMHhlOSwgMHhmNSB9LAogICAgICAgIHsgVktfT0VNX05FQ19FUVVBTCwgVktfT0VNX05FQ19FUVVBTCB9LAogICAgICAgIHsgVktfRjEsIFZLX0YyNCB9LAogICAgICAgIHsgMHgzMCwgMHgzOSB9LCAvKiBWS18wIC0gVktfOSAqLwogICAgICAgIHsgMHg0MSwgMHg1YSB9LCAvKiBWS19BIC0gVktfWiAqLwogICAgICAgIHsgMCwgMCB9CiAgICB9OwogICAgaW50IHZrZXlfcmFuZ2U7CgogICAgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkoKTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFhGcmVlKGtzcCk7CgogICAgbW1wID0gWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CgogICAgICAgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCgkgICAgaWYgKCprY3ApCiAgICAgICAgICAgIHsKCQlpbnQgazsKCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfTnVtX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJOdW1Mb2NrTWFzayBpcyAleFxuIiwgTnVtTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwgKmtjcCwgaykgPT0gWEtfU2Nyb2xsX0xvY2spCgkJICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xsTG9ja01hc2sgPSAxIDw8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhrZXkpKCJTY3JvbGxMb2NrTWFzayBpcyAleFxuIiwgU2Nyb2xsTG9ja01hc2spOwoJCSAgICB9CiAgICAgICAgICAgIH0KICAgIH0KICAgIFhGcmVlTW9kaWZpZXJtYXAobW1wKTsKCiAgICAvKiBEZXRlY3QgdGhlIGtleWJvYXJkIGxheW91dCAqLwogICAgWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dCggZGlzcGxheSApOwogICAgbGtleSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5rZXk7CiAgICBzeW1zID0gKGtleXN5bXNfcGVyX2tleWNvZGUgPiA0KSA/IDQgOiBrZXlzeW1zX3Blcl9rZXljb2RlOwoKICAgIC8qIE5vdyBidWlsZCB0d28gY29udmVyc2lvbiBhcnJheXMgOgogICAgICoga2V5Y29kZSAtPiB2a2V5ICsgc2NhbmNvZGUgKyBleHRlbmRlZAogICAgICogdmtleSArIGV4dGVuZGVkIC0+IGtleWNvZGUgKi8KCiAgICBlMi5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUyLnN0YXRlID0gMDsKICAgIGUyLnR5cGUgPSBLZXlQcmVzczsKCiAgICBtZW1zZXQoa2V5YzJ2a2V5LCAwLCBzaXplb2Yoa2V5YzJ2a2V5KSk7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGNoYXIgYnVmWzMwXTsKICAgICAgICBpbnQgaGF2ZV9jaGFyczsKCiAgICAgICAga2V5c3ltID0gMDsKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBoYXZlX2NoYXJzID0gWExvb2t1cFN0cmluZygmZTIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgICAgIHZrZXkgPSAwOyBzY2FuID0gMDsKICAgICAgICBpZiAoa2V5c3ltKSAgLyogb3RoZXJ3aXNlLCBrZXljb2RlIG5vdCB1c2VkICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGtleXN5bSA+PiA4KSA9PSAweEZGKSAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgc2NhbiA9IG5vbmNoYXJfa2V5X3NjYW5ba2V5c3ltICYgMHhmZl07CgkJLyogc2V0IGV4dGVuZGVkIGJpdCB3aGVuIG5lY2Vzc2FyeSAqLwoJCWlmIChzY2FuICYgMHgxMDApIHZrZXkgfD0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGtleXN5bSA+PiA4KSA9PSAweDEwMDhGRikgeyAvKiBYRnJlZTg2IHZlbmRvciBrZXlzICovCiAgICAgICAgICAgICAgICB2a2V5ID0geGZyZWU4Nl92ZW5kb3Jfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICAvKiBBbGwgdmVuZG9yIGtleXMgYXJlIGV4dGVuZGVkIHdpdGggYSBzY2FuIGNvZGUgb2YgMCBwZXIgdGVzdGluZyBvbiBXaW5YUCAqLwogICAgICAgICAgICAgICAgc2NhbiA9IDB4MTAwOwoJCXZrZXkgfD0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5c3ltID09IDB4MjApIHsgICAgICAgICAgICAgICAgIC8qIFNwYWNlYmFyICovCgkgICAgICAgIHZrZXkgPSBWS19TUEFDRTsKCQlzY2FuID0gMHgzOTsKCSAgICB9IGVsc2UgaWYgKGhhdmVfY2hhcnMpIHsKCSAgICAgIC8qIHdlIHNlZW0gdG8gbmVlZCB0byBzZWFyY2ggdGhlIGxheW91dC1kZXBlbmRlbnQgc2NhbmNvZGVzICovCgkgICAgICBpbnQgbWF4bGVuPTAsbWF4dmFsPS0xLG9rOwoJICAgICAgZm9yIChpPTA7IGk8c3ltczsgaSsrKSB7CgkJa2V5c3ltID0ga2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDAwKSAmJiAoa2V5c3ltIT0nICcpKQogICAgICAgICAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKCFvaykgaS0tOyAvKiB3ZSBvdmVyc2hvdCAqLwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICBrZXljMnNjYW5bZTIua2V5Y29kZV0gPSBzY2FuOwogICAgICAgIGlmICgodmtleSAmIDB4ZmYpICYmIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSkKICAgICAgICAgICAgV0FSTigidmtleSAlMDRYIGlzIGJlaW5nIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBrZXljb2RlXG4iLCB2a2V5KTsKICAgICAgICB2a2V5X3VzZWRbKHZrZXkgJiAweGZmKV0gPSAxOwogICAgfSAvKiBmb3IgKi8KCiNkZWZpbmUgVktFWV9JRl9OT1RfVVNFRCh2a2V5KSAodmtleV91c2VkWyh2a2V5KV0gPyAwIDogKHZrZXlfdXNlZFsodmtleSldID0gMSwgKHZrZXkpKSkKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4ZmY7CiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KICAgICAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFhLXzAgJiYga2V5c3ltIDw9IFhLXzkpCiAgICAgICAgICAgICAgICB8fCAoa2V5c3ltID49IFhLX0EgJiYga2V5c3ltIDw9IFhLX1opKSB7CiAgICAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChrZXlzeW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgc3dpdGNoIChrZXlzeW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8xKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy8nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzMpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV80KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzYpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV83KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJywnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fQ09NTUEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9QRVJJT0QpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9NSU5VUyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcrJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BMVVMpOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIH0KICAgIH0gLyogZm9yICovCgogICAgLyogRm9yIGFueSBrZXljb2RlcyB3aGljaCBzdGlsbCBkb24ndCBoYXZlIGEgdmtleSwgYXNzaWduIGFueSBzcGFyZQogICAgICogY2hhcmFjdGVyLCBmdW5jdGlvbiBrZXksIG9yIE9FTSB2aXJ0dWFsIGtleSBjb2RlLiAqLwogICAgdmtleV9yYW5nZSA9IDA7CiAgICB2a2V5ID0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0uZmlyc3Q7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGlmIChrZXljMnZrZXlba2V5Y10gJiAweGZmKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIDApOwogICAgICAgIGlmICgha2V5c3ltKQogICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICB3aGlsZSAodmtleSAmJiB2a2V5X3VzZWRbdmtleV0pCiAgICAgICAgewogICAgICAgICAgICBpZiAodmtleSA9PSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5sYXN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5X3JhbmdlKys7CiAgICAgICAgICAgICAgICB2a2V5ID0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0uZmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmtleSsrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF2a2V5KQogICAgICAgIHsKICAgICAgICAgICAgV0FSTigiTm8gbW9yZSB2a2V5cyBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoVFJBQ0VfT04oa2V5Ym9hcmQpKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoInNwYXJlIHZpcnR1YWwga2V5ICUwNFggYXNzaWduZWQgdG8ga2V5Y29kZSAldTpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQogICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICBUUkFDRSggIiVseCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgfQoKICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgdmtleV91c2VkW3ZrZXldID0gMTsKICAgIH0gLyogZm9yICovCiN1bmRlZiBWS0VZX0lGX05PVF9VU0VECgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwoJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAldSAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0KCnN0YXRpYyBCT09MIG1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoSEtMIGhrbCkKewogICAgY29uc3QgRFdPUkQgaXNJTUUgPSAweEUwMDAwMDAwOwogICAgSEtMIHhIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICAvKiBpZiB0aGUgbGF5b3V0IGlzIGFuIElNRSwgb25seSBtYXRjaCB0aGUgbG93IHdvcmQgKExDSUQpICovCiAgICBpZiAoKChVTE9OR19QVFIpaGtsICYgaXNJTUUpID09IGlzSU1FKQogICAgICAgIHJldHVybiAoTE9XT1JEKGhrbCkgPT0gTE9XT1JEKHhIa2wpKTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gKGhrbCA9PSB4SGtsKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEFzeW5jS2V5U3RhdGUgKFgxMURSVi5AKQogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX0dldEFzeW5jS2V5U3RhdGUoSU5UIGtleSkKewogICAgU0hPUlQgcmV0dmFsOwoKICAgIC8qIFBob3Rvc2hvcCBsaXZlbG9ja3MgdW5sZXNzIG1vdXNlIGV2ZW50cyBhcmUgaW5jbHVkZWQgaGVyZSAqLwogICAgWDExRFJWX01zZ1dhaXRGb3JNdWx0aXBsZU9iamVjdHNFeCggMCwgTlVMTCwgMCwgUVNfS0VZIHwgUVNfTU9VU0UsIDAgKTsKCiAgICByZXR2YWwgPSAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg0MCkgPyAweDAwMDEgOiAwKSB8CiAgICAgICAgICAgICAoKGtleV9zdGF0ZV90YWJsZVtrZXldICYgMHg4MCkgPyAweDgwMDAgOiAwKTsKICAgIGtleV9zdGF0ZV90YWJsZVtrZXldICY9IH4weDQwOwogICAgVFJBQ0VfKGtleSkoIiglWCkgLT4gJXhcbiIsIGtleSwgcmV0dmFsKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoRFdPUkQgZHdUaHJlYWRpZCkKewogICAgaWYgKCFkd1RocmVhZGlkIHx8IGR3VGhyZWFkaWQgPT0gR2V0Q3VycmVudFRocmVhZElkKCkpCiAgICB7CiAgICAgICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKTsKICAgICAgICBpZiAodGhyZWFkX2RhdGEgJiYgdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQpIHJldHVybiB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIH0KICAgIGVsc2UKICAgICAgICBGSVhNRSgiY291bGRuJ3QgcmV0dXJuIGtleWJvYXJkIGxheW91dCBmb3IgdGhyZWFkICUwNHhcbiIsIGR3VGhyZWFkaWQpOwoKICAgIHJldHVybiBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzdHViIVxuIiwgZGVidWdzdHJfdyhuYW1lKSwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlVbmxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpCT09MIENERUNMIFgxMURSVl9VbmxvYWRLZXlib2FyZExheW91dChIS0wgaGtsKQp7CiAgICBGSVhNRSgiJXA6IHN0dWIhXG4iLCBoa2wpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWN0aXZhdGVLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCwgVUlOVCBmbGFncykKewogICAgSEtMIG9sZEhrbCA9IDA7CiAgICBzdHJ1Y3QgeDExZHJ2X3RocmVhZF9kYXRhICp0aHJlYWRfZGF0YSA9IHgxMWRydl9pbml0X3RocmVhZF9kYXRhKCk7CgogICAgRklYTUUoIiVwLCAlMDR4OiBzZW1pLXN0dWIhXG4iLCBoa2wsIGZsYWdzKTsKICAgIGlmIChmbGFncyAmIEtMRl9TRVRGT1JQUk9DRVNTKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIktMRl9TRVRGT1JQUk9DRVNTIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChmbGFncykKICAgICAgICBGSVhNRSgiZmxhZ3MgJXggbm90IHN1cHBvcnRlZFxuIixmbGFncyk7CgogICAgaWYgKGhrbCA9PSAoSEtMKUhLTF9ORVhUIHx8IGhrbCA9PSAoSEtMKUhLTF9QUkVWKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoIkhLTF9ORVhUIGFuZCBIS0xfUFJFViBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJzZXR0aW5nIGtleWJvYXJkIG9mIGRpZmZlcmVudCBsb2NhbGVzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG9sZEhrbCA9IHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0OwogICAgaWYgKCFvbGRIa2wpIG9sZEhrbCA9IGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwoKICAgIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0ID0gaGtsOwoKICAgIHJldHVybiBvbGRIa2w7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBIV05EIGR1bW15LCBYRXZlbnQgKmV2ZW50ICkKewogICAgSFdORCBod25kOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoJmV2ZW50LT54bWFwcGluZyk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggZXZlbnQtPnhtYXBwaW5nLmRpc3BsYXkgKTsKCiAgICBod25kID0gR2V0Rm9jdXMoKTsKICAgIGlmICghaHduZCkgaHduZCA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgUG9zdE1lc3NhZ2VXKGh3bmQsIFdNX0lOUFVUTEFOR0NIQU5HRVJFUVVFU1QsCiAgICAgICAgICAgICAgICAgMCAvKkZJWE1FKi8sIChMUEFSQU0pWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVmtLZXlTY2FuRXggKFgxMURSVi5AKQogKgogKiBOb3RlOiBXaW5kb3dzIGlnbm9yZXMgSEtMIHBhcmFtZXRlciBhbmQgdXNlcyBjdXJyZW50IGFjdGl2ZSBsYXlvdXQgaW5zdGVhZAogKi8KU0hPUlQgQ0RFQ0wgWDExRFJWX1ZrS2V5U2NhbkV4KFdDSEFSIHdDaGFyLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpLCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgLyogRklYTUU6IHdoYXQgaGFwcGVucyBpZiB3Q2hhciBpcyBub3QgYSBMYXRpbjEgY2hhcmFjdGVyIGFuZCBDUF9VTklYQ1AKICAgICAqIGlzIFVURi04IChtdWx0aWJ5dGUgZW5jb2RpbmcpPwogICAgICovCiAgICBpZiAoIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVU5JWENQLCAwLCAmd0NoYXIsIDEsICZjQ2hhciwgMSwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgV0FSTigibm8gdHJhbnNsYXRpb24gZnJvbSB1bmljb2RlIHRvIENQX1VOSVhDUCBmb3IgMHglMDJ4XG4iLCB3Q2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFRSQUNFKCJ3Q2hhciAweCUwMnggLT4gY0NoYXIgJyVjJ1xuIiwgd0NoYXIsIGNDaGFyKTsKCiAgICAvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCiAgICBrZXlzeW0gPSAodW5zaWduZWQgY2hhciljQ2hhcjsgLyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwogICAgaWYgKGtleXN5bSA8PSAyNykga2V5c3ltICs9IDB4RkYwMDsgLyogc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uICovCgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KICAgIGlmICgha2V5Y29kZSkKICAgIHsKICAgICAgICBpZiAoa2V5c3ltID49IDB4RkYwMCkgLyogV2luZG93cyByZXR1cm5zIDB4MDI0MCArIGNDaGFyIGluIHRoaXMgY2FzZSAqLwogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gMHgwMjQwICsgY0NoYXI7IC8qIDB4MDIwMCBpbmRpY2F0ZXMgYSBjb250cm9sIGNoYXJhY3RlciAqLwogICAgICAgICAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgY3RybCBjaGFyICUjLjJ4XG4iLCByZXQpOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KICAgICAgICAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KICAgICAgICBUUkFDRSgicmV0cnlpbmcgd2l0aCB8IDB4RkUwMFxuIik7CiAgICAgICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0UoIiclYycoJWx4KTogZ290IGtleWNvZGUgJXVcbiIsIGNDaGFyLCBrZXlzeW0sIGtleWNvZGUpOwoKICAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNvZGVdOwoKICAgIGlmICgha2V5Y29kZSB8fCAhcmV0KQogICAgewogICAgICAgIFRSQUNFKCJrZXljb2RlIGZvciAnJWMnIG5vdCBmb3VuZCwgcmV0dXJuaW5nIC0xXG4iLCBjQ2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGluZGV4ID0gLTE7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KICAgIHsKICAgICAgICBpZiAoa2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgaSkgPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIHN3aXRjaCAoaW5kZXgpCiAgICB7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLCBrZXlzeW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIGNhc2UgMDogYnJlYWs7CiAgICAgICAgY2FzZSAxOiByZXQgKz0gMHgwMTAwOyBicmVhazsKICAgICAgICBjYXNlIDI6IHJldCArPSAweDA2MDA7IGJyZWFrOwogICAgICAgIGNhc2UgMzogcmV0ICs9IDB4MDcwMDsgYnJlYWs7CiAgICB9CiAgICAvKgogICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCiAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQogICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCiAgICAgKi8KCiAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXlFeCAoWDExRFJWLkApCiAqLwpVSU5UIENERUNMIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSwgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKCiNkZWZpbmUgcmV0dXJuTVZLKHZhbHVlKSBkbyB7IFRSQUNFKCJyZXR1cm5pbmcgMHgleC5cbiIsdmFsdWUpOyByZXR1cm4gdmFsdWU7IH0gd2hpbGUoMCkKCiAgICBUUkFDRSgid0NvZGU9MHgleCwgd01hcFR5cGU9JWQsIGhrbCAlcFxuIiwgd0NvZGUsIHdNYXBUeXBlLCBoa2wpOwogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIHN3aXRjaCh3TWFwVHlwZSkKICAgIHsKICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX1ZTQzogLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDX0VYOgogICAgICAgIHsKICAgICAgICAgICAgaW50IGtleWM7CgogICAgICAgICAgICBzd2l0Y2ggKHdDb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFZLX1NISUZUOiB3Q29kZSA9IFZLX0xTSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX0NPTlRST0w6IHdDb2RlID0gVktfTENPTlRST0w7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBWS19NRU5VOiB3Q29kZSA9IFZLX0xNRU5VOyBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IHNjYW4gKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpIGJyZWFrOwoKICAgICAgICAgICAgaWYgKGtleWMgPiBtYXhfa2V5Y29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoInJldHVybmluZyBubyBzY2FuLWNvZGUuXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CiAgICAgICAgfQogICAgICAgIGNhc2UgTUFQVktfVlNDX1RPX1ZLOiAvKiBzY2FuLWNvZGUgdG8gdmtleS1jb2RlICovCiAgICAgICAgY2FzZSBNQVBWS19WU0NfVE9fVktfRVg6CiAgICAgICAgewogICAgICAgICAgICBpbnQga2V5YzsKICAgICAgICAgICAgVUlOVCB2a2V5ID0gMDsKCiAgICAgICAgICAgIC8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCiAgICAgICAgICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgICAgICAgICAgICBpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgc3RvcCBpZiBpdCdzIG5vdCBhIG51bXBhZCB2a2V5OyBvdGhlcndpc2Uga2VlcAogICAgICAgICAgICAgICAgICAgICAgIGxvb2tpbmcgZm9yIGEgcG90ZW50aWFsIGJldHRlciB2a2V5LiAqLwogICAgICAgICAgICAgICAgICAgIGlmICh2a2V5ICYmICh2a2V5IDwgVktfTlVNUEFEMCB8fCBWS19ESVZJREUgPCB2a2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAodmtleSA9PSAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh3TWFwVHlwZSA9PSBNQVBWS19WU0NfVE9fVkspCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm5NVksgKHZrZXkpOwogICAgICAgIH0KCQljYXNlIE1BUFZLX1ZLX1RPX0NIQVI6IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCgkJewogICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgInVuc2hpZnRlZCIgbWVhbnMuIGluIHdpbmRvd3MgVktfVyAoMHg1NykKICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0dXJucyAweDU3LCB3aGljaCBpcyB1cGVyY2FzZSAnVycuIFNvIHdlIGhhdmUgdG8gcmV0dXJuIHRoZSB1cHBlcmNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5Li4gTG9va3MgbGlrZSBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgTVMgZG9jcz8KICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHRydWUgZm9yIGxldHRlcnMsIGZvciBleGFtcGxlIFZLXzAgcmV0dXJucyAnMCcgbm90ICcpJy4KICAgICAgICAgICAgICAgICAgICAgICAgICogLSBoZW5jZSB3ZSB1c2UgdGhlIGxvY2sgbWFzayB0byBlbnN1cmUgdGhpcyBoYXBwZW5zLgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KCQkJLyogbGV0J3MgZG8gdmtleSAtPiBrZXljb2RlIC0+IChYTG9va3VwU3RyaW5nKSBhbnNpIGNoYXIgKi8KCQkJWEtleUV2ZW50IGU7CgkJCUtleVN5bSBrZXlzeW07CgkJCWludCBrZXljLCBsZW47CgkJCWNoYXIgc1sxMF07CgoJCQllLmRpc3BsYXkgPSBkaXNwbGF5OwoJCQllLnN0YXRlID0gMDsKCQkJZS5rZXljb2RlID0gMDsKCQkJZS50eXBlID0gS2V5UHJlc3M7CgogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCgkJCS8qIFdlIGV4aXQgb24gdGhlIGZpcnN0IGtleWNvZGUgZm91bmQsIHRvIHNwZWVkIHVwIHRoZSB0aGluZy4gKi8KCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKCQkJeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KCQkJICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkgICAgeyAvKiBXZSBmaWx0ZXIgdGhlIGV4dGVuZGVkIGJpdCwgd2UgZG9uJ3Qga25vdyBpdCAqLwoJCQkgICAgICAgIGUua2V5Y29kZSA9IGtleWM7IC8qIFN0b3JlIGl0IHRlbXBvcmFyaWx5ICovCgkJCQlpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoMCwmZSkgJiAweEZGKSAhPSB3Q29kZSkgewoJCQkJICAgIGUua2V5Y29kZSA9IDA7IC8qIFdyb25nIG9uZSAoZXg6IGJlY2F1c2Ugb2YgdGhlIE51bUxvY2sKCQkJCQkgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwoJCQkJfQoJCQkgICAgfQoJCQl9CgoJCQlpZiAoKHdDb2RlPj1WS19OVU1QQUQwKSAmJiAod0NvZGU8PVZLX05VTVBBRDkpKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCB3Q29kZS1WS19OVU1QQUQwK1hLX0tQXzApOwoKCQkJaWYgKHdDb2RlPT1WS19ERUNJTUFMKQoJCQkgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCgkJCWlmICghZS5rZXljb2RlKQoJCQl7CgkJCSAgV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHdDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoJCQkgIHJldHVybiAwOyAvKiB3aGF0ZXZlciAqLwoJCQl9CgkJCVRSQUNFKCJGb3VuZCBrZXljb2RlICV1XG4iLGUua2V5Y29kZSk7CgogICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBYTG9va3VwU3RyaW5nKCZlLCBzLCBzaXplb2YocyksICZrZXlzeW0sIE5VTEwpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0NIQVIgd2NoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBzLCBsZW4sICZ3Y2gsIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybk1WSyh0b3VwcGVyVyh3Y2gpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIEFOU0kuXG4iKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWRlZmF1bHQ6IC8qIHJlc2VydmVkICovCgkJCUZJWE1FKCJVbmtub3duIHdNYXBUeXBlICVkICFcbiIsIHdNYXBUeXBlKTsKCQkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlOYW1lVGV4dCAoWDExRFJWLkApCiAqLwpJTlQgQ0RFQ0wgWDExRFJWX0dldEtleU5hbWVUZXh0KExPTkcgbFBhcmFtLCBMUFdTVFIgbHBCdWZmZXIsIElOVCBuU2l6ZSkKewogIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgaW50IHZrZXksIGFuc2ksIHNjYW5Db2RlOwogIEtleUNvZGUga2V5YzsKICBpbnQga2V5aTsKICBLZXlTeW0ga2V5czsKICBjaGFyICpuYW1lOwoKICBzY2FuQ29kZSA9IGxQYXJhbSA+PiAxNjsKICBzY2FuQ29kZSAmPSAweDFmZjsgIC8qIGtlZXAgImV4dGVuZGVkLWtleSIgZmxhZyB3aXRoIGNvZGUgKi8KCiAgdmtleSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoc2NhbkNvZGUsIE1BUFZLX1ZTQ19UT19WS19FWCwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKCiAgLyogIGhhbmRsZSAiZG9uJ3QgY2FyZSIgYml0ICgweDAyMDAwMDAwKSAqLwogIGlmICghKGxQYXJhbSAmIDB4MDIwMDAwMDApKSB7CiAgICBzd2l0Y2ggKHZrZXkpIHsKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUi1TaGlmdCBpcyAic3BlY2lhbCIgLSBpdCBpcyBhbiBleHRlbmRlZCBrZXkgd2l0aCBzZXBhcmF0ZSBzY2FuIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuQ29kZSB8PSAweDEwMDsKICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHZrZXksIE1BUFZLX1ZLX1RPX0NIQVIsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CiAgVFJBQ0UoInNjYW4gMHglMDR4LCB2a2V5IDB4JTA0WCwgQU5TSSAweCUwNHhcbiIsIHNjYW5Db2RlLCB2a2V5LCBhbnNpKTsKCiAgLyogZmlyc3QgZ2V0IHRoZSBuYW1lIG9mIHRoZSAicmVndWxhciIga2V5cyB3aGljaCBpcyB0aGUgVXBwZXIgY2FzZQogICAgIHZhbHVlIG9mIHRoZSBrZXljYXAgaW1wcmludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBpZiAoICgoYW5zaSA+PSAweDIxKSAmJiAoYW5zaSA8PSAweDdlKSkgJiYKICAgICAgIChzY2FuQ29kZSAhPSAweDEzNykgJiYgICAvKiBQcnRTY24gICAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MTM1KSAmJiAgIC8qIG51bXBhZCAvICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgzNyApICYmICAgLyogbnVtcGFkICogKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRhICkgJiYgICAvKiBudW1wYWQgLSAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGUgKSApICAgIC8qIG51bXBhZCArICovCiAgICAgIHsKICAgICAgICBpZiAoKG5TaXplID49IDIpICYmIGxwQnVmZmVyKQoJewogICAgICAgICAgKmxwQnVmZmVyID0gdG91cHBlclcoKFdDSEFSKWFuc2kpOwogICAgICAgICAgKihscEJ1ZmZlcisxKSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogRklYTUU6IGhvcnJpYmxlIGhhY2sgdG8gZml4IGZ1bmN0aW9uIGtleXMuIFdpbmRvd3MgcmVwb3J0cyBzY2FuY29kZQogICAgICAgICAgICB3aXRob3V0ICJleHRlbmRlZC1rZXkiIGZsYWcuIEhvd2V2ZXIgV2luZSBnZW5lcmF0ZXMgc2NhbmNvZGUKICAgICAgICAgICAgKndpdGgqICJleHRlbmRlZC1rZXkiIGZsYWcuIFNlZW1zIHRvIG9jY3VyICpvbmx5KiBmb3IgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIGtleXMuIFNvb29vLi4gV2Ugd2lsbCBsZWF2ZSB0aGUgdGFibGUgYWxvbmUgYW5kCiAgICAgICAgICAgIGZ1ZGdlIHRoZSBsb29rdXAgaGVyZSB0aWxsIHRoZSBvdGhlciBwYXJ0IGlzIGZvdW5kIGFuZCBmaXhlZCEhISAqLwoKICBpZiAoICgoc2NhbkNvZGUgPj0gMHgxM2IpICYmIChzY2FuQ29kZSA8PSAweDE0NCkpIHx8CiAgICAgICAoc2NhbkNvZGUgPT0gMHgxNTcpIHx8IChzY2FuQ29kZSA9PSAweDE1OCkpCiAgICBzY2FuQ29kZSAmPSAweGZmOyAgIC8qIHJlbW92ZSAiZXh0ZW5kZWQta2V5IiBmbGFnIGZvciBGeCBrZXlzICovCgogIC8qIGxldCdzIGRvIHNjYW5jb2RlIC0+IGtleWNvZGUgLT4ga2V5c3ltIC0+IFN0cmluZyAqLwoKICBmb3IgKGtleWk9bWluX2tleWNvZGU7IGtleWk8PW1heF9rZXljb2RlOyBrZXlpKyspCiAgICAgIGlmICgoa2V5YzJzY2FuW2tleWldKSA9PSBzY2FuQ29kZSkKICAgICAgICAgYnJlYWs7CiAgaWYgKGtleWkgPD0gbWF4X2tleWNvZGUpCiAgewogICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAga2V5YyA9IChLZXlDb2RlKSBrZXlpOwogICAgICBrZXlzID0ga2V5Y29kZV90b19rZXlzeW0oZGlzcGxheSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CiAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0ldSBrZXlzeW09JTA0eCBzdHJpbmc9JXNcbiIsCiAgICAgICAgICAgIHNjYW5Db2RlLCBrZXljLCAoaW50KWtleXMsIG5hbWUpOwogICAgICBpZiAobHBCdWZmZXIgJiYgblNpemUgJiYgbmFtZSkKICAgICAgICAgIHJldHVybiBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbmFtZSwgLTEsIGxwQnVmZmVyLCBuU2l6ZSk7CiAgfQoKICAvKiBGaW5hbGx5IGlzc3VlIFdBUk4gZm9yIHVua25vd24ga2V5cyAgICovCgogIFdBUk4oIiglMDh4LCVwLCVkKTogdW5zdXBwb3J0ZWQga2V5LCB2a2V5PSUwNFgsIGFuc2k9JTA0eFxuIixsUGFyYW0sbHBCdWZmZXIsblNpemUsdmtleSxhbnNpKTsKICBpZiAobHBCdWZmZXIgJiYgblNpemUpCiAgICAqbHBCdWZmZXIgPSAwOwogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9NYXBEZWFkS2V5c3ltCiAqLwpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pCnsKCXN3aXRjaCAoa2V5c3ltKQoJICAgIHsKCS8qIHN5bWJvbGljIEFTQ0lJIGlzIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gcmZjMTM0NSAqLwojaWZkZWYgWEtfZGVhZF90aWxkZQoJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCgkJcmV0dXJuICd+JzsJLyogJz8gKi8KI2lmZGVmIFhLX2RlYWRfYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfYWN1dGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjcgOiAvKiBYZnJlZSdzIFhLX0RhY3V0ZV9hY2NlbnQgKi8KCQlyZXR1cm4gMHhiNDsJLyogJycgKi8KI2lmZGVmIFhLX2RlYWRfY2lyY3VtZmxleAoJICAgIGNhc2UgWEtfZGVhZF9jaXJjdW1mbGV4OgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLwoJCXJldHVybiAnXic7CS8qICc+ICovCiNpZmRlZiBYS19kZWFkX2dyYXZlCgkgICAgY2FzZSBYS19kZWFkX2dyYXZlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTYwIDogLyogWGZyZWUncyBYS19EZ3JhdmVfYWNjZW50ICovCgkJcmV0dXJuICdgJzsJLyogJyEgKi8KI2lmZGVmIFhLX2RlYWRfZGlhZXJlc2lzCgkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLwoJCXJldHVybiAweGE4OwkvKiAnOiAqLwojaWZkZWYgWEtfZGVhZF9jZWRpbGxhCgkgICAgY2FzZSBYS19kZWFkX2NlZGlsbGEgOgoJICAgICAgICByZXR1cm4gMHhiODsJLyogJywgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX21hY3JvbgoJICAgIGNhc2UgWEtfZGVhZF9tYWNyb24gOgoJICAgICAgICByZXR1cm4gJy0nOwkvKiAnbSBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2JyZXZlCgkgICAgY2FzZSBYS19kZWFkX2JyZXZlIDoKCSAgICAgICAgcmV0dXJuIDB4YTI7CS8qICcoICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZWRvdAoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZWRvdCA6CgkgICAgICAgIHJldHVybiAweGZmOwkvKiAnLiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVyaW5nCgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlcmluZyA6CgkgICAgICAgIHJldHVybiAnMCc7CS8qICcwIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfZG91YmxlYWN1dGUKCSAgICBjYXNlIFhLX2RlYWRfZG91YmxlYWN1dGUgOgoJICAgICAgICByZXR1cm4gMHhiZDsJLyogJyIgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Nhcm9uCgkgICAgY2FzZSBYS19kZWFkX2Nhcm9uIDoKCSAgICAgICAgcmV0dXJuIDB4Yjc7CS8qICc8ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9vZ29uZWsKCSAgICBjYXNlIFhLX2RlYWRfb2dvbmVrIDoKCSAgICAgICAgcmV0dXJuIDB4YjI7CS8qICc7ICovCiNlbmRpZgovKiBGSVhNRTogSSBkb24ndCBrbm93IHRoaXMgdGhyZWUuCgkgICAgY2FzZSBYS19kZWFkX2lvdGEgOgoJICAgICAgICByZXR1cm4gJ2knOwoJICAgIGNhc2UgWEtfZGVhZF92b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3YnOwoJICAgIGNhc2UgWEtfZGVhZF9zZW1pdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICdzJzsKKi8KCSAgICB9CglUUkFDRSgibm8gY2hhcmFjdGVyIGZvciBkZWFkIGtleXN5bSAweCUwOGx4XG4iLGtleXN5bSk7CglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlUb1VuaWNvZGVFeCAoWDExRFJWLkApCiAqCiAqIFRoZSBUb1VuaWNvZGUgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgc3BlY2lmaWVkIHZpcnR1YWwta2V5IGNvZGUgYW5kIGtleWJvYXJkCiAqIHN0YXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIFdpbmRvd3MgY2hhcmFjdGVyIG9yIGNoYXJhY3RlcnMuCiAqCiAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGEgZGVhZCBrZXksIHRoZSByZXR1cm4gdmFsdWUgaXMgbmVnYXRpdmUuIE90aGVyd2lzZSwKICogaXQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgogKiBWYWx1ZQlNZWFuaW5nCiAqIDAJVGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSBoYXMgbm8gdHJhbnNsYXRpb24gZm9yIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBrZXlib2FyZC4KICogMQlPbmUgV2luZG93cyBjaGFyYWN0ZXIgd2FzIGNvcGllZCB0byB0aGUgYnVmZmVyLgogKiAyCVR3byBjaGFyYWN0ZXJzIHdlcmUgY29waWVkIHRvIHRoZSBidWZmZXIuIFRoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gYQogKiAgICAgIGRlYWQta2V5IGNoYXJhY3RlciAoYWNjZW50IG9yIGRpYWNyaXRpYykgc3RvcmVkIGluIHRoZSBrZXlib2FyZCBsYXlvdXQgY2Fubm90CiAqICAgICAgYmUgY29tcG9zZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IHRvIGZvcm0gYSBzaW5nbGUgY2hhcmFjdGVyLgogKgogKiBGSVhNRSA6IHNob3VsZCBkbyB0aGUgYWJvdmUgKHJldHVybiAyIGZvciBub24gbWF0Y2hpbmcgZGVhZGNoYXIrY2hhciBjb21iaW5hdGlvbnMpCiAqCiAqLwpJTlQgQ0RFQ0wgWDExRFJWX1RvVW5pY29kZUV4KFVJTlQgdmlydEtleSwgVUlOVCBzY2FuQ29kZSwgY29uc3QgQllURSAqbHBLZXlTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgYnVmVywgaW50IGJ1Zldfc2l6ZSwgVUlOVCBmbGFncywgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICAgIFhLZXlFdmVudCBlOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CiAgICBjaGFyIGJ1ZlsxMF07CiAgICBjaGFyICpscENoYXIgPSBidWY7CiAgICBIV05EIGZvY3VzOwogICAgWElDIHhpYzsKICAgIFN0YXR1cyBzdGF0dXMgPSAwOwoKICAgIGlmIChzY2FuQ29kZSAmIDB4ODAwMCkKICAgIHsKICAgICAgICBUUkFDRSgiS2V5IFVQLCBkb2luZyBub3RoaW5nXG4iICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIGlmICgobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApICYmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkpCiAgICB7CiAgICAgICAgVFJBQ0UoIkN0cmwrQWx0K1trZXldIHdvbid0IGdlbmVyYXRlIGEgY2hhcmFjdGVyXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZS5rZXljb2RlID0gMDsKICAgIGUuc3RhdGUgPSAwOwogICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgZm9jdXMgPSB4MTFkcnZfdGhyZWFkX2RhdGEoKS0+bGFzdF94aWNfaHduZDsKICAgIGlmICghZm9jdXMpCiAgICB7CiAgICAgICAgZm9jdXMgPSBHZXRGb2N1cygpOwogICAgICAgIGlmIChmb2N1cykgZm9jdXMgPSBHZXRBbmNlc3RvciggZm9jdXMsIEdBX1JPT1QgKTsKICAgICAgICBpZiAoIWZvY3VzKSBmb2N1cyA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgfQogICAgZS53aW5kb3cgPSBYMTFEUlZfZ2V0X3dob2xlX3dpbmRvdyggZm9jdXMgKTsKICAgIHhpYyA9IFgxMURSVl9nZXRfaWMoIGZvY3VzICk7CgogICAgaWYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkKICAgIHsKCVRSQUNFKCJTaGlmdE1hc2sgPSAlMDR4XG4iLCBTaGlmdE1hc2spOwoJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCiAgICB7CglUUkFDRSgiTG9ja01hc2sgPSAlMDR4XG4iLCBMb2NrTWFzayk7CgllLnN0YXRlIHw9IExvY2tNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQogICAgewoJVFJBQ0UoIkNvbnRyb2xNYXNrID0gJTA0eFxuIiwgQ29udHJvbE1hc2spOwoJZS5zdGF0ZSB8PSBDb250cm9sTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJOdW1Mb2NrTWFzayA9ICUwNHhcbiIsIE51bUxvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTnVtTG9ja01hc2s7CiAgICB9CgogICAgLyogUmVzdG9yZSBzYXZlZCBBbHRHciBzdGF0ZSAqLwogICAgVFJBQ0UoIkFsdEdyTWFzayA9ICUwNHhcbiIsIEFsdEdyTWFzayk7CiAgICBlLnN0YXRlIHw9IEFsdEdyTWFzazsKCiAgICBUUkFDRV8oa2V5KSgiKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAweCUwNHhcbiIsCgkJdmlydEtleSwgc2NhbkNvZGUsIGUuc3RhdGUpOwogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gdmlydEtleSkKICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsJmUpICYgMHhGRikgIT0gdmlydEtleSkgewogICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCiAgICAgICAgICAgICAgfQoJICB9CiAgICAgIH0KCiAgICBpZiAodmlydEtleSA+PSBWS19MRUZUICYmIHZpcnRLZXkgPD0gVktfRE9XTikKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleSAtIFZLX0xFRlQgKyBYS19MZWZ0KTsKCiAgICBpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleS1WS19OVU1QQUQwK1hLX0tQXzApOwoKICAgIGlmICh2aXJ0S2V5PT1WS19ERUNJTUFMKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCiAgICBpZiAodmlydEtleT09VktfU0VQQVJBVE9SKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9TZXBhcmF0b3IpOwoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgdmlydEtleSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCXJldHVybiAwOwogICAgICB9CiAgICBlbHNlIFRSQUNFKCJGb3VuZCBrZXljb2RlICV1XG4iLGUua2V5Y29kZSk7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAldVxuIiwKCQllLnR5cGUsIGUud2luZG93LCBlLnN0YXRlLCBlLmtleWNvZGUpOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nLAogICAgICogZS50eXBlIHdhcyBzZXQgdG8gS2V5UHJlc3MgYWJvdmUuCiAgICAgKi8KICAgIGlmICh4aWMpCiAgICB7CiAgICAgICAgcmV0ID0gWG1iTG9va3VwU3RyaW5nKHhpYywgJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIFRSQUNFKCJYbWJMb29rdXBTdHJpbmcgbmVlZHMgJWQgYnl0ZShzKVxuIiwgcmV0KTsKICAgICAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhciA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCByZXQpOwogICAgICAgICAgICBpZiAobHBDaGFyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBscENoYXIsIHJldCwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgibmJ5dGUgPSAlZCwgc3RhdHVzIDB4JXhcbiIsIHJldCwgc3RhdHVzKTsKCiAgICBpZiAoVFJBQ0VfT04oa2V5KSkKICAgIHsKICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJObyBOYW1lIjsKICAgICAgICBUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWx4ICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIHJldCwgZGVidWdzdHJfYW4obHBDaGFyLCByZXQpKTsKICAgIH0KCiAgICBpZiAocmV0ID09IDApCiAgICB7CgljaGFyIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYiAmJiAhKGUuc3RhdGUgJiBDb250cm9sTWFzaykpCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgwOTsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKICAgICAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5c3ltID49IDB4MDEwMDAxMDAgJiYga2V5c3ltIDw9IDB4MDEwMGZmZmYpCiAgICAgICAgewogICAgICAgICAgICAvKiBVbmljb2RlIGRpcmVjdCBtYXBwaW5nICovCiAgICAgICAgICAgIGJ1ZldbMF0gPSBrZXlzeW0gJiAweGZmZmY7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsKICAgICAgICAgICAgYnVmV1swXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCSAgICBpZiAoIWtzbmFtZSkKCQlrc25hbWUgPSAiTm8gTmFtZSI7CgkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKCQl7CgkJV0FSTigibm8gY2hhciBmb3Iga2V5c3ltICUwNGx4ICglcykgOlxuIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSk7CgkJV0FSTigidmlydEtleT0lWCwgc2NhbkNvZGU9JVgsIGtleWNvZGU9JXUsIHN0YXRlPSVYXG4iLAogICAgICAgICAgICAgICAgICAgIHZpcnRLZXksIHNjYW5Db2RlLCBlLmtleWNvZGUsIGUuc3RhdGUpOwoJCX0KCSAgICB9Cgl9CiAgICBlbHNlIHsgIC8qIHJldCAhPSAwICovCiAgICAgICAgLyogV2UgaGF2ZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgOiBTaGlmdCArIGFycm93LCBzaGlmdCArIGhvbWUsIC4uLgogICAgICAgICAgIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0LiBMZXQncyBlYXQgaXQuICovCiAgICAgICAgaWYgKCEoZS5zdGF0ZSAmIE51bUxvY2tNYXNrKSAgLyogTnVtTG9jayBpcyBvZmYgKi8KICAgICAgICAgICAgJiYgKGUuc3RhdGUgJiBTaGlmdE1hc2spIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KICAgICAgICAgICAgJiYgKGtleXN5bT49WEtfS1BfMCkgJiYgKGtleXN5bTw9WEtfS1BfOSkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyogbW9yZSBhcmVhcyB3aGVyZSBYIHJldHVybnMgY2hhcmFjdGVycyBidXQgV2luZG93cyBkb2VzIG5vdAogICAgICAgICAgIENUUkwgKyBudW1iZXIgb3IgQ1RSTCArIHN5bWJvbCAqLwogICAgICAgIGlmIChlLnN0YXRlICYgQ29udHJvbE1hc2spCiAgICAgICAgewogICAgICAgICAgICBpZiAoKChrZXlzeW0+PTMzKSAmJiAoa2V5c3ltIDwgJ0EnKSkgfHwKICAgICAgICAgICAgICAgICgoa2V5c3ltID4gJ1onKSAmJiAoa2V5c3ltIDwgJ2EnKSkgfHwKICAgICAgICAgICAgICAgIChrZXlzeW0gPT0gWEtfVGFiKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qIFdlIGhhdmUgYW5vdGhlciBzcGVjaWFsIGNhc2UgZm9yIGRlbGV0ZSBrZXkgKFhLX0RlbGV0ZSkgb24gYW4KICAgICAgICAgZXh0ZW5kZWQga2V5Ym9hcmQuIFggcmV0dXJucyBhIGNoYXIgZm9yIGl0LCBidXQgV2luZG93cyBkb2Vzbid0ICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19EZWxldGUpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfS1BfRGVjaW1hbCkpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgIH0KCWVsc2UgaWYoKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKSAvKiBDb250cm9sIGlzIHByZXNzZWQgKi8KCQkmJiAoa2V5c3ltID09IFhLX1JldHVybiB8fCBrZXlzeW0gPT0gWEtfS1BfRW50ZXIpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gJ1xuJzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICB9CgogICAgICAgIC8qIEhhY2sgdG8gZGV0ZWN0IGFuIFhMb29rdXBTdHJpbmcgaGFyZC1jb2RlZCB0byBMYXRpbjEgKi8KICAgICAgICBpZiAocmV0ID09IDEgJiYga2V5c3ltID49IDB4MDBhMCAmJiBrZXlzeW0gPD0gMHgwMGZmICYmIChCWVRFKWxwQ2hhclswXSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gKEJZVEUpbHBDaGFyWzBdOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCgkvKiBwZXJmb3JtIHRyYW5zbGF0aW9uIHRvIHVuaWNvZGUgKi8KCWlmKHJldCkKCXsKCSAgICBUUkFDRV8oa2V5KSgiVHJhbnNsYXRpbmcgY2hhciAweCUwMnggdG8gdW5pY29kZVxuIiwgKihCWVRFICopbHBDaGFyKTsKCSAgICByZXQgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbHBDaGFyLCByZXQsIGJ1ZlcsIGJ1Zldfc2l6ZSk7Cgl9CiAgICB9Cgpmb3VuZDoKICAgIGlmIChidWYgIT0gbHBDaGFyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxwQ2hhcik7CiAgICBUUkFDRV8oa2V5KSgicmV0dXJuaW5nICVkIHdpdGggJXNcbiIsIHJldCwgZGVidWdzdHJfd24oYnVmVywgcmV0KSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUJlZXAgKFgxMURSVi5AKQogKi8Kdm9pZCBDREVDTCBYMTFEUlZfQmVlcCh2b2lkKQp7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhCZWxsKGdkaV9kaXNwbGF5LCAwKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0K