LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgovKiBsb2cgZm9ybWF0IChhZGQgMC1wYWRkaW5nIGFzIGFwcHJvcHJpYXRlKToKICAgIGtleWNvZGUgICV1ICBhcyBpbiBvdXRwdXQgZnJvbSB4ZXYKICAgIGtleXN5bSAgICVseCBhcyBpbiBYMTEva2V5c3ltZGVmLmgKICAgIHZrZXkgICAgICVYICBhcyBpbiB3aW51c2VyLmgKICAgIHNjYW5jb2RlICV4CiovCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGtleWJvYXJkKTsKV0lORV9ERUNMQVJFX0RFQlVHX0NIQU5ORUwoa2V5KTsKCnN0YXRpYyBpbnQgbWluX2tleWNvZGUsIG1heF9rZXljb2RlLCBrZXlzeW1zX3Blcl9rZXljb2RlOwpzdGF0aWMgS2V5U3ltICprZXlfbWFwcGluZzsKc3RhdGljIFdPUkQga2V5YzJ2a2V5WzI1Nl0sIGtleWMyc2NhblsyNTZdOwoKc3RhdGljIGludCBOdW1Mb2NrTWFzaywgU2Nyb2xsTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCgpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBrYmRfc2VjdGlvbjsKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT05fREVCVUcgY3JpdHNlY3RfZGVidWcgPQp7CiAgICAwLCAwLCAma2JkX3NlY3Rpb24sCiAgICB7ICZjcml0c2VjdF9kZWJ1Zy5Qcm9jZXNzTG9ja3NMaXN0LCAmY3JpdHNlY3RfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCB9LAogICAgICAwLCAwLCB7IChEV09SRF9QVFIpKF9fRklMRV9fICI6IGtiZF9zZWN0aW9uIikgfQp9OwpzdGF0aWMgQ1JJVElDQUxfU0VDVElPTiBrYmRfc2VjdGlvbiA9IHsgJmNyaXRzZWN0X2RlYnVnLCAtMSwgMCwgMCwgMCwgMCB9OwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ5CnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogXCAgICAgIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHg1ZSwweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2LCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fZHZvcmFrW01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICBbICAgIF0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MUEsMHgxQiwKIC8qICcgICAgLCAgICAuICAgIHAgICAgeSAgICBmICAgIGcgICAgYyAgICByICAgIGwgICAgLyAgICA9ICovCiAgIDB4MjgsMHgzMywweDM0LDB4MTksMHgxNSwweDIxLDB4MjIsMHgyRSwweDEzLDB4MjYsMHgzNSwweDBELAogLyogYSAgICBvICAgIGUgICAgdSAgICBpICAgIGQgICAgaCAgICB0ICAgIG4gICAgcyAgICAtICAgIFwgKi8KICAgMHgxRSwweDE4LDB4MTIsMHgxNiwweDE3LDB4MjAsMHgyMywweDE0LDB4MzEsMHgxRiwweDBDLDB4MkIsCiAvKiA7ICAgIHEgICAgaiAgICBrICAgIHggICAgYiAgICBtICAgIHcgICAgdiAgICB6ICovCiAgIDB4MjcsMHgxMCwweDI0LDB4MjUsMHgyRCwweDMwLDB4MzIsMHgxMSwweDJGLDB4MkMsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7CiAgLyogdGhpcyBpcyBteSAoMTA2LWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MjksCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewogLyogMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgIF4gICAgXCAqLwogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDdkLAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBAICAgIFsgKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgIDogICAgXSAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg3MyAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fMywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV83LFZLX09FTV81LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzMsVktfT0VNXzQsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV9QTFVTLFZLX09FTV8xLFZLX09FTV82LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzgsVktfT0VNXzUsCiAgIFZLX09FTV83LCdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fUExVUywKICAgJ0EnLCdaJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnUScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJywnTScsVktfT0VNXzMsVktfT0VNXzUsCiAgICdXJywnWCcsJ0MnLCdWJywnQicsJ04nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9kdm9yYWtbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX09FTV83LFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELCdQJywnWScsJ0YnLCdHJywnQycsJ1InLCdMJyxWS19PRU1fMixWS19PRU1fUExVUywKICAgJ0EnLCdPJywnRScsJ1UnLCdJJywnRCcsJ0gnLCdUJywnTicsJ1MnLFZLX09FTV9NSU5VUyxWS19PRU1fNSwKICAgVktfT0VNXzEsJ1EnLCdKJywnSycsJ1gnLCdCJywnTScsJ1cnLCdWJywnWicsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKioqIERFRklORSBZT1VSIE5FVyBMQU5HVUFHRS1TUEVDSUZJQyBNQVBQSU5HUyBCRUxPVywgU0VFIEVYSVNUSU5HIFRBQkxFUyAqLwoKLyogdGhlIFZLIG1hcHBpbmdzIGZvciB0aGUgbWFpbiBrZXlib2FyZCB3aWxsIGJlIGF1dG8tYXNzaWduZWQgYXMgYmVmb3JlLAogICBzbyB3aGF0IHdlIGhhdmUgaGVyZSBpcyBqdXN0IHRoZSBjaGFyYWN0ZXIgdGFibGVzICovCi8qIG9yZGVyOiBOb3JtYWwsIFNoaWZ0LCBBbHRHciwgU2hpZnQtQWx0R3IgKi8KLyogV2UgcmVjb21tZW5kIHlvdSB3cml0ZSBqdXN0IHdoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IChpLmUuIHdoYXQncwogICB3cml0dGVuIG9uIHRoZSBrZXljYXBzKSwgbm90IHRoZSBidW5jaCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmVoaW5kIEFsdEdyCiAgIGFuZCBTaGlmdC1BbHRHciBpZiBpdCBjYW4gdmFyeSBhbW9uZyBkaWZmZXJlbnQgWCBzZXJ2ZXJzICovCi8qIFRoZXNlIHRhYmxlcyBzZXJ2ZSB0byBndWVzcyB0aGUga2V5Ym9hcmQgdHlwZSBhbmQgc2NhbmNvZGUgbWFwcGluZy4KICAgQ29tcGxldGUgbW9kZWxpbmcgaXMgbm90IGltcG9ydGFudCwgaWRlbnRpZmljYXRpb24vZGlzY3JpbWluYXRpb24gaXMuICovCi8qIFJlbWVtYmVyIHRoYXQgeW91ciAxMDJuZCBrZXkgKHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSBzaG91bGQgYmUgb24gYQogICBzZXBhcmF0ZSBsaW5lLCBzZWUgZXhpc3RpbmcgdGFibGVzICovCi8qIElmIFdpbmUgZmFpbHMgdG8gbWF0Y2ggeW91ciBuZXcgdGFibGUsIHVzZSBXSU5FREVCVUc9K2tleSB0byBmaW5kIG91dCB3aHkgKi8KLyogUmVtZW1iZXIgdG8gYWxzbyBhZGQgeW91ciBuZXcgdGFibGUgdG8gdGhlIGxheW91dCBpbmRleCB0YWJsZSBmYXIgYmVsb3chICovCgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMiIsIlwiMyIsIic0IiwiKDUiLCItNiIsIug3IiwiXzgiLCLnOSIsIuAwIiwiKbAiLCI9KyIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjIiwKICJxUSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKiBBbGwgZ2VybWFuIGtleWIgbGF5b3V0IHRhYmxlcyBoYXZlIHRoZSBhY3V0ZS9hcG9zdHJvcGhlIHN5bWJvbCBuZXh0IHRvCiAqIHRoZSBCQUNLU1BBQ0Uga2V5IHJlbW92ZWQgKHJlcGxhY2VkIHdpdGggTlVMTCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZQogKiBkZXRlY3Rpb24gY29kZSkuCiAqIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgbWFwcGluZyBvZiB0aGUgYWN1dGUgKGFuZCBhcG9zdHJvcGhlKSBpcyBkb25lCiAqIGRpZmZlcmVudGx5IGluIHZhcmlvdXMgeGtiLWRhdGEveGtleWJvYXJkLWNvbmZpZyB2ZXJzaW9ucy4gU29tZSByZXBsYWNlCiAqIHRoZSBhY3V0ZSB3aXRoIGEgbm9ybWFsIGFwb3N0cm9waGUsIHNvIHRoYXQgdGhlIGFwb3N0cm9waGUgaXMgZm91bmQgdHdpY2UKICogb24gdGhlIGtleWJvYXJkIChvbmUgbmV4dCB0byBCQUNLU1BBQ0UgYW5kIG9uZSBuZXh0IHRvIEVOVEVSKS4KICogT3RoZXJzIHB1dCB0aGUgYWN1dGUgYW5kIGdyYXZlIGFjY2VudHMgb24gdGhlIGtleSBsZWZ0IG9mIEJBQ0tTUEFDRS4KICogTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmQubyBidWd0cmFja2VyOgogKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUxNAogKiBLZXlzIHJlYWNoYWJsZSB2aWEgQWx0R3IgKEAsIFtdLCB+LCBcLCB8LCB7fSkgZGlmZmVyIGNvbXBsZXRlbHkKICogYW1vbmcgUEMgYW5kIE1hYyBrZXlib2FyZHMsIHNvIHRoZXNlIGFyZSBub3QgbGlzdGVkLgogKi8KCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRlIFstdmFyaWFudCBub2RlYWRrZXlzfGRlYWRhY3V0ZSBldGMuXSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi3z8iLCIiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIiMnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjaCAtdmFyaWFudCBkZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0dbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSsiLCIyXCIiLCIzKiIsIjTnIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCJeYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL86CIsIqghIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL26SIsIuTgIiwiJKMiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGZyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRltNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIuj8IiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIun2Iiwi4OQiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBPdmUgS+V2ZW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X05PW01BSU5fTEVOXVs0XSA9CnsKICJ8pyIsIjEhIiwiMlwiQCIsIjMjoyIsIjSkJCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCIrPyIsIlxcYLQiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvjYIiwi5sYiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZGspICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0RBW01BSU5fTEVOXVs0XSA9CnsKICK9pyIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCL42CIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3ZWRpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2UpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NFW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEVzdG9uaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGVlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FVFtNQUlOX0xFTl1bNF0gPQp7CiAit34iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwi9dUiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2FfZW5oYW5jZWQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NGW01BSU5fTEVOXVs0XSA9CnsKICIjfFxcIiwiMSGxIiwiMlwiQCIsIjMvoyIsIjQkoiIsIjUlpCIsIjY/rCIsIjcmpiIsIjgqsiIsIjkosyIsIjApvCIsIi1fvSIsIj0rviIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PpyIsInBQtiIsIl5eWyIsIrioXSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzp+IiwiYGB7IiwiPD59IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnLSIsIi4iLCLpySIsCiAiq7uwIgp9OwoKLyoqKiBDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2EgLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBX2ZyW01BSU5fTEVOXVs0XSA9CnsKICIjfCIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjUlIiwiNj8iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXl4iLCK4qCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCJgYCIsIjw+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiwnIiwiLiIsIunJIiwKICKruyIKfTsKCi8qKiogQ2FuYWRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2EpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NBW01BSU5fTEVOXVs0XSA9CnsKICIvXFwiLCIxIbmhIiwiMkCyIiwiMyOzoyIsIjQkvKQiLCI1Jb0iLCI2P74iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/jYIiwicFD+3iIsIl6oqCIsIufHfiIsCiAiYUHmxiIsInNT36ciLCJkRPDQIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzq0Iiwi6MgiLCLgwCIsCiAieloiLCJ4WCIsImNDoqkiLCJ2ViIsImJCIiwibk4iLCJtTbW6IiwiLCciLCIuXCK39yIsIunJIiwKICL52SIKfTsKCi8qKiogUG9ydHVndWVzZSBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBwdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiq7siLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiKyoiLCK0YCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi58ciLCK6qiIsIn5eIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEl0YWxpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjOjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIuxeIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIujpIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvLnIiwi4LAiLCL5pyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBGaW5uaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGZpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9GSVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBCdWxnYXJpYW4gYmRzIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19iZHNbTUFJTl9MRU5dWzRdID0KewogImB+KCkiLCIxISIsIjJAMj8iLCIzIzMrIiwiNCQ0XCIiLCI1JSIsIjZeNj0iLCI3Jjc6IiwiOCo4LyIsIjkoIiwiMCkiLCItXy1JIiwiPSsuViIsCiAicVEs+yIsIndX89MiLCJlReXFIiwiclLoyCIsInRU+NgiLCJ5WfnZIiwidVXqyiIsImlJ8dEiLCJvT+TEIiwicFDnxyIsIlt79tYiLCJdfTsiLAogImFB/NwiLCJzU//fIiwiZETgwCIsImZG7s4iLCJnR+bGIiwiaEjjwyIsImpK8tIiLCJrS+3NIiwibEziwiIsIjs67MwiLCInXCL31yIsIlxcfCfbIiwKICJ6Wv7eIiwieFjpySIsImND+toiLCJ2Vv3dIiwiYkL01CIsIm5O9dUiLCJtTe/PIiwiLDzw0CIsIi4+68siLCIvP+HBIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+99ciLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR/98iLCJ3V+LCIiwiZUXlxSIsInJS8NAiLCJ0VPLSIiwieVn62iIsInVV89MiLCJpSejIIiwib0/uziIsInBQ788iLCJbe/jYIiwiXX352SIsCiAiYUHgwCIsInNT8dEiLCJkROTEIiwiZkb01CIsImdH48MiLCJoSPXVIiwiakrpySIsImtL6soiLCJsTOvLIiwiOzoiLCInXCIiLCJcXHz+3iIsCiAielrnxyIsInhY/NwiLCJjQ/bWIiwidlbmxiIsImJC4cEiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCZWxhcnVzaWFuIHN0YW5kYXJkIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgSGxlYiBWYWxvc2thKSAqLwovKioqIEl0IG1hdGNoZXMgQmVsYXJ1c2lhbiBsYXlvdXQgZm9yIFhLQiBmcm9tIEFsZXhhbmRlciBNaWtoYWlsaWFuICAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JZW01BSU5fTEVOXVs0XSA9CnsKICJgfqOzIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9Prr4iLCJwUNr6IiwiW3vI6CIsIl19JyciLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfC98IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkKmtiIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy4sIiwgIjw+fKYiLAp9OwoKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IFBhdmVsIFJvc2tpbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waGFudG9tW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9rb2k4cltNQUlOX0xFTl1bNF0gPQp7CiAiKCkiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1OiIsIjYsIiwiNy4iLCI4OyIsIjk/IiwiMCUiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXHwiLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9jcDEyNTFbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUenJIiwid1f21iIsImVF89MiLCJyUurKIiwidFTlxSIsInlZ7c0iLCJ1VePDIiwiaUn42CIsIm9P+dkiLCJwUOfHIiwiW3v11SIsIl19+toiLAogImFB9NQiLCJzU/vbIiwiZETiwiIsImZG4MAiLCJnR+/PIiwiaEjw0CIsImpK7s4iLCJrS+vLIiwibEzkxCIsIjs65sYiLCInXCL93SIsIlxcfCIsCiAielr/3yIsInhY99ciLCJjQ/HRIiwidlbszCIsImJC6MgiLCJuTvLSIiwibU383CIsIiw84cEiLCIuPv7eIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUdHxIiwid1fX9yIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2fkiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl193f0iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKyuoiLCJrS8vrIiwibEzM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wtr6IiwieFjY+CIsImNDw+MiLCJ2Vtb2IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBW01BSU5fTEVOXVs0XSA9CnsKICJgfq29IiwiMSExISIsIjJAMlwiIiwiMyMzJyIsIjQkNCoiLCI1JTU6IiwiNl42LCIsIjcmNy4iLCI4Kjg7IiwiOSg5KCIsIjApMCkiLCItXy1fIiwiPSs9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfae3IiwKICJhQcbmIiwic1OmtiIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wipLQiLCJcXHxcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Lz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgYnkgTy4gTnlreWZvcmNoeW4gKi8KLyoqKiAgKGFzIGl0IGFwcGVhcnMgb24gbW9zdCBvZiBrZXlib2FyZHMgc29sZCB0b2RheSkgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQV9zdGRbTUFJTl9MRU5dWzRdID0KewogIq29IiwiMSEiLCIyXCIiLCIzJyIsIjQ7IiwiNSUiLCI2OiIsIjc/IiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIqe3IiwKICLG5iIsIqa2Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsIqS0IiwiXFwvIiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIuLCIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKHBhaXIgdG8gdGhlIHByZXZpb3VzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9zdGRbTUFJTl9MRU5dWzRdID0KewogIqOzIiwiMSEiLCIyXCIiLCIzJyIsIjQ7IiwiNSUiLCI2OiIsIjc/IiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFwvIiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIuLCIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTcGFuaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FU1tNQUlOX0xFTl1bNF0gPQp7CiAiuqoiLCIxISIsIjJcIiIsIjO3IiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqG/IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsImBeIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvHRIiwitKgiLCLnxyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBCZWxnaWFuIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JFW01BSU5fTEVOXVs0XSA9CnsKICIiLCImMXwiLCLpMkAiLCJcIjMjIiwiJzQiLCIoNSIsIqc2XiIsIug3IiwiITgiLCLnOXsiLCLgMH0iLCIpsCIsIi1fIiwKICJhQSIsInpaIiwiZUWkIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqFsiLCIkKl0iLAogInFRIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvkltCIsIrWjYCIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiPSt+IiwKICI8PlxcIgp9OwoKLyoqKiBIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hVW01BSU5fTEVOXVs0XSA9CnsKICIwpyIsIjEnIiwiMlwiIiwiMysiLCI0ISIsIjUlIiwiNi8iLCI3PSIsIjgoIiwiOSkiLCL21iIsIvzcIiwi89MiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi9dUiLCL62iIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6ckiLCLhwSIsIvvbIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAi7c0iCn07CgovKioqIFBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JqciLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUXqyiIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT/PTIiwicFAiLCJbeyIsIl19IiwKICJhQbGhIiwic1O2piIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMs6MiLCI7OiIsIidcIiIsIlxcfCIsCiAielq/ryIsInhYvKwiLCJjQ+bGIiwidlYiLCJiQiIsIm5O8dEiLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc2kpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0lbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICKpuSIsIqq6IiwixeUiLCLS8iIsItT0Iiwi2voiLCLV9SIsIsnpIiwiz+8iLCLQ8CIsItv7IiwiW10iLAogIsHhIiwi0/MiLCLE5CIsIsbmIiwix+ciLCLI6CIsIqi4Iiwiy+siLCLM7CIsIt7+Iiwiq7siLCItXyIsCiAiobEiLCKvvyIsIsPjIiwi1/ciLCLC4iIsIs7uIiwize0iLCIsOyIsIi46Iiwi1vYiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxzcikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19TUltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAMlwiIiwiMyMiLCI0JCIsIjUlIiwiNl42JiIsIjcmNy8iLCI4KjgoIiwiOSg5KSIsIjApMD0iLCItXyc/IiwiPSsrKiIsCiAicVGpuSIsIndXqroiLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdr6IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfVtdIiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSqi4Iiwia0vL6yIsImxMzOwiLCI7Ot7+IiwiJ1wiq7siLCJcXHwtXyIsCiAielqhsSIsInhYr78iLCJjQ8PjIiwidlbX9yIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8LDsiLCIuPi46IiwiLz/W9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgc3BlY2lmaWMgZm9yIG1lIDxqZWxseUBzcmsuZmVyLmhyPiAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSX2plbGx5W01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbe7mpIiwiXX3w0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzroyCIsIidcIubGIiwiXFx8vq4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGhyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0hSW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCIvPyIsCiAiPD4iCn07CgovKioqIEphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9qcDEwNltNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjB+IiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfbWFjanBbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJefiIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAYCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJfXyIsCn07CgovKioqIEphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9wYzk4eDFbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwIiwiLT0iLCJeYCIsIlxcfCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJAfiIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7KyIsIjoqIiwiXX0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXF8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUmF1bCBHb21lcyBGZXJuYW5kZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyW01BSU5fTEVOXVs0XSA9CnsKICInXCIiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNqgiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwitGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi58ciLCJ+XiIsIl19IiwKICJcXHwiLCJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/IiwKfTsKCi8qKiogQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgd2l0aCA8QUxUIEdSPiAoY29udHJpYnV0ZWQgYnkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVF9icl9hbHRfZ3JbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhOSIsIjJAMiIsIjMjMyIsIjQkIyIsIjUlXCIiLCI2KCwiLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsnIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIjRgIiwiW3sqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJnRyIsIn5eIiwiXX06IiwKICJcXHwiLCJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCI7OiIsIi8/MCIKfTsKCi8qKiogVVMgaW50ZXJuYXRpb25hbCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEd1c3Rhdm8gTm9yb25oYSAoa292QGRlYmlhbi5vcmcpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU19pbnRsW01BSU5fTEVOXVs0XSA9CnsKICAiYH4iLCAiMSEiLCAiMkAiLCAiMyMiLCAiNCQiLCAiNSUiLCAiNl4iLCAiNyYiLCAiOCoiLCAiOSgiLCAiMCkiLCAiLV8iLCAiPSsiLCAiXFx8IiwKICAicVEiLCAid1ciLCAiZUUiLCAiclIiLCAidFQiLCAieVkiLCAidVUiLCAiaUkiLCAib08iLCAicFAiLCAiW3siLCAiXX0iLAogICJhQSIsICJzUyIsICJkRCIsICJmRiIsICJnRyIsICJoSCIsICJqSiIsICJrSyIsICJsTCIsICI7OiIsICInXCIiLAogICJ6WiIsICJ4WCIsICJjQyIsICJ2ViIsICJiQiIsICJuTiIsICJtTSIsICIsPCIsICIuPiIsICIvPyIKfTsKCi8qKiogU2xvdmFrIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfaWJtKHNrX3F3ZXJ0eSkgaW4geGtic2VsKQogIC0gZGVhZF9hYm92ZXJpbmcgcmVwbGFjZWQgd2l0aCBkZWdyZWUgLSBubyBzeW1ib2wgaW4gaXNvODg1OS0yCiAgLSBicm9rZW5iYXIgcmVwbGFjZWQgd2l0aCBiYXIJCQkJCSovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NLW01BSU5fTEVOXVs0XSA9CnsKICI7MCIsIisxIiwitTIiLCK5MyIsIug0IiwiuzUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCIndiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIuQoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL0XCIiLCKnISIsIvIpIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGN6KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWltNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwIiwiPSUiLCK0tyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6LyIsIikoIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL5XCIiLCKnISIsIqgnIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw/IiwiLjoiLCItXyIsCiAiXFwiCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGN6X3F3ZXJ0eSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ1pfcXdlcnR5W01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogU2xvdmFrIGFuZCBDemVjaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQgKHNlZSBjc3NrX2R1YWwoY3Nfc2tfdWN3KSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tfcHJvZ1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR5MQiLCJ3V+zMIiwiZUXpySIsInJS+NgiLCJ0VLurIiwieVn93SIsInVV+dkiLCJpSe3NIiwib0/z0yIsInBQ9tYiLCJbeyIsIl19IiwKICJhQeHBIiwic1O5qSIsImRE788iLCJmRuvLIiwiZ0fgwCIsImhI+toiLCJqSvzcIiwia0v01CIsImxMtaUiLCI7OiIsIidcIiIsIlxcfCIsCiAielq+riIsInhYpCIsImND6MgiLCJ2VufHIiwiYkIiLCJuTvLSIiwibU3lxSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEN6ZWNoIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfaWJtKGNzX3F3ZXJ0eSkgaW4geGtic2VsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DU1tNQUlOX0xFTl1bNF0gPQp7CiAiOyIsIisxIiwi7DIiLCK5MyIsIug0Iiwi+DUiLCK+NiIsIv03Iiwi4TgiLCLtOSIsIukwvSkiLCI9JSIsIiIsCiAicVFcXCIsIndXfCIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL6L1t7IiwiKShdfSIsCiAiYUEiLCJzU/AiLCJkRNAiLCJmRlsiLCJnR10iLCJoSCIsImpKIiwia0uzIiwibEyjIiwi+VwiJCIsIqch3yIsIqgnIiwKICJ6Wj4iLCJ4WCMiLCJjQyYiLCJ2VkAiLCJiQnsiLCJuTn0iLCJtTSIsIiw/PCIsIi46PiIsIi1fKiIsCiAiPD5cXHwiCn07CgovKioqIExhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR2FicmllbCBPcmxhbmRvIEdhcmNpYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTEFbTUFJTl9MRU5dWzRdID0KewogInywIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCK/oSIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwitKgiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCJ7W14iLCJ9XSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBMaXRodWFuaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGx0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MVF9CW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIuDAIiwi6MgiLCLmxiIsIuvLIiwi4cEiLCLw0CIsIvjYIiwi+9siLCKlKCIsIrQpIiwiLV8iLCL+3iIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidcIiIsIlxcfCIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIqqsIgp9OwoKLyoqKiBUdXJraXNoIGtleWJvYXJkIExheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9US1tNQUlOX0xFTl1bNF0gPQp7CiJcIukiLCIxISIsIjInIiwiM14jIiwiNCskIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIio/XFwiLCItXyIsCiJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCL9Se4iLCJvTyIsInBQIiwi8NAiLCL83H4iLAoiYUHmIiwic1PfIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL+3iIsImndIiwiLDtgIiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46Igp9OwoKLyoqKiBUdXJraXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHRyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9UUltNQUlOX0xFTl1bNF0gPQp7CiJcIlxcIiwiMSEiLCIyJyIsIjNeIiwiNCsiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIqPyIsIi1fIiwKInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiXHhiOUkiLCJvTyIsInBQIiwiXHhiYlx4YWIiLCL83CIsCiJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJceGJhXHhhYSIsImlcMCIsIiw7IiwKInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwi9tYiLCLnxyIsIi46IiwKIjw+Igp9OwoKLyoqKiBUdXJraXNoIEYga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHJmKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9UUl9GW01BSU5fTEVOXVs0XSA9CnsKIisqIiwiMSEiLCIyXCIiLCIzXiMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwPSIsIi8/IiwiLV8iLAoiZkYiLCJnRyIsIlx4YmJceGFiIiwiXHhiOUkiLCJvTyIsImREIiwiclIiLCJuTiIsImhIIiwicFAiLCJxUSIsIndXIiwKInVVIiwiaVwwIiwiZUUiLCJhQSIsIvzcIiwidFQiLCJrSyIsIm1NIiwibEwiLCJ5WSIsIlx4YmFceGFhIiwieFgiLAoiakoiLCL21iIsInZWIiwiY0MiLCLnxyIsInpaIiwic1MiLCJiQiIsIi46IiwiLDsiLAoiPD4iCn07CgovKioqIElzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxbTUFJTl9MRU5dWzRdID0KewogImB+OyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEvIiwid1cnIiwiZUX3IiwiclL4IiwidFTgIiwieVnoIiwidVXlIiwiaUnvIiwib0/tIiwicFD0IiwiW3siLCJdfSIsCiAiYUH5Iiwic1PjIiwiZETiIiwiZkbrIiwiZ0fyIiwiaEjpIiwiakrnIiwia0vsIiwibEzqIiwiOzrzIiwiXCdcIiwiLCJcXHwiLAogInpa5iIsInhY8SIsImND4SIsInZW5CIsImJC8CIsIm5O7iIsIm1N9iIsIiw8+iIsIi4+9SIsIi8/LiIsCiAiPD4iCn07CgovKioqIElzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB1cyxpbF9waG9uZXRpYykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfcGhvbmV0aWNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUfciLCJ3V+UiLCJlReAiLCJyUvgiLCJ0VPoiLCJ5WfIiLCJ1VeUiLCJpSekiLCJvT/EiLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU/kiLCJkROMiLCJmRvQiLCJnR+IiLCJoSOQiLCJqSukiLCJrS+siLCJsTOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlblIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgLXN5bWJvbHMgInVzKHBjMTA1KStpbF9zYWhhcm9uIikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSUxfc2FoYXJvbltNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX8SIsImVFIiwiclL4IiwidFToIiwieVnjIiwidVUiLCJpSSIsIm9PIiwicFD0IiwiW3siLCJdfSIsCiAiYUHgIiwic1PlIiwiZETsIiwiZkb6IiwiZ0fiIiwiaEjkIiwiakr5Iiwia0vrIiwibEzpIiwiOzoiLCInXCIiLCJcXHwiLAogInpa5iIsInhY5yIsImND9iIsInZW8iIsImJC4SIsIm5O8CIsIm1N7iIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIEdyZWVrIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgS3JpdG9uIEt5cmltaXMgPGt5cmltaXNAY3RpLmdyPikKICBHcmVlayBjaGFyYWN0ZXJzIGZvciAid1ciIGFuZCAic1MiIGFyZSBvbWl0dGVkIHRvIG5vdCBwcm9kdWNlIGEgbWlzbWF0Y2gKICBtZXNzYWdlIHNpbmNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVycyBpbiBnciBhbmQgZWwgWEZyZWU4NiBsYXlvdXRzLiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9FTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFROzoiLCJ3VyIsImVF5cUiLCJyUvHRIiwidFT01CIsInlZ9dUiLCJ1VejIIiwiaUnpySIsIm9P788iLCJwUPDQIiwiW3siLCJdfSIsCiAiYUHhwSIsInNTIiwiZETkxCIsImZG9tYiLCJnR+PDIiwiaEjnxyIsImpK7s4iLCJrS+rKIiwibEzryyIsIjs6tKgiLCInXCIiLCJcXHwiLAogInpa5sYiLCJ4WPfXIiwiY0P42CIsInZW+dkiLCJiQuLCIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBUaGFpIChLZWRtYW5lZSkga2V5Ym9hcmQgbGF5b3V0IGJ5IFN1cHBoYWNob2tlIFN1bnRpd2ljaGF5YSA8bXJjaG9rZUBvcGVudGxlLm9yZz4gKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdGhbTUFJTl9MRU5dWzRdID0KewogImB+XyUiLCIxIeUrIiwiMkAv8SIsIjMjLfIiLCI0JMDzIiwiNSW29CIsIjZe2NkiLCI3JtbfIiwiOCqk9SIsIjkotfYiLCIwKaj3IiwiLV+i+CIsIj0rqvkiLAogInFR5vAiLCJ3V+RcIiIsImVF064iLCJyUr6xIiwidFTQuCIsInlZ0e0iLCJ1VdXqIiwiaUnDsyIsIm9Puc8iLCJwUMKtIiwiW3u6sCIsIl19xSwiLAogImFBv8QiLCJzU8umIiwiZEShryIsImZGtOIiLCJnR+CsIiwiaEjp5yIsImpK6OsiLCJrS9LJIiwibEzKyCIsIjs6x6siLCJcJ1wipy4iLCJcXHyjpSIsCiAielq8KCIsInhYuykiLCJjQ+GpIiwidlbNziIsImJC2iIsIm5O1+wiLCJtTbc/IiwiLDzBsiIsIi4+48wiLCIvP73GIgp9OyAKCi8qKiogVk5DIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3ZuY1tNQUlOX0xFTl0gPQp7CiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MUEsMHgxQiwweDI3LDB4MjgsMHgyOSwweDMzLDB4MzQsMHgzNSwweDJCLAogICAweDFFLDB4MzAsMHgyRSwweDIwLDB4MTIsMHgyMSwweDIyLDB4MjMsMHgxNywweDI0LDB4MjUsMHgyNiwweDMyLDB4MzEsMHgxOCwweDE5LDB4MTAsMHgxMywweDFGLDB4MTQsMHgxNiwweDJGLDB4MTEsMHgyRCwweDE1LDB4MkMsCiAgIDB4NTYKfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfdm5jW01BSU5fTEVOXSA9CnsKICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fNCxWS19PRU1fNixWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fMyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMixWS19PRU1fNSwKICAgJ0EnLCdCJywnQycsJ0QnLCdFJywnRicsJ0cnLCdIJywnSScsJ0onLCdLJywnTCcsJ00nLCdOJywnTycsJ1AnLCdRJywnUicsJ1MnLCdUJywnVScsJ1YnLCdXJywnWCcsJ1knLCdaJywKICAgVktfT0VNXzEwMgp9OwoKc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfdm5jW01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLCJbeyIsIl19IiwiOzoiLCInXCIiLCJgfiIsIiw8IiwiLj4iLCIvPyIsIlxcfCIsCiAiYUEiLCJiQiIsImNDIiwiZEQiLCJlRSIsImZGIiwiZ0ciLCJoSCIsImlJIiwiakoiLCJrSyIsImxMIiwibU0iLCJuTiIsIm9PIiwicFAiLCJxUSIsInJSIiwic1MiLCJ0VCIsInVVIiwidlYiLCJ3VyIsInhYIiwieVkiLCJ6WiIKfTsKCi8qKiogRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbmwpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTkxbTUFJTl9MRU5dWzRdID0KewogIkCnIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjdfIiwiOCgiLCI5KSIsIjAnIiwiLz8iLCKwfiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCKofiIsIip8IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCIrsSIsIidgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi09IiwKICJbXSIKfTsKCgoKLyoqKiBMYXlvdXQgdGFibGUuIEFkZCB5b3VyIGtleWJvYXJkIG1hcHBpbmdzIHRvIHRoaXMgbGlzdCAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIExDSUQgbGNpZDsgLyogaW5wdXQgbG9jYWxlIGlkZW50aWZpZXIsIGxvb2sgZm9yIExPQ0FMRV9JTEFOR1VBR0UKICAgICAgICAgICAgICAgICBpbiB0aGUgYXBwcm9wcmlhdGUgZGxscy9rZXJuZWwvbmxzLy5ubHMgZmlsZSAqLwogICAgY29uc3QgY2hhciAqY29tbWVudDsKICAgIGNvbnN0IGNoYXIgKCprZXkpW01BSU5fTEVOXVs0XTsKICAgIGNvbnN0IFdPUkQgKCpzY2FuKVtNQUlOX0xFTl07IC8qIHNjYW4gY29kZXMgbWFwcGluZyAqLwogICAgY29uc3QgV09SRCAoKnZrZXkpW01BSU5fTEVOXTsgLyogdmlydHVhbCBrZXkgY29kZXMgbWFwcGluZyAqLwp9IG1haW5fa2V5X3RhYltdPXsKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChwaGFudG9tIGtleSB2ZXJzaW9uKSIsICZtYWluX2tleV9VU19waGFudG9tLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKGR2b3JhaykiLCAmbWFpbl9rZXlfVVNfZHZvcmFrLCAmbWFpbl9rZXlfc2Nhbl9kdm9yYWssICZtYWluX2tleV92a2V5X2R2b3Jha30sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBJbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VU19pbnRsLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODA5LCAiQnJpdGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVUssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RFLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwODA3LCAiU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MTAwYywgIlN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWQsICJTd2VkaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfdjJ9LAogezB4MDQyNSwgIkVzdG9uaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNCwgIk5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTk8sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDYsICJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBjLCAiRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChDQV9mcikiLCAmbWFpbl9rZXlfQ0FfZnIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0EsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MGMsICJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MDgxNiwgIlBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFRfYnIsICZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgQUxUIEdSIiwgJm1haW5fa2V5X1BUX2JyX2FsdF9nciwmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQwYiwgIkZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfYmRzLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMywgIkJlbGFydXNpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JZLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfUlVfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiIsICZtYWluX2tleV9SVV9rb2k4ciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSIsICZtYWluX2tleV9SVV9jcDEyNTEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVV9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIiwgJm1haW5fa2V5X1VBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1VBX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfUlVfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTAsICJJdGFsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZiwgIkljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGUsICJIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDE1LCAiUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNCwgIlNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCBzciIsICZtYWluX2tleV9TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgdXMsc3IiLCAmbWFpbl9rZXlfVVNfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc3BlY2lmaWMpIiwgJm1haW5fa2V5X0hSX2plbGx5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDExLCAiSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9qcDEwNiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZ9LAogezB4MDQxMSwgIkphcGFuZXNlIE1hYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfbWFjanAsICZtYWluX2tleV9zY2FuX3F3ZXJ0eV9tYWNqcCwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X21hY2pwfSwKIHsweDA0MTEsICJKYXBhbmVzZSBwYzk4eDEga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX3BjOTh4MSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsgYW5kIEN6ZWNoIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyIsICZtYWluX2tleV9TS19wcm9nLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6IiwgJm1haW5fa2V5X0NaLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDA1LCAiQ3plY2gga2V5Ym9hcmQgbGF5b3V0IGN6X3F3ZXJ0eSIsICZtYWluX2tleV9DWl9xd2VydHksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGEsICJMYXRpbiBBbWVyaWNhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTEEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjcsICJMaXRodWFuaWFuIChCYWx0aWMpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MVF9CLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfVEssICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0ciIsICZtYWluX2tleV9UUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyZiIsICZtYWluX2tleV9UUl9GLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUxfc2FoYXJvbiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwOSwgIlZOQyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdm5jLCAmbWFpbl9rZXlfc2Nhbl92bmMsICZtYWluX2tleV92a2V5X3ZuY30sCiB7MHgwNDA4LCAiR3JlZWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFlLCAiVGhhaSAoS2VkbWFuZWUpICBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfdGgsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTMsICJEdXRjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTkwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKCiB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KfTsKc3RhdGljIHVuc2lnbmVkIGtiZF9sYXlvdXQ9MDsgLyogaW5kZXggaW50byBhYm92ZSB0YWJsZSBvZiBsYXlvdXRzICovCgovKiBtYXliZSBtb3JlIG9mIHRoZXNlIHNjYW5jb2RlcyBzaG91bGQgYmUgZXh0ZW5kZWQ/ICovCiAgICAgICAgICAgICAgICAvKiBleHRlbmRlZCBtdXN0IGJlIHNldCBmb3IgQUxUX1IsIENUUkxfUiwKICAgICAgICAgICAgICAgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKICAgICAgICAgICAgICAgICAgIGtleXBhZCAvIGFuZCBrZXlwYWQgRU5URVIgKFNESyAzLjEgVm9sLjMgcCAxMzgpICovCiAgICAgICAgICAgICAgICAvKiBGSVhNRSBzaG91bGQgd2Ugc2V0IGV4dGVuZGVkIGJpdCBmb3IgTnVtTG9jayA/IE15CiAgICAgICAgICAgICAgICAgKiBXaW5kb3dzIGRvZXMgLi4uIERGICovCiAgICAgICAgICAgICAgICAvKiBZZXMsIHRvIGRpc3Rpbmd1aXNoIGJhc2VkIG9uIHNjYW4gY29kZXMsIGFsc28KICAgICAgICAgICAgICAgICAgIGZvciBQcnRTY24ga2V5IC4uLiBHQSAqLwoKc3RhdGljIGNvbnN0IFdPUkQgbm9uY2hhcl9rZXlfdmtleVsyNTZdID0KewogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIFZLX0JBQ0ssIFZLX1RBQiwgMCwgVktfQ0xFQVIsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYyOCAqLwogICAgMCwgVktfSEFOR1VMLCAwLCAwLCBWS19IQU5KQSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCBWS19SSUdIVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTAgKi8KICAgIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwwLDAsIFZLX0FQUFMsIC8qIEZGNjAgKi8KICAgIDAsIFZLX0NBTkNFTCwgVktfSEVMUCwgVktfQ0FOQ0VMLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8qIEZGNjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19OVU1MT0NLLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCiAgICBWS19SSUdIVCwgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICBWS19FTkQsIFZLX0NMRUFSLCBWS19JTlNFUlQsIFZLX0RFTEVURSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTAgKi8KICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIC8qIFdpbmRvd3MgYWx3YXlzIGdlbmVyYXRlcyBWS19ERUNJTUFMIGZvciBEZWwvLiBvbiBrZXlwYWQgd2hpbGUgc29tZQogICAgICogWDExIGtleWJvYXJkIGxheW91dHMgZ2VuZXJhdGUgWEtfS1BfU2VwYXJhdG9yIGluc3RlYWQgb2YgWEtfS1BfRGVjaW1hbAogICAgICogaW4gb3JkZXIgdG8gcHJvZHVjZSBhIGxvY2FsZSBkZXBlbmRlbnQgbnVtZXJpYyBzZXBhcmF0b3IuCiAgICAgKi8KICAgIFZLX0RFQ0lNQUwsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgVktfT0VNX05FQ19FUVVBTCwgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgVktfRjE3LCBWS19GMTgsIC8qIEZGQzggKi8KICAgIFZLX0YxOSwgVktfRjIwLCBWS19GMjEsIFZLX0YyMiwgVktfRjIzLCBWS19GMjQsIDAsIDAsICAgICAgIC8qIEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDAsIFZLX0xTSElGVCwgVktfUlNISUZULCBWS19MQ09OVFJPTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIFZLX1JDT05UUk9MLCBWS19DQVBJVEFMLCAwLCBWS19MTUVOVSwKICAgIFZLX1JNRU5VLCBWS19MTUVOVSwgVktfUk1FTlUsIFZLX0xXSU4sIFZLX1JXSU4sIDAsIDAsIDAsICAgIC8qIEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0RFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRjggKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3NjYW5bMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgMHgwRSwgMHgwRiwgMHgwMCwgLyo/Ki8gMCwgMHgwMCwgMHgxQywgMHgwMCwgMHgwMCwgICAgICAgICAgIC8qIEZGMDggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYyMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgMHgxNDcsIDB4MTRCLCAweDE0OCwgMHgxNEQsIDB4MTUwLCAweDE0OSwgMHgxNTEsIDB4MTRGLCAgICAgIC8qIEZGNTAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjU4ICovCiAgICAvKiBtaXNjIGtleXMgKi8KICAgIC8qPyovIDAsIDB4MTM3LCAvKj8qLyAwLCAweDE1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNUQsICAgICAvKiBGRjYwICovCiAgICAvKj8qLyAwLCAvKj8qLyAwLCAweDM4LCAweDE0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgLyogRkY2OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGNzAgKi8KICAgIC8qIGtleXBhZCBrZXlzICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE0NSwgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTFDLCAweDAwLCAweDAwLCAgICAgICAgICAgICAvKiBGRjg4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDRCLCAweDQ4LCAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgMHg0RCwgMHg1MCwgMHg0OSwgMHg1MSwgMHg0RiwgMHg0QywgMHg1MiwgMHg1MywgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAweDAwLCAweDAwLCAweDM3LCAweDRFLCAweDUzLCAweDRBLCAweDUzLCAweDEzNSwgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgMHg1MiwgMHg0RiwgMHg1MCwgMHg1MSwgMHg0QiwgMHg0QywgMHg0RCwgMHg0NywgICAgICAgICAgICAgIC8qIEZGQjAgKi8KICAgIDB4NDgsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCiAgICAvKiBmdW5jdGlvbiBrZXlzICovCiAgICAweDNCLCAweDNDLAogICAgMHgzRCwgMHgzRSwgMHgzRiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgICAgICAgICAgICAgIC8qIEZGQzAgKi8KICAgIDB4NTcsIDB4NTgsIDB4NUIsIDB4NUMsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkM4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDB4MDAsIDB4MkEsIDB4MTM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAvKiBGRkUwICovCiAgICAweDEzOCwgMHgzOCwgMHgxMzgsIDB4MTViLCAweDE1YywgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgLyogRkZFOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTUzICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVsyNTZdID0KewogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjA4ICovCiAgICAwLCBWS19WT0xVTUVfRE9XTiwgVktfVk9MVU1FX01VVEUsIFZLX1ZPTFVNRV9VUCwgICAgICAgICAgICAvKiAxMDA4RkYxMCAqLwogICAgVktfTUVESUFfUExBWV9QQVVTRSwgVktfTUVESUFfU1RPUCwKICAgIFZLX01FRElBX1BSRVZfVFJBQ0ssIFZLX01FRElBX05FWFRfVFJBQ0ssCiAgICAwLCBWS19MQVVOQ0hfTUFJTCwgMCwgVktfQlJPV1NFUl9TRUFSQ0gsICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYxOCAqLwogICAgMCwgMCwgMCwgVktfQlJPV1NFUl9IT01FLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgVktfQlJPV1NFUl9CQUNLLCBWS19CUk9XU0VSX0ZPUldBUkQsICAgICAgLyogMTAwOEZGMjAgKi8KICAgIFZLX0JST1dTRVJfU1RPUCwgVktfQlJPV1NFUl9SRUZSRVNILCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgIC8qIDEwMDhGRjI4ICovCiAgICBWS19CUk9XU0VSX0ZBVk9SSVRFUywgMCwgVktfTEFVTkNIX01FRElBX1NFTEVDVCwgMCwgICAgICAgICAvKiAxMDA4RkYzMCAqLwogICAgMCwgMCwgMCwgMCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY0MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY3MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjgwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGOTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjk4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZBMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkUwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkY4ICovCn07CgpzdGF0aWMgaW5saW5lIEtleVN5bSBrZXljb2RlX3RvX2tleXN5bSggRGlzcGxheSAqZGlzcGxheSwgS2V5Q29kZSBrZXljb2RlLCBpbnQgaW5kZXggKQp7CiNpZmRlZiBIQVZFX1hLQgogICAgaWYgKHVzZV94a2IpIHJldHVybiBYa2JLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgMCwgaW5kZXgpOwojZW5kaWYKICAgIHJldHVybiBrZXlfbWFwcGluZ1soa2V5Y29kZSAtIG1pbl9rZXljb2RlKSAqIGtleXN5bXNfcGVyX2tleWNvZGUgKyBpbmRleF07Cn0KCi8qIFJldHVybnMgdGhlIFdpbmRvd3MgdmlydHVhbCBrZXkgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFggZXZlbnQgPGU+ICovCi8qIGtiZF9zZWN0aW9uIG11c3QgYmUgaGVsZCAqLwpzdGF0aWMgV09SRCBFVkVOVF9ldmVudF90b192a2V5KCBYSUMgeGljLCBYS2V5RXZlbnQgKmUpCnsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgU3RhdHVzIHN0YXR1czsKICAgIGNoYXIgYnVmWzI0XTsKCiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZyAqLwogICAgaWYgKHhpYyAmJiBlLT50eXBlID09IEtleVByZXNzKQogICAgICAgIFhtYkxvb2t1cFN0cmluZyh4aWMsIGUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgZWxzZQogICAgICAgIFhMb29rdXBTdHJpbmcoZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CgogICAgaWYgKChlLT5zdGF0ZSAmIE51bUxvY2tNYXNrKSAmJgogICAgICAgIChrZXlzeW0gPT0gWEtfS1BfU2VwYXJhdG9yIHx8IGtleXN5bSA9PSBYS19LUF9EZWNpbWFsIHx8CiAgICAgICAgIChrZXlzeW0gPj0gWEtfS1BfMCAmJiBrZXlzeW0gPD0gWEtfS1BfOSkpKQogICAgICAgIC8qIE9ubHkgdGhlIEtleXBhZCBrZXlzIDAtOSBhbmQgLiBzZW5kIGRpZmZlcmVudCBrZXlzeW1zCiAgICAgICAgICogZGVwZW5kaW5nIG9uIHRoZSBOdW1Mb2NrIHN0YXRlICovCiAgICAgICAgcmV0dXJuIG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhGRl07CgogICAgLyogUHJlc3NpbmcgdGhlIFBhdXNlL0JyZWFrIGtleSBhbG9uZSBwcm9kdWNlcyBWS19QQVVTRSB2a2V5LCB3aGlsZQogICAgICogcHJlc3NpbmcgQ3RybCtQYXVzZS9CcmVhayBwcm9kdWNlcyBWS19DQU5DRUwuICovCiAgICBpZiAoKGUtPnN0YXRlICYgQ29udHJvbE1hc2spICYmIChrZXlzeW0gPT0gWEtfQnJlYWspKQogICAgICAgIHJldHVybiBWS19DQU5DRUw7CgogICAgVFJBQ0VfKGtleSkoImUtPmtleWNvZGUgPSAldVxuIiwgZS0+a2V5Y29kZSk7CgogICAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQKICovCnN0YXRpYyB2b2lkIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBIV05EIGh3bmQsIFdPUkQgdmtleSwgV09SRCBzY2FuLCBEV09SRCBmbGFncywgRFdPUkQgdGltZSApCnsKICAgIElOUFVUIGlucHV0OwoKICAgIFRSQUNFXyhrZXkpKCAiaHduZCAlcCB2a2V5PSUwNHggc2Nhbj0lMDR4IGZsYWdzPSUwNHhcbiIsIGh3bmQsIHZrZXksIHNjYW4sIGZsYWdzICk7CgogICAgaW5wdXQudHlwZSAgICAgICAgICAgICA9IElOUFVUX0tFWUJPQVJEOwogICAgaW5wdXQudS5raS53VmsgICAgICAgICA9IHZrZXk7CiAgICBpbnB1dC51LmtpLndTY2FuICAgICAgID0gc2NhbjsKICAgIGlucHV0LnUua2kuZHdGbGFncyAgICAgPSBmbGFnczsKICAgIGlucHV0LnUua2kudGltZSAgICAgICAgPSB0aW1lOwogICAgaW5wdXQudS5raS5kd0V4dHJhSW5mbyA9IDA7CgogICAgX193aW5lX3NlbmRfaW5wdXQoIGh3bmQsICZpbnB1dCApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBnZXRfYXN5bmNfa2V5X3N0YXRlCiAqLwpzdGF0aWMgQk9PTCBnZXRfYXN5bmNfa2V5X3N0YXRlKCBCWVRFIHN0YXRlWzI1Nl0gKQp7CiAgICBCT09MIHJldDsKCiAgICBTRVJWRVJfU1RBUlRfUkVRKCBnZXRfa2V5X3N0YXRlICkKICAgIHsKICAgICAgICByZXEtPnRpZCA9IDA7CiAgICAgICAgcmVxLT5rZXkgPSAtMTsKICAgICAgICB3aW5lX3NlcnZlcl9zZXRfcmVwbHkoIHJlcSwgc3RhdGUsIDI1NiApOwogICAgICAgIHJldCA9ICF3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBzZXRfYXN5bmNfa2V5X3N0YXRlCiAqLwpzdGF0aWMgdm9pZCBzZXRfYXN5bmNfa2V5X3N0YXRlKCBjb25zdCBCWVRFIHN0YXRlWzI1Nl0gKQp7CiAgICBTRVJWRVJfU1RBUlRfUkVRKCBzZXRfa2V5X3N0YXRlICkKICAgIHsKICAgICAgICByZXEtPnRpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwogICAgICAgIHJlcS0+YXN5bmMgPSAxOwogICAgICAgIHdpbmVfc2VydmVyX2FkZF9kYXRhKCByZXEsIHN0YXRlLCAyNTYgKTsKICAgICAgICB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwp9CgpzdGF0aWMgdm9pZCB1cGRhdGVfa2V5X3N0YXRlKCBCWVRFICprZXlzdGF0ZSwgQllURSBrZXksIGludCBkb3duICkKewogICAgaWYgKGRvd24pCiAgICB7CiAgICAgICAgaWYgKCEoa2V5c3RhdGVba2V5XSAmIDB4ODApKSBrZXlzdGF0ZVtrZXldIF49IDB4MDE7CiAgICAgICAga2V5c3RhdGVba2V5XSB8PSAweDgwOwogICAgfQogICAgZWxzZSBrZXlzdGF0ZVtrZXldICY9IH4weDgwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8Kdm9pZCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgajsKICAgIEJZVEUga2V5c3RhdGVbMjU2XTsKICAgIFdPUkQgdmtleTsKICAgIEJPT0wgY2hhbmdlZCA9IEZBTFNFOwogICAgc3RydWN0IHsKICAgICAgICBXT1JEIHZrZXk7CiAgICAgICAgQk9PTCBwcmVzc2VkOwogICAgfSBtb2RpZmllcnNbNl07IC8qIFZLX0xTSElGVCB0aHJvdWdoIFZLX1JNRU5VIGFyZSBjb250aWd1b3VzICovCgogICAgaWYgKCFnZXRfYXN5bmNfa2V5X3N0YXRlKCBrZXlzdGF0ZSApKSByZXR1cm47CgogICAgbWVtc2V0KG1vZGlmaWVycywgMCwgc2l6ZW9mKG1vZGlmaWVycykpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICAvKiB0aGUgbWluaW11bSBrZXljb2RlIGlzIGFsd2F5cyBncmVhdGVyIG9yIGVxdWFsIHRvIDgsIHNvIHdlIGNhbgogICAgICogc2tpcCB0aGUgZmlyc3QgOCB2YWx1ZXMsIGhlbmNlIHN0YXJ0IGF0IDEKICAgICAqLwogICAgZm9yIChpID0gMTsgaSA8IDMyOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGludCBtOwoKICAgICAgICAgICAgdmtleSA9IGtleWMydmtleVsoaSAqIDgpICsgal07CgogICAgICAgICAgICBzd2l0Y2godmtleSAmIDB4ZmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgY2FzZSBWS19MU0hJRlQ6CiAgICAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgbSA9ICh2a2V5ICYgMHhmZikgLSBWS19MU0hJRlQ7CiAgICAgICAgICAgICAgICAvKiBUYWtlIHRoZSB2a2V5IGZyb20gdGhlIGZpcnN0IGtleWNvZGUgd2UgZW5jb3VudGVyIGZvciB0aGlzIG1vZGlmaWVyICovCiAgICAgICAgICAgICAgICBpZiAoIW1vZGlmaWVyc1ttXS52a2V5KSBtb2RpZmllcnNbbV0udmtleSA9IHZrZXk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbnQtPnhrZXltYXAua2V5X3ZlY3RvcltpXSAmICgxPDxqKSkgbW9kaWZpZXJzW21dLnByZXNzZWQgPSBUUlVFOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZm9yICh2a2V5ID0gVktfTFNISUZUOyB2a2V5IDw9IFZLX1JNRU5VOyB2a2V5KyspCiAgICB7CiAgICAgICAgaW50IG0gPSB2a2V5IC0gVktfTFNISUZUOwogICAgICAgIGlmIChtb2RpZmllcnNbbV0udmtleSAmJiAhKGtleXN0YXRlW3ZrZXldICYgMHg4MCkgIT0gIW1vZGlmaWVyc1ttXS5wcmVzc2VkKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoICJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwKICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyc1ttXS52a2V5LCBrZXlzdGF0ZVt2a2V5XSk7CgogICAgICAgICAgICB1cGRhdGVfa2V5X3N0YXRlKCBrZXlzdGF0ZSwgdmtleSwgbW9kaWZpZXJzW21dLnByZXNzZWQgKTsKICAgICAgICAgICAgY2hhbmdlZCA9IFRSVUU7CiAgICAgICAgfQogICAgfQoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgIGlmICghY2hhbmdlZCkgcmV0dXJuOwoKICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCBWS19DT05UUk9MLCAoa2V5c3RhdGVbVktfTENPTlRST0xdIHwga2V5c3RhdGVbVktfUkNPTlRST0xdKSAmIDB4ODAgKTsKICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCBWS19NRU5VLCAoa2V5c3RhdGVbVktfTE1FTlVdIHwga2V5c3RhdGVbVktfUk1FTlVdKSAmIDB4ODAgKTsKICAgIHVwZGF0ZV9rZXlfc3RhdGUoIGtleXN0YXRlLCBWS19TSElGVCwgKGtleXN0YXRlW1ZLX0xTSElGVF0gfCBrZXlzdGF0ZVtWS19SU0hJRlRdKSAmIDB4ODAgKTsKICAgIHNldF9hc3luY19rZXlfc3RhdGUoIGtleXN0YXRlICk7Cn0KCnN0YXRpYyB2b2lkIHVwZGF0ZV9sb2NrX3N0YXRlKCBIV05EIGh3bmQsIFdPUkQgdmtleSwgVUlOVCBzdGF0ZSwgRFdPUkQgdGltZSApCnsKICAgIEJZVEUga2V5c3RhdGVbMjU2XTsKCiAgICAvKiBOb3RlOiBYIHNldHMgdGhlIGJlbG93IHN0YXRlcyBvbiBrZXkgZG93biBhbmQgY2xlYXJzIHRoZW0gb24ga2V5IHVwLgogICAgICAgV2luZG93cyB0cmlnZ2VycyB0aGVtIG9uIGtleSBkb3duLiAqLwoKICAgIGlmICghZ2V0X2FzeW5jX2tleV9zdGF0ZSgga2V5c3RhdGUgKSkgcmV0dXJuOwoKICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleXN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkgIT0gIShzdGF0ZSAmIExvY2tNYXNrKSAmJiB2a2V5ICE9IFZLX0NBUElUQUwpCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSAwOwogICAgICAgIGlmIChrZXlzdGF0ZVtWS19DQVBJVEFMXSAmIDB4ODApIGZsYWdzIF49IEtFWUVWRU5URl9LRVlVUDsKICAgICAgICBUUkFDRSgiQWRqdXN0aW5nIENhcHNMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleXN0YXRlW1ZLX0NBUElUQUxdKTsKICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgVktfQ0FQSVRBTCwgMHgzYSwgZmxhZ3MsIHRpbWUgKTsKICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggaHduZCwgVktfQ0FQSVRBTCwgMHgzYSwgZmxhZ3MgXiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleXN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkgIT0gIShzdGF0ZSAmIE51bUxvY2tNYXNrKSAmJiAodmtleSAmIDB4ZmYpICE9IFZLX05VTUxPQ0spCiAgICB7CiAgICAgICAgRFdPUkQgZmxhZ3MgPSBLRVlFVkVOVEZfRVhURU5ERURLRVk7CiAgICAgICAgaWYgKGtleXN0YXRlW1ZLX05VTUxPQ0tdICYgMHg4MCkgZmxhZ3MgXj0gS0VZRVZFTlRGX0tFWVVQOwogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlzdGF0ZVtWS19OVU1MT0NLXSk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX05VTUxPQ0ssIDB4NDUsIGZsYWdzLCB0aW1lICk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX05VTUxPQ0ssIDB4NDUsIGZsYWdzIF4gS0VZRVZFTlRGX0tFWVVQLCB0aW1lICk7CiAgICB9CgogICAgLyogQWRqdXN0IHRoZSBTQ1JPTExMT0NLIHN0YXRlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSB3aW5lICovCiAgICBpZiAoIShrZXlzdGF0ZVtWS19TQ1JPTExdICYgMHgwMSkgIT0gIShzdGF0ZSAmIFNjcm9sbExvY2tNYXNrKSAmJiB2a2V5ICE9IFZLX1NDUk9MTCkKICAgIHsKICAgICAgICBEV09SRCBmbGFncyA9IDA7CiAgICAgICAgaWYgKGtleXN0YXRlW1ZLX1NDUk9MTF0gJiAweDgwKSBmbGFncyBePSBLRVlFVkVOVEZfS0VZVVA7CiAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBTY3JMb2NrIHN0YXRlICglIy4yeClcbiIsIGtleXN0YXRlW1ZLX1NDUk9MTF0pOwogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCBWS19TQ1JPTEwsIDB4NDYsIGZsYWdzLCB0aW1lICk7CiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIGh3bmQsIFZLX1NDUk9MTCwgMHg0NiwgZmxhZ3MgXiBLRVlFVkVOVEZfS0VZVVAsIHRpbWUgKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5RXZlbnQKICoKICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICovCnZvaWQgWDExRFJWX0tleUV2ZW50KCBIV05EIGh3bmQsIFhFdmVudCAqeGV2ICkKewogICAgWEtleUV2ZW50ICpldmVudCA9ICZ4ZXYtPnhrZXk7CiAgICBjaGFyIGJ1ZlsyNF07CiAgICBjaGFyICpTdHIgPSBidWY7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIFdPUkQgdmtleSA9IDAsIGJTY2FuOwogICAgRFdPUkQgZHdGbGFnczsKICAgIGludCBhc2NpaV9jaGFyczsKICAgIFhJQyB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBod25kICk7CiAgICBEV09SRCBldmVudF90aW1lID0gRVZFTlRfeDExX3RpbWVfdG9fd2luMzJfdGltZShldmVudC0+dGltZSk7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBUUkFDRV8oa2V5KSgidHlwZSAlZCwgd2luZG93ICVseCwgc3RhdGUgMHglMDR4LCBrZXljb2RlICV1XG4iLAoJCWV2ZW50LT50eXBlLCBldmVudC0+d2luZG93LCBldmVudC0+c3RhdGUsIGV2ZW50LT5rZXljb2RlKTsKCiAgICBpZiAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpIHVwZGF0ZV91c2VyX3RpbWUoIGV2ZW50LT50aW1lICk7CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICB7CiAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgVFJBQ0VfKGtleSkoIlhtYkxvb2t1cFN0cmluZyBuZWVkcyAlaSBieXRlKHMpXG4iLCBhc2NpaV9jaGFycyk7CiAgICAgICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgewogICAgICAgICAgICBTdHIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYXNjaWlfY2hhcnMpOwogICAgICAgICAgICBpZiAoU3RyID09IE5VTEwpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUl8oa2V5KSgiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSFcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIFN0ciwgYXNjaWlfY2hhcnMsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBhc2NpaV9jaGFycyA9IFhMb29rdXBTdHJpbmcoZXZlbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwoKICAgIFRSQUNFXyhrZXkpKCJuYnl0ZSA9ICVkLCBzdGF0dXMgJWRcbiIsIGFzY2lpX2NoYXJzLCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWExvb2t1cENoYXJzKQogICAgewogICAgICAgIFgxMURSVl9YSU1Mb29rdXBDaGFycyggU3RyLCBhc2NpaV9jaGFycyApOwogICAgICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBTdHIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CgogICAgLyogSWYgWEtCIGV4dGVuc2lvbnMgYXJlIHVzZWQsIHRoZSBzdGF0ZSBtYXNrIGZvciBBbHRHciB3aWxsIHVzZSB0aGUgZ3JvdXAKICAgICAgIGluZGV4IGluc3RlYWQgb2YgdGhlIG1vZGlmaWVyIG1hc2suIFRoZSBncm91cCBpbmRleCBpcyBzZXQgaW4gYml0cwogICAgICAgMTMtMTQgb2YgdGhlIHN0YXRlIGZpZWxkIGluIHRoZSBYS2V5RXZlbnQgc3RydWN0dXJlLiBTbyBpZiBBbHRHciBpcwogICAgICAgcHJlc3NlZCwgbG9vayBpZiB0aGUgZ3JvdXAgaW5kZXggaXMgZGlmZmVyZW50IHRoYW4gMC4gRnJvbSBYS0IKICAgICAgIGV4dGVuc2lvbiBkb2N1bWVudGF0aW9uLCB0aGUgZ3JvdXAgaW5kZXggZm9yIEFsdEdyIHNob3VsZCBiZSAyCiAgICAgICAoZXZlbnQtPnN0YXRlID0gMHgyMDAwKS4gSXQncyBwcm9iYWJseSBiZXR0ZXIgdG8gbm90IGFzc3VtZSBhCiAgICAgICBwcmVkZWZpbmVkIGdyb3VwIGluZGV4IGFuZCBmaW5kIGl0IGR5bmFtaWNhbGx5CgogICAgICAgUmVmOiBYIEtleWJvYXJkIEV4dGVuc2lvbjogTGlicmFyeSBzcGVjaWZpY2F0aW9uIChzZWN0aW9uIDE0LjEuMSBhbmQgMTcuMS4xKSAqLwogICAgLyogU2F2ZSBhbHNvIGFsbCBwb3NzaWJsZSBtb2RpZmllciBzdGF0ZXMuICovCiAgICBBbHRHck1hc2sgPSBldmVudC0+c3RhdGUgJiAoMHg2MDAwIHwgTW9kMU1hc2sgfCBNb2QyTWFzayB8IE1vZDNNYXNrIHwgTW9kNE1hc2sgfCBNb2Q1TWFzayk7CgogICAgaWYgKFRSQUNFX09OKGtleSkpewoJY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWx4ICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIGRlYnVnc3RyX2FuKFN0ciwgYXNjaWlfY2hhcnMpKTsKICAgIH0KICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CgogICAgdmtleSA9IEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLGV2ZW50KTsKICAgIC8qIFggcmV0dXJucyBrZXljb2RlIDAgZm9yIGNvbXBvc2VkIGNoYXJhY3RlcnMgKi8KICAgIGlmICghdmtleSAmJiBhc2NpaV9jaGFycykgdmtleSA9IFZLX05PTkFNRTsKICAgIGJTY2FuID0ga2V5YzJzY2FuW2V2ZW50LT5rZXljb2RlXSAmIDB4RkY7CgogICAgVFJBQ0VfKGtleSkoImtleWNvZGUgJXUgY29udmVydGVkIHRvIHZrZXkgMHglWCBzY2FuICUwMnhcbiIsCiAgICAgICAgICAgICAgICBldmVudC0+a2V5Y29kZSwgdmtleSwgYlNjYW4pOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICBpZiAoIXZrZXkpIHJldHVybjsKCiAgICBkd0ZsYWdzID0gMDsKICAgIGlmICggZXZlbnQtPnR5cGUgPT0gS2V5UmVsZWFzZSApIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0tFWVVQOwogICAgaWYgKCB2a2V5ICYgMHgxMDAgKSAgICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfRVhURU5ERURLRVk7CgogICAgdXBkYXRlX2xvY2tfc3RhdGUoIGh3bmQsIHZrZXksIGV2ZW50LT5zdGF0ZSwgZXZlbnRfdGltZSApOwoKICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCBod25kLCB2a2V5ICYgMHhmZiwgYlNjYW4sIGR3RmxhZ3MsIGV2ZW50X3RpbWUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQKICoKICogQ2FsbGVkIGZyb20gWDExRFJWX0luaXRLZXlib2FyZAogKiAgVGhpcyByb3V0aW5lIHdhbGtzIHRocm91Z2ggdGhlIGRlZmluZWQga2V5Ym9hcmQgbGF5b3V0cyBhbmQgc2VsZWN0cwogKiAgd2hpY2hldmVyIG1hdGNoZXMgbW9zdCBjbG9zZWx5LgogKiBrYmRfc2VjdGlvbiBtdXN0IGJlIGhlbGQuCiAqLwpzdGF0aWMgdm9pZApYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBEaXNwbGF5ICpkaXNwbGF5ICkKewogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBpLCBzeW1zOwogIGludCBzY29yZSwga2V5Yywga2V5LCBwa2V5LCBvazsKICBLZXlTeW0ga2V5c3ltID0gMDsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbMjU2XVs0XTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KCiAgbWVtc2V0KCBja2V5LCAwLCBzaXplb2YoY2tleSkgKTsKICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewogICAgICAgIGlmICghKGtleXN5bSA9IGtleWNvZGVfdG9fa2V5c3ltIChkaXNwbGF5LCBrZXljLCBpKSkpIGNvbnRpbnVlOwoJLyogQWxsb3cgYm90aCBvbmUtYnl0ZSBhbmQgdHdvLWJ5dGUgbmF0aW9uYWwga2V5c3ltcyAqLwoJaWYgKChrZXlzeW0gPCAweDgwMDApICYmIChrZXlzeW0gIT0gJyAnKSkKICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtrZXljXVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgiWEtCIGNvdWxkIG5vdCB0cmFuc2xhdGUga2V5c3ltICUwNGx4XG4iLCBrZXlzeW0pOwogICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2tleVtrZXljXVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNlIHsKCSAgY2tleVtrZXljXVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCX0KICAgICAgfQogIH0KCiAgZm9yIChjdXJyZW50ID0gMDsgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQ7IGN1cnJlbnQrKykgewogICAgVFJBQ0UoIkF0dGVtcHRpbmcgdG8gbWF0Y2ggYWdhaW5zdCBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50KTsKICAgIG1hdGNoID0gMDsKICAgIG1pc21hdGNoID0gMDsKICAgIHNjb3JlID0gMDsKICAgIHNlcSA9IDA7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmtleTsKICAgIHBrZXkgPSAtMTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgaWYgKGNrZXlba2V5Y11bMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjwqMiLCBmb3IgZXhhbXBsZSkgKi8KCS8qIGhvd2V2ZXIsIHRoZSBzY29yZSB3aWxsIGJlIGhpZ2hlciBmb3IgbG9uZ2VyIG1hdGNoZXMgKi8KCWZvciAoa2V5ID0gMDsga2V5IDwgTUFJTl9MRU47IGtleSsrKSB7CgkgIGZvciAob2sgPSAwLCBpID0gMDsgKG9rID49IDApICYmIChpIDwgc3ltcyk7IGkrKykgewoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSA9PSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rKys7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldICE9IGNrZXlba2V5Y11baV0pKQoJICAgICAgb2sgPSAtMTsKCSAgfQoJICBpZiAob2sgPiAwKSB7CgkgICAgc2NvcmUgKz0gb2s7CgkgICAgYnJlYWs7CgkgIH0KCX0KCS8qIGNvdW50IHRoZSBtYXRjaGVzIGFuZCBtaXNtYXRjaGVzICovCglpZiAob2sgPiAwKSB7CgkgIG1hdGNoKys7CgkgIC8qIGFuZCBob3cgbXVjaCB0aGUga2V5Y29kZSBvcmRlciBtYXRjaGVzICovCgkgIGlmIChrZXkgPiBwa2V5KSBzZXErKzsKCSAgcGtleSA9IGtleTsKCX0gZWxzZSB7CiAgICAgICAgICAvKiBwcmludCBzcGFjZXMgaW5zdGVhZCBvZiBcMCdzICovCiAgICAgICAgICBjaGFyIHN0cls1XTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHN0cltpXSA9IGNrZXlba2V5Y11baV0gPyBja2V5W2tleWNdW2ldIDogJyAnOwogICAgICAgICAgc3RyWzRdID0gMDsKICAgICAgICAgIFRSQUNFXyhrZXkpKCJtaXNtYXRjaCBmb3Iga2V5Y29kZSAldSwgZ290ICVzXG4iLCBrZXljLCBzdHIpOwogICAgICAgICAgbWlzbWF0Y2grKzsKICAgICAgICAgIHNjb3JlIC09IHN5bXM7Cgl9CiAgICAgIH0KICAgIH0KICAgIFRSQUNFKCJtYXRjaGVzPSVkLCBtaXNtYXRjaGVzPSVkLCBzZXE9JWQsIHNjb3JlPSVkXG4iLAoJICAgbWF0Y2gsIG1pc21hdGNoLCBzZXEsIHNjb3JlKTsKICAgIGlmICgoc2NvcmUgPiBtYXhfc2NvcmUpIHx8CgkoKHNjb3JlID09IG1heF9zY29yZSkgJiYgKHNlcSA+IG1heF9zZXEpKSkgewogICAgICAvKiBiZXN0IG1hdGNoIHNvIGZhciAqLwogICAgICBrYmRfbGF5b3V0ID0gY3VycmVudDsKICAgICAgbWF4X3Njb3JlID0gc2NvcmU7CiAgICAgIG1heF9zZXEgPSBzZXE7CiAgICAgIGlzbWF0Y2ggPSAhbWlzbWF0Y2g7CiAgICB9CiAgfQogIC8qIHdlJ3JlIGRvbmUsIHJlcG9ydCByZXN1bHRzIGlmIG5lY2Vzc2FyeSAqLwogIGlmICghaXNtYXRjaCkKICAgIFdBUk4oIlVzaW5nIGNsb3Nlc3QgbWF0Y2ggKCVzKSBmb3Igc2Nhbi92aXJ0dWFsIGNvZGVzIG1hcHBpbmcuXG4iLAogICAgICAgIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKCiAgVFJBQ0UoImRldGVjdGVkIGxheW91dCBpcyBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5jb21tZW50KTsKfQoKc3RhdGljIEhLTCBnZXRfbG9jYWxlX2tiZF9sYXlvdXQodm9pZCkKewogICAgVUxPTkdfUFRSIGxheW91dDsKICAgIExBTkdJRCBsYW5naWQ7CgogICAgLyogRklYTUU6CiAgICAgKgogICAgICogbGF5b3V0ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmxjaWQ7CiAgICAgKgogICAgICogV2lud29yZCB1c2VzIHJldHVybiB2YWx1ZSBvZiBHZXRLZXlib2FyZExheW91dCBhcyBhIGNvZGVwYWdlCiAgICAgKiB0byB0cmFuc2xhdGUgQU5TSSBrZXlib2FyZCBtZXNzYWdlcyB0byB1bmljb2RlLiBCdXQgd2UgaGF2ZQogICAgICogYSBwcm9ibGVtIHdpdGggaXQ6IGZvciBpbnN0YW5jZSBQb2xpc2gga2V5Ym9hcmQgbGF5b3V0IGlzCiAgICAgKiBpZGVudGljYWwgdG8gdGhlIFVTIG9uZSwgYW5kIHRoZXJlZm9yZSBpbnN0ZWFkIG9mIHRoZSBQb2xpc2gKICAgICAqIGxvY2FsZSBpZCB3ZSByZXR1cm4gdGhlIFVTIG9uZS4KICAgICAqLwoKICAgIGxheW91dCA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwoKICAgIC8qCiAgICAgKiBNaWNyb3NvZnQgT2ZmaWNlIGV4cGVjdHMgdGhpcyB2YWx1ZSB0byBiZSBzb21ldGhpbmcgc3BlY2lmaWMKICAgICAqIGZvciBKYXBhbmVzZSBhbmQgS29yZWFuIFdpbmRvd3Mgd2l0aCBhbiBJTUUgdGhlIHZhbHVlIGlzIDB4ZTAwMQogICAgICogV2Ugc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRvIHNlZSBpZiBhbiBJTUUgZXhpc3RzIGFuZCBpZiBzbyB0aGVuCiAgICAgKiBzZXQgdGhpcyB3b3JkIHByb3Blcmx5LgogICAgICovCiAgICBsYW5naWQgPSBQUklNQVJZTEFOR0lEKExBTkdJREZST01MQ0lEKGxheW91dCkpOwogICAgaWYgKGxhbmdpZCA9PSBMQU5HX0NISU5FU0UgfHwgbGFuZ2lkID09IExBTkdfSkFQQU5FU0UgfHwgbGFuZ2lkID09IExBTkdfS09SRUFOKQogICAgICAgIGxheW91dCB8PSAweGUwMDEgPDwgMTY7IC8qIElNRSAqLwogICAgZWxzZQogICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgcmV0dXJuIChIS0wpbGF5b3V0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgIEdldEtleWJvYXJkTGF5b3V0TmFtZSAoWDExRFJWLkApCiAqLwpCT09MIENERUNMIFgxMURSVl9HZXRLZXlib2FyZExheW91dE5hbWUoTFBXU1RSIG5hbWUpCnsKICAgIHN0YXRpYyBjb25zdCBXQ0hBUiBmb3JtYXRXW10gPSB7JyUnLCcwJywnOCcsJ3gnLDB9OwogICAgRFdPUkQgbGF5b3V0OwoKICAgIGxheW91dCA9IEhhbmRsZVRvVWxvbmcoIGdldF9sb2NhbGVfa2JkX2xheW91dCgpICk7CiAgICBpZiAoSElXT1JEKGxheW91dCkgPT0gTE9XT1JEKGxheW91dCkpIGxheW91dCA9IExPV09SRChsYXlvdXQpOwogICAgc3ByaW50ZlcobmFtZSwgZm9ybWF0VywgbGF5b3V0KTsKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cobmFtZSkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyB2b2lkIHNldF9rYmRfbGF5b3V0X3ByZWxvYWRfa2V5KHZvaWQpCnsKICAgIHN0YXRpYyBjb25zdCBXQ0hBUiBwcmVsb2FkW10gPQogICAgICAgIHsnSycsJ2UnLCd5JywnYicsJ28nLCdhJywncicsJ2QnLCcgJywnTCcsJ2EnLCd5JywnbycsJ3UnLCd0JywnXFwnLCdQJywncicsJ2UnLCdsJywnbycsJ2EnLCdkJywwfTsKICAgIHN0YXRpYyBjb25zdCBXQ0hBUiBvbmVbXSA9IHsnMScsMH07CgogICAgSEtFWSBoa2V5OwogICAgV0NIQVIgbGF5b3V0W0tMX05BTUVMRU5HVEhdOwoKICAgIGlmIChSZWdDcmVhdGVLZXlFeFcoSEtFWV9DVVJSRU5UX1VTRVIsIHByZWxvYWQsIDAsIE5VTEwsIDAsIEtFWV9BTExfQUNDRVNTLCBOVUxMLCAmaGtleSwgTlVMTCkpCiAgICAgICAgcmV0dXJuOwoKICAgIGlmICghUmVnUXVlcnlWYWx1ZUV4Vyhoa2V5LCBvbmUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXROYW1lKGxheW91dCkpCiAgICAgICAgUmVnU2V0VmFsdWVFeFcoaGtleSwgb25lLCAwLCBSRUdfU1osIChjb25zdCBCWVRFICopbGF5b3V0LCBzaXplb2YobGF5b3V0KSk7CgogICAgUmVnQ2xvc2VLZXkoaGtleSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfSW5pdEtleWJvYXJkCiAqLwp2b2lkIFgxMURSVl9Jbml0S2V5Ym9hcmQoIERpc3BsYXkgKmRpc3BsYXkgKQp7CiAgICBYTW9kaWZpZXJLZXltYXAgKm1tcDsKICAgIEtleVN5bSBrZXlzeW07CiAgICBLZXlDb2RlICprY3A7CiAgICBYS2V5RXZlbnQgZTI7CiAgICBXT1JEIHNjYW4sIHZrZXk7CiAgICBpbnQga2V5YywgaSwga2V5biwgc3ltczsKICAgIGNoYXIgY2tleVs0XT17MCwwLDAsMH07CiAgICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogICAgY2hhciB2a2V5X3VzZWRbMjU2XSA9IHsgMCB9OwoKICAgIC8qIFJhbmdlcyBvZiBPRU0sIGZ1bmN0aW9uIGtleSwgYW5kIGNoYXJhY3RlciB2aXJ0dWFsIGtleSBjb2Rlcy4KICAgICAqIERvbid0IGluY2x1ZGUgdGhvc2UgaGFuZGxlZCBzcGVjaWFsbHkgaW4gWDExRFJWX1RvVW5pY29kZUV4IGFuZAogICAgICogWDExRFJWX01hcFZpcnR1YWxLZXlFeCwgbGlrZSBWS19OVU1QQUQwIC0gVktfRElWSURFLiAqLwogICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgICAgV09SRCBmaXJzdCwgbGFzdDsKICAgIH0gdmtleV9yYW5nZXNbXSA9IHsKICAgICAgICB7IFZLX09FTV8xLCBWS19PRU1fMyB9LAogICAgICAgIHsgVktfT0VNXzQsIFZLX0lDT18wMCB9LAogICAgICAgIHsgMHhlNiwgMHhlNiB9LAogICAgICAgIHsgMHhlOSwgMHhmNSB9LAogICAgICAgIHsgVktfT0VNX05FQ19FUVVBTCwgVktfT0VNX05FQ19FUVVBTCB9LAogICAgICAgIHsgVktfRjEsIFZLX0YyNCB9LAogICAgICAgIHsgMHgzMCwgMHgzOSB9LCAvKiBWS18wIC0gVktfOSAqLwogICAgICAgIHsgMHg0MSwgMHg1YSB9LCAvKiBWS19BIC0gVktfWiAqLwogICAgICAgIHsgMCwgMCB9CiAgICB9OwogICAgaW50IHZrZXlfcmFuZ2U7CgogICAgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkoKTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICBYRGlzcGxheUtleWNvZGVzKGRpc3BsYXksICZtaW5fa2V5Y29kZSwgJm1heF9rZXljb2RlKTsKICAgIGlmIChrZXlfbWFwcGluZykgWEZyZWUoIGtleV9tYXBwaW5nICk7CiAgICBrZXlfbWFwcGluZyA9IFhHZXRLZXlib2FyZE1hcHBpbmcoZGlzcGxheSwgbWluX2tleWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKCiAgICBtbXAgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOwogICAga2NwID0gbW1wLT5tb2RpZmllcm1hcDsKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDEpIC8qIFRoZXJlIGFyZSA4IG1vZGlmaWVyIGtleXMgKi8KICAgIHsKICAgICAgICBpbnQgajsKCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwoKCQlmb3IgKGsgPSAwOyBrIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgayArPSAxKQogICAgICAgICAgICAgICAgICAgIGlmIChrZXljb2RlX3RvX2tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrZXljb2RlX3RvX2tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19TY3JvbGxfTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBTY3JvbGxMb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIlNjcm9sbExvY2tNYXNrIGlzICV4XG4iLCBTY3JvbGxMb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgfQogICAgfQogICAgWEZyZWVNb2RpZmllcm1hcChtbXApOwoKICAgIC8qIERldGVjdCB0aGUga2V5Ym9hcmQgbGF5b3V0ICovCiAgICBYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBkaXNwbGF5ICk7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmtleTsKICAgIHN5bXMgPSAoa2V5c3ltc19wZXJfa2V5Y29kZSA+IDQpID8gNCA6IGtleXN5bXNfcGVyX2tleWNvZGU7CgogICAgLyogTm93IGJ1aWxkIHR3byBjb252ZXJzaW9uIGFycmF5cyA6CiAgICAgKiBrZXljb2RlIC0+IHZrZXkgKyBzY2FuY29kZSArIGV4dGVuZGVkCiAgICAgKiB2a2V5ICsgZXh0ZW5kZWQgLT4ga2V5Y29kZSAqLwoKICAgIGUyLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZTIuc3RhdGUgPSAwOwogICAgZTIudHlwZSA9IEtleVByZXNzOwoKICAgIG1lbXNldChrZXljMnZrZXksIDAsIHNpemVvZihrZXljMnZrZXkpKTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgY2hhciBidWZbMzBdOwogICAgICAgIGludCBoYXZlX2NoYXJzOwoKICAgICAgICBrZXlzeW0gPSAwOwogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGhhdmVfY2hhcnMgPSBYTG9va3VwU3RyaW5nKCZlMiwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICAgICAgdmtleSA9IDA7IHNjYW4gPSAwOwogICAgICAgIGlmIChrZXlzeW0pICAvKiBvdGhlcndpc2UsIGtleWNvZGUgbm90IHVzZWQgKi8KICAgICAgICB7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID4+IDgpID09IDB4RkYpICAgICAgICAgLyogbm9uLWNoYXJhY3RlciBrZXkgKi8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleSA9IG5vbmNoYXJfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICBzY2FuID0gbm9uY2hhcl9rZXlfc2NhbltrZXlzeW0gJiAweGZmXTsKCQkvKiBzZXQgZXh0ZW5kZWQgYml0IHdoZW4gbmVjZXNzYXJ5ICovCgkJaWYgKHNjYW4gJiAweDEwMCkgdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7IC8qIFhGcmVlODYgdmVuZG9yIGtleXMgKi8KICAgICAgICAgICAgICAgIHZrZXkgPSB4ZnJlZTg2X3ZlbmRvcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIC8qIEFsbCB2ZW5kb3Iga2V5cyBhcmUgZXh0ZW5kZWQgd2l0aCBhIHNjYW4gY29kZSBvZiAwIHBlciB0ZXN0aW5nIG9uIFdpblhQICovCiAgICAgICAgICAgICAgICBzY2FuID0gMHgxMDA7CgkJdmtleSB8PSAweDEwMDsKICAgICAgICAgICAgfSBlbHNlIGlmIChrZXlzeW0gPT0gMHgyMCkgeyAgICAgICAgICAgICAgICAgLyogU3BhY2ViYXIgKi8KCSAgICAgICAgdmtleSA9IFZLX1NQQUNFOwoJCXNjYW4gPSAweDM5OwoJICAgIH0gZWxzZSBpZiAoaGF2ZV9jaGFycykgewoJICAgICAgLyogd2Ugc2VlbSB0byBuZWVkIHRvIHNlYXJjaCB0aGUgbGF5b3V0LWRlcGVuZGVudCBzY2FuY29kZXMgKi8KCSAgICAgIGludCBtYXhsZW49MCxtYXh2YWw9LTEsb2s7CgkgICAgICBmb3IgKGk9MDsgaTxzeW1zOyBpKyspIHsKCQlrZXlzeW0gPSBrZXljb2RlX3RvX2tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMDApICYmIChrZXlzeW0hPScgJykpCiAgICAgICAgICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNrZXlbaV0gPSAoa2V5c3ltIDw9IDB4N0YpID8ga2V5c3ltIDogMDsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKCFvaykgaS0tOyAvKiB3ZSBvdmVyc2hvdCAqLwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJrZXljb2RlICV1ID0+IHZrZXkgJTA0WFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICBrZXljMnNjYW5bZTIua2V5Y29kZV0gPSBzY2FuOwogICAgICAgIGlmICgodmtleSAmIDB4ZmYpICYmIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSkKICAgICAgICAgICAgV0FSTigidmtleSAlMDRYIGlzIGJlaW5nIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBrZXljb2RlXG4iLCB2a2V5KTsKICAgICAgICB2a2V5X3VzZWRbKHZrZXkgJiAweGZmKV0gPSAxOwogICAgfSAvKiBmb3IgKi8KCiNkZWZpbmUgVktFWV9JRl9OT1RfVVNFRCh2a2V5KSAodmtleV91c2VkWyh2a2V5KV0gPyAwIDogKHZrZXlfdXNlZFsodmtleSldID0gMSwgKHZrZXkpKSkKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICB7CiAgICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4ZmY7CiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgMCk7CiAgICAgICAgaWYgKCFrZXlzeW0pCiAgICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIGZpbmQgYSBzdWl0YWJsZSBsYXlvdXQtZGVwZW5kZW50IFZLIGNvZGUgKi8KICAgICAgICAvKiAobW9zdCBXaW5lbGliIGFwcHMgb3VnaHQgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGhvdXQgbGF5b3V0IHRhYmxlcyEpICovCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgIGlmICgoa2V5c3ltID49IFhLXzAgJiYga2V5c3ltIDw9IFhLXzkpCiAgICAgICAgICAgICAgICB8fCAoa2V5c3ltID49IFhLX0EgJiYga2V5c3ltIDw9IFhLX1opKSB7CiAgICAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChrZXlzeW0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgc3dpdGNoIChrZXlzeW0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAnOyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8xKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy8nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdgJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzMpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnWyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV80KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1xcJzogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICddJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzYpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXCcnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV83KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJywnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fQ09NTUEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLic6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9QRVJJT0QpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLSc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9NSU5VUyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcrJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BMVVMpOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIH0KICAgIH0gLyogZm9yICovCgogICAgLyogRm9yIGFueSBrZXljb2RlcyB3aGljaCBzdGlsbCBkb24ndCBoYXZlIGEgdmtleSwgYXNzaWduIGFueSBzcGFyZQogICAgICogY2hhcmFjdGVyLCBmdW5jdGlvbiBrZXksIG9yIE9FTSB2aXJ0dWFsIGtleSBjb2RlLiAqLwogICAgdmtleV9yYW5nZSA9IDA7CiAgICB2a2V5ID0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0uZmlyc3Q7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGlmIChrZXljMnZrZXlba2V5Y10gJiAweGZmKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIDApOwogICAgICAgIGlmICgha2V5c3ltKQogICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICB3aGlsZSAodmtleSAmJiB2a2V5X3VzZWRbdmtleV0pCiAgICAgICAgewogICAgICAgICAgICBpZiAodmtleSA9PSB2a2V5X3Jhbmdlc1t2a2V5X3JhbmdlXS5sYXN0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5X3JhbmdlKys7CiAgICAgICAgICAgICAgICB2a2V5ID0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0uZmlyc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdmtleSsrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF2a2V5KQogICAgICAgIHsKICAgICAgICAgICAgV0FSTigiTm8gbW9yZSB2a2V5cyBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoVFJBQ0VfT04oa2V5Ym9hcmQpKQogICAgICAgIHsKICAgICAgICAgICAgVFJBQ0UoInNwYXJlIHZpcnR1YWwga2V5ICUwNFggYXNzaWduZWQgdG8ga2V5Y29kZSAldTpcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgIFRSQUNFKCIoIik7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlOyBpICs9IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgIGlmICgha3NuYW1lKQogICAgICAgICAgICAgICAgICAgIGtzbmFtZSA9ICJOb1N5bWJvbCI7CiAgICAgICAgICAgICAgICBUUkFDRSggIiVseCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRSgiKVxuIik7CiAgICAgICAgfQoKICAgICAgICBUUkFDRSgia2V5Y29kZSAldSA9PiB2a2V5ICUwNFhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgdmtleV91c2VkW3ZrZXldID0gMTsKICAgIH0gLyogZm9yICovCiN1bmRlZiBWS0VZX0lGX05PVF9VU0VECgogICAgLyogSWYgc29tZSBrZXlzIHN0aWxsIGxhY2sgc2NhbmNvZGVzLCBhc3NpZ24gc29tZSBhcmJpdHJhcnkgb25lcyB0byB0aGVtIG5vdyAqLwogICAgZm9yIChzY2FuID0gMHg2MCwga2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgIGlmIChrZXljMnZrZXlba2V5Y10mJiFrZXljMnNjYW5ba2V5Y10pIHsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCWtleXN5bSA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwoJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAldSAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKfQoKc3RhdGljIEJPT0wgbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChIS0wgaGtsKQp7CiAgICBjb25zdCBEV09SRCBpc0lNRSA9IDB4RTAwMDAwMDA7CiAgICBIS0wgeEhrbCA9IGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwoKICAgIC8qIGlmIHRoZSBsYXlvdXQgaXMgYW4gSU1FLCBvbmx5IG1hdGNoIHRoZSBsb3cgd29yZCAoTENJRCkgKi8KICAgIGlmICgoKFVMT05HX1BUUiloa2wgJiBpc0lNRSkgPT0gaXNJTUUpCiAgICAgICAgcmV0dXJuIChMT1dPUkQoaGtsKSA9PSBMT1dPUkQoeEhrbCkpOwogICAgZWxzZQogICAgICAgIHJldHVybiAoaGtsID09IHhIa2wpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KERXT1JEIGR3VGhyZWFkaWQpCnsKICAgIGlmICghZHdUaHJlYWRpZCB8fCBkd1RocmVhZGlkID09IEdldEN1cnJlbnRUaHJlYWRJZCgpKQogICAgewogICAgICAgIHN0cnVjdCB4MTFkcnZfdGhyZWFkX2RhdGEgKnRocmVhZF9kYXRhID0geDExZHJ2X3RocmVhZF9kYXRhKCk7CiAgICAgICAgaWYgKHRocmVhZF9kYXRhICYmIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0KSByZXR1cm4gdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQ7CiAgICB9CiAgICBlbHNlCiAgICAgICAgRklYTUUoImNvdWxkbid0IHJldHVybiBrZXlib2FyZCBsYXlvdXQgZm9yIHRocmVhZCAlMDR4XG4iLCBkd1RocmVhZGlkKTsKCiAgICByZXR1cm4gZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgQ0RFQ0wgWDExRFJWX0xvYWRLZXlib2FyZExheW91dChMUENXU1RSIG5hbWUsIFVJTlQgZmxhZ3MpCnsKICAgIEZJWE1FKCIlcywgJTA0eDogc3R1YiFcbiIsIGRlYnVnc3RyX3cobmFtZSksIGZsYWdzKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVW5sb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KQk9PTCBDREVDTCBYMTFEUlZfVW5sb2FkS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCkKewogICAgRklYTUUoIiVwOiBzdHViIVxuIiwgaGtsKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUFjdGl2YXRlS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIENERUNMIFgxMURSVl9BY3RpdmF0ZUtleWJvYXJkTGF5b3V0KEhLTCBoa2wsIFVJTlQgZmxhZ3MpCnsKICAgIEhLTCBvbGRIa2wgPSAwOwogICAgc3RydWN0IHgxMWRydl90aHJlYWRfZGF0YSAqdGhyZWFkX2RhdGEgPSB4MTFkcnZfaW5pdF90aHJlYWRfZGF0YSgpOwoKICAgIEZJWE1FKCIlcCwgJTA0eDogc2VtaS1zdHViIVxuIiwgaGtsLCBmbGFncyk7CiAgICBpZiAoZmxhZ3MgJiBLTEZfU0VURk9SUFJPQ0VTUykKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJLTEZfU0VURk9SUFJPQ0VTUyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoZmxhZ3MpCiAgICAgICAgRklYTUUoImZsYWdzICV4IG5vdCBzdXBwb3J0ZWRcbiIsZmxhZ3MpOwoKICAgIGlmIChoa2wgPT0gKEhLTClIS0xfTkVYVCB8fCBoa2wgPT0gKEhLTClIS0xfUFJFVikKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgICAgIEZJWE1FKCJIS0xfTkVYVCBhbmQgSEtMX1BSRVYgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICAgICBGSVhNRSgic2V0dGluZyBrZXlib2FyZCBvZiBkaWZmZXJlbnQgbG9jYWxlcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBvbGRIa2wgPSB0aHJlYWRfZGF0YS0+a2JkX2xheW91dDsKICAgIGlmICghb2xkSGtsKSBvbGRIa2wgPSBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKTsKCiAgICB0aHJlYWRfZGF0YS0+a2JkX2xheW91dCA9IGhrbDsKCiAgICByZXR1cm4gb2xkSGtsOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfTWFwcGluZ05vdGlmeQogKi8Kdm9pZCBYMTFEUlZfTWFwcGluZ05vdGlmeSggSFdORCBkdW1teSwgWEV2ZW50ICpldmVudCApCnsKICAgIEhXTkQgaHduZDsKCiAgICBYUmVmcmVzaEtleWJvYXJkTWFwcGluZygmZXZlbnQtPnhtYXBwaW5nKTsKICAgIFgxMURSVl9Jbml0S2V5Ym9hcmQoIGV2ZW50LT54bWFwcGluZy5kaXNwbGF5ICk7CgogICAgaHduZCA9IEdldEZvY3VzKCk7CiAgICBpZiAoIWh3bmQpIGh3bmQgPSBHZXRBY3RpdmVXaW5kb3coKTsKICAgIFBvc3RNZXNzYWdlVyhod25kLCBXTV9JTlBVVExBTkdDSEFOR0VSRVFVRVNULAogICAgICAgICAgICAgICAgIDAgLypGSVhNRSovLCAoTFBBUkFNKVgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVZrS2V5U2NhbkV4IChYMTFEUlYuQCkKICoKICogTm90ZTogV2luZG93cyBpZ25vcmVzIEhLTCBwYXJhbWV0ZXIgYW5kIHVzZXMgY3VycmVudCBhY3RpdmUgbGF5b3V0IGluc3RlYWQKICovClNIT1JUIENERUNMIFgxMURSVl9Wa0tleVNjYW5FeChXQ0hBUiB3Q2hhciwgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICAgIEtleUNvZGUga2V5Y29kZTsKICAgIEtleVN5bSBrZXlzeW07CiAgICBpbnQgaW5kZXg7CiAgICBDSEFSIGNDaGFyOwogICAgU0hPUlQgcmV0OwoKICAgIC8qIEZJWE1FOiB3aGF0IGhhcHBlbnMgaWYgd0NoYXIgaXMgbm90IGEgTGF0aW4xIGNoYXJhY3RlciBhbmQgQ1BfVU5JWENQCiAgICAgKiBpcyBVVEYtOCAobXVsdGlieXRlIGVuY29kaW5nKT8KICAgICAqLwogICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VOSVhDUCwgMCwgJndDaGFyLCAxLCAmY0NoYXIsIDEsIE5VTEwsIE5VTEwpKQogICAgewogICAgICAgIFdBUk4oIm5vIHRyYW5zbGF0aW9uIGZyb20gdW5pY29kZSB0byBDUF9VTklYQ1AgZm9yIDB4JTAyeFxuIiwgd0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBUUkFDRSgid0NoYXIgMHglMDJ4IC0+IGNDaGFyICclYydcbiIsIHdDaGFyLCBjQ2hhcik7CgogICAgLyogY2hhci0+a2V5c3ltIChzYW1lIGZvciBBTlNJIGNoYXJzKSAqLwogICAga2V5c3ltID0gKHVuc2lnbmVkIGNoYXIpY0NoYXI7IC8qICghKSBjQ2hhciBpcyBzaWduZWQgKi8KICAgIGlmIChrZXlzeW0gPD0gMjcpIGtleXN5bSArPSAweEZGMDA7IC8qIHNwZWNpYWwgY2hhcnMgOiByZXR1cm4sIGJhY2tzcGFjZS4uLiAqLwoKICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLwogICAgaWYgKCFrZXljb2RlKQogICAgewogICAgICAgIGlmIChrZXlzeW0gPj0gMHhGRjAwKSAvKiBXaW5kb3dzIHJldHVybnMgMHgwMjQwICsgY0NoYXIgaW4gdGhpcyBjYXNlICovCiAgICAgICAgewogICAgICAgICAgICByZXQgPSAweDAyNDAgKyBjQ2hhcjsgLyogMHgwMjAwIGluZGljYXRlcyBhIGNvbnRyb2wgY2hhcmFjdGVyICovCiAgICAgICAgICAgIFRSQUNFKCIgLi4uIHJldHVybmluZyBjdHJsIGNoYXIgJSMuMnhcbiIsIHJldCk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogICAgICAgIC8qIEl0IGRpZG4ndCB3b3JrIC4uLiBsZXQncyB0cnkgd2l0aCBkZWFkY2hhciBjb2RlLiAqLwogICAgICAgIFRSQUNFKCJyZXRyeWluZyB3aXRoIHwgMHhGRTAwXG4iKTsKICAgICAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwogICAgfQoKICAgIFRSQUNFKCInJWMnKCVseCk6IGdvdCBrZXljb2RlICV1XG4iLCBjQ2hhciwga2V5c3ltLCBrZXljb2RlKTsKICAgIGlmICgha2V5Y29kZSkgcmV0dXJuIC0xOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KICAgIHJldCA9IGtleWMydmtleVtrZXljb2RlXTsKICAgIGlmICghcmV0KQogICAgewogICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgICAgICBUUkFDRSgia2V5Y29kZSBmb3IgJyVjJyBub3QgZm91bmQsIHJldHVybmluZyAtMVxuIiwgY0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCiAgICAgICAgaWYgKGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWNvZGUsIGluZGV4KSA9PSBrZXlzeW0pIGJyZWFrOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICBzd2l0Y2ggKGluZGV4KQogICAgewogICAgICAgIGNhc2UgMDogYnJlYWs7CiAgICAgICAgY2FzZSAxOiByZXQgKz0gMHgwMTAwOyBicmVhazsKICAgICAgICBjYXNlIDI6IHJldCArPSAweDA2MDA7IGJyZWFrOwogICAgICAgIGNhc2UgMzogcmV0ICs9IDB4MDcwMDsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgV0FSTigiS2V5c3ltICVseCBub3QgZm91bmQgd2hpbGUgcGFyc2luZyB0aGUga2V5Y29kZSB0YWJsZVxuIiwga2V5c3ltKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgLyoKICAgICAgaW5kZXggOiAwICAgICBhZGRzIDB4MDAwMAogICAgICBpbmRleCA6IDEgICAgIGFkZHMgMHgwMTAwIChzaGlmdCkKICAgICAgaW5kZXggOiA/ICAgICBhZGRzIDB4MDIwMCAoY3RybCkKICAgICAgaW5kZXggOiAyICAgICBhZGRzIDB4MDYwMCAoY3RybCthbHQpCiAgICAgIGluZGV4IDogMyAgICAgYWRkcyAweDA3MDAgKGN0cmwrYWx0K3NoaWZ0KQogICAgICovCgogICAgVFJBQ0UoIiAuLi4gcmV0dXJuaW5nICUjLjJ4XG4iLCByZXQpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlNYXBWaXJ0dWFsS2V5RXggKFgxMURSVi5AKQogKi8KVUlOVCBDREVDTCBYMTFEUlZfTWFwVmlydHVhbEtleUV4KFVJTlQgd0NvZGUsIFVJTlQgd01hcFR5cGUsIEhLTCBoa2wpCnsKICAgIFVJTlQgcmV0ID0gMDsKICAgIGludCBrZXljOwogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKCiAgICBUUkFDRSgid0NvZGU9MHgleCwgd01hcFR5cGU9JWQsIGhrbCAlcFxuIiwgd0NvZGUsIHdNYXBUeXBlLCBoa2wpOwogICAgaWYgKCFtYXRjaF94MTFfa2V5Ym9hcmRfbGF5b3V0KGhrbCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICBzd2l0Y2god01hcFR5cGUpCiAgICB7CiAgICAgICAgY2FzZSBNQVBWS19WS19UT19WU0M6IC8qIHZrZXktY29kZSB0byBzY2FuLWNvZGUgKi8KICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX1ZTQ19FWDoKICAgICAgICAgICAgc3dpdGNoICh3Q29kZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSBWS19TSElGVDogd0NvZGUgPSBWS19MU0hJRlQ7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBWS19DT05UUk9MOiB3Q29kZSA9IFZLX0xDT05UUk9MOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVktfTUVOVTogd0NvZGUgPSBWS19MTUVOVTsgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCiAgICAgICAgICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0ga2V5YzJzY2FuW2tleWNdICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBNQVBWS19WU0NfVE9fVks6IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WS19FWDoKCiAgICAgICAgICAgIC8qIGxldCdzIGRvIHNjYW4gLT4ga2V5Y29kZSAtPiB2a2V5ICovCiAgICAgICAgICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspCiAgICAgICAgICAgICAgICBpZiAoKGtleWMyc2NhbltrZXljXSAmIDB4RkYpID09ICh3Q29kZSAmIDB4RkYpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldCA9IGtleWMydmtleVtrZXljXSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgLyogT25seSBzdG9wIGlmIGl0J3Mgbm90IGEgbnVtcGFkIHZrZXk7IG90aGVyd2lzZSBrZWVwCiAgICAgICAgICAgICAgICAgICAgICAgbG9va2luZyBmb3IgYSBwb3RlbnRpYWwgYmV0dGVyIHZrZXkuICovCiAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAmJiAocmV0IDwgVktfTlVNUEFEMCB8fCBWS19ESVZJREUgPCByZXQpKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh3TWFwVHlwZSA9PSBNQVBWS19WU0NfVE9fVkspCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHJldCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gVktfU0hJRlQ7IGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gVktfQ09OVFJPTDsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBWS19NRU5VOyBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE1BUFZLX1ZLX1RPX0NIQVI6IC8qIHZrZXktY29kZSB0byB1bnNoaWZ0ZWQgQU5TSSBjb2RlICovCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBzdGlsbCBkb24ndCBrbm93IHdoYXQgInVuc2hpZnRlZCIgbWVhbnMuIGluIHdpbmRvd3MgVktfVyAoMHg1NykKICAgICAgICAgICAgICogcmV0dXJucyAweDU3LCB3aGljaCBpcyB1cHBlcmNhc2UgJ1cnLiBTbyB3ZSBoYXZlIHRvIHJldHVybiB0aGUgdXBwZXJjYXNlCiAgICAgICAgICAgICAqIGtleS4uIExvb2tzIGxpa2Ugc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIE1TIGRvY3M/CiAgICAgICAgICAgICAqIFRoaXMgaXMgb25seSB0cnVlIGZvciBsZXR0ZXJzLCBmb3IgZXhhbXBsZSBWS18wIHJldHVybnMgJzAnIG5vdCAnKScuCiAgICAgICAgICAgICAqIC0gaGVuY2Ugd2UgdXNlIHRoZSBsb2NrIG1hc2sgdG8gZW5zdXJlIHRoaXMgaGFwcGVucy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIC8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiAoWExvb2t1cFN0cmluZykgYW5zaSBjaGFyICovCiAgICAgICAgICAgIFhLZXlFdmVudCBlOwogICAgICAgICAgICBLZXlTeW0ga2V5c3ltOwogICAgICAgICAgICBpbnQgbGVuOwogICAgICAgICAgICBjaGFyIHNbMTBdOwoKICAgICAgICAgICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgICAgICAgICAgZS5zdGF0ZSA9IDA7CiAgICAgICAgICAgIGUua2V5Y29kZSA9IDA7CiAgICAgICAgICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgICAgICAgICAgLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwogICAgICAgICAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICAgICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gd0NvZGUpCiAgICAgICAgICAgICAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCiAgICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoMCwmZSkgJiAweEZGKSAhPSB3Q29kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgod0NvZGU+PVZLX05VTVBBRDApICYmICh3Q29kZTw9VktfTlVNUEFEOSkpCiAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKCiAgICAgICAgICAgIC8qIFdpbmRvd3MgYWx3YXlzIGdlbmVyYXRlcyBWS19ERUNJTUFMIGZvciBEZWwvLiBvbiBrZXlwYWQgd2hpbGUgc29tZQogICAgICAgICAgICAgKiBYMTEga2V5Ym9hcmQgbGF5b3V0cyBnZW5lcmF0ZSBYS19LUF9TZXBhcmF0b3IgaW5zdGVhZCBvZiBYS19LUF9EZWNpbWFsCiAgICAgICAgICAgICAqIGluIG9yZGVyIHRvIHByb2R1Y2UgYSBsb2NhbGUgZGVwZW5kZW50IG51bWVyaWMgc2VwYXJhdG9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHdDb2RlID09IFZLX0RFQ0lNQUwgfHwgd0NvZGUgPT0gVktfU0VQQVJBVE9SKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfU2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgIGlmICghZS5rZXljb2RlKQogICAgICAgICAgICAgICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFlLmtleWNvZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB3Q29kZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRSgiRm91bmQga2V5Y29kZSAldVxuIixlLmtleWNvZGUpOwoKICAgICAgICAgICAgbGVuID0gWExvb2t1cFN0cmluZygmZSwgcywgc2l6ZW9mKHMpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICAgICAgaWYgKGxlbikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgV0NIQVIgd2NoOwogICAgICAgICAgICAgICAgaWYgKE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBzLCBsZW4sICZ3Y2gsIDEpKSByZXQgPSB0b3VwcGVyVyh3Y2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgZGVmYXVsdDogLyogcmVzZXJ2ZWQgKi8KICAgICAgICAgICAgRklYTUUoIlVua25vd24gd01hcFR5cGUgJWQgIVxuIiwgd01hcFR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICBUUkFDRSggInJldHVybmluZyAweCV4LlxuIiwgcmV0ICk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldEtleU5hbWVUZXh0IChYMTFEUlYuQCkKICovCklOVCBDREVDTCBYMTFEUlZfR2V0S2V5TmFtZVRleHQoTE9ORyBsUGFyYW0sIExQV1NUUiBscEJ1ZmZlciwgSU5UIG5TaXplKQp7CiAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9pbml0X2Rpc3BsYXkoKTsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CiAgS2V5Q29kZSBrZXljOwogIGludCBrZXlpOwogIEtleVN5bSBrZXlzOwogIGNoYXIgKm5hbWU7CgogIHNjYW5Db2RlID0gbFBhcmFtID4+IDE2OwogIHNjYW5Db2RlICY9IDB4MWZmOyAgLyoga2VlcCAiZXh0ZW5kZWQta2V5IiBmbGFnIHdpdGggY29kZSAqLwoKICB2a2V5ID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeChzY2FuQ29kZSwgTUFQVktfVlNDX1RPX1ZLX0VYLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwoKICAvKiAgaGFuZGxlICJkb24ndCBjYXJlIiBiaXQgKDB4MDIwMDAwMDApICovCiAgaWYgKCEobFBhcmFtICYgMHgwMjAwMDAwMCkpIHsKICAgIHN3aXRjaCAodmtleSkgewogICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSLVNoaWZ0IGlzICJzcGVjaWFsIiAtIGl0IGlzIGFuIGV4dGVuZGVkIGtleSB3aXRoIHNlcGFyYXRlIHNjYW4gY29kZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5Db2RlIHw9IDB4MTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfU0hJRlQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgY2FzZSBWS19SQ09OVFJPTDoKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfQ09OVFJPTDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgYW5zaSA9IFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgodmtleSwgTUFQVktfVktfVE9fQ0hBUiwgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKTsKICBUUkFDRSgic2NhbiAweCUwNHgsIHZrZXkgMHglMDRYLCBBTlNJIDB4JTA0eFxuIiwgc2NhbkNvZGUsIHZrZXksIGFuc2kpOwoKICAvKiBmaXJzdCBnZXQgdGhlIG5hbWUgb2YgdGhlICJyZWd1bGFyIiBrZXlzIHdoaWNoIGlzIHRoZSBVcHBlciBjYXNlCiAgICAgdmFsdWUgb2YgdGhlIGtleWNhcCBpbXByaW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGlmICggKChhbnNpID49IDB4MjEpICYmIChhbnNpIDw9IDB4N2UpKSAmJgogICAgICAgKHNjYW5Db2RlICE9IDB4MTM3KSAmJiAgIC8qIFBydFNjbiAgICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzUpICYmICAgLyogbnVtcGFkIC8gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDM3ICkgJiYgICAvKiBudW1wYWQgKiAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGEgKSAmJiAgIC8qIG51bXBhZCAtICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0ZSApICkgICAgLyogbnVtcGFkICsgKi8KICAgICAgewogICAgICAgIGlmIChuU2l6ZSA+PSAyKQoJewogICAgICAgICAgKmxwQnVmZmVyID0gdG91cHBlclcoKFdDSEFSKWFuc2kpOwogICAgICAgICAgKihscEJ1ZmZlcisxKSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogRklYTUU6IGhvcnJpYmxlIGhhY2sgdG8gZml4IGZ1bmN0aW9uIGtleXMuIFdpbmRvd3MgcmVwb3J0cyBzY2FuY29kZQogICAgICAgICAgICB3aXRob3V0ICJleHRlbmRlZC1rZXkiIGZsYWcuIEhvd2V2ZXIgV2luZSBnZW5lcmF0ZXMgc2NhbmNvZGUKICAgICAgICAgICAgKndpdGgqICJleHRlbmRlZC1rZXkiIGZsYWcuIFNlZW1zIHRvIG9jY3VyICpvbmx5KiBmb3IgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIGtleXMuIFNvb29vLi4gV2Ugd2lsbCBsZWF2ZSB0aGUgdGFibGUgYWxvbmUgYW5kCiAgICAgICAgICAgIGZ1ZGdlIHRoZSBsb29rdXAgaGVyZSB0aWxsIHRoZSBvdGhlciBwYXJ0IGlzIGZvdW5kIGFuZCBmaXhlZCEhISAqLwoKICBpZiAoICgoc2NhbkNvZGUgPj0gMHgxM2IpICYmIChzY2FuQ29kZSA8PSAweDE0NCkpIHx8CiAgICAgICAoc2NhbkNvZGUgPT0gMHgxNTcpIHx8IChzY2FuQ29kZSA9PSAweDE1OCkpCiAgICBzY2FuQ29kZSAmPSAweGZmOyAgIC8qIHJlbW92ZSAiZXh0ZW5kZWQta2V5IiBmbGFnIGZvciBGeCBrZXlzICovCgogIC8qIGxldCdzIGRvIHNjYW5jb2RlIC0+IGtleWNvZGUgLT4ga2V5c3ltIC0+IFN0cmluZyAqLwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CgogIGZvciAoa2V5aT1taW5fa2V5Y29kZTsga2V5aTw9bWF4X2tleWNvZGU7IGtleWkrKykKICAgICAgaWYgKChrZXljMnNjYW5ba2V5aV0pID09IHNjYW5Db2RlKQogICAgICAgICBicmVhazsKICBpZiAoa2V5aSA8PSBtYXhfa2V5Y29kZSkKICB7CiAgICAgIElOVCByYzsKCiAgICAgIGtleWMgPSAoS2V5Q29kZSkga2V5aTsKICAgICAga2V5cyA9IGtleWNvZGVfdG9fa2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwogICAgICBuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXMpOwoKICAgICAgaWYgKG5hbWUgJiYgKHZrZXkgPT0gVktfU0hJRlQgfHwgdmtleSA9PSBWS19DT05UUk9MIHx8IHZrZXkgPT0gVktfTUVOVSkpCiAgICAgIHsKICAgICAgICAgIGNoYXIqIGlkeCA9IHN0cnJjaHIobmFtZSwgJ18nKTsKICAgICAgICAgIGlmIChpZHggJiYgKHN0cmNhc2VjbXAoaWR4LCAiX3IiKSA9PSAwIHx8IHN0cmNhc2VjbXAoaWR4LCAiX2wiKSA9PSAwKSkKICAgICAgICAgIHsKICAgICAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICAgICAgICAgICAgVFJBQ0UoImZvdW5kIHNjYW49JTA0eCBrZXljPSV1IGtleXN5bT0lbHggbW9kaWZpZWRfc3RyaW5nPSVzXG4iLAogICAgICAgICAgICAgICAgICAgIHNjYW5Db2RlLCBrZXljLCBrZXlzLCBkZWJ1Z3N0cl9hbihuYW1lLGlkeC1uYW1lKSk7CiAgICAgICAgICAgICAgcmMgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbmFtZSwgaWR4LW5hbWUrMSwgbHBCdWZmZXIsIG5TaXplKTsKICAgICAgICAgICAgICBpZiAoIXJjKSByYyA9IG5TaXplOwogICAgICAgICAgICAgIGxwQnVmZmVyWy0tcmNdID0gMDsKICAgICAgICAgICAgICByZXR1cm4gcmM7CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChuYW1lKQogICAgICB7CiAgICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CiAgICAgICAgICBUUkFDRSgiZm91bmQgc2Nhbj0lMDR4IGtleWM9JXUga2V5c3ltPSUwNHggdmtleT0lMDR4IHN0cmluZz0lc1xuIiwKICAgICAgICAgICAgICAgIHNjYW5Db2RlLCBrZXljLCAoaW50KWtleXMsIHZrZXksIGRlYnVnc3RyX2EobmFtZSkpOwogICAgICAgICAgcmMgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgbmFtZSwgLTEsIGxwQnVmZmVyLCBuU2l6ZSk7CiAgICAgICAgICBpZiAoIXJjKSByYyA9IG5TaXplOwogICAgICAgICAgbHBCdWZmZXJbLS1yY10gPSAwOwogICAgICAgICAgcmV0dXJuIHJjOwogICAgICB9CiAgfQoKICAvKiBGaW5hbGx5IGlzc3VlIFdBUk4gZm9yIHVua25vd24ga2V5cyAgICovCgogIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICBXQVJOKCIoJTA4eCwlcCwlZCk6IHVuc3VwcG9ydGVkIGtleSwgdmtleT0lMDRYLCBhbnNpPSUwNHhcbiIsbFBhcmFtLGxwQnVmZmVyLG5TaXplLHZrZXksYW5zaSk7CiAgKmxwQnVmZmVyID0gMDsKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlYMTFEUlZfS0VZQk9BUkRfTWFwRGVhZEtleXN5bQogKi8Kc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKQp7Cglzd2l0Y2ggKGtleXN5bSkKCSAgICB7CgkvKiBzeW1ib2xpYyBBU0NJSSBpcyB0aGUgc2FtZSBhcyBkZWZpbmVkIGluIHJmYzEzNDUgKi8KI2lmZGVmIFhLX2RlYWRfdGlsZGUKCSAgICBjYXNlIFhLX2RlYWRfdGlsZGUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFN0UgOiAvKiBYZnJlZSdzIFhLX0R0aWxkZSAqLwoJCXJldHVybiAnfic7CS8qICc/ICovCiNpZmRlZiBYS19kZWFkX2FjdXRlCgkgICAgY2FzZSBYS19kZWFkX2FjdXRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTI3IDogLyogWGZyZWUncyBYS19EYWN1dGVfYWNjZW50ICovCgkJcmV0dXJuIDB4YjQ7CS8qICcnICovCiNpZmRlZiBYS19kZWFkX2NpcmN1bWZsZXgKCSAgICBjYXNlIFhLX2RlYWRfY2lyY3VtZmxleDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTVFIDogLyogWGZyZWUncyBYS19EY2lyY3VtZmxleF9hY2NlbnQgKi8KCQlyZXR1cm4gJ14nOwkvKiAnPiAqLwojaWZkZWYgWEtfZGVhZF9ncmF2ZQoJICAgIGNhc2UgWEtfZGVhZF9ncmF2ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU2MCA6IC8qIFhmcmVlJ3MgWEtfRGdyYXZlX2FjY2VudCAqLwoJCXJldHVybiAnYCc7CS8qICchICovCiNpZmRlZiBYS19kZWFkX2RpYWVyZXNpcwoJICAgIGNhc2UgWEtfZGVhZF9kaWFlcmVzaXMgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFMjIgOiAvKiBYZnJlZSdzIFhLX0RkaWFlcmVzaXMgKi8KCQlyZXR1cm4gMHhhODsJLyogJzogKi8KI2lmZGVmIFhLX2RlYWRfY2VkaWxsYQoJICAgIGNhc2UgWEtfZGVhZF9jZWRpbGxhIDoKCSAgICAgICAgcmV0dXJuIDB4Yjg7CS8qICcsICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9tYWNyb24KCSAgICBjYXNlIFhLX2RlYWRfbWFjcm9uIDoKCSAgICAgICAgcmV0dXJuICctJzsJLyogJ20gaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9icmV2ZQoJICAgIGNhc2UgWEtfZGVhZF9icmV2ZSA6CgkgICAgICAgIHJldHVybiAweGEyOwkvKiAnKCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYWJvdmVkb3QKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVkb3QgOgoJICAgICAgICByZXR1cm4gMHhmZjsJLyogJy4gKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlcmluZwoJICAgIGNhc2UgWEtfZGVhZF9hYm92ZXJpbmcgOgoJICAgICAgICByZXR1cm4gJzAnOwkvKiAnMCBpc24ndCBkZWZpbmVkIG9uIGlzby04ODU5LXggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2RvdWJsZWFjdXRlCgkgICAgY2FzZSBYS19kZWFkX2RvdWJsZWFjdXRlIDoKCSAgICAgICAgcmV0dXJuIDB4YmQ7CS8qICciICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9jYXJvbgoJICAgIGNhc2UgWEtfZGVhZF9jYXJvbiA6CgkgICAgICAgIHJldHVybiAweGI3OwkvKiAnPCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfb2dvbmVrCgkgICAgY2FzZSBYS19kZWFkX29nb25layA6CgkgICAgICAgIHJldHVybiAweGIyOwkvKiAnOyAqLwojZW5kaWYKLyogRklYTUU6IEkgZG9uJ3Qga25vdyB0aGlzIHRocmVlLgoJICAgIGNhc2UgWEtfZGVhZF9pb3RhIDoKCSAgICAgICAgcmV0dXJuICdpJzsKCSAgICBjYXNlIFhLX2RlYWRfdm9pY2VkX3NvdW5kIDoKCSAgICAgICAgcmV0dXJuICd2JzsKCSAgICBjYXNlIFhLX2RlYWRfc2VtaXZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAncyc7CiovCgkgICAgfQoJVFJBQ0UoIm5vIGNoYXJhY3RlciBmb3IgZGVhZCBrZXlzeW0gMHglMDhseFxuIixrZXlzeW0pOwoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJVG9Vbmljb2RlRXggKFgxMURSVi5AKQogKgogKiBUaGUgVG9Vbmljb2RlIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsLWtleSBjb2RlIGFuZCBrZXlib2FyZAogKiBzdGF0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBXaW5kb3dzIGNoYXJhY3RlciBvciBjaGFyYWN0ZXJzLgogKgogKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBhIGRlYWQga2V5LCB0aGUgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlLiBPdGhlcndpc2UsCiAqIGl0IGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICogVmFsdWUJTWVhbmluZwogKiAwCVRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgaGFzIG5vIHRyYW5zbGF0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUga2V5Ym9hcmQuCiAqIDEJT25lIFdpbmRvd3MgY2hhcmFjdGVyIHdhcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4KICogMglUd28gY2hhcmFjdGVycyB3ZXJlIGNvcGllZCB0byB0aGUgYnVmZmVyLiBUaGlzIHVzdWFsbHkgaGFwcGVucyB3aGVuIGEKICogICAgICBkZWFkLWtleSBjaGFyYWN0ZXIgKGFjY2VudCBvciBkaWFjcml0aWMpIHN0b3JlZCBpbiB0aGUga2V5Ym9hcmQgbGF5b3V0IGNhbm5vdAogKiAgICAgIGJlIGNvbXBvc2VkIHdpdGggdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGtleSB0byBmb3JtIGEgc2luZ2xlIGNoYXJhY3Rlci4KICoKICogRklYTUUgOiBzaG91bGQgZG8gdGhlIGFib3ZlIChyZXR1cm4gMiBmb3Igbm9uIG1hdGNoaW5nIGRlYWRjaGFyK2NoYXIgY29tYmluYXRpb25zKQogKgogKi8KSU5UIENERUNMIFgxMURSVl9Ub1VuaWNvZGVFeChVSU5UIHZpcnRLZXksIFVJTlQgc2NhbkNvZGUsIGNvbnN0IEJZVEUgKmxwS2V5U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXU1RSIGJ1ZlcsIGludCBidWZXX3NpemUsIFVJTlQgZmxhZ3MsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgICBYS2V5RXZlbnQgZTsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgSU5UIHJldDsKICAgIGludCBrZXljOwogICAgY2hhciBidWZbMTBdOwogICAgY2hhciAqbHBDaGFyID0gYnVmOwogICAgSFdORCBmb2N1czsKICAgIFhJQyB4aWM7CiAgICBTdGF0dXMgc3RhdHVzID0gMDsKCiAgICBpZiAoc2NhbkNvZGUgJiAweDgwMDApCiAgICB7CiAgICAgICAgVFJBQ0VfKGtleSkoIktleSBVUCwgZG9pbmcgbm90aGluZ1xuIiApOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICghbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChoa2wpKQogICAgICAgIEZJWE1FXyhrZXkpKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCiAgICBpZiAoKGxwS2V5U3RhdGVbVktfTUVOVV0gJiAweDgwKSAmJiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgewogICAgICAgIFRSQUNFXyhrZXkpKCJDdHJsK0FsdCtba2V5XSB3b24ndCBnZW5lcmF0ZSBhIGNoYXJhY3RlclxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZS5kaXNwbGF5ID0gZGlzcGxheTsKICAgIGUua2V5Y29kZSA9IDA7CiAgICBlLnN0YXRlID0gMDsKICAgIGUudHlwZSA9IEtleVByZXNzOwoKICAgIGZvY3VzID0geDExZHJ2X3RocmVhZF9kYXRhKCktPmxhc3RfeGljX2h3bmQ7CiAgICBpZiAoIWZvY3VzKQogICAgewogICAgICAgIGZvY3VzID0gR2V0Rm9jdXMoKTsKICAgICAgICBpZiAoZm9jdXMpIGZvY3VzID0gR2V0QW5jZXN0b3IoIGZvY3VzLCBHQV9ST09UICk7CiAgICAgICAgaWYgKCFmb2N1cykgZm9jdXMgPSBHZXRBY3RpdmVXaW5kb3coKTsKICAgIH0KICAgIGUud2luZG93ID0gWDExRFJWX2dldF93aG9sZV93aW5kb3coIGZvY3VzICk7CiAgICB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBmb2N1cyApOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKCiAgICBpZiAobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKQogICAgewoJVFJBQ0VfKGtleSkoIlNoaWZ0TWFzayA9ICUwNHhcbiIsIFNoaWZ0TWFzayk7CgllLnN0YXRlIHw9IFNoaWZ0TWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NBUElUQUxdICYgMHgwMSkKICAgIHsKCVRSQUNFXyhrZXkpKCJMb2NrTWFzayA9ICUwNHhcbiIsIExvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTG9ja01hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApCiAgICB7CglUUkFDRV8oa2V5KSgiQ29udHJvbE1hc2sgPSAlMDR4XG4iLCBDb250cm9sTWFzayk7CgllLnN0YXRlIHw9IENvbnRyb2xNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfTlVNTE9DS10gJiAweDAxKQogICAgewoJVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrID0gJTA0eFxuIiwgTnVtTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBOdW1Mb2NrTWFzazsKICAgIH0KCiAgICAvKiBSZXN0b3JlIHNhdmVkIEFsdEdyIHN0YXRlICovCiAgICBUUkFDRV8oa2V5KSgiQWx0R3JNYXNrID0gJTA0eFxuIiwgQWx0R3JNYXNrKTsKICAgIGUuc3RhdGUgfD0gQWx0R3JNYXNrOwoKICAgIFRSQUNFXyhrZXkpKCIoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9IDB4JTA0eFxuIiwKCQl2aXJ0S2V5LCBzY2FuQ29kZSwgZS5zdGF0ZSk7CgogICAgLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKICAgICAgeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KICAgICAgICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHZpcnRLZXkpCiAgICAgICAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCiAgICAgICAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgICBpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLCZlKSAmIDB4RkYpICE9IHZpcnRLZXkpIHsKICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwogICAgICAgICAgICAgIH0KCSAgfQogICAgICB9CgogICAgaWYgKHZpcnRLZXkgPj0gVktfTEVGVCAmJiB2aXJ0S2V5IDw9IFZLX0RPV04pCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXkgLSBWS19MRUZUICsgWEtfTGVmdCk7CgogICAgaWYgKCh2aXJ0S2V5Pj1WS19OVU1QQUQwKSAmJiAodmlydEtleTw9VktfTlVNUEFEOSkpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKCiAgICAvKiBXaW5kb3dzIGFsd2F5cyBnZW5lcmF0ZXMgVktfREVDSU1BTCBmb3IgRGVsLy4gb24ga2V5cGFkIHdoaWxlIHNvbWUKICAgICAqIFgxMSBrZXlib2FyZCBsYXlvdXRzIGdlbmVyYXRlIFhLX0tQX1NlcGFyYXRvciBpbnN0ZWFkIG9mIFhLX0tQX0RlY2ltYWwKICAgICAqIGluIG9yZGVyIHRvIHByb2R1Y2UgYSBsb2NhbGUgZGVwZW5kZW50IG51bWVyaWMgc2VwYXJhdG9yLgogICAgICovCiAgICBpZiAodmlydEtleSA9PSBWS19ERUNJTUFMIHx8IHZpcnRLZXkgPT0gVktfU0VQQVJBVE9SKQogICAgewogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9TZXBhcmF0b3IpOwogICAgICAgIGlmICghZS5rZXljb2RlKQogICAgICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CiAgICB9CgogICAgaWYgKCFlLmtleWNvZGUgJiYgdmlydEtleSAhPSBWS19OT05BTUUpCiAgICAgIHsKCVdBUk5fKGtleSkoIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB2aXJ0S2V5KTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CglyZXR1cm4gMDsKICAgICAgfQogICAgZWxzZSBUUkFDRV8oa2V5KSgiRm91bmQga2V5Y29kZSAldVxuIixlLmtleWNvZGUpOwoKICAgIFRSQUNFXyhrZXkpKCJ0eXBlICVkLCB3aW5kb3cgJWx4LCBzdGF0ZSAweCUwNHgsIGtleWNvZGUgJXVcbiIsCgkJZS50eXBlLCBlLndpbmRvdywgZS5zdGF0ZSwgZS5rZXljb2RlKTsKCiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZywKICAgICAqIGUudHlwZSB3YXMgc2V0IHRvIEtleVByZXNzIGFib3ZlLgogICAgICovCiAgICBpZiAoeGljKQogICAgewogICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICBUUkFDRV8oa2V5KSgiWG1iTG9va3VwU3RyaW5nIG5lZWRzICVkIGJ5dGUocylcbiIsIHJldCk7CiAgICAgICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgewogICAgICAgICAgICBscENoYXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcmV0KTsKICAgICAgICAgICAgaWYgKGxwQ2hhciA9PSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlJfKGtleSkoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkhXG4iKTsKICAgICAgICAgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAma2JkX3NlY3Rpb24gKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBscENoYXIsIHJldCwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHJldCA9IFhMb29rdXBTdHJpbmcoJmUsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwoKICAgIFRSQUNFXyhrZXkpKCJuYnl0ZSA9ICVkLCBzdGF0dXMgMHgleFxuIiwgcmV0LCBzdGF0dXMpOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJObyBOYW1lIjsKICAgICAgICBUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWx4ICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZS50eXBlID09IEtleVByZXNzKSA/ICJLZXlQcmVzcyIgOiAiS2V5UmVsZWFzZSIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUsIHJldCwgZGVidWdzdHJfYW4obHBDaGFyLCByZXQpKTsKICAgIH0KCiAgICBpZiAocmV0ID09IDApCiAgICB7CgljaGFyIGRlYWRfY2hhcjsKCiNpZmRlZiBYS19FdXJvU2lnbgogICAgICAgIC8qIEFuIHVnbHkgaGFjayBmb3IgRXVyb1NpZ246IFggY2FuJ3QgdHJhbnNsYXRlIGl0IHRvIGEgY2hhcmFjdGVyCiAgICAgICAgICAgZm9yIHNvbWUgbG9jYWxlcy4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0V1cm9TaWduKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MjBBQzsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CiNlbmRpZgogICAgICAgIC8qIFNwZWNpYWwgY2FzZTogWCB0dXJucyBzaGlmdC10YWIgaW50byBJU09fTGVmdF9UYWIuICovCiAgICAgICAgLyogSGVyZSB3ZSBjaGFuZ2UgaXQgYmFjay4gKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0lTT19MZWZ0X1RhYiAmJiAhKGUuc3RhdGUgJiBDb250cm9sTWFzaykpCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgwOTsKICAgICAgICAgICAgcmV0ID0gMTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJZGVhZF9jaGFyID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJaWYgKGRlYWRfY2hhcikKICAgICAgICB7CgkgICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsICZkZWFkX2NoYXIsIDEsIGJ1ZlcsIGJ1Zldfc2l6ZSk7CgkgICAgcmV0ID0gLTE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5c3ltID49IDB4MDEwMDAxMDAgJiYga2V5c3ltIDw9IDB4MDEwMGZmZmYpCiAgICAgICAgewogICAgICAgICAgICAvKiBVbmljb2RlIGRpcmVjdCBtYXBwaW5nICovCiAgICAgICAgICAgIGJ1ZldbMF0gPSBrZXlzeW0gJiAweGZmZmY7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsKICAgICAgICAgICAgYnVmV1swXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoJZWxzZQoJICAgIHsKCSAgICBjb25zdCBjaGFyICprc25hbWU7CgoJICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJICAgIGlmICgha3NuYW1lKQoJCWtzbmFtZSA9ICJObyBOYW1lIjsKCSAgICBpZiAoKGtleXN5bSA+PiA4KSAhPSAweGZmKQoJCXsKCQlXQVJOXyhrZXkpKCJubyBjaGFyIGZvciBrZXlzeW0gJTA0bHggKCVzKSA6XG4iLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lKTsKCQlXQVJOXyhrZXkpKCJ2aXJ0S2V5PSVYLCBzY2FuQ29kZT0lWCwga2V5Y29kZT0ldSwgc3RhdGU9JVhcbiIsCiAgICAgICAgICAgICAgICAgICAgdmlydEtleSwgc2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CgkJfQoJICAgIH0KCX0KICAgIGVsc2UgeyAgLyogcmV0ICE9IDAgKi8KICAgICAgICAvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIHRvIGhhbmRsZSA6IFNoaWZ0ICsgYXJyb3csIHNoaWZ0ICsgaG9tZSwgLi4uCiAgICAgICAgICAgWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QuIExldCdzIGVhdCBpdC4gKi8KICAgICAgICBpZiAoIShlLnN0YXRlICYgTnVtTG9ja01hc2spICAvKiBOdW1Mb2NrIGlzIG9mZiAqLwogICAgICAgICAgICAmJiAoZS5zdGF0ZSAmIFNoaWZ0TWFzaykgLyogU2hpZnQgaXMgcHJlc3NlZCAqLwogICAgICAgICAgICAmJiAoa2V5c3ltPj1YS19LUF8wKSAmJiAoa2V5c3ltPD1YS19LUF85KSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKiBtb3JlIGFyZWFzIHdoZXJlIFggcmV0dXJucyBjaGFyYWN0ZXJzIGJ1dCBXaW5kb3dzIGRvZXMgbm90CiAgICAgICAgICAgQ1RSTCArIG51bWJlciBvciBDVFJMICsgc3ltYm9sICovCiAgICAgICAgaWYgKGUuc3RhdGUgJiBDb250cm9sTWFzaykKICAgICAgICB7CiAgICAgICAgICAgIGlmICgoKGtleXN5bT49MzMpICYmIChrZXlzeW0gPCAnQScpKSB8fAogICAgICAgICAgICAgICAgKChrZXlzeW0gPiAnWicpICYmIChrZXlzeW0gPCAnYScpKSB8fAogICAgICAgICAgICAgICAgKGtleXN5bSA9PSBYS19UYWIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19DT05UUk9MXSAmIDB4ODApIC8qIENvbnRyb2wgaXMgcHJlc3NlZCAqLwoJCSYmIChrZXlzeW0gPT0gWEtfUmV0dXJuIHx8IGtleXN5bSA9PSBYS19LUF9FbnRlcikpCiAgICAgICAgewogICAgICAgICAgICBscENoYXJbMF0gPSAnXG4nOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgIH0KCiAgICAgICAgLyogSGFjayB0byBkZXRlY3QgYW4gWExvb2t1cFN0cmluZyBoYXJkLWNvZGVkIHRvIExhdGluMSAqLwogICAgICAgIGlmIChyZXQgPT0gMSAmJiBrZXlzeW0gPj0gMHgwMGEwICYmIGtleXN5bSA8PSAweDAwZmYgJiYgKEJZVEUpbHBDaGFyWzBdID09IGtleXN5bSkKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAoQllURSlscENoYXJbMF07CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCS8qIHBlcmZvcm0gdHJhbnNsYXRpb24gdG8gdW5pY29kZSAqLwoJaWYocmV0KQoJewoJICAgIFRSQUNFXyhrZXkpKCJUcmFuc2xhdGluZyBjaGFyIDB4JTAyeCB0byB1bmljb2RlXG4iLCAqKEJZVEUgKilscENoYXIpOwoJICAgIHJldCA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBscENoYXIsIHJldCwgYnVmVywgYnVmV19zaXplKTsKCX0KICAgIH0KCmZvdW5kOgogICAgaWYgKGJ1ZiAhPSBscENoYXIpCiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBDaGFyKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmtiZF9zZWN0aW9uICk7CgogICAgLyogTnVsbC10ZXJtaW5hdGUgdGhlIGJ1ZmZlciwgaWYgdGhlcmUncyByb29tLiAgTVNETiBjbGVhcmx5IHN0YXRlcyB0aGF0IHRoZQogICAgICAgY2FsbGVyIG11c3Qgbm90IGFzc3VtZSB0aGlzIGlzIGRvbmUsIGJ1dCBzb21lIHByb2dyYW1zIChlLmcuIEF1ZGlvc3VyZikgZG8uICovCiAgICBpZiAoMSA8PSByZXQgJiYgcmV0IDwgYnVmV19zaXplKQogICAgICAgIGJ1ZldbcmV0XSA9IDA7CgogICAgVFJBQ0VfKGtleSkoInJldHVybmluZyAlZCB3aXRoICVzXG4iLCByZXQsIGRlYnVnc3RyX3duKGJ1ZlcsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCZWVwIChYMTFEUlYuQCkKICovCnZvaWQgQ0RFQ0wgWDExRFJWX0JlZXAodm9pZCkKewogICAgWEJlbGwoZ2RpX2Rpc3BsYXksIDApOwp9Cg==