LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBLw6V2ZW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgojaW5jbHVkZSA8WDExL2tleXN5bS5oPgojaW5jbHVkZSA8WDExL1hsaWIuaD4KI2luY2x1ZGUgPFgxMS9YcmVzb3VyY2UuaD4KI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgojaWZkZWYgSEFWRV9YMTFfWEtCTElCX0gKI2luY2x1ZGUgPFgxMS9YS0JsaWIuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW51c2VyLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChrZXlib2FyZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7CgovKiBrZXkgc3RhdGUgdGFibGUgYml0czoKICAweDgwIC0+IGtleSBpcyBwcmVzc2VkCiAgMHg0MCAtPiBrZXkgZ290IHByZXNzZWQgc2luY2UgbGFzdCB0aW1lCiAgMHgwMSAtPiBrZXkgaXMgdG9nZ2xlZAoqLwpCWVRFIGtleV9zdGF0ZV90YWJsZVsyNTZdOwoKc3RhdGljIEJZVEUgVHJhY2tTeXNLZXkgPSAwOyAvKiBkZXRlcm1pbmUgd2hldGhlciBBTFQga2V5IHVwIHdpbGwgY2F1c2UgYSBXTV9TWVNLRVlVUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgV01fS0VZVVAgbWVzc2FnZSAqLwoKc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CnN0YXRpYyBXT1JEIGtleWMydmtleVsyNTZdLCBrZXljMnNjYW5bMjU2XTsKCnN0YXRpYyBpbnQgTnVtTG9ja01hc2ssIFNjcm9sbExvY2tNYXNrLCBBbHRHck1hc2s7IC8qIG1hc2sgaW4gdGhlIFhLZXlFdmVudCBzdGF0ZSAqLwoKc3RhdGljIGNoYXIgS0VZQk9BUkRfTWFwRGVhZEtleXN5bShLZXlTeW0ga2V5c3ltKTsKCi8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwojZGVmaW5lIE1BSU5fTEVOIDQ5CnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5W01BSU5fTEVOXSA9CnsKLyogdGhpcyBpcyBteSAoMTAyLWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7CiAvKiBgICAgIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICA9ICovCiAgIDB4MjksMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIFsgICAgXSAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgJyAgICBcICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogXCAgICAgIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHg1ZSwweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2LCAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fZHZvcmFrW01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICBbICAgIF0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MUEsMHgxQiwKIC8qICcgICAgLCAgICAuICAgIHAgICAgeSAgICBmICAgIGcgICAgYyAgICByICAgIGwgICAgLyAgICA9ICovCiAgIDB4MjgsMHgzMywweDM0LDB4MTksMHgxNSwweDIxLDB4MjIsMHgyRSwweDEzLDB4MjYsMHgzNSwweDBELAogLyogYSAgICBvICAgIGUgICAgdSAgICBpICAgIGQgICAgaCAgICB0ICAgIG4gICAgcyAgICAtICAgIFwgKi8KICAgMHgxRSwweDE4LDB4MTIsMHgxNiwweDE3LDB4MjAsMHgyMywweDE0LDB4MzEsMHgxRiwweDBDLDB4MkIsCiAvKiA7ICAgIHEgICAgaiAgICBrICAgIHggICAgYiAgICBtICAgIHcgICAgdiAgICB6ICovCiAgIDB4MjcsMHgxMCwweDI0LDB4MjUsMHgyRCwweDMwLDB4MzIsMHgxMSwweDJGLDB4MkMsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7CiAgLyogdGhpcyBpcyBteSAoMTA2LWtleSkga2V5Ym9hcmQgbGF5b3V0LCBzb3JyeSBpZiBpdCBkb2Vzbid0IHF1aXRlIG1hdGNoIHlvdXJzICovCiAvKiAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIC0gICAgXiAgICBcICovCiAgIDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MjksCiAvKiBxICAgIHcgICAgZSAgICByICAgIHQgICAgeSAgICB1ICAgIGkgICAgbyAgICBwICAgIEAgICAgWyAqLwogICAweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwKIC8qIGEgICAgcyAgICBkICAgIGYgICAgZyAgICBoICAgIGogICAgayAgICBsICAgIDsgICAgOiAgICBdICovCiAgIDB4MUUsMHgxRiwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsMHgyNSwweDI2LDB4MjcsMHgyOCwweDJCLAogLyogeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDJDLDB4MkQsMHgyRSwweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LAogICAweDU2IC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewogLyogMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgIF4gICAgXCAqLwogICAweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwweDdkLAogLyogcSAgICB3ICAgIGUgICAgciAgICB0ICAgIHkgICAgdSAgICBpICAgIG8gICAgcCAgICBAICAgIFsgKi8KICAgMHgxMCwweDExLDB4MTIsMHgxMywweDE0LDB4MTUsMHgxNiwweDE3LDB4MTgsMHgxOSwweDFBLDB4MUIsCiAvKiBhICAgIHMgICAgZCAgICBmICAgIGcgICAgaCAgICBqICAgIGsgICAgbCAgICA7ICAgIDogICAgXSAqLwogICAweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsMHgyQiwKIC8qIHogICAgeCAgICBjICAgIHYgICAgYiAgICBuICAgIG0gICAgLCAgICAuICAgIC8gKi8KICAgMHgyQywweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKICAgMHg3MyAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUyxWS19PRU1fMywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlfbWFjanBbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV83LFZLX09FTV81LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzMsVktfT0VNXzQsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV9QTFVTLFZLX09FTV8xLFZLX09FTV82LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV92MltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV81LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fUExVUyxWS19PRU1fNCwKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMyxWS19PRU1fNyxWS19PRU1fMiwKICAgJ1onLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV9NSU5VUywKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR6W01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzMsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9NSU5VUyxWS19PRU1fUExVUywKICAgJ1EnLCdXJywnRScsJ1InLCdUJywnWicsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV80LFZLX09FTV82LAogICAnQScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJyxWS19PRU1fMSxWS19PRU1fNyxWS19PRU1fNSwKICAgJ1knLCdYJywnQycsJ1YnLCdCJywnTicsJ00nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzgsVktfT0VNXzUsCiAgIFZLX09FTV83LCdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fUExVUywKICAgJ0EnLCdaJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnUScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJywnTScsVktfT0VNXzMsVktfT0VNXzUsCiAgICdXJywnWCcsJ0MnLCdWJywnQicsJ04nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9kdm9yYWtbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX09FTV83LFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELCdQJywnWScsJ0YnLCdHJywnQycsJ1InLCdMJyxWS19PRU1fMixWS19PRU1fUExVUywKICAgJ0EnLCdPJywnRScsJ1UnLCdJJywnRCcsJ0gnLCdUJywnTicsJ1MnLFZLX09FTV9NSU5VUyxWS19PRU1fNSwKICAgVktfT0VNXzEsJ1EnLCdKJywnSycsJ1gnLCdCJywnTScsJ1cnLCdWJywnWicsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKioqIERFRklORSBZT1VSIE5FVyBMQU5HVUFHRS1TUEVDSUZJQyBNQVBQSU5HUyBCRUxPVywgU0VFIEVYSVNUSU5HIFRBQkxFUyAqLwoKLyogdGhlIFZLIG1hcHBpbmdzIGZvciB0aGUgbWFpbiBrZXlib2FyZCB3aWxsIGJlIGF1dG8tYXNzaWduZWQgYXMgYmVmb3JlLAogICBzbyB3aGF0IHdlIGhhdmUgaGVyZSBpcyBqdXN0IHRoZSBjaGFyYWN0ZXIgdGFibGVzICovCi8qIG9yZGVyOiBOb3JtYWwsIFNoaWZ0LCBBbHRHciwgU2hpZnQtQWx0R3IgKi8KLyogV2UgcmVjb21tZW5kIHlvdSB3cml0ZSBqdXN0IHdoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IChpLmUuIHdoYXQncwogICB3cml0dGVuIG9uIHRoZSBrZXljYXBzKSwgbm90IHRoZSBidW5jaCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmVoaW5kIEFsdEdyCiAgIGFuZCBTaGlmdC1BbHRHciBpZiBpdCBjYW4gdmFyeSBhbW9uZyBkaWZmZXJlbnQgWCBzZXJ2ZXJzICovCi8qIFJlbWVtYmVyIHRoYXQgeW91ciAxMDJuZCBrZXkgKHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSBzaG91bGQgYmUgb24gYQogICBzZXBhcmF0ZSBsaW5lLCBzZWUgZXhpc3RpbmcgdGFibGVzICovCi8qIElmIFdpbmUgZmFpbHMgdG8gbWF0Y2ggeW91ciBuZXcgdGFibGUsIHVzZSBXSU5FREVCVUc9K2tleSB0byBmaW5kIG91dCB3aHkgKi8KLyogUmVtZW1iZXIgdG8gYWxzbyBhZGQgeW91ciBuZXcgdGFibGUgdG8gdGhlIGxheW91dCBpbmRleCB0YWJsZSBmYXIgYmVsb3chICovCgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChtb3N0bHkgY29udHJpYnV0ZWQgYnkgVXdlIEJvbm5lcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCi8qIChYRnJlZTg2IHJlcG9ydHMgdGhlIDw+IGtleSBldmVuIGlmIGl0J3Mgbm90IHBoeXNpY2FsbHkgdGhlcmUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrIHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2R2b3Jha1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIlt7IiwiXX0iLAogIidcIiIsIiw8IiwiLj4iLCJwUCIsInlZIiwiZkYiLCJnRyIsImNDIiwiclIiLCJsTCIsIi8/IiwiPSsiLAogImFBIiwib08iLCJlRSIsInVVIiwiaUkiLCJkRCIsImhIIiwidFQiLCJuTiIsInNTIiwiLV8iLCJcXHwiLAogIjs6IiwicVEiLCJqSiIsImtLIiwieFgiLCJiQiIsIm1NIiwid1ciLCJ2ViIsInpaIgp9OwoKLyoqKiBCcml0aXNoIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VS1tNQUlOX0xFTl1bNF0gPQp7CiAiYCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInQCIsIiN+IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFx8Igp9OwoKLyoqKiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZSW01BSU5fTEVOXVs0XSA9CnsKICKyIiwiJjEiLCLpMiIsIlwiMyIsIic0IiwiKDUiLCItNiIsIug3IiwiXzgiLCLnOSIsIuAwIiwiKbAiLCI9KyIsCiAiYUEiLCJ6WiIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeqCIsIiSjIiwKICJxUSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCJtTSIsIvklIiwiKrUiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIiGnIiwKICI8PiIKfTsKCi8qKiogSWNlbGFuZGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGlzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JU1tNQUlOX0xFTl1bNF0gPQp7CiAisCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIvbWIiwiLV8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi8NAiLCInPyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi5sYiLCK0xCIsIisqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCL+3iIsCiAiPD4iCn07CgovKiBBbGwgZ2VybWFuIGtleWIgbGF5b3V0IHRhYmxlcyBoYXZlIHRoZSBhY3V0ZS9hcG9zdHJvcGhlIHN5bWJvbCBuZXh0IHRvCiAqIHRoZSBCQUNLU1BBQ0Uga2V5IHJlbW92ZWQgKHJlcGxhY2VkIHdpdGggTlVMTCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZQogKiBkZXRlY3Rpb24gY29kZSkuCiAqIFRoaXMgd2FzIGRvbmUgYmVjYXVzZSB0aGUgbWFwcGluZyBvZiB0aGUgYWN1dGUgKGFuZCBhcG9zdHJvcGhlKSBpcyBkb25lCiAqIGRpZmZlcmVudGx5IGluIHZhcmlvdXMgeGtiLWRhdGEveGtleWJvYXJkLWNvbmZpZyB2ZXJzaW9ucy4gU29tZSByZXBsYWNlCiAqIHRoZSBhY3V0ZSB3aXRoIGEgbm9ybWFsIGFwb3N0cm9waGUsIHNvIHRoYXQgdGhlIGFwb3N0cm9waGUgaXMgZm91bmQgdHdpY2UKICogb24gdGhlIGtleWJvYXJkIChvbmUgbmV4dCB0byBCQUNLU1BBQ0UgYW5kIG9uZSBuZXh0IHRvIEVOVEVSKS4KICogT3RoZXJzIHB1dCB0aGUgYWN1dGUgYW5kIGdyYXZlIGFjY2VudHMgb24gdGhlIGtleSBsZWZ0IG9mIEJBQ0tTUEFDRS4KICogTW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgZmQubyBidWd0cmFja2VyOgogKiBodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUxNAogKi8KCi8qKiogR2VybWFuIExvZ2l0ZWNoIERlc2t0b3AgUHJvIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9sb2dpdGVjaFtNQUlOX0xFTl1bNF0gPQp7CiAiXlx4YjAiLCIxISIsIjJcIiIsIjNceGE3IiwiNCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiXHhkZj9cXCIsIlwwYCIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiXHhmY1x4ZGMiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4ZjZceGQ2IiwiXHhlNFx4YzQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCLfPyIsIlwwYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PnwiCn07CgovKioqIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbm9kZWFkW01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwiIiwiM6ciLCI0JCIsIjUlIiwiNiYiLCI3L3siLCI4KFsiLCI5KV0iLCIwPX0iLCLfP1xcIiwiIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNoIC12YXJpYW50IGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TR1tNQUlOX0xFTl1bNF0gPQp7CiAip7AiLCIxKyIsIjJcIiIsIjMqIiwiNOciLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIl5gIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzoIiwiqCEiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbpIiwi5OAiLCIkoyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZnIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NGW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi6PwiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6fYiLCLg5CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIE5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IE92ZSBL5XZlbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfTk9bTUFJTl9MRU5dWzRdID0KewogInynIiwiMSEiLCIyXCJAIiwiMyOjIiwiNKQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIis/IiwiXFxgtCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqhefiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+NgiLCLmxiIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIERhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBkaykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREFbTUFJTl9MRU5dWzRdID0KewogIr2nIiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIvjYIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0VbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRXN0b25pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZWUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VUW01BSU5fTEVOXVs0XSA9CnsKICK3fiIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCL11SIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYV9lbmhhbmNlZCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0ZbTUFJTl9MRU5dWzRdID0KewogIiN8XFwiLCIxIbEiLCIyXCJAIiwiMy+jIiwiNCSiIiwiNSWkIiwiNj+sIiwiNyamIiwiOCqyIiwiOSizIiwiMCm8IiwiLV+9IiwiPSu+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0+nIiwicFC2IiwiXl5bIiwiuKhdIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7On4iLCJgYHsiLCI8Pn0iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCctIiwiLiIsIunJIiwKICKru7AiCn07CgovKioqIENhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FfZnJbTUFJTl9MRU5dWzRdID0KewogIiN8IiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNSUiLCI2PyIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJeXiIsIrioIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsImBgIiwiPD4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLCciLCIuIiwi6ckiLAogIqu7Igp9OwoKLyoqKiBDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjYSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQ0FbTUFJTl9MRU5dWzRdID0KewogIi9cXCIsIjEhuaEiLCIyQLIiLCIzI7OjIiwiNCS8pCIsIjUlvSIsIjY/viIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P+NgiLCJwUP7eIiwiXqioIiwi58d+IiwKICJhQebGIiwic1PfpyIsImRE8NAiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OrQiLCLoyCIsIuDAIiwKICJ6WiIsInhYIiwiY0OiqSIsInZWIiwiYkIiLCJuTiIsIm1NtboiLCIsJyIsIi5cIrf3Iiwi6ckiLAogIvnZIgp9OwoKLyoqKiBQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHB0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9QVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKruyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCIrKiIsIrRgIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIrqqIiwifl4iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBpdCkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSVRbTUFJTl9MRU5dWzRdID0KewogIlxcfCIsIjEhIiwiMlwiIiwiM6MiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwi7F4iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi6OkiLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8uciLCLgsCIsIvmnIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZmkpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0ZJW01BSU5fTEVOXVs0XSA9CnsKICKnvSIsIjEhIiwiMlwiIiwiMyMiLCI0pCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIis/IiwitGAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi5cUiLCKoXiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9tYiLCLkxCIsIicqIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX2Jkc1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4oKSIsIjEhIiwiMkAyPyIsIjMjMysiLCI0JDRcIiIsIjUlIiwiNl42PSIsIjcmNzoiLCI4KjgvIiwiOSgiLCIwKSIsIi1fLUkiLCI9Ky5WIiwKICJxUSz7Iiwid1fz0yIsImVF5cUiLCJyUujIIiwidFT42CIsInlZ+dkiLCJ1VerKIiwiaUnx0SIsIm9P5MQiLCJwUOfHIiwiW3v21iIsIl19OyIsCiAiYUH83CIsInNT/98iLCJkRODAIiwiZkbuziIsImdH5sYiLCJoSOPDIiwiakry0iIsImtL7c0iLCJsTOLCIiwiOzrszCIsIidcIvfXIiwiXFx8J9siLAogInpa/t4iLCJ4WOnJIiwiY0P62iIsInZW/d0iLCJiQvTUIiwibk711SIsIm1N788iLCIsPPDQIiwiLj7ryyIsIi8/4cEiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CR19waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH731yIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH/3yIsIndX4sIiLCJlReXFIiwiclLw0CIsInRU8tIiLCJ5WfraIiwidVXz0yIsImlJ6MgiLCJvT+7OIiwicFDvzyIsIlt7+NgiLCJdffnZIiwKICJhQeDAIiwic1Px0SIsImRE5MQiLCJmRvTUIiwiZ0fjwyIsImhI9dUiLCJqSunJIiwia0vqyiIsImxM68siLCI7OiIsIidcIiIsIlxcfP7eIiwKICJ6WufHIiwieFj83CIsImND9tYiLCJ2VubGIiwiYkLhwSIsIm5O7c0iLCJtTezMIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIEJlbGFydXNpYW4gc3RhbmRhcmQga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBIbGViIFZhbG9za2EpICovCi8qKiogSXQgbWF0Y2hlcyBiZWxhcnVzaWFuIGxheW91dCBmb3IgWEtCIGZyb20gQWxleGFuZGVyIE1pa2hhaWxpYW4gICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQllbTUFJTl9MRU5dWzRdID0KewogImB+o7MiLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0+uviIsInBQ2voiLCJbe8joIiwiXX0nJyIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8L3wiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQqa2Iiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/LiwiLCAiPD58piIsCn07CgoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgUGF2ZWwgUm9za2luKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIKfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3BoYW50b21bTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl193/8iLAogImFBxuYiLCJzU9n5IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCLc/CIsIlxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2tvaThyW01BSU5fTEVOXVs0XSA9CnsKICIoKSIsIjEhIiwiMlwiIiwiMy8iLCI0JCIsIjU6IiwiNiwiLCI3LiIsIjg7IiwiOT8iLCIwJSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcfCIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgY3AxMjUxICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX2NwMTI1MVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR6ckiLCJ3V/bWIiwiZUXz0yIsInJS6soiLCJ0VOXFIiwieVntzSIsInVV48MiLCJpSfjYIiwib0/52SIsInBQ58ciLCJbe/XVIiwiXX362iIsCiAiYUH01CIsInNT+9siLCJkROLCIiwiZkbgwCIsImdH788iLCJoSPDQIiwiakruziIsImtL68siLCJsTOTEIiwiOzrmxiIsIidcIv3dIiwiXFx8IiwKICJ6Wv/fIiwieFj31yIsImND8dEiLCJ2VuzMIiwiYkLoyCIsIm5O8tIiLCJtTfzcIiwiLDzhwSIsIi4+/t4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9SVV9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR0fEiLCJ3V9f3IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVnZ+SIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX3d/SIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakrK6iIsImtLy+siLCJsTMzsIiwiOzoiLCInXCIiLCJcXHwiLAogInpa2voiLCJ4WNj4IiwiY0PD4yIsInZW1vYiLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVUgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFbTUFJTl9MRU5dWzRdID0KewogImB+rb0iLCIxITEhIiwiMkAyXCIiLCIzIzMnIiwiNCQ0KiIsIjUlNToiLCI2XjYsIiwiNyY3LiIsIjgqODsiLCI5KDkoIiwiMCkwKSIsIi1fLV8iLCI9Kz0rIiwKICJxUcrqIiwid1fD4yIsImVF1fUiLCJyUsvrIiwidFTF5SIsInlZzu4iLCJ1VcfnIiwiaUnb+yIsIm9P3f0iLCJwUNr6IiwiW3vI6CIsIl19p7ciLAogImFBxuYiLCJzU6a2IiwiZETX9yIsImZGweEiLCJnR9DwIiwiaEjS8iIsImpKz+8iLCJrS8zsIiwibEzE5CIsIjs61vYiLCInXCKktCIsIlxcfFxcfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCyekiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8vPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSBieSBPLiBOeWt5Zm9yY2h5biAqLwovKioqICAoYXMgaXQgYXBwZWFycyBvbiBtb3N0IG9mIGtleWJvYXJkcyBzb2xkIHRvZGF5KSAgICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VBX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAirb0iLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwip7ciLAogIsbmIiwiprYiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2IiwipLQiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiAocGFpciB0byB0aGUgcHJldmlvdXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3N0ZFtNQUlOX0xFTl1bNF0gPQp7CiAio7MiLCIxISIsIjJcIiIsIjMnIiwiNDsiLCI1JSIsIjY6IiwiNz8iLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICLK6iIsIsPjIiwi1fUiLCLL6yIsIsXlIiwizu4iLCLH5yIsItv7Iiwi3f0iLCLa+iIsIsjoIiwi3/8iLAogIsbmIiwi2fkiLCLX9yIsIsHhIiwi0PAiLCLS8iIsIs/vIiwizOwiLCLE5CIsItb2Iiwi3PwiLCJcXC8iLAogItHxIiwi3v4iLCLT8yIsIs3tIiwiyekiLCLU9CIsItj4IiwiwuIiLCLA4CIsIi4sIiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgZXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VTW01BSU5fTEVOXVs0XSA9CnsKICK6qiIsIjEhIiwiMlwiIiwiM7ciLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/Iiwiob8iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiYF4iLCIrKiIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi8dEiLCK0qCIsIufHIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIEJlbGdpYW4ga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkVbTUFJTl9MRU5dWzRdID0KewogIiIsIiYxfCIsIukyQCIsIlwiMyMiLCInNCIsIig1IiwipzZeIiwi6DciLCIhOCIsIuc5eyIsIuAwfSIsIimwIiwiLV8iLAogImFBIiwieloiLCJlRaQiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oWyIsIiQqXSIsCiAicVEiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SW0IiwitaNgIiwKICJ3VyIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCIsPyIsIjsuIiwiOi8iLCI9K34iLAogIjw+XFwiCn07CgovKioqIEh1bmdhcmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBodSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFVbTUFJTl9MRU5dWzRdID0KewogIjCnIiwiMSciLCIyXCIiLCIzKyIsIjQhIiwiNSUiLCI2LyIsIjc9IiwiOCgiLCI5KSIsIvbWIiwi/NwiLCLz0yIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCL11SIsIvraIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLpySIsIuHBIiwi+9siLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICLtzSIKfTsKCi8qKiogUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmpyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRerKIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9P89MiLCJwUCIsIlt7IiwiXX0iLAogImFBsaEiLCJzU7amIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEyzoyIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr+vIiwieFi8rCIsImND5sYiLCJ2ViIsImJCIiwibk7x0SIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PnwiCn07CgovKioqIFNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBzaSkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TSVtNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogIqm5IiwiqroiLCLF5SIsItLyIiwi1PQiLCLa+iIsItX1IiwiyekiLCLP7yIsItDwIiwi2/siLCJbXSIsCiAiweEiLCLT8yIsIsTkIiwixuYiLCLH5yIsIsjoIiwiqLgiLCLL6yIsIszsIiwi3v4iLCKruyIsIi1fIiwKICKhsSIsIq+/Iiwiw+MiLCLX9yIsIsLiIiwizu4iLCLN7SIsIiw7IiwiLjoiLCLW9iIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBTZXJiaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLHNyKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX1NSW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAyXCIiLCIzIyIsIjQkIiwiNSUiLCI2XjYmIiwiNyY3LyIsIjgqOCgiLCI5KDkpIiwiMCkwPSIsIi1fJz8iLCI9KysqIiwKICJxUam5Iiwid1equiIsImVFxeUiLCJyUtLyIiwidFTU9CIsInlZ2voiLCJ1VdX1IiwiaUnJ6SIsIm9Pz+8iLCJwUNDwIiwiW3vb+yIsIl19W10iLAogImFBweEiLCJzU9PzIiwiZETE5CIsImZGxuYiLCJnR8fnIiwiaEjI6CIsImpKqLgiLCJrS8vrIiwibEzM7CIsIjs63v4iLCInXCKruyIsIlxcfC1fIiwKICJ6WqGxIiwieFivvyIsImNDw+MiLCJ2Vtf3IiwiYkLC4iIsIm5Ozu4iLCJtTc3tIiwiLDwsOyIsIi4+LjoiLCIvP9b2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIENyb2F0aWFuIGtleWJvYXJkIGxheW91dCBzcGVjaWZpYyBmb3IgbWUgPGplbGx5QHNyay5mZXIuaHI+ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJfamVsbHlbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7uakiLCJdffDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OujIIiwiJ1wi5sYiLCJcXHy+riIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaHIpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSFJbTUFJTl9MRU5dWzRdID0KewogIrioIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCK5qSIsIvDQIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLoyCIsIubGIiwivq4iLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi8/IiwKICI8PiIKfTsKCi8qKiogSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX2pwMTA2W01BSU5fTEVOXVs0XSA9CnsKICIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNyciLCI4KCIsIjkpIiwiMH4iLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9KQV9tYWNqcFtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5+IiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkBgIiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIl9fIiwKfTsKCi8qKiogSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX3BjOTh4MVtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5gIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkB+IiwiW3siLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjsrIiwiOioiLCJdfSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIlxcXyIsCn07CgovKioqIEJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBSYXVsIEdvbWVzIEZlcm5hbmRlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUFRfYnJbTUFJTl9MRU5dWzRdID0KewogIidcIiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2qCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0YCIsIlt7IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLnxyIsIn5eIiwiXX0iLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8iLAp9OwoKLyoqKiBCcmF6aWxpYW4gQUJOVC0yIGtleWJvYXJkIGxheW91dCB3aXRoIDxBTFQgR1I+IChjb250cmlidXRlZCBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUX2JyX2FsdF9ncltNQUlOX0xFTl1bNF0gPQp7CiAiJ1wiIiwiMSE5IiwiMkAyIiwiMyMzIiwiNCQjIiwiNSVcIiIsIjYoLCIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiNGAiLCJbeyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsImdHIiwifl4iLCJdfToiLAogIlxcfCIsInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIjs6IiwiLz8wIgp9OwoKLyoqKiBVUyBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgR3VzdGF2byBOb3JvbmhhIChrb3ZAZGViaWFuLm9yZykpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VTX2ludGxbTUFJTl9MRU5dWzRdID0KewogICJgfiIsICIxISIsICIyQCIsICIzIyIsICI0JCIsICI1JSIsICI2XiIsICI3JiIsICI4KiIsICI5KCIsICIwKSIsICItXyIsICI9KyIsICJcXHwiLAogICJxUSIsICJ3VyIsICJlRSIsICJyUiIsICJ0VCIsICJ5WSIsICJ1VSIsICJpSSIsICJvTyIsICJwUCIsICJbeyIsICJdfSIsCiAgImFBIiwgInNTIiwgImREIiwgImZGIiwgImdHIiwgImhIIiwgImpKIiwgImtLIiwgImxMIiwgIjs6IiwgIidcIiIsCiAgInpaIiwgInhYIiwgImNDIiwgInZWIiwgImJCIiwgIm5OIiwgIm1NIiwgIiw8IiwgIi4+IiwgIi8/Igp9OwoKLyoqKiBTbG92YWsga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oc2tfcXdlcnR5KSBpbiB4a2JzZWwpCiAgLSBkZWFkX2Fib3ZlcmluZyByZXBsYWNlZCB3aXRoIGRlZ3JlZSAtIG5vIHN5bWJvbCBpbiBpc284ODU5LTIKICAtIGJyb2tlbmJhciByZXBsYWNlZCB3aXRoIGJhcgkJCQkJKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0tbTUFJTl9MRU5dWzRdID0KewogIjswIiwiKzEiLCK1MiIsIrkzIiwi6DQiLCK7NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIid2IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwi5CgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvRcIiIsIqchIiwi8ikiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3opICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NaW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TAiLCI9JSIsIrS3IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovIiwiKSgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvlcIiIsIqchIiwiqCciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLD8iLCIuOiIsIi1fIiwKICJcXCIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY3pfcXdlcnR5KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DWl9xd2VydHlbTUFJTl9MRU5dWzRdID0KewogIjsiLCIrMSIsIuwyIiwiuTMiLCLoNCIsIvg1IiwivjYiLCL9NyIsIuE4Iiwi7TkiLCLpMCIsIj0lIiwitLciLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwi+i8iLCIpKCIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi+VwiIiwipyEiLCKoJyIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIlxcIgp9OwoKLyoqKiBTbG92YWsgYW5kIEN6ZWNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCAoc2VlIGNzc2tfZHVhbChjc19za191Y3cpKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TS19wcm9nW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHkxCIsIndX7MwiLCJlRenJIiwiclL42CIsInRUu6siLCJ5Wf3dIiwidVX52SIsImlJ7c0iLCJvT/PTIiwicFD21iIsIlt7IiwiXX0iLAogImFB4cEiLCJzU7mpIiwiZETvzyIsImZG68siLCJnR+DAIiwiaEj62iIsImpK/NwiLCJrS/TUIiwibEy1pSIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6Wr6uIiwieFikIiwiY0PoyCIsInZW58ciLCJiQiIsIm5O8tIiLCJtTeXFIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogQ3plY2gga2V5Ym9hcmQgbGF5b3V0IChzZWUgY3Nza19pYm0oY3NfcXdlcnR5KSBpbiB4a2JzZWwpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0NTW01BSU5fTEVOXVs0XSA9CnsKICI7IiwiKzEiLCLsMiIsIrkzIiwi6DQiLCL4NSIsIr42Iiwi/TciLCLhOCIsIu05Iiwi6TC9KSIsIj0lIiwiIiwKICJxUVxcIiwid1d8IiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIvovW3siLCIpKF19IiwKICJhQSIsInNT8CIsImRE0CIsImZGWyIsImdHXSIsImhIIiwiakoiLCJrS7MiLCJsTKMiLCL5XCIkIiwipyHfIiwiqCciLAogInpaPiIsInhYIyIsImNDJiIsInZWQCIsImJCeyIsIm5OfSIsIm1NIiwiLD88IiwiLjo+IiwiLV8qIiwKICI8PlxcfCIKfTsKCi8qKiogTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBHYWJyaWVsIE9ybGFuZG8gR2FyY2lhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9MQVtNQUlOX0xFTl1bNF0gPQp7CiAifLAiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIr+hIiwKICJxUUAiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCK0qCIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIntbXiIsIn1dIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIExpdGh1YW5pYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgbHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0xUX0JbTUFJTl9MRU5dWzRdID0KewogImB+Iiwi4MAiLCLoyCIsIubGIiwi68siLCLhwSIsIvDQIiwi+NgiLCL72yIsIqUoIiwitCkiLCItXyIsIv7eIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIlt7IiwiXX0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiJ1wiIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiqqwiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgTGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RLW01BSU5fTEVOXVs0XSA9CnsKIlwi6SIsIjEhIiwiMiciLCIzXiMiLCI0KyQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKj9cXCIsIi1fIiwKInFRQCIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsIv1J7iIsIm9PIiwicFAiLCLw0CIsIvzcfiIsCiJhQeYiLCJzU98iLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIv7eIiwiad0iLCIsO2AiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiCn07CgovKioqIFR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdHIpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSW01BSU5fTEVOXVs0XSA9CnsKIlwiXFwiLCIxISIsIjInIiwiM14iLCI0KyIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIio/IiwiLV8iLAoicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJceGI5SSIsIm9PIiwicFAiLCJceGJiXHhhYiIsIvzcIiwKImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4YmFceGFhIiwiaVwwIiwiLDsiLAoieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCL21iIsIufHIiwiLjoiLAoiPD4iCn07CgovKioqIFR1cmtpc2ggRiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCB0cmYpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1RSX0ZbTUFJTl9MRU5dWzRdID0KewoiKyoiLCIxISIsIjJcIiIsIjNeIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjA9IiwiLz8iLCItXyIsCiJmRiIsImdHIiwiXHhiYlx4YWIiLCJceGI5SSIsIm9PIiwiZEQiLCJyUiIsIm5OIiwiaEgiLCJwUCIsInFRIiwid1ciLAoidVUiLCJpXDAiLCJlRSIsImFBIiwi/NwiLCJ0VCIsImtLIiwibU0iLCJsTCIsInlZIiwiXHhiYVx4YWEiLCJ4WCIsCiJqSiIsIvbWIiwidlYiLCJjQyIsIufHIiwieloiLCJzUyIsImJCIiwiLjoiLCIsOyIsCiI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTFtNQUlOX0xFTl1bNF0gPQp7CiAiYH47IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUS8iLCJ3VyciLCJlRfciLCJyUvgiLCJ0VOAiLCJ5WegiLCJ1VeUiLCJpSe8iLCJvT+0iLCJwUPQiLCJbeyIsIl19IiwKICJhQfkiLCJzU+MiLCJkROIiLCJmRusiLCJnR/IiLCJoSOkiLCJqSuciLCJrS+wiLCJsTOoiLCI7OvMiLCJcJ1wiLCIsIlxcfCIsCiAielrmIiwieFjxIiwiY0PhIiwidlbkIiwiYkLwIiwibk7uIiwibU32IiwiLDz6IiwiLj71IiwiLz8uIiwKICI8PiIKfTsKCi8qKiogSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHVzLGlsX3Bob25ldGljKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9waG9uZXRpY1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFR9yIsIndX5SIsImVF4CIsInJS+CIsInRU+iIsInlZ8iIsInVV5SIsImlJ6SIsIm9P8SIsInBQ9CIsIlt7IiwiXX0iLAogImFB4CIsInNT+SIsImRE4yIsImZG9CIsImdH4iIsImhI5CIsImpK6SIsImtL6yIsImxM7CIsIjs6IiwiJ1wiIiwiXFx8IiwKICJ6WuYiLCJ4WOciLCJjQ/YiLCJ2VuUiLCJiQuEiLCJuTvAiLCJtTe4iLCIsPCIsIi4+IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBJc3JhZWxpYW4gU2FoYXJvbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCAtc3ltYm9scyAidXMocGMxMDUpK2lsX3NhaGFyb24iKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JTF9zYWhhcm9uW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVH3Iiwid1fxIiwiZUUiLCJyUvgiLCJ0VOgiLCJ5WeMiLCJ1VSIsImlJIiwib08iLCJwUPQiLCJbeyIsIl19IiwKICJhQeAiLCJzU+UiLCJkROwiLCJmRvoiLCJnR+IiLCJoSOQiLCJqSvkiLCJrS+siLCJsTOkiLCI7OiIsIidcIiIsIlxcfCIsCiAielrmIiwieFjnIiwiY0P2IiwidlbyIiwiYkLhIiwibk7wIiwibU3uIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIKfTsKCi8qKiogR3JlZWsga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBLcml0b24gS3lyaW1pcyA8a3lyaW1pc0BjdGkuZ3I+KQogIEdyZWVrIGNoYXJhY3RlcnMgZm9yICJ3VyIgYW5kICJzUyIgYXJlIG9taXR0ZWQgdG8gbm90IHByb2R1Y2UgYSBtaXNtYXRjaAogIG1lc3NhZ2Ugc2luY2UgdGhleSBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIGluIGdyIGFuZCBlbCBYRnJlZTg2IGxheW91dHMuICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0VMW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVE7OiIsIndXIiwiZUXlxSIsInJS8dEiLCJ0VPTUIiwieVn11SIsInVV6MgiLCJpSenJIiwib0/vzyIsInBQ8NAiLCJbeyIsIl19IiwKICJhQeHBIiwic1MiLCJkROTEIiwiZkb21iIsImdH48MiLCJoSOfHIiwiakruziIsImtL6soiLCJsTOvLIiwiOzq0qCIsIidcIiIsIlxcfCIsCiAielrmxiIsInhY99ciLCJjQ/jYIiwidlb52SIsImJC4sIiLCJuTu3NIiwibU3szCIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iCn07CgovKioqIFRoYWkgKEtlZG1hbmVlKSBrZXlib2FyZCBsYXlvdXQgYnkgU3VwcGhhY2hva2UgU3VudGl3aWNoYXlhIDxtcmNob2tlQG9wZW50bGUub3JnPiAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV90aFtNQUlOX0xFTl1bNF0gPQp7CiAiYH5fJSIsIjEh5SsiLCIyQC/xIiwiMyMt8iIsIjQkwPMiLCI1Jbb0IiwiNl7Y2SIsIjcm1t8iLCI4KqT1IiwiOSi19iIsIjApqPciLCItX6L4IiwiPSuq+SIsCiAicVHm8CIsIndX5FwiIiwiZUXTriIsInJSvrEiLCJ0VNC4IiwieVnR7SIsInVV1eoiLCJpScOzIiwib0+5zyIsInBQwq0iLCJbe7qwIiwiXX3FLCIsCiAiYUG/xCIsInNTy6YiLCJkRKGvIiwiZka04iIsImdH4KwiLCJoSOnnIiwiakro6yIsImtL0skiLCJsTMrIIiwiOzrHqyIsIlwnXCKnLiIsIlxcfKOlIiwKICJ6WrwoIiwieFi7KSIsImND4akiLCJ2Vs3OIiwiYkLaIiwibk7X7CIsIm1Ntz8iLCIsPMGyIiwiLj7jzCIsIi8/vcYiCn07IAoKLyoqKiBWTkMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fdm5jW01BSU5fTEVOXSA9CnsKICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgxQSwweDFCLDB4MjcsMHgyOCwweDI5LDB4MzMsMHgzNCwweDM1LDB4MkIsCiAgIDB4MUUsMHgzMCwweDJFLDB4MjAsMHgxMiwweDIxLDB4MjIsMHgyMywweDE3LDB4MjQsMHgyNSwweDI2LDB4MzIsMHgzMSwweDE4LDB4MTksMHgxMCwweDEzLDB4MUYsMHgxNCwweDE2LDB4MkYsMHgxMSwweDJELDB4MTUsMHgyQywKICAgMHg1Ngp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV92bmNbTUFJTl9MRU5dID0KewogICAnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLFZLX09FTV80LFZLX09FTV82LFZLX09FTV8xLFZLX09FTV83LFZLX09FTV8zLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV81LAogICAnQScsJ0InLCdDJywnRCcsJ0UnLCdGJywnRycsJ0gnLCdJJywnSicsJ0snLCdMJywnTScsJ04nLCdPJywnUCcsJ1EnLCdSJywnUycsJ1QnLCdVJywnVicsJ1cnLCdYJywnWScsJ1onLAogICBWS19PRU1fMTAyCn07CgpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV92bmNbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsIlt7IiwiXX0iLCI7OiIsIidcIiIsImB+IiwiLDwiLCIuPiIsIi8/IiwiXFx8IiwKICJhQSIsImJCIiwiY0MiLCJkRCIsImVFIiwiZkYiLCJnRyIsImhIIiwiaUkiLCJqSiIsImtLIiwibEwiLCJtTSIsIm5OIiwib08iLCJwUCIsInFRIiwiclIiLCJzUyIsInRUIiwidVUiLCJ2ViIsIndXIiwieFgiLCJ5WSIsInpaIgp9OwoKLyoqKiBEdXRjaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBubCkgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OTFtNQUlOX0xFTl1bNF0gPQp7CiAiQKciLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiN18iLCI4KCIsIjkpIiwiMCciLCIvPyIsIrB+IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIqh+IiwiKnwiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiuxIiwiJ2AiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLT0iLAogIltdIgp9OwoKCgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgTENJRCBsY2lkOyAvKiBpbnB1dCBsb2NhbGUgaWRlbnRpZmllciwgbG9vayBmb3IgTE9DQUxFX0lMQU5HVUFHRQogICAgICAgICAgICAgICAgIGluIHRoZSBhcHByb3ByaWF0ZSBkbGxzL2tlcm5lbC9ubHMvLm5scyBmaWxlICovCiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwogICAgY29uc3QgV09SRCAoKnNjYW4pW01BSU5fTEVOXTsgLyogc2NhbiBjb2RlcyBtYXBwaW5nICovCiAgICBjb25zdCBXT1JEICgqdmtleSlbTUFJTl9MRU5dOyAvKiB2aXJ0dWFsIGtleSBjb2RlcyBtYXBwaW5nICovCn0gbWFpbl9rZXlfdGFiW109ewogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1VTX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsICZtYWluX2tleV9VU19kdm9yYWssICZtYWluX2tleV9zY2FuX2R2b3JhaywgJm1haW5fa2V5X3ZrZXlfZHZvcmFrfSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTX2ludGwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MDksICJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X0RFX25vZGVhZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgZm9yIGxvZ2l0ZWNoIGRlc2t0b3AgcHJvIiwgJm1haW5fa2V5X0RFX2xvZ2l0ZWNoLCAgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDgwNywgIlN3aXNzIEdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDEwMGMsICJTd2lzcyBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDFkLCAiU3dlZGlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0UsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyfSwKIHsweDA0MjUsICJFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTQsICJOb3J3ZWdpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05PLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA2LCAiRGFuaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9EQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYywgIkZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRlIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NGLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoQ0FfZnIpIiwgJm1haW5fa2V5X0NBX2ZyLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwYzBjLCAiQ2FuYWRpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0NBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwODBjLCAiQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYXplcnR5fSwKIHsweDA4MTYsICJQb3J0dWd1ZXNlIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BUX2JyLCAmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQxNiwgIkJyYXppbGlhbiBBQk5ULTIga2V5Ym9hcmQgbGF5b3V0IEFMVCBHUiIsICZtYWluX2tleV9QVF9icl9hbHRfZ3IsJm1haW5fa2V5X3NjYW5fYWJudF9xd2VydHksICZtYWluX2tleV92a2V5X2FibnRfcXdlcnR5fSwKIHsweDA0MGIsICJGaW5uaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GSSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBiZHMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JHX2JkcywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwMiwgIkJ1bGdhcmlhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjMsICJCZWxhcnVzaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CWSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1JVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1JVX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIiLCAmbWFpbl9rZXlfUlVfa29pOHIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEiLCAmbWFpbl9rZXlfUlVfY3AxMjUxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBwaG9uZXRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlVfcGhvbmV0aWMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjIsICJVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSIsICZtYWluX2tleV9VQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgKHN0YW5kYXJkKSIsICZtYWluX2tleV9VQV9zdGQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1JVX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIlNwYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEwLCAiSXRhbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVQsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGYsICJJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBlLCAiSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IVSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxNSwgIlBvbGlzaCAocHJvZ3JhbW1lcidzKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUEwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MjQsICJTbG92ZW5pYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgc3IiLCAmbWFpbl9rZXlfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MGMxYSwgIlNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IHVzLHNyIiwgJm1haW5fa2V5X1VTX1NSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sIC8qIExBTkdfU0VSQklBTixTVUJMQU5HX1NFUkJJQU5fQ1lSSUxMSUMgKi8KIHsweDA0MWEsICJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWEsICJDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNwZWNpZmljKSIsICZtYWluX2tleV9IUl9qZWxseSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMSwgIkphcGFuZXNlIDEwNiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfanAxMDYsICZtYWluX2tleV9zY2FuX3F3ZXJ0eV9qcDEwNiwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5X2pwMTA2fSwKIHsweDA0MTEsICJKYXBhbmVzZSBNYWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0pBX21hY2pwLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHlfbWFjanAsICZtYWluX2tleV92a2V5X3F3ZXJ0eV9tYWNqcH0sCiB7MHgwNDExLCAiSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9wYzk4eDEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWIsICJTbG92YWsga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1NLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGFuZCBDemVjaCBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMiLCAmbWFpbl9rZXlfU0tfcHJvZywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9DUywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjeiIsICZtYWluX2tleV9DWiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNSwgIkN6ZWNoIGtleWJvYXJkIGxheW91dCBjel9xd2VydHkiLCAmbWFpbl9rZXlfQ1pfcXdlcnR5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiTGF0aW4gQW1lcmljYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDI3LCAiTGl0aHVhbmlhbiAoQmFsdGljKSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTFRfQiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1RLLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHIiLCAmbWFpbl9rZXlfVFIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCB0cmYiLCAmbWFpbl9rZXlfVFJfRiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3Bob25ldGljLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIFNhaGFyb24ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMX3NhaGFyb24sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJWTkMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3ZuYywgJm1haW5fa2V5X3NjYW5fdm5jLCAmbWFpbl9rZXlfdmtleV92bmN9LAogezB4MDQwOCwgIkdyZWVrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZSwgIlRoYWkgKEtlZG1hbmVlKSAga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X3RoLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDEzLCAiRHV0Y2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X05MLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCgogezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCn07CnN0YXRpYyB1bnNpZ25lZCBrYmRfbGF5b3V0PTA7IC8qIGluZGV4IGludG8gYWJvdmUgdGFibGUgb2YgbGF5b3V0cyAqLwoKLyogbWF5YmUgbW9yZSBvZiB0aGVzZSBzY2FuY29kZXMgc2hvdWxkIGJlIGV4dGVuZGVkPyAqLwogICAgICAgICAgICAgICAgLyogZXh0ZW5kZWQgbXVzdCBiZSBzZXQgZm9yIEFMVF9SLCBDVFJMX1IsCiAgICAgICAgICAgICAgICAgICBJTlMsIERFTCwgSE9NRSwgRU5ELCBQQUdFX1VQLCBQQUdFX0RPV04sIEFSUk9XIGtleXMsCiAgICAgICAgICAgICAgICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwogICAgICAgICAgICAgICAgLyogRklYTUUgc2hvdWxkIHdlIHNldCBleHRlbmRlZCBiaXQgZm9yIE51bUxvY2sgPyBNeQogICAgICAgICAgICAgICAgICogV2luZG93cyBkb2VzIC4uLiBERiAqLwogICAgICAgICAgICAgICAgLyogWWVzLCB0byBkaXN0aW5ndWlzaCBiYXNlZCBvbiBzY2FuIGNvZGVzLCBhbHNvCiAgICAgICAgICAgICAgICAgICBmb3IgUHJ0U2NuIGtleSAuLi4gR0EgKi8KCnN0YXRpYyBjb25zdCBXT1JEIG5vbmNoYXJfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIC8qIHVudXNlZCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYwMCAqLwogICAgLyogc3BlY2lhbCBrZXlzICovCiAgICBWS19CQUNLLCBWS19UQUIsIDAsIFZLX0NMRUFSLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAwLCAwLCAwLCBWS19QQVVTRSwgVktfU0NST0xMLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGRjEwICovCiAgICAwLCAwLCAwLCBWS19FU0NBUEUsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMjggKi8KICAgIDAsIFZLX0hBTkdVTCwgMCwgMCwgVktfSEFOSkEsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNDggKi8KICAgIC8qIGN1cnNvciBrZXlzICovCiAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjUwICovCiAgICBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgVktfRU5ELAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsMCwwLCBWS19BUFBTLCAvKiBGRjYwICovCiAgICAwLCBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvKiBGRjY4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwogICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5OCAqLwogICAgVktfRU5ELCBWS19DTEVBUiwgVktfSU5TRVJULCBWS19ERUxFVEUsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCiAgICAwLCAwLCBWS19NVUxUSVBMWSwgVktfQURELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkE4ICovCiAgICBWS19TRVBBUkFUT1IsIFZLX1NVQlRSQUNULCBWS19ERUNJTUFMLCBWS19ESVZJREUsCiAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCAgICAgICAgICAgICAvKiBGRkIwICovCiAgICBWS19OVU1QQUQ0LCBWS19OVU1QQUQ1LCBWS19OVU1QQUQ2LCBWS19OVU1QQUQ3LAogICAgVktfTlVNUEFEOCwgVktfTlVNUEFEOSwgMCwgMCwgMCwgVktfT0VNX05FQ19FUVVBTCwgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgVktfRjEsIFZLX0YyLAogICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwogICAgVktfRjExLCBWS19GMTIsIFZLX0YxMywgVktfRjE0LCBWS19GMTUsIFZLX0YxNiwgMCwgMCwgICAgICAgLyogRkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZEOCAqLwogICAgLyogbW9kaWZpZXIga2V5cyAqLwogICAgMCwgVktfTFNISUZULCBWS19SU0hJRlQsIFZLX0xDT05UUk9MLCAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgVktfUkNPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX01FTlUsCiAgICBWS19NRU5VLCBWS19MTUVOVSwgVktfUk1FTlUsIFZLX0xXSU4sIFZLX1JXSU4sIDAsIDAsIDAsICAgICAvKiBGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV9zY2FuWzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIDB4MEUsIDB4MEYsIDB4MDAsIC8qPyovIDAsIDB4MDAsIDB4MUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiwgICAgICAvKiBGRjUwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICAvKj8qLyAwLCAweDEzNywgLyo/Ki8gMCwgMHgxNTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTVELCAgICAgLyogRkY2MCAqLwogICAgLyo/Ki8gMCwgLyo/Ki8gMCwgMHgzOCwgMHgxNDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIEZGNjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNDUsICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExQywgMHgwMCwgMHgwMCwgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0QiwgMHg0OCwgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMHgwMCwgMHgwMCwgMHgzNywgMHg0RSwgMHg1MywgMHg0QSwgMHg1MywgMHgxMzUsICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgICAvKiBGRkIwICovCiAgICAweDQ4LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgMHgzQiwgMHgzQywKICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgICAvKiBGRkMwICovCiAgICAweDU3LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZDOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAweDAwLCAweDJBLCAweDEzNiwgMHgxRCwgMHgxMUQsIDB4M0EsIDB4MDAsIDB4MzgsICAgICAgICAgICAgLyogRkZFMCAqLwogICAgMHgxMzgsIDB4MzgsIDB4MTM4LCAweDE1YiwgMHgxNWMsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgIC8qIEZGRTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE1MyAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgeGZyZWU4Nl92ZW5kb3Jfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjAwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYwOCAqLwogICAgMCwgVktfVk9MVU1FX0RPV04sIFZLX1ZPTFVNRV9NVVRFLCBWS19WT0xVTUVfVVAsICAgICAgICAgICAgLyogMTAwOEZGMTAgKi8KICAgIFZLX01FRElBX1BMQVlfUEFVU0UsIFZLX01FRElBX1NUT1AsCiAgICBWS19NRURJQV9QUkVWX1RSQUNLLCBWS19NRURJQV9ORVhUX1RSQUNLLAogICAgMCwgVktfTEFVTkNIX01BSUwsIDAsIFZLX0JST1dTRVJfU0VBUkNILCAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMTggKi8KICAgIDAsIDAsIDAsIFZLX0JST1dTRVJfSE9NRSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0JST1dTRVJfQkFDSywgVktfQlJPV1NFUl9GT1JXQVJELCAgICAgIC8qIDEwMDhGRjIwICovCiAgICBWS19CUk9XU0VSX1NUT1AsIFZLX0JST1dTRVJfUkVGUkVTSCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAvKiAxMDA4RkYyOCAqLwogICAgVktfQlJPV1NFUl9GQVZPUklURVMsIDAsIFZLX0xBVU5DSF9NRURJQV9TRUxFQ1QsIDAsICAgICAgICAgLyogMTAwOEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjQ4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjkwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY5OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkE4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkQ4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZGOCAqLwp9OwoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBTdGF0dXMgc3RhdHVzOwogICAgY2hhciBidWZbMjRdOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGUtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGUtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKGtleXN5bSA9PSBYS19LUF9TZXBhcmF0b3IgfHwga2V5c3ltID09IFhLX0tQX0RlY2ltYWwgfHwKICAgICAgICAgKGtleXN5bSA+PSBYS19LUF8wICYmIGtleXN5bSA8PSBYS19LUF85KSkpCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweEZGXTsKCiAgICBUUkFDRV8oa2V5KSgiZS0+a2V5Y29kZSA9ICV4XG4iLCBlLT5rZXljb2RlKTsKCiAgICByZXR1cm4ga2V5YzJ2a2V5W2UtPmtleWNvZGVdOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dAogKi8Kdm9pZCBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggV09SRCB3VmssIFdPUkQgd1NjYW4sIERXT1JEIGV2ZW50X2ZsYWdzLCBEV09SRCB0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0V4dHJhSW5mbywgVUlOVCBpbmplY3RlZF9mbGFncyApCnsKICAgIFVJTlQgbWVzc2FnZTsKICAgIEtCRExMSE9PS1NUUlVDVCBob29rOwogICAgV09SRCBmbGFncywgd1ZrU3RyaXBwZWQsIHdWa0wsIHdWa1IsIHZrX2hvb2sgPSB3Vms7CiAgICBMUEFSQU0gbFBhcmFtID0gMDsKCiAgICB3VmsgPSBMT0JZVEUod1ZrKTsKICAgIGZsYWdzID0gTE9CWVRFKHdTY2FuKTsKCiAgICBpZiAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpIGZsYWdzIHw9IEtGX0VYVEVOREVEOwogICAgLyogRklYTUU6IHNldCBLRl9ETEdNT0RFIGFuZCBLRl9NRU5VTU9ERSB3aGVuIG5lZWRlZCAqLwoKICAgIC8qIHN0cmlwIGxlZnQvcmlnaHQgZm9yIG1lbnUsIGNvbnRyb2wsIHNoaWZ0ICovCiAgICBzd2l0Y2ggKHdWaykKICAgIHsKICAgIGNhc2UgVktfTUVOVToKICAgIGNhc2UgVktfTE1FTlU6CiAgICBjYXNlIFZLX1JNRU5VOgogICAgICAgIHdWayA9IChldmVudF9mbGFncyAmIEtFWUVWRU5URl9FWFRFTkRFREtFWSkgPyBWS19STUVOVSA6IFZLX0xNRU5VOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfTUVOVTsKICAgICAgICB3VmtMID0gVktfTE1FTlU7CiAgICAgICAgd1ZrUiA9IFZLX1JNRU5VOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBWS19DT05UUk9MOgogICAgY2FzZSBWS19MQ09OVFJPTDoKICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgd1ZrID0gKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSA/IFZLX1JDT05UUk9MIDogVktfTENPTlRST0w7CiAgICAgICAgd1ZrU3RyaXBwZWQgPSBWS19DT05UUk9MOwogICAgICAgIHdWa0wgPSBWS19MQ09OVFJPTDsKICAgICAgICB3VmtSID0gVktfUkNPTlRST0w7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX1NISUZUOgogICAgY2FzZSBWS19MU0hJRlQ6CiAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICB3VmsgPSAoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfRVhURU5ERURLRVkpID8gVktfUlNISUZUIDogVktfTFNISUZUOwogICAgICAgIHdWa1N0cmlwcGVkID0gVktfU0hJRlQ7CiAgICAgICAgd1ZrTCA9IFZLX0xTSElGVDsKICAgICAgICB3VmtSID0gVktfUlNISUZUOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICB3VmtTdHJpcHBlZCA9IHdWa0wgPSB3VmtSID0gd1ZrOwogICAgfQoKICAgIGlmIChldmVudF9mbGFncyAmIEtFWUVWRU5URl9LRVlVUCkKICAgIHsKICAgICAgICBtZXNzYWdlID0gV01fS0VZVVA7CiAgICAgICAgaWYgKCgoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgJiYKICAgICAgICAgICAgICgod1ZrU3RyaXBwZWQgPT0gVktfTUVOVSkgfHwgKHdWa1N0cmlwcGVkID09IFZLX0NPTlRST0wpCiAgICAgICAgICAgICAgfHwgIShrZXlfc3RhdGVfdGFibGVbVktfQ09OVFJPTF0gJiAweDgwKSkpCiAgICAgICAgICAgIHx8ICh3VmtTdHJpcHBlZCA9PSBWS19GMTApKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIFRyYWNrU3lzS2V5ID09IFZLX01FTlUgfHwgLyogPEFMVD4tZG93bi88QUxUPi11cCBzZXF1ZW5jZSAqLwogICAgICAgICAgICAgICAgKHdWa1N0cmlwcGVkICE9IFZLX01FTlUpKSAvKiA8QUxUPi1kb3duLi4uPHNvbWV0aGluZyBlbHNlPi11cCAqLwogICAgICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWVVQOwogICAgICAgICAgICBUcmFja1N5c0tleSA9IDA7CiAgICAgICAgfQogICAgICAgIGZsYWdzIHw9IEtGX1JFUEVBVCB8IEtGX1VQOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIG1lc3NhZ2UgPSBXTV9LRVlET1dOOwogICAgICAgIGlmICgoKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODAgfHwgd1ZrU3RyaXBwZWQgPT0gVktfTUVOVSkgJiYKICAgICAgICAgICAgICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCB8fCB3VmtTdHJpcHBlZCA9PSBWS19DT05UUk9MKSkgfHwKICAgICAgICAgICAgKHdWa1N0cmlwcGVkID09IFZLX0YxMCkpCiAgICAgICAgewogICAgICAgICAgICBtZXNzYWdlID0gV01fU1lTS0VZRE9XTjsKICAgICAgICAgICAgVHJhY2tTeXNLZXkgPSB3VmtTdHJpcHBlZDsKICAgICAgICB9CiAgICAgICAgaWYgKCEoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfVU5JQ09ERSkgJiYga2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSBmbGFncyB8PSBLRl9SRVBFQVQ7CiAgICB9CgogICAgaWYgKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX1VOSUNPREUpCiAgICB7CiAgICAgICAgdmtfaG9vayA9IHdWayA9IFZLX1BBQ0tFVDsKICAgICAgICBsUGFyYW0gPSBNQUtFTFBBUkFNKDEgLyogcmVwZWF0IGNvdW50ICovLCB3U2Nhbik7CiAgICAgICAgVFJBQ0VfKGtleSkoIiBtZXNzYWdlPTB4JTA0eCB3UGFyYW09MHglMDR4IGxQYXJhbT0weCUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHdWaywgbFBhcmFtKTsKICAgIH0KCiAgICAvKiBIb29rIGdldHMgd2hhdGV2ZXIga2V5IHdhcyBzZW50LiAqLwogICAgaG9vay52a0NvZGUgICAgICA9IHZrX2hvb2s7CiAgICBob29rLnNjYW5Db2RlICAgID0gd1NjYW47CiAgICBob29rLmZsYWdzICAgICAgID0gKGZsYWdzID4+IDgpIHwgaW5qZWN0ZWRfZmxhZ3M7CiAgICBob29rLnRpbWUgICAgICAgID0gdGltZTsKICAgIGhvb2suZHdFeHRyYUluZm8gPSBkd0V4dHJhSW5mbzsKICAgIGlmIChIT09LX0NhbGxIb29rcyggV0hfS0VZQk9BUkRfTEwsIEhDX0FDVElPTiwgbWVzc2FnZSwgKExQQVJBTSkmaG9vaywgVFJVRSApKSByZXR1cm47CgogICAgaWYgKCEoZXZlbnRfZmxhZ3MgJiBLRVlFVkVOVEZfVU5JQ09ERSkpCiAgICB7CiAgICAgICAgaWYgKGV2ZW50X2ZsYWdzICYgS0VZRVZFTlRGX0tFWVVQKQogICAgICAgIHsKICAgICAgICAgICAga2V5X3N0YXRlX3RhYmxlW3dWa10gJj0gfjB4ODA7CiAgICAgICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtTdHJpcHBlZF0gPSBrZXlfc3RhdGVfdGFibGVbd1ZrTF0gfCBrZXlfc3RhdGVfdGFibGVbd1ZrUl07CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVt3VmtdICYgMHg4MCkpIGtleV9zdGF0ZV90YWJsZVt3VmtdIF49IDB4MDE7CiAgICAgICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtdIHw9IDB4YzA7CiAgICAgICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtTdHJpcHBlZF0gPSBrZXlfc3RhdGVfdGFibGVbd1ZrTF0gfCBrZXlfc3RhdGVfdGFibGVbd1ZrUl07CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgZmxhZ3MgfD0gS0ZfQUxURE9XTjsKCiAgICAgICAgaWYgKHdWa1N0cmlwcGVkID09IFZLX1NISUZUKSBmbGFncyAmPSB+S0ZfRVhURU5ERUQ7CgogICAgICAgIGxQYXJhbSA9IE1BS0VMUEFSQU0oMSAvKiByZXBlYXQgY291bnQgKi8sIGZsYWdzKTsKCiAgICAgICAgVFJBQ0VfKGtleSkoIiBtZXNzYWdlPTB4JTA0eCB3UGFyYW09MHglMDR4LCBsUGFyYW09MHglMDhseCwgSW5wdXRLZXlTdGF0ZT0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHdWaywgbFBhcmFtLCBrZXlfc3RhdGVfdGFibGVbd1ZrXSk7CiAgICB9CgogICAgU0VSVkVSX1NUQVJUX1JFUSggc2VuZF9oYXJkd2FyZV9tZXNzYWdlICkKICAgIHsKICAgICAgICByZXEtPmlkICAgICAgID0gKGluamVjdGVkX2ZsYWdzICYgTExLSEZfSU5KRUNURUQpID8gMCA6IEdldEN1cnJlbnRUaHJlYWRJZCgpOwogICAgICAgIHJlcS0+d2luICAgICAgPSAwOwogICAgICAgIHJlcS0+bXNnICAgICAgPSBtZXNzYWdlOwogICAgICAgIHJlcS0+d3BhcmFtICAgPSB3Vms7CiAgICAgICAgcmVxLT5scGFyYW0gICA9IGxQYXJhbTsKICAgICAgICByZXEtPnggICAgICAgID0gY3Vyc29yX3Bvcy54OwogICAgICAgIHJlcS0+eSAgICAgICAgPSBjdXJzb3JfcG9zLnk7CiAgICAgICAgcmVxLT50aW1lICAgICA9IHRpbWU7CiAgICAgICAgcmVxLT5pbmZvICAgICA9IGR3RXh0cmFJbmZvOwogICAgICAgIHdpbmVfc2VydmVyX2NhbGwoIHJlcSApOwogICAgfQogICAgU0VSVkVSX0VORF9SRVE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlCiAqCiAqIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgZm9yIDx2a2V5PiwgZGVwZW5kaW5nIG9uIGtleSA8c3RhdGU+IHVuZGVyIFgKICoKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSAoIFdPUkQgdmtleSwgV09SRCBzY2FuLCBpbnQgc3RhdGUsIERXT1JEIHRpbWUgKQp7CiAgICAvKiBEbyBzb21ldGhpbmcgaWYgaW50ZXJuYWwgdGFibGUgc3RhdGUgIT0gWCBzdGF0ZSBmb3Iga2V5Y29kZSAqLwogICAgaWYgKCgoa2V5X3N0YXRlX3RhYmxlW3ZrZXkgJiAweGZmXSAmIDB4ODApIT0wKSAhPSBzdGF0ZSkKICAgIHsKICAgICAgICBEV09SRCBmbGFncyA9IHZrZXkgJiAweDEwMCA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDA7CgogICAgICAgIGlmICghc3RhdGUpIGZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKCiAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBzdGF0ZSBmb3IgdmtleSAlIy4yeC4gU3RhdGUgYmVmb3JlICUjLjJ4XG4iLAogICAgICAgICAgICAgIHZrZXksIGtleV9zdGF0ZV90YWJsZVt2a2V5ICYgMHhmZl0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXkgJiAweGZmLCBzY2FuICYgMHhmZiwgZmxhZ3MsIHRpbWUsIDAsIDAgKTsKCiAgICAgICAgVFJBQ0UoIlN0YXRlIGFmdGVyICUjLjJ4XG4iLCBrZXlfc3RhdGVfdGFibGVbdmtleSAmIDB4ZmZdKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBYMTFEUlZfS2V5bWFwTm90aWZ5CiAqCiAqIFVwZGF0ZSBtb2RpZmllcnMgc3RhdGUgKEN0cmwsIEFsdCwgU2hpZnQpIHdoZW4gd2luZG93IGlzIGFjdGl2YXRlZC4KICoKICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIG9uZSB1c2VzIEN0cmwrLi4uIEFsdCsuLi4gb3IgU2hpZnQrLi4gdG8gc3dpdGNoCiAqIGZyb20gd2luZSB0byBhbm90aGVyIGFwcGxpY2F0aW9uIGFuZCBiYWNrLgogKiBUb2dnbGUga2V5cyBhcmUgaGFuZGxlZCBpbiBIYW5kbGVFdmVudC4KICovCnZvaWQgWDExRFJWX0tleW1hcE5vdGlmeSggSFdORCBod25kLCBYRXZlbnQgKmV2ZW50ICkKewogICAgaW50IGksIGo7CiAgICBEV09SRCB0aW1lID0gR2V0Q3VycmVudFRpbWUoKTsKCiAgICAvKiB0aGUgbWluaW11bSBrZXljb2RlIGlzIGFsd2F5cyBncmVhdGVyIG9yIGVxdWFsIHRvIDgsIHNvIHdlIGNhbgogICAgICogc2tpcCB0aGUgZmlyc3QgOCB2YWx1ZXMsIGhlbmNlIHN0YXJ0IGF0IDEKICAgICAqLwogICAgZm9yIChpID0gMTsgaSA8IDMyOyBpKyspCiAgICB7CiAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIFdPUkQgdmtleSA9IGtleWMydmtleVsoaSAqIDgpICsgal07CiAgICAgICAgICAgIFdPUkQgc2NhbiA9IGtleWMyc2NhblsoaSAqIDgpICsgal07CiAgICAgICAgICAgIGludCBzdGF0ZSA9IChldmVudC0+eGtleW1hcC5rZXlfdmVjdG9yW2ldICYgKDE8PGopKSAhPSAwOwoKICAgICAgICAgICAgc3dpdGNoKHZrZXkgJiAweGZmKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgVktfTE1FTlU6CiAgICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCB2a2V5LCBzY2FuLCBzdGF0ZSwgdGltZSApOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIHVwZGF0ZV9sb2NrX3N0YXRlKEJZVEUgdmtleSwgV09SRCBzY2FuLCBEV09SRCB0aW1lKQp7CiAgICBEV09SRCBmbGFncyA9IHZrZXkgPT0gVktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDA7CgogICAgaWYgKGtleV9zdGF0ZV90YWJsZVt2a2V5XSAmIDB4ODApIGZsYWdzIF49IEtFWUVWRU5URl9LRVlVUDsKCiAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZmxhZ3MsIHRpbWUsIDAsIDAgKTsKICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBmbGFncyBeIEtFWUVWRU5URl9LRVlVUCwgdGltZSwgMCwgMCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXlFdmVudAogKgogKiBIYW5kbGUgYSBYIGtleSBldmVudAogKi8Kdm9pZCBYMTFEUlZfS2V5RXZlbnQoIEhXTkQgaHduZCwgWEV2ZW50ICp4ZXYgKQp7CiAgICBYS2V5RXZlbnQgKmV2ZW50ID0gJnhldi0+eGtleTsKICAgIGNoYXIgYnVmWzI0XTsKICAgIGNoYXIgKlN0ciA9IGJ1ZjsKICAgIEtleVN5bSBrZXlzeW0gPSAwOwogICAgV09SRCB2a2V5ID0gMCwgYlNjYW47CiAgICBEV09SRCBkd0ZsYWdzOwogICAgaW50IGFzY2lpX2NoYXJzOwogICAgWElDIHhpYyA9IFgxMURSVl9nZXRfaWMoIGh3bmQgKTsKICAgIERXT1JEIGV2ZW50X3RpbWUgPSBFVkVOVF94MTFfdGltZV90b193aW4zMl90aW1lKGV2ZW50LT50aW1lKTsKICAgIFN0YXR1cyBzdGF0dXMgPSAwOwoKICAgIFRSQUNFXyhrZXkpKCJ0eXBlICVkLCB3aW5kb3cgJWx4LCBzdGF0ZSAweCUwNHgsIGtleWNvZGUgMHglMDR4XG4iLAoJCWV2ZW50LT50eXBlLCBldmVudC0+d2luZG93LCBldmVudC0+c3RhdGUsIGV2ZW50LT5rZXljb2RlKTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGV2ZW50LT50eXBlID09IEtleVByZXNzKQogICAgewogICAgICAgIGFzY2lpX2NoYXJzID0gWG1iTG9va3VwU3RyaW5nKHhpYywgZXZlbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIFRSQUNFKCJYbWJMb29rdXBTdHJpbmcgbmVlZHMgJWkgYnl0ZShzKVxuIiwgYXNjaWlfY2hhcnMpOwogICAgICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIHsKICAgICAgICAgICAgU3RyID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGFzY2lpX2NoYXJzKTsKICAgICAgICAgICAgaWYgKFN0ciA9PSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkhXG4iKTsKICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgU3RyLCBhc2NpaV9jaGFycywgJmtleXN5bSwgJnN0YXR1cyk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIGFzY2lpX2NoYXJzID0gWExvb2t1cFN0cmluZyhldmVudCwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgTlVMTCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJuYnl0ZSA9ICVkLCBzdGF0dXMgMHgleFxuIiwgYXNjaWlfY2hhcnMsIHN0YXR1cyk7CgogICAgaWYgKHN0YXR1cyA9PSBYTG9va3VwQ2hhcnMpCiAgICB7CiAgICAgICAgWDExRFJWX1hJTUxvb2t1cENoYXJzKCBTdHIsIGFzY2lpX2NoYXJzICk7CiAgICAgICAgaWYgKGJ1ZiAhPSBTdHIpCiAgICAgICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGFyZSB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2UgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IGZvciBBbHRHciBzaG91bGQgYmUgMgogICAgICAgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIC8qIFNhdmUgYWxzbyBhbGwgcG9zc2libGUgbW9kaWZpZXIgc3RhdGVzLiAqLwogICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgKDB4NjAwMCB8IE1vZDFNYXNrIHwgTW9kMk1hc2sgfCBNb2QzTWFzayB8IE1vZDRNYXNrIHwgTW9kNU1hc2spOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIGRlYnVnc3RyX2FuKFN0ciwgYXNjaWlfY2hhcnMpKTsKICAgIH0KICAgIGlmIChidWYgIT0gU3RyKQogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFN0cik7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICB2a2V5ID0gRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsZXZlbnQpOwogICAgLyogWCByZXR1cm5zIGtleWNvZGUgMCBmb3IgY29tcG9zZWQgY2hhcmFjdGVycyAqLwogICAgaWYgKCF2a2V5ICYmIGFzY2lpX2NoYXJzKSB2a2V5ID0gVktfTk9OQU1FOwogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRV8oa2V5KSgia2V5Y29kZSAweCV4IGNvbnZlcnRlZCB0byB2a2V5IDB4JXhcbiIsCiAgICAgICAgICAgICAgICBldmVudC0+a2V5Y29kZSwgdmtleSk7CgogICAgaWYgKCF2a2V5KSByZXR1cm47CgogICAgZHdGbGFncyA9IDA7CiAgICBpZiAoIGV2ZW50LT50eXBlID09IEtleVJlbGVhc2UgKSBkd0ZsYWdzIHw9IEtFWUVWRU5URl9LRVlVUDsKICAgIGlmICggdmtleSAmIDB4MTAwICkgICAgICAgICAgICAgIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0VYVEVOREVES0VZOwoKCiAgICAvKiBOb3RlOiBYIHNldHMgdGhlIGJlbG93IHN0YXRlcyBvbiBrZXkgZG93biBhbmQgY2xlYXJzIHRoZW0gb24ga2V5IHVwLgogICAgICAgV2luZG93cyB0cmlnZ2VycyB0aGVtIG9uIGtleSBkb3duLiAqLwoKICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spICYmCiAgICAgICAgdmtleSAhPSBWS19DQVBJVEFMKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgQ2Fwc0xvY2sgc3RhdGUgKCUjLjJ4KVxuIiwga2V5X3N0YXRlX3RhYmxlW1ZLX0NBUElUQUxdKTsKICAgICAgICB1cGRhdGVfbG9ja19zdGF0ZShWS19DQVBJVEFMLCAweDNBLCBldmVudF90aW1lKTsKICAgIH0KCiAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KICAgIGlmICghKGtleV9zdGF0ZV90YWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKHZrZXkgJiAweGZmKSAhPSBWS19OVU1MT0NLKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgTnVtTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlfc3RhdGVfdGFibGVbVktfTlVNTE9DS10pOwogICAgICAgIHVwZGF0ZV9sb2NrX3N0YXRlKFZLX05VTUxPQ0ssIDB4NDUsIGV2ZW50X3RpbWUpOwogICAgfQoKICAgIC8qIEFkanVzdCB0aGUgU0NST0xMTE9DSyBzdGF0ZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgd2luZSAqLwogICAgaWYgKCEoa2V5X3N0YXRlX3RhYmxlW1ZLX1NDUk9MTF0gJiAweDAxKSAhPSAhKGV2ZW50LT5zdGF0ZSAmIFNjcm9sbExvY2tNYXNrKSAmJgogICAgICAgIHZrZXkgIT0gVktfU0NST0xMKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3RpbmcgU2NyTG9jayBzdGF0ZSAoJSMuMngpXG4iLCBrZXlfc3RhdGVfdGFibGVbVktfU0NST0xMXSk7CiAgICAgICAgdXBkYXRlX2xvY2tfc3RhdGUoVktfU0NST0xMLCAweDQ2LCBldmVudF90aW1lKTsKICAgIH0KCiAgICBiU2NhbiA9IGtleWMyc2NhbltldmVudC0+a2V5Y29kZV0gJiAweEZGOwogICAgVFJBQ0VfKGtleSkoImJTY2FuID0gMHglMDJ4LlxuIiwgYlNjYW4pOwoKICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgYlNjYW4sIGR3RmxhZ3MsIGV2ZW50X3RpbWUsIDAsIDAgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQKICoKICogQ2FsbGVkIGZyb20gWDExRFJWX0luaXRLZXlib2FyZAogKiAgVGhpcyByb3V0aW5lIHdhbGtzIHRocm91Z2ggdGhlIGRlZmluZWQga2V5Ym9hcmQgbGF5b3V0cyBhbmQgc2VsZWN0cwogKiAgd2hpY2hldmVyIG1hdGNoZXMgbW9zdCBjbG9zZWx5LgogKiBYMTEgbG9jayBtdXN0IGJlIGhlbGQuCiAqLwpzdGF0aWMgdm9pZApYMTFEUlZfS0VZQk9BUkRfRGV0ZWN0TGF5b3V0KCBEaXNwbGF5ICpkaXNwbGF5ICkKewogIHVuc2lnbmVkIGN1cnJlbnQsIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBpLCBzeW1zOwogIGludCBzY29yZSwga2V5Yywga2V5LCBwa2V5LCBvazsKICBLZXlTeW0ga2V5c3ltID0gMDsKICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogIHVuc2lnbmVkIG1heF9zZXEgPSAwOwogIGludCBtYXhfc2NvcmUgPSAwLCBpc21hdGNoID0gMDsKICBjaGFyIGNrZXlbMjU2XVs0XTsKCiAgc3ltcyA9IGtleXN5bXNfcGVyX2tleWNvZGU7CiAgaWYgKHN5bXMgPiA0KSB7CiAgICBXQVJOKCIlZCBrZXlzeW1zIHBlciBrZXljb2RlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byA0XG4iLCBzeW1zKTsKICAgIHN5bXMgPSA0OwogIH0KCiAgbWVtc2V0KCBja2V5LCAwLCBzaXplb2YoY2tleSkgKTsKICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKSB7CiAgICAgIC8qIGdldCBkYXRhIGZvciBrZXljb2RlIGZyb20gWCBzZXJ2ZXIgKi8KICAgICAgZm9yIChpID0gMDsgaSA8IHN5bXM7IGkrKykgewogICAgICAgIGlmICghKGtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0gKGRpc3BsYXksIGtleWMsIGkpKSkgY29udGludWU7CgkvKiBBbGxvdyBib3RoIG9uZS1ieXRlIGFuZCB0d28tYnl0ZSBuYXRpb25hbCBrZXlzeW1zICovCglpZiAoKGtleXN5bSA8IDB4ODAwMCkgJiYgKGtleXN5bSAhPSAnICcpKQogICAgICAgIHsKI2lmZGVmIEhBVkVfWEtCCiAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2tleWNdW2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJYS0IgY291bGQgbm90IHRyYW5zbGF0ZSBrZXlzeW0gJWxkXG4iLCBrZXlzeW0pOwogICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgKiB3aXRoIGFwcHJvcHJpYXRlIFNoaWZ0TWFzayBhbmQgTW9kZV9zd2l0Y2gsIHVzZSBYTG9va3VwU3RyaW5nCiAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2tleVtrZXljXVtpXSA9IGtleXN5bSAmIDB4RkY7CiAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNlIHsKCSAgY2tleVtrZXljXVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCX0KICAgICAgfQogIH0KCiAgZm9yIChjdXJyZW50ID0gMDsgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQ7IGN1cnJlbnQrKykgewogICAgVFJBQ0UoIkF0dGVtcHRpbmcgdG8gbWF0Y2ggYWdhaW5zdCBcIiVzXCJcbiIsIG1haW5fa2V5X3RhYltjdXJyZW50XS5jb21tZW50KTsKICAgIG1hdGNoID0gMDsKICAgIG1pc21hdGNoID0gMDsKICAgIHNjb3JlID0gMDsKICAgIHNlcSA9IDA7CiAgICBsa2V5ID0gbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmtleTsKICAgIHBrZXkgPSAtMTsKICAgIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgaWYgKGNrZXlba2V5Y11bMF0pIHsKCS8qIHNlYXJjaCBmb3IgYSBtYXRjaCBpbiBsYXlvdXQgdGFibGUgKi8KCS8qIHJpZ2h0IG5vdywgd2UganVzdCBmaW5kIGFuIGFic29sdXRlIG1hdGNoIGZvciBkZWZpbmVkIHBvc2l0aW9ucyAqLwoJLyogKHVuZGVmaW5lZCBwb3NpdGlvbnMgYXJlIGlnbm9yZWQsIHNvIGlmIGl0J3MgZGVmaW5lZCBhcyAiMyMiIGluICovCgkvKiB0aGUgdGFibGUsIGl0J3Mgb2theSB0aGF0IHRoZSBYIHNlcnZlciBoYXMgIjMjwqMiLCBmb3IgZXhhbXBsZSkgKi8KCS8qIGhvd2V2ZXIsIHRoZSBzY29yZSB3aWxsIGJlIGhpZ2hlciBmb3IgbG9uZ2VyIG1hdGNoZXMgKi8KCWZvciAoa2V5ID0gMDsga2V5IDwgTUFJTl9MRU47IGtleSsrKSB7CgkgIGZvciAob2sgPSAwLCBpID0gMDsgKG9rID49IDApICYmIChpIDwgc3ltcyk7IGkrKykgewoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSA9PSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rKys7CgkgICAgaWYgKCgqbGtleSlba2V5XVtpXSAmJiAoKCpsa2V5KVtrZXldW2ldICE9IGNrZXlba2V5Y11baV0pKQoJICAgICAgb2sgPSAtMTsKCSAgfQoJICBpZiAob2sgPiAwKSB7CgkgICAgc2NvcmUgKz0gb2s7CgkgICAgYnJlYWs7CgkgIH0KCX0KCS8qIGNvdW50IHRoZSBtYXRjaGVzIGFuZCBtaXNtYXRjaGVzICovCglpZiAob2sgPiAwKSB7CgkgIG1hdGNoKys7CgkgIC8qIGFuZCBob3cgbXVjaCB0aGUga2V5Y29kZSBvcmRlciBtYXRjaGVzICovCgkgIGlmIChrZXkgPiBwa2V5KSBzZXErKzsKCSAgcGtleSA9IGtleTsKCX0gZWxzZSB7CiAgICAgICAgICAvKiBwcmludCBzcGFjZXMgaW5zdGVhZCBvZiBcMCdzICovCiAgICAgICAgICBjaGFyIHN0cls1XTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHN0cltpXSA9IGNrZXlba2V5Y11baV0gPyBja2V5W2tleWNdW2ldIDogJyAnOwogICAgICAgICAgc3RyWzRdID0gMDsKICAgICAgICAgIFRSQUNFXyhrZXkpKCJtaXNtYXRjaCBmb3Iga2V5c3ltIDB4JTA0bFgsIGtleWNvZGUgJWQsIGdvdCAlc1xuIiwga2V5c3ltLCBrZXljLCBzdHIgKTsKICAgICAgICAgIG1pc21hdGNoKys7CiAgICAgICAgICBzY29yZSAtPSBzeW1zOwoJfQogICAgICB9CiAgICB9CiAgICBUUkFDRSgibWF0Y2hlcz0lZCwgbWlzbWF0Y2hlcz0lZCwgc2VxPSVkLCBzY29yZT0lZFxuIiwKCSAgIG1hdGNoLCBtaXNtYXRjaCwgc2VxLCBzY29yZSk7CiAgICBpZiAoKHNjb3JlID4gbWF4X3Njb3JlKSB8fAoJKChzY29yZSA9PSBtYXhfc2NvcmUpICYmIChzZXEgPiBtYXhfc2VxKSkpIHsKICAgICAgLyogYmVzdCBtYXRjaCBzbyBmYXIgKi8KICAgICAga2JkX2xheW91dCA9IGN1cnJlbnQ7CiAgICAgIG1heF9zY29yZSA9IHNjb3JlOwogICAgICBtYXhfc2VxID0gc2VxOwogICAgICBpc21hdGNoID0gIW1pc21hdGNoOwogICAgfQogIH0KICAvKiB3ZSdyZSBkb25lLCByZXBvcnQgcmVzdWx0cyBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIWlzbWF0Y2gpCiAgICBXQVJOKCJVc2luZyBjbG9zZXN0IG1hdGNoICglcykgZm9yIHNjYW4vdmlydHVhbCBjb2RlcyBtYXBwaW5nLlxuIiwKICAgICAgICBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7CgogIFRSQUNFKCJkZXRlY3RlZCBsYXlvdXQgaXMgXCIlc1wiXG4iLCBtYWluX2tleV90YWJba2JkX2xheW91dF0uY29tbWVudCk7Cn0KCnN0YXRpYyBIS0wgZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KHZvaWQpCnsKICAgIFVMT05HX1BUUiBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIC8qIEZJWE1FOgogICAgICoKICAgICAqIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgICoKICAgICAqIFdpbndvcmQgdXNlcyByZXR1cm4gdmFsdWUgb2YgR2V0S2V5Ym9hcmRMYXlvdXQgYXMgYSBjb2RlcGFnZQogICAgICogdG8gdHJhbnNsYXRlIEFOU0kga2V5Ym9hcmQgbWVzc2FnZXMgdG8gdW5pY29kZS4gQnV0IHdlIGhhdmUKICAgICAqIGEgcHJvYmxlbSB3aXRoIGl0OiBmb3IgaW5zdGFuY2UgUG9saXNoIGtleWJvYXJkIGxheW91dCBpcwogICAgICogaWRlbnRpY2FsIHRvIHRoZSBVUyBvbmUsIGFuZCB0aGVyZWZvcmUgaW5zdGVhZCBvZiB0aGUgUG9saXNoCiAgICAgKiBsb2NhbGUgaWQgd2UgcmV0dXJuIHRoZSBVUyBvbmUuCiAgICAgKi8KCiAgICBsYXlvdXQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCiAgICAvKgogICAgICogTWljcm9zb2Z0IE9mZmljZSBleHBlY3RzIHRoaXMgdmFsdWUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljCiAgICAgKiBmb3IgSmFwYW5lc2UgYW5kIEtvcmVhbiBXaW5kb3dzIHdpdGggYW4gSU1FIHRoZSB2YWx1ZSBpcyAweGUwMDEKICAgICAqIFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0byBzZWUgaWYgYW4gSU1FIGV4aXN0cyBhbmQgaWYgc28gdGhlbgogICAgICogc2V0IHRoaXMgd29yZCBwcm9wZXJseS4KICAgICAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBJTUUgKi8KICAgIGVsc2UKICAgICAgICBsYXlvdXQgfD0gbGF5b3V0IDw8IDE2OwoKICAgIHJldHVybiAoSEtMKWxheW91dDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICBHZXRLZXlib2FyZExheW91dE5hbWUgKFgxMURSVi5AKQogKi8KQk9PTCBDREVDTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXROYW1lKExQV1NUUiBuYW1lKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geyclJywnMCcsJzgnLCd4JywwfTsKICAgIERXT1JEIGxheW91dDsKCiAgICBsYXlvdXQgPSBIYW5kbGVUb1Vsb25nKCBnZXRfbG9jYWxlX2tiZF9sYXlvdXQoKSApOwogICAgaWYgKEhJV09SRChsYXlvdXQpID09IExPV09SRChsYXlvdXQpKSBsYXlvdXQgPSBMT1dPUkQobGF5b3V0KTsKICAgIHNwcmludGZXKG5hbWUsIGZvcm1hdFcsIGxheW91dCk7CiAgICBUUkFDRSgicmV0dXJuaW5nICVzXG4iLCBkZWJ1Z3N0cl93KG5hbWUpKTsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgdm9pZCBzZXRfa2JkX2xheW91dF9wcmVsb2FkX2tleSh2b2lkKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgcHJlbG9hZFtdID0KICAgICAgICB7J0snLCdlJywneScsJ2InLCdvJywnYScsJ3InLCdkJywnICcsJ0wnLCdhJywneScsJ28nLCd1JywndCcsJ1xcJywnUCcsJ3InLCdlJywnbCcsJ28nLCdhJywnZCcsMH07CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgb25lW10gPSB7JzEnLDB9OwoKICAgIEhLRVkgaGtleTsKICAgIFdDSEFSIGxheW91dFtLTF9OQU1FTEVOR1RIXTsKCiAgICBpZiAoUmVnQ3JlYXRlS2V5RXhXKEhLRVlfQ1VSUkVOVF9VU0VSLCBwcmVsb2FkLCAwLCBOVUxMLCAwLCBLRVlfQUxMX0FDQ0VTUywgTlVMTCwgJmhrZXksIE5VTEwpKQogICAgICAgIHJldHVybjsKCiAgICBpZiAoIVJlZ1F1ZXJ5VmFsdWVFeFcoaGtleSwgb25lLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKICAgIHsKICAgICAgICBSZWdDbG9zZUtleShoa2V5KTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TmFtZShsYXlvdXQpKQogICAgICAgIFJlZ1NldFZhbHVlRXhXKGhrZXksIG9uZSwgMCwgUkVHX1NaLCAoY29uc3QgQllURSAqKWxheW91dCwgc2l6ZW9mKGxheW91dCkpOwoKICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0luaXRLZXlib2FyZAogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKCBEaXNwbGF5ICpkaXNwbGF5ICkKewogICAgS2V5U3ltICprc3A7CiAgICBYTW9kaWZpZXJLZXltYXAgKm1tcDsKICAgIEtleVN5bSBrZXlzeW07CiAgICBLZXlDb2RlICprY3A7CiAgICBYS2V5RXZlbnQgZTI7CiAgICBXT1JEIHNjYW4sIHZrZXk7CiAgICBpbnQga2V5YywgaSwga2V5biwgc3ltczsKICAgIGNoYXIgY2tleVs0XT17MCwwLDAsMH07CiAgICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogICAgY2hhciB2a2V5X3VzZWRbMjU2XSA9IHsgMCB9OwoKICAgIC8qIFJhbmdlcyBvZiBPRU0sIGZ1bmN0aW9uIGtleSwgYW5kIGNoYXJhY3RlciB2aXJ0dWFsIGtleSBjb2Rlcy4KICAgICAqIERvbid0IGluY2x1ZGUgdGhvc2UgaGFuZGxlZCBzcGVjaWFsbHkgaW4gWDExRFJWX1RvVW5pY29kZUV4IGFuZAogICAgICogWDExRFJWX01hcFZpcnR1YWxLZXlFeCwgbGlrZSBWS19OVU1QQUQwIC0gVktfRElWSURFLiAqLwogICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgICAgV09SRCBmaXJzdCwgbGFzdDsKICAgIH0gdmtleV9yYW5nZXNbXSA9IHsKICAgICAgICB7IFZLX09FTV8xLCBWS19PRU1fMyB9LAogICAgICAgIHsgVktfT0VNXzQsIFZLX0lDT18wMCB9LAogICAgICAgIHsgMHhlNiwgMHhlNiB9LAogICAgICAgIHsgMHhlOSwgMHhmNSB9LAogICAgICAgIHsgVktfT0VNX05FQ19FUVVBTCwgVktfT0VNX05FQ19FUVVBTCB9LAogICAgICAgIHsgVktfRjEsIFZLX0YyNCB9LAogICAgICAgIHsgMHgzMCwgMHgzOSB9LCAvKiBWS18wIC0gVktfOSAqLwogICAgICAgIHsgMHg0MSwgMHg1YSB9LCAvKiBWS19BIC0gVktfWiAqLwogICAgICAgIHsgMCwgMCB9CiAgICB9OwogICAgaW50IHZrZXlfcmFuZ2U7CgogICAgc2V0X2tiZF9sYXlvdXRfcHJlbG9hZF9rZXkoKTsKCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIFhEaXNwbGF5S2V5Y29kZXMoZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOwogICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhkaXNwbGF5LCBtaW5fa2V5Y29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2tleWNvZGUgKyAxIC0gbWluX2tleWNvZGUsICZrZXlzeW1zX3Blcl9rZXljb2RlKTsKICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4ga2V5c3ltc19wZXJfa2V5Y29kZS4KICAgICAgIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIGxvY2FsIGNvcHkgb2YgdGhlIGtleXN5bXMgdGFibGUgKi8KICAgIFhGcmVlKGtzcCk7CgogICAgbW1wID0gWEdldE1vZGlmaWVyTWFwcGluZyhkaXNwbGF5KTsKICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CiAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCiAgICB7CiAgICAgICAgaW50IGo7CgogICAgICAgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCgkgICAgaWYgKCprY3ApCiAgICAgICAgICAgIHsKCQlpbnQgazsKCgkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKICAgICAgICAgICAgICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCAqa2NwLCBrKSA9PSBYS19OdW1fTG9jaykKCQkgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOdW1Mb2NrTWFzayA9IDEgPDwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGtleSkoIk51bUxvY2tNYXNrIGlzICV4XG4iLCBOdW1Mb2NrTWFzayk7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX1Njcm9sbF9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbExvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiU2Nyb2xsTG9ja01hc2sgaXMgJXhcbiIsIFNjcm9sbExvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoIGRpc3BsYXkgKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CgogICAgbWVtc2V0KGtleWMydmtleSwgMCwgc2l6ZW9mKGtleWMydmtleSkpOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBjaGFyIGJ1ZlszMF07CiAgICAgICAgaW50IGhhdmVfY2hhcnM7CgogICAgICAgIGtleXN5bSA9IDA7CiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAgaGF2ZV9jaGFycyA9IFhMb29rdXBTdHJpbmcoJmUyLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICB2a2V5ID0gMDsgc2NhbiA9IDA7CiAgICAgICAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLwogICAgICAgIHsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2a2V5ID0gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweGZmXTsKICAgICAgICAgICAgICAgIHNjYW4gPSBub25jaGFyX2tleV9zY2FuW2tleXN5bSAmIDB4ZmZdOwoJCS8qIHNldCBleHRlbmRlZCBiaXQgd2hlbiBuZWNlc3NhcnkgKi8KCQlpZiAoc2NhbiAmIDB4MTAwKSB2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHgxMDA4RkYpIHsgLyogWEZyZWU4NiB2ZW5kb3Iga2V5cyAqLwogICAgICAgICAgICAgICAgdmtleSA9IHhmcmVlODZfdmVuZG9yX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgLyogQWxsIHZlbmRvciBrZXlzIGFyZSBleHRlbmRlZCB3aXRoIGEgc2NhbiBjb2RlIG9mIDAgcGVyIHRlc3Rpbmcgb24gV2luWFAgKi8KICAgICAgICAgICAgICAgIHNjYW4gPSAweDEwMDsKCQl2a2V5IHw9IDB4MTAwOwogICAgICAgICAgICB9IGVsc2UgaWYgKGtleXN5bSA9PSAweDIwKSB7ICAgICAgICAgICAgICAgICAvKiBTcGFjZWJhciAqLwoJICAgICAgICB2a2V5ID0gVktfU1BBQ0U7CgkJc2NhbiA9IDB4Mzk7CgkgICAgfSBlbHNlIGlmIChoYXZlX2NoYXJzKSB7CgkgICAgICAvKiB3ZSBzZWVtIHRvIG5lZWQgdG8gc2VhcmNoIHRoZSBsYXlvdXQtZGVwZW5kZW50IHNjYW5jb2RlcyAqLwoJICAgICAgaW50IG1heGxlbj0wLG1heHZhbD0tMSxvazsKCSAgICAgIGZvciAoaT0wOyBpPHN5bXM7IGkrKykgewoJCWtleXN5bSA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgaSk7CgkJaWYgKChrZXlzeW08MHg4MDAwKSAmJiAoa2V5c3ltIT0nICcpKQogICAgICAgICAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZV94a2IgfHwgIVhrYlRyYW5zbGF0ZUtleVN5bShkaXNwbGF5LCAma2V5c3ltLCAwLCAmY2tleVtpXSwgMSwgTlVMTCkpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUU6IHF1ZXJ5IHdoYXQga2V5c3ltIGlzIHVzZWQgYXMgTW9kZV9zd2l0Y2gsIGZpbGwgWEtleUV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gZ2V0IGNoYXJhY3RlciBpbiB0aGUgbG9jYWwgZW5jb2RpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBja2V5W2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgICAgICAgICB9CgkJfSBlbHNlIHsKCQkgIGNrZXlbaV0gPSBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKGtleXN5bSk7CgkJfQoJICAgICAgfQoJICAgICAgLyogZmluZCBrZXkgd2l0aCBsb25nZXN0IG1hdGNoIHN0cmVhayAqLwoJICAgICAgZm9yIChrZXluPTA7IGtleW48TUFJTl9MRU47IGtleW4rKykgewoJCWZvciAob2s9KCpsa2V5KVtrZXluXVtpPTBdOyBvayYmKGk8NCk7IGkrKykKCQkgIGlmICgoKmxrZXkpW2tleW5dW2ldICYmICgqbGtleSlba2V5bl1baV0hPWNrZXlbaV0pIG9rPTA7CgkJaWYgKCFvaykgaS0tOyAvKiB3ZSBvdmVyc2hvdCAqLwoJCWlmIChva3x8KGk+bWF4bGVuKSkgewoJCSAgbWF4bGVuPWk7IG1heHZhbD1rZXluOwoJCX0KCQlpZiAob2spIGJyZWFrOwoJICAgICAgfQoJICAgICAgaWYgKG1heHZhbD49MCkgewoJCS8qIGdvdCBpdCAqLwoJCWNvbnN0IFdPUkQgKCpsc2NhbilbTUFJTl9MRU5dID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLnNjYW47CgkJY29uc3QgV09SRCAoKmx2a2V5KVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0udmtleTsKCQlzY2FuID0gKCpsc2NhbilbbWF4dmFsXTsKCQl2a2V5ID0gKCpsdmtleSlbbWF4dmFsXTsKCSAgICAgIH0KCSAgICB9CiAgICAgICAgfQogICAgICAgIFRSQUNFKCJrZXljb2RlICUwNHggPT4gdmtleSAlMDR4XG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIGtleWMyc2NhbltlMi5rZXljb2RlXSA9IHNjYW47CiAgICAgICAgaWYgKCh2a2V5ICYgMHhmZikgJiYgdmtleV91c2VkWyh2a2V5ICYgMHhmZildKQogICAgICAgICAgICBXQVJOKCJ2a2V5ICUwNHggaXMgYmVpbmcgdXNlZCBieSBtb3JlIHRoYW4gb25lIGtleWNvZGVcbiIsIHZrZXkpOwogICAgICAgIHZrZXlfdXNlZFsodmtleSAmIDB4ZmYpXSA9IDE7CiAgICB9IC8qIGZvciAqLwoKI2RlZmluZSBWS0VZX0lGX05PVF9VU0VEKHZrZXkpICh2a2V5X3VzZWRbKHZrZXkpXSA/IDAgOiAodmtleV91c2VkWyh2a2V5KV0gPSAxLCAodmtleSkpKQogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICB2a2V5ID0ga2V5YzJ2a2V5W2tleWNdICYgMHhmZjsKICAgICAgICBpZiAodmtleSkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgLyogZmluZCBhIHN1aXRhYmxlIGxheW91dC1kZXBlbmRlbnQgVksgY29kZSAqLwogICAgICAgIC8qIChtb3N0IFdpbmVsaWIgYXBwcyBvdWdodCB0byBiZSBhYmxlIHRvIHdvcmsgd2l0aG91dCBsYXlvdXQgdGFibGVzISkgKi8KICAgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgaWYgKChrZXlzeW0gPj0gWEtfMCAmJiBrZXlzeW0gPD0gWEtfOSkKICAgICAgICAgICAgICAgIHx8IChrZXlzeW0gPj0gWEtfQSAmJiBrZXlzeW0gPD0gWEtfWikpIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKGtleXN5bSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBzd2l0Y2ggKGtleXN5bSkKICAgICAgICAgICAgewogICAgICAgICAgICBjYXNlICc7JzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzEpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8yKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2AnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdbJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzQpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXFwnOiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV81KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ10nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNik7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcJyc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzcpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnLCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9DT01NQSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcuJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX1BFUklPRCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICctJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX01JTlVTKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJysnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUExVUyk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodmtleSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJrZXljb2RlICUwNHggPT4gdmtleSAlMDR4XG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICAgICAga2V5YzJ2a2V5W2UyLmtleWNvZGVdID0gdmtleTsKICAgICAgICB9CiAgICB9IC8qIGZvciAqLwoKICAgIC8qIEZvciBhbnkga2V5Y29kZXMgd2hpY2ggc3RpbGwgZG9uJ3QgaGF2ZSBhIHZrZXksIGFzc2lnbiBhbnkgc3BhcmUKICAgICAqIGNoYXJhY3RlciwgZnVuY3Rpb24ga2V5LCBvciBPRU0gdmlydHVhbCBrZXkgY29kZS4gKi8KICAgIHZrZXlfcmFuZ2UgPSAwOwogICAgdmtleSA9IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmZpcnN0OwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgIHsKICAgICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdICYgMHhmZikKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIGUyLmtleWNvZGUgPSAoS2V5Q29kZSlrZXljOwogICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCAwKTsKICAgICAgICBpZiAoIWtleXN5bSkKICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgd2hpbGUgKHZrZXkgJiYgdmtleV91c2VkW3ZrZXldKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZrZXkgPT0gdmtleV9yYW5nZXNbdmtleV9yYW5nZV0ubGFzdCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmtleV9yYW5nZSsrOwogICAgICAgICAgICAgICAgdmtleSA9IHZrZXlfcmFuZ2VzW3ZrZXlfcmFuZ2VdLmZpcnN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHZrZXkrKzsKICAgICAgICB9CgogICAgICAgIGlmICghdmtleSkKICAgICAgICB7CiAgICAgICAgICAgIFdBUk4oIk5vIG1vcmUgdmtleXMgYXZhaWxhYmxlIVxuIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKFRSQUNFX09OKGtleWJvYXJkKSkKICAgICAgICB7CiAgICAgICAgICAgIFRSQUNFKCJzcGFyZSB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYOlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5LCBlMi5rZXljb2RlKTsKICAgICAgICAgICAgVFJBQ0UoIigiKTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwogICAgICAgICAgICAgICAgaWYgKCFrc25hbWUpCiAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgIFRSQUNFKCAiJWxYICglcykgIiwga2V5c3ltLCBrc25hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFKCIpXG4iKTsKICAgICAgICB9CgogICAgICAgIFRSQUNFKCJrZXljb2RlICUwNHggPT4gdmtleSAlMDR4XG4iLCBlMi5rZXljb2RlLCB2a2V5KTsKICAgICAgICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OwogICAgICAgIHZrZXlfdXNlZFt2a2V5XSA9IDE7CiAgICB9IC8qIGZvciAqLwojdW5kZWYgVktFWV9JRl9OT1RfVVNFRAoKICAgIC8qIElmIHNvbWUga2V5cyBzdGlsbCBsYWNrIHNjYW5jb2RlcywgYXNzaWduIHNvbWUgYXJiaXRyYXJ5IG9uZXMgdG8gdGhlbSBub3cgKi8KICAgIGZvciAoc2NhbiA9IDB4NjAsIGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICBpZiAoa2V5YzJ2a2V5W2tleWNdJiYha2V5YzJzY2FuW2tleWNdKSB7Cgljb25zdCBjaGFyICprc25hbWU7CglrZXlzeW0gPSBYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksIGtleWMsIDApOwoJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CglpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vU3ltYm9sIjsKCgkvKiBzaG91bGQgbWFrZSBzdXJlIHRoZSBzY2FuY29kZSBpcyB1bmFzc2lnbmVkIGhlcmUsIGJ1dCA+PTB4NjAgY3VycmVudGx5IGFsd2F5cyBpcyAqLwoKCVRSQUNFXyhrZXkpKCJhc3NpZ25pbmcgc2NhbmNvZGUgJTAyeCB0byB1bmlkZW50aWZpZWQga2V5Y29kZSAlMDJ4ICglcylcbiIsc2NhbixrZXljLGtzbmFtZSk7CglrZXljMnNjYW5ba2V5Y109c2NhbisrOwogICAgICB9CgogICAgd2luZV90c3gxMV91bmxvY2soKTsKfQoKc3RhdGljIEJPT0wgbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChIS0wgaGtsKQp7CiAgICBjb25zdCBEV09SRCBpc0lNRSA9IDB4RTAwMDAwMDA7CiAgICBIS0wgeEhrbCA9IGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwoKICAgIC8qIGlmIHRoZSBsYXlvdXQgaXMgYW4gSU1FLCBvbmx5IG1hdGNoIHRoZSBsb3cgd29yZCAoTENJRCkgKi8KICAgIGlmICgoKFVMT05HX1BUUiloa2wgJiBpc0lNRSkgPT0gaXNJTUUpCiAgICAgICAgcmV0dXJuIChMT1dPUkQoaGtsKSA9PSBMT1dPUkQoeEhrbCkpOwogICAgZWxzZQogICAgICAgIHJldHVybiAoaGtsID09IHhIa2wpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0QXN5bmNLZXlTdGF0ZSAoWDExRFJWLkApCiAqLwpTSE9SVCBDREVDTCBYMTFEUlZfR2V0QXN5bmNLZXlTdGF0ZShJTlQga2V5KQp7CiAgICBTSE9SVCByZXR2YWw7CgogICAgLyogUGhvdG9zaG9wIGxpdmVsb2NrcyB1bmxlc3MgbW91c2UgZXZlbnRzIGFyZSBpbmNsdWRlZCBoZXJlICovCiAgICBYMTFEUlZfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KCAwLCBOVUxMLCAwLCBRU19LRVkgfCBRU19NT1VTRSwgMCApOwoKICAgIHJldHZhbCA9ICgoa2V5X3N0YXRlX3RhYmxlW2tleV0gJiAweDQwKSA/IDB4MDAwMSA6IDApIHwKICAgICAgICAgICAgICgoa2V5X3N0YXRlX3RhYmxlW2tleV0gJiAweDgwKSA/IDB4ODAwMCA6IDApOwogICAga2V5X3N0YXRlX3RhYmxlW2tleV0gJj0gfjB4NDA7CiAgICBUUkFDRV8oa2V5KSgiKCV4KSAtPiAleFxuIiwga2V5LCByZXR2YWwpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIENERUNMIFgxMURSVl9HZXRLZXlib2FyZExheW91dChEV09SRCBkd1RocmVhZGlkKQp7CiAgICBpZiAoIWR3VGhyZWFkaWQgfHwgZHdUaHJlYWRpZCA9PSBHZXRDdXJyZW50VGhyZWFkSWQoKSkKICAgIHsKICAgICAgICBzdHJ1Y3QgeDExZHJ2X3RocmVhZF9kYXRhICp0aHJlYWRfZGF0YSA9IHgxMWRydl90aHJlYWRfZGF0YSgpOwogICAgICAgIGlmICh0aHJlYWRfZGF0YSAmJiB0aHJlYWRfZGF0YS0+a2JkX2xheW91dCkgcmV0dXJuIHRocmVhZF9kYXRhLT5rYmRfbGF5b3V0OwogICAgfQogICAgZWxzZQogICAgICAgIEZJWE1FKCJjb3VsZG4ndCByZXR1cm4ga2V5Ym9hcmQgbGF5b3V0IGZvciB0aHJlYWQgJTA0eFxuIiwgZHdUaHJlYWRpZCk7CgogICAgcmV0dXJuIGdldF9sb2NhbGVfa2JkX2xheW91dCgpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlMb2FkS2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIENERUNMIFgxMURSVl9Mb2FkS2V5Ym9hcmRMYXlvdXQoTFBDV1NUUiBuYW1lLCBVSU5UIGZsYWdzKQp7CiAgICBGSVhNRSgiJXMsICUwNHg6IHN0dWIhXG4iLCBkZWJ1Z3N0cl93KG5hbWUpLCBmbGFncyk7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVVubG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkJPT0wgQ0RFQ0wgWDExRFJWX1VubG9hZEtleWJvYXJkTGF5b3V0KEhLTCBoa2wpCnsKICAgIEZJWE1FKCIlcDogc3R1YiFcbiIsIGhrbCk7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgcmV0dXJuIEZBTFNFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBY3RpdmF0ZUtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBDREVDTCBYMTFEUlZfQWN0aXZhdGVLZXlib2FyZExheW91dChIS0wgaGtsLCBVSU5UIGZsYWdzKQp7CiAgICBIS0wgb2xkSGtsID0gMDsKICAgIHN0cnVjdCB4MTFkcnZfdGhyZWFkX2RhdGEgKnRocmVhZF9kYXRhID0geDExZHJ2X2luaXRfdGhyZWFkX2RhdGEoKTsKCiAgICBGSVhNRSgiJXAsICUwNHg6IHNlbWktc3R1YiFcbiIsIGhrbCwgZmxhZ3MpOwogICAgaWYgKGZsYWdzICYgS0xGX1NFVEZPUlBST0NFU1MpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICAgICBGSVhNRSgiS0xGX1NFVEZPUlBST0NFU1Mgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKGZsYWdzKQogICAgICAgIEZJWE1FKCJmbGFncyAleCBub3Qgc3VwcG9ydGVkXG4iLGZsYWdzKTsKCiAgICBpZiAoaGtsID09IChIS0wpSEtMX05FWFQgfHwgaGtsID09IChIS0wpSEtMX1BSRVYpCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgICAgICBGSVhNRSgiSEtMX05FWFQgYW5kIEhLTF9QUkVWIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmICghbWF0Y2hfeDExX2tleWJvYXJkX2xheW91dChoa2wpKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgICAgICAgRklYTUUoInNldHRpbmcga2V5Ym9hcmQgb2YgZGlmZmVyZW50IGxvY2FsZXMgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgb2xkSGtsID0gdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQ7CiAgICBpZiAoIW9sZEhrbCkgb2xkSGtsID0gZ2V0X2xvY2FsZV9rYmRfbGF5b3V0KCk7CgogICAgdGhyZWFkX2RhdGEtPmtiZF9sYXlvdXQgPSBoa2w7CgogICAgcmV0dXJuIG9sZEhrbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX01hcHBpbmdOb3RpZnkKICovCnZvaWQgWDExRFJWX01hcHBpbmdOb3RpZnkoIEhXTkQgZHVtbXksIFhFdmVudCAqZXZlbnQgKQp7CiAgICBIV05EIGh3bmQ7CgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYUmVmcmVzaEtleWJvYXJkTWFwcGluZygmZXZlbnQtPnhtYXBwaW5nKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICBYMTFEUlZfSW5pdEtleWJvYXJkKCBldmVudC0+eG1hcHBpbmcuZGlzcGxheSApOwoKICAgIGh3bmQgPSBHZXRGb2N1cygpOwogICAgaWYgKCFod25kKSBod25kID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBQb3N0TWVzc2FnZVcoaHduZCwgV01fSU5QVVRMQU5HQ0hBTkdFUkVRVUVTVCwKICAgICAgICAgICAgICAgICAwIC8qRklYTUUqLywgKExQQVJBTSlYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWa0tleVNjYW5FeCAoWDExRFJWLkApCiAqCiAqIE5vdGU6IFdpbmRvd3MgaWdub3JlcyBIS0wgcGFyYW1ldGVyIGFuZCB1c2VzIGN1cnJlbnQgYWN0aXZlIGxheW91dCBpbnN0ZWFkCiAqLwpTSE9SVCBDREVDTCBYMTFEUlZfVmtLZXlTY2FuRXgoV0NIQVIgd0NoYXIsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfaW5pdF9kaXNwbGF5KCk7CiAgICBLZXlDb2RlIGtleWNvZGU7CiAgICBLZXlTeW0ga2V5c3ltOwogICAgaW50IGksIGluZGV4OwogICAgQ0hBUiBjQ2hhcjsKICAgIFNIT1JUIHJldDsKCiAgICAvKiBGSVhNRTogd2hhdCBoYXBwZW5zIGlmIHdDaGFyIGlzIG5vdCBhIExhdGluMSBjaGFyYWN0ZXIgYW5kIENQX1VOSVhDUAogICAgICogaXMgVVRGLTggKG11bHRpYnl0ZSBlbmNvZGluZyk/CiAgICAgKi8KICAgIGlmICghV2lkZUNoYXJUb011bHRpQnl0ZShDUF9VTklYQ1AsIDAsICZ3Q2hhciwgMSwgJmNDaGFyLCAxLCBOVUxMLCBOVUxMKSkKICAgIHsKICAgICAgICBXQVJOKCJubyB0cmFuc2xhdGlvbiBmcm9tIHVuaWNvZGUgdG8gQ1BfVU5JWENQIGZvciAweCUwMnhcbiIsIHdDaGFyKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgVFJBQ0UoIndDaGFyIDB4JTAyeCAtPiBjQ2hhciAnJWMnXG4iLCB3Q2hhciwgY0NoYXIpOwoKICAgIC8qIGNoYXItPmtleXN5bSAoc2FtZSBmb3IgQU5TSSBjaGFycykgKi8KICAgIGtleXN5bSA9ICh1bnNpZ25lZCBjaGFyKWNDaGFyOyAvKiAoISkgY0NoYXIgaXMgc2lnbmVkICovCiAgICBpZiAoa2V5c3ltIDw9IDI3KSBrZXlzeW0gKz0gMHhGRjAwOyAvKiBzcGVjaWFsIGNoYXJzIDogcmV0dXJuLCBiYWNrc3BhY2UuLi4gKi8KCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGRpc3BsYXksIGtleXN5bSk7ICAvKiBrZXlzeW0gLT4ga2V5Y29kZSAqLwogICAgaWYgKCFrZXljb2RlKQogICAgewogICAgICAgIGlmIChrZXlzeW0gPj0gMHhGRjAwKSAvKiBXaW5kb3dzIHJldHVybnMgMHgwMjQwICsgY0NoYXIgaW4gdGhpcyBjYXNlICovCiAgICAgICAgewogICAgICAgICAgICByZXQgPSAweDAyNDAgKyBjQ2hhcjsgLyogMHgwMjAwIGluZGljYXRlcyBhIGNvbnRyb2wgY2hhcmFjdGVyICovCiAgICAgICAgICAgIFRSQUNFKCIgLi4uIHJldHVybmluZyBjdHJsIGNoYXIgJSMuMnhcbiIsIHJldCk7CiAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogICAgICAgIC8qIEl0IGRpZG4ndCB3b3JrIC4uLiBsZXQncyB0cnkgd2l0aCBkZWFkY2hhciBjb2RlLiAqLwogICAgICAgIFRSQUNFKCJyZXRyeWluZyB3aXRoIHwgMHhGRTAwXG4iKTsKICAgICAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0gfCAweEZFMDApOwogICAgfQogICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICBUUkFDRSgiJyVjJyglI2x4LCAlbHUpOiBnb3Qga2V5Y29kZSAlIy4yeCAoJWQpXG4iLAogICAgICAgICAgICBjQ2hhciwga2V5c3ltLCBrZXlzeW0sIGtleWNvZGUsIGtleWNvZGUpOwoKICAgIC8qIGtleWNvZGUgLT4gKGtleWMydmtleSkgdmtleSAqLwogICAgcmV0ID0ga2V5YzJ2a2V5W2tleWNvZGVdOwoKICAgIGlmICgha2V5Y29kZSB8fCAhcmV0KQogICAgewogICAgICAgIFRSQUNFKCJrZXljb2RlIGZvciAnJWMnIG5vdCBmb3VuZCwgcmV0dXJuaW5nIC0xXG4iLCBjQ2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGluZGV4ID0gLTE7CiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIC8qIGZpbmQgc2hpZnQgc3RhdGUgKi8KICAgIHsKICAgICAgICBpZiAoWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljb2RlLCBpKSA9PSBrZXlzeW0pCiAgICAgICAgewogICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgc3dpdGNoIChpbmRleCkKICAgIHsKICAgICAgICBkZWZhdWx0OgogICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgIFdBUk4oIktleXN5bSAlbHggbm90IGZvdW5kIHdoaWxlIHBhcnNpbmcgdGhlIGtleWNvZGUgdGFibGVcbiIsIGtleXN5bSk7CiAgICAgICAgICAgIHJldHVybiAtMTsKCiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHJldCArPSAweDAxMDA7IGJyZWFrOwogICAgICAgIGNhc2UgMjogcmV0ICs9IDB4MDYwMDsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiByZXQgKz0gMHgwNzAwOyBicmVhazsKICAgIH0KICAgIC8qCiAgICAgIGluZGV4IDogMCAgICAgYWRkcyAweDAwMDAKICAgICAgaW5kZXggOiAxICAgICBhZGRzIDB4MDEwMCAoc2hpZnQpCiAgICAgIGluZGV4IDogPyAgICAgYWRkcyAweDAyMDAgKGN0cmwpCiAgICAgIGluZGV4IDogMiAgICAgYWRkcyAweDA2MDAgKGN0cmwrYWx0KQogICAgICBpbmRleCA6IDMgICAgIGFkZHMgMHgwNzAwIChjdHJsK2FsdCtzaGlmdCkKICAgICAqLwoKICAgIFRSQUNFKCIgLi4uIHJldHVybmluZyAlIy4yeFxuIiwgcmV0KTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTWFwVmlydHVhbEtleUV4IChYMTFEUlYuQCkKICovClVJTlQgQ0RFQ0wgWDExRFJWX01hcFZpcnR1YWxLZXlFeChVSU5UIHdDb2RlLCBVSU5UIHdNYXBUeXBlLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwoKI2RlZmluZSByZXR1cm5NVksodmFsdWUpIGRvIHsgVFJBQ0UoInJldHVybmluZyAweCV4LlxuIix2YWx1ZSk7IHJldHVybiB2YWx1ZTsgfSB3aGlsZSgwKQoKICAgIFRSQUNFKCJ3Q29kZT0weCV4LCB3TWFwVHlwZT0lZCwgaGtsICVwXG4iLCB3Q29kZSwgd01hcFR5cGUsIGhrbCk7CiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgc3dpdGNoKHdNYXBUeXBlKQogICAgewogICAgICAgIGNhc2UgTUFQVktfVktfVE9fVlNDOiAvKiB2a2V5LWNvZGUgdG8gc2Nhbi1jb2RlICovCiAgICAgICAgY2FzZSBNQVBWS19WS19UT19WU0NfRVg6CiAgICAgICAgewogICAgICAgICAgICBpbnQga2V5YzsKCiAgICAgICAgICAgIHN3aXRjaCAod0NvZGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhc2UgVktfU0hJRlQ6IHdDb2RlID0gVktfTFNISUZUOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgVktfQ09OVFJPTDogd0NvZGUgPSBWS19MQ09OVFJPTDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFZLX01FTlU6IHdDb2RlID0gVktfTE1FTlU7IGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gc2NhbiAqLwogICAgICAgICAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgICAgICAgICAgICAgaWYgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkgYnJlYWs7CgogICAgICAgICAgICBpZiAoa2V5YyA+IG1heF9rZXljb2RlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUUkFDRSgicmV0dXJuaW5nIG5vIHNjYW4tY29kZS5cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuTVZLIChrZXljMnNjYW5ba2V5Y10gJiAweEZGKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBNQVBWS19WU0NfVE9fVks6IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KICAgICAgICBjYXNlIE1BUFZLX1ZTQ19UT19WS19FWDoKICAgICAgICB7CiAgICAgICAgICAgIGludCBrZXljOwogICAgICAgICAgICBVSU5UIHZrZXkgPSAwOwoKICAgICAgICAgICAgLyogbGV0J3MgZG8gc2NhbiAtPiBrZXljb2RlIC0+IHZrZXkgKi8KICAgICAgICAgICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgICAgICAgICAgIGlmICgoa2V5YzJzY2FuW2tleWNdICYgMHhGRikgPT0gKHdDb2RlICYgMHhGRikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdmtleSA9IGtleWMydmtleVtrZXljXSAmIDB4RkY7CiAgICAgICAgICAgICAgICAgICAgLyogT25seSBzdG9wIGlmIGl0J3Mgbm90IGEgbnVtcGFkIHZrZXk7IG90aGVyd2lzZSBrZWVwCiAgICAgICAgICAgICAgICAgICAgICAgbG9va2luZyBmb3IgYSBwb3RlbnRpYWwgYmV0dGVyIHZrZXkuICovCiAgICAgICAgICAgICAgICAgICAgaWYgKHZrZXkgJiYgKHZrZXkgPCBWS19OVU1QQUQwIHx8IFZLX0RJVklERSA8IHZrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh2a2V5ID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRSQUNFKCJyZXR1cm5pbmcgbm8gdmtleS1jb2RlLlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdNYXBUeXBlID09IE1BUFZLX1ZTQ19UT19WSykKICAgICAgICAgICAgICAgIHN3aXRjaCAodmtleSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX1JTSElGVDoKICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xDT05UUk9MOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOyBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19NRU5VOyBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybk1WSyAodmtleSk7CiAgICAgICAgfQoJCWNhc2UgTUFQVktfVktfVE9fQ0hBUjogLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KCQl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwZXJjYXNlICdXJy4gU28gd2UgaGF2ZSB0byByZXR1cm4gdGhlIHVwcGVyY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkuLiBMb29rcyBsaWtlIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBNUyBkb2NzPwogICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdHJ1ZSBmb3IgbGV0dGVycywgZm9yIGV4YW1wbGUgVktfMCByZXR1cm5zICcwJyBub3QgJyknLgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtIGhlbmNlIHdlIHVzZSB0aGUgbG9jayBtYXNrIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWMsIGxlbjsKCQkJY2hhciBzWzEwXTsKCgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgkJCWUuc3RhdGUgPSAwOwoJCQllLmtleWNvZGUgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgoJCQkvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCgkJCXsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCgkJCSAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KCQkJICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwoJCQkJaWYgKChFVkVOVF9ldmVudF90b192a2V5KDAsJmUpICYgMHhGRikgIT0gd0NvZGUpIHsKCQkJCSAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCgkJCQkJIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KCQkJCX0KCQkJICAgIH0KCQkJfQoKCQkJaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKCgkJCWlmICh3Q29kZT09VktfREVDSU1BTCkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgoJCQlpZiAoIWUua2V5Y29kZSkKCQkJewoJCQkgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB3Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gWExvb2t1cFN0cmluZygmZSwgcywgc2l6ZW9mKHMpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdDSEFSIHdjaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgcywgbGVuLCAmd2NoLCAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5NVksodG91cHBlclcod2NoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJVFJBQ0UoInJldHVybmluZyBubyBBTlNJLlxuIik7CgkJCXJldHVybiAwOwoJCX0KCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwoJCQlGSVhNRSgiVW5rbm93biB3TWFwVHlwZSAlZCAhXG4iLCB3TWFwVHlwZSk7CgkJCXJldHVybiAwOwoJfQoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5TmFtZVRleHQgKFgxMURSVi5AKQogKi8KSU5UIENERUNMIFgxMURSVl9HZXRLZXlOYW1lVGV4dChMT05HIGxQYXJhbSwgTFBXU1RSIGxwQnVmZmVyLCBJTlQgblNpemUpCnsKICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogIGludCB2a2V5LCBhbnNpLCBzY2FuQ29kZTsKICBLZXlDb2RlIGtleWM7CiAgaW50IGtleWk7CiAgS2V5U3ltIGtleXM7CiAgY2hhciAqbmFtZTsKCiAgc2NhbkNvZGUgPSBsUGFyYW0gPj4gMTY7CiAgc2NhbkNvZGUgJj0gMHgxZmY7ICAvKiBrZWVwICJleHRlbmRlZC1rZXkiIGZsYWcgd2l0aCBjb2RlICovCgogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHNjYW5Db2RlLCBNQVBWS19WU0NfVE9fVktfRVgsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CgogIC8qICBoYW5kbGUgImRvbid0IGNhcmUiIGJpdCAoMHgwMjAwMDAwMCkgKi8KICBpZiAoIShsUGFyYW0gJiAweDAyMDAwMDAwKSkgewogICAgc3dpdGNoICh2a2V5KSB7CiAgICAgICAgIGNhc2UgVktfUlNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFItU2hpZnQgaXMgInNwZWNpYWwiIC0gaXQgaXMgYW4gZXh0ZW5kZWQga2V5IHdpdGggc2VwYXJhdGUgc2NhbiBjb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbkNvZGUgfD0gMHgxMDA7CiAgICAgICAgIGNhc2UgVktfTFNISUZUOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19TSElGVDsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVktfTENPTlRST0w6CiAgICAgICBjYXNlIFZLX1JDT05UUk9MOgogICAgICAgICAgICAgICAgICAgICAgICAgIHZrZXkgPSBWS19DT05UUk9MOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBWS19MTUVOVToKICAgICAgICAgIGNhc2UgVktfUk1FTlU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX01FTlU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBhbnNpID0gWDExRFJWX01hcFZpcnR1YWxLZXlFeCh2a2V5LCBNQVBWS19WS19UT19DSEFSLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwogIFRSQUNFKCJzY2FuIDB4JTA0eCwgdmtleSAweCUwNHgsIEFOU0kgMHglMDR4XG4iLCBzY2FuQ29kZSwgdmtleSwgYW5zaSk7CgogIC8qIGZpcnN0IGdldCB0aGUgbmFtZSBvZiB0aGUgInJlZ3VsYXIiIGtleXMgd2hpY2ggaXMgdGhlIFVwcGVyIGNhc2UKICAgICB2YWx1ZSBvZiB0aGUga2V5Y2FwIGltcHJpbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgaWYgKCAoKGFuc2kgPj0gMHgyMSkgJiYgKGFuc2kgPD0gMHg3ZSkpICYmCiAgICAgICAoc2NhbkNvZGUgIT0gMHgxMzcpICYmICAgLyogUHJ0U2NuICAgKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDEzNSkgJiYgICAvKiBudW1wYWQgLyAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MzcgKSAmJiAgIC8qIG51bXBhZCAqICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHg0YSApICYmICAgLyogbnVtcGFkIC0gKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRlICkgKSAgICAvKiBudW1wYWQgKyAqLwogICAgICB7CiAgICAgICAgaWYgKChuU2l6ZSA+PSAyKSAmJiBscEJ1ZmZlcikKCXsKICAgICAgICAgICpscEJ1ZmZlciA9IHRvdXBwZXJXKChXQ0hBUilhbnNpKTsKICAgICAgICAgICoobHBCdWZmZXIrMSkgPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKICB9CgogIC8qIEZJWE1FOiBob3JyaWJsZSBoYWNrIHRvIGZpeCBmdW5jdGlvbiBrZXlzLiBXaW5kb3dzIHJlcG9ydHMgc2NhbmNvZGUKICAgICAgICAgICAgd2l0aG91dCAiZXh0ZW5kZWQta2V5IiBmbGFnLiBIb3dldmVyIFdpbmUgZ2VuZXJhdGVzIHNjYW5jb2RlCiAgICAgICAgICAgICp3aXRoKiAiZXh0ZW5kZWQta2V5IiBmbGFnLiBTZWVtcyB0byBvY2N1ciAqb25seSogZm9yIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBrZXlzLiBTb29vby4uIFdlIHdpbGwgbGVhdmUgdGhlIHRhYmxlIGFsb25lIGFuZAogICAgICAgICAgICBmdWRnZSB0aGUgbG9va3VwIGhlcmUgdGlsbCB0aGUgb3RoZXIgcGFydCBpcyBmb3VuZCBhbmQgZml4ZWQhISEgKi8KCiAgaWYgKCAoKHNjYW5Db2RlID49IDB4MTNiKSAmJiAoc2NhbkNvZGUgPD0gMHgxNDQpKSB8fAogICAgICAgKHNjYW5Db2RlID09IDB4MTU3KSB8fCAoc2NhbkNvZGUgPT0gMHgxNTgpKQogICAgc2NhbkNvZGUgJj0gMHhmZjsgICAvKiByZW1vdmUgImV4dGVuZGVkLWtleSIgZmxhZyBmb3IgRngga2V5cyAqLwoKICAvKiBsZXQncyBkbyBzY2FuY29kZSAtPiBrZXljb2RlIC0+IGtleXN5bSAtPiBTdHJpbmcgKi8KCiAgZm9yIChrZXlpPW1pbl9rZXljb2RlOyBrZXlpPD1tYXhfa2V5Y29kZTsga2V5aSsrKQogICAgICBpZiAoKGtleWMyc2NhbltrZXlpXSkgPT0gc2NhbkNvZGUpCiAgICAgICAgIGJyZWFrOwogIGlmIChrZXlpIDw9IG1heF9rZXljb2RlKQogIHsKICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgIGtleWMgPSAoS2V5Q29kZSkga2V5aTsKICAgICAga2V5cyA9IFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5YywgMCk7CiAgICAgIG5hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5cyk7CiAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgIFRSQUNFKCJmb3VuZCBzY2FuPSUwNHgga2V5Yz0lMDR4IGtleXN5bT0lMDR4IHN0cmluZz0lc1xuIiwKICAgICAgICAgICAgc2NhbkNvZGUsIGtleWMsIChpbnQpa2V5cywgbmFtZSk7CiAgICAgIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSAmJiBuYW1lKQogICAgICAgICAgcmV0dXJuIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCAtMSwgbHBCdWZmZXIsIG5TaXplKTsKICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgV0FSTiBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgV0FSTigiKCUwOHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0eCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CgkgICAgY2FzZSBYS19kZWFkX3ZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAndic7CgkgICAgY2FzZSBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3MnOwoqLwoJICAgIH0KCVRSQUNFKCJubyBjaGFyYWN0ZXIgZm9yIGRlYWQga2V5c3ltIDB4JTA4bHhcbiIsa2V5c3ltKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVRvVW5pY29kZUV4IChYMTFEUlYuQCkKICoKICogVGhlIFRvVW5pY29kZSBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbC1rZXkgY29kZSBhbmQga2V5Ym9hcmQKICogc3RhdGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV2luZG93cyBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycy4KICoKICogSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgYSBkZWFkIGtleSwgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gT3RoZXJ3aXNlLAogKiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqIFZhbHVlCU1lYW5pbmcKICogMAlUaGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IGhhcyBubyB0cmFuc2xhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkLgogKiAxCU9uZSBXaW5kb3dzIGNoYXJhY3RlciB3YXMgY29waWVkIHRvIHRoZSBidWZmZXIuCiAqIDIJVHdvIGNoYXJhY3RlcnMgd2VyZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhCiAqICAgICAgZGVhZC1rZXkgY2hhcmFjdGVyIChhY2NlbnQgb3IgZGlhY3JpdGljKSBzdG9yZWQgaW4gdGhlIGtleWJvYXJkIGxheW91dCBjYW5ub3QKICogICAgICBiZSBjb21wb3NlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgdG8gZm9ybSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAqCiAqIEZJWE1FIDogc2hvdWxkIGRvIHRoZSBhYm92ZSAocmV0dXJuIDIgZm9yIG5vbiBtYXRjaGluZyBkZWFkY2hhcitjaGFyIGNvbWJpbmF0aW9ucykKICoKICovCklOVCBDREVDTCBYMTFEUlZfVG9Vbmljb2RlRXgoVUlOVCB2aXJ0S2V5LCBVSU5UIHNjYW5Db2RlLCBjb25zdCBCWVRFICpscEtleVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBidWZXLCBpbnQgYnVmV19zaXplLCBVSU5UIGZsYWdzLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2luaXRfZGlzcGxheSgpOwogICAgWEtleUV2ZW50IGU7CiAgICBLZXlTeW0ga2V5c3ltID0gMDsKICAgIElOVCByZXQ7CiAgICBpbnQga2V5YzsKICAgIGNoYXIgYnVmWzEwXTsKICAgIGNoYXIgKmxwQ2hhciA9IGJ1ZjsKICAgIEhXTkQgZm9jdXM7CiAgICBYSUMgeGljOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgaWYgKHNjYW5Db2RlICYgMHg4MDAwKQogICAgewogICAgICAgIFRSQUNFKCJLZXkgVVAsIGRvaW5nIG5vdGhpbmdcbiIgKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAoIW1hdGNoX3gxMV9rZXlib2FyZF9sYXlvdXQoaGtsKSkKICAgICAgICBGSVhNRSgia2V5Ym9hcmQgbGF5b3V0ICVwIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGhrbCk7CgogICAgaWYgKChscEtleVN0YXRlW1ZLX01FTlVdICYgMHg4MCkgJiYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKSkKICAgIHsKICAgICAgICBUUkFDRSgiQ3RybCtBbHQrW2tleV0gd29uJ3QgZ2VuZXJhdGUgYSBjaGFyYWN0ZXJcbiIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGUuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlLmtleWNvZGUgPSAwOwogICAgZS5zdGF0ZSA9IDA7CiAgICBlLnR5cGUgPSBLZXlQcmVzczsKCiAgICBmb2N1cyA9IEdldEZvY3VzKCk7CiAgICBpZiAoZm9jdXMpIGZvY3VzID0gR2V0QW5jZXN0b3IoIGZvY3VzLCBHQV9ST09UICk7CiAgICBpZiAoIWZvY3VzKSBmb2N1cyA9IEdldEFjdGl2ZVdpbmRvdygpOwogICAgZS53aW5kb3cgPSBYMTFEUlZfZ2V0X3dob2xlX3dpbmRvdyggZm9jdXMgKTsKICAgIHhpYyA9IFgxMURSVl9nZXRfaWMoIGZvY3VzICk7CgogICAgaWYgKGxwS2V5U3RhdGVbVktfU0hJRlRdICYgMHg4MCkKICAgIHsKCVRSQUNFKCJTaGlmdE1hc2sgPSAlMDR4XG4iLCBTaGlmdE1hc2spOwoJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19DQVBJVEFMXSAmIDB4MDEpCiAgICB7CglUUkFDRSgiTG9ja01hc2sgPSAlMDR4XG4iLCBMb2NrTWFzayk7CgllLnN0YXRlIHw9IExvY2tNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQogICAgewoJVFJBQ0UoIkNvbnRyb2xNYXNrID0gJTA0eFxuIiwgQ29udHJvbE1hc2spOwoJZS5zdGF0ZSB8PSBDb250cm9sTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHgwMSkKICAgIHsKCVRSQUNFKCJOdW1Mb2NrTWFzayA9ICUwNHhcbiIsIE51bUxvY2tNYXNrKTsKCWUuc3RhdGUgfD0gTnVtTG9ja01hc2s7CiAgICB9CgogICAgLyogUmVzdG9yZSBzYXZlZCBBbHRHciBzdGF0ZSAqLwogICAgVFJBQ0UoIkFsdEdyTWFzayA9ICUwNHhcbiIsIEFsdEdyTWFzayk7CiAgICBlLnN0YXRlIHw9IEFsdEdyTWFzazsKCiAgICBUUkFDRV8oa2V5KSgiKCUwNFgsICUwNFgpIDogZmFrZWQgc3RhdGUgPSAweCUwNHhcbiIsCgkJdmlydEtleSwgc2NhbkNvZGUsIGUuc3RhdGUpOwogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCiAgICBmb3IgKGtleWM9bWluX2tleWNvZGU7IChrZXljPD1tYXhfa2V5Y29kZSkgJiYgKCFlLmtleWNvZGUpIDsga2V5YysrKQogICAgICB7IC8qIEZpbmQgYSBrZXljb2RlIHRoYXQgY291bGQgaGF2ZSBnZW5lcmF0ZWQgdGhpcyB2aXJ0dWFsIGtleSAqLwogICAgICAgICAgaWYgICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRikgPT0gdmlydEtleSkKICAgICAgICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KICAgICAgICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwogICAgICAgICAgICAgIGlmICgoRVZFTlRfZXZlbnRfdG9fdmtleSh4aWMsJmUpICYgMHhGRikgIT0gdmlydEtleSkgewogICAgICAgICAgICAgICAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSksIHNvIHNldCBpdCB0byAwLCB3ZSdsbCBmaW5kIGFub3RoZXIgb25lICovCiAgICAgICAgICAgICAgfQoJICB9CiAgICAgIH0KCiAgICBpZiAodmlydEtleSA+PSBWS19MRUZUICYmIHZpcnRLZXkgPD0gVktfRE9XTikKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleSAtIFZLX0xFRlQgKyBYS19MZWZ0KTsKCiAgICBpZiAoKHZpcnRLZXk+PVZLX05VTVBBRDApICYmICh2aXJ0S2V5PD1WS19OVU1QQUQ5KSkKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgdmlydEtleS1WS19OVU1QQUQwK1hLX0tQXzApOwoKICAgIGlmICh2aXJ0S2V5PT1WS19ERUNJTUFMKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9EZWNpbWFsKTsKCiAgICBpZiAodmlydEtleT09VktfU0VQQVJBVE9SKQogICAgICAgIGUua2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZS5kaXNwbGF5LCBYS19LUF9TZXBhcmF0b3IpOwoKICAgIGlmICghZS5rZXljb2RlICYmIHZpcnRLZXkgIT0gVktfTk9OQU1FKQogICAgICB7CglXQVJOKCJVbmtub3duIHZpcnR1YWwga2V5ICVYICEhIVxuIiwgdmlydEtleSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCXJldHVybiAwOwogICAgICB9CiAgICBlbHNlIFRSQUNFKCJGb3VuZCBrZXljb2RlICVkICgweCUyWClcbiIsZS5rZXljb2RlLGUua2V5Y29kZSk7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAweCUwNHhcbiIsCgkJZS50eXBlLCBlLndpbmRvdywgZS5zdGF0ZSwgZS5rZXljb2RlKTsKCiAgICAvKiBDbGllbnRzIHNob3VsZCBwYXNzIG9ubHkgS2V5UHJlc3MgZXZlbnRzIHRvIFhtYkxvb2t1cFN0cmluZywKICAgICAqIGUudHlwZSB3YXMgc2V0IHRvIEtleVByZXNzIGFib3ZlLgogICAgICovCiAgICBpZiAoeGljKQogICAgewogICAgICAgIHJldCA9IFhtYkxvb2t1cFN0cmluZyh4aWMsICZlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCAmc3RhdHVzKTsKICAgICAgICBUUkFDRSgiWG1iTG9va3VwU3RyaW5nIG5lZWRzICVkIGJ5dGUocylcbiIsIHJldCk7CiAgICAgICAgaWYgKHN0YXR1cyA9PSBYQnVmZmVyT3ZlcmZsb3cpCiAgICAgICAgewogICAgICAgICAgICBscENoYXIgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcmV0KTsKICAgICAgICAgICAgaWYgKGxwQ2hhciA9PSBOVUxMKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkhXG4iKTsKICAgICAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgbHBDaGFyLCByZXQsICZrZXlzeW0sICZzdGF0dXMpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoIm5ieXRlID0gJWQsIHN0YXR1cyAweCV4XG4iLCByZXQsIHN0YXR1cyk7CgogICAgaWYgKFRSQUNFX09OKGtleSkpCiAgICB7CiAgICAgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgIGlmICgha3NuYW1lKSBrc25hbWUgPSAiTm8gTmFtZSI7CiAgICAgICAgVFJBQ0VfKGtleSkoIiVzIDoga2V5c3ltPSVsWCAoJXMpLCAjIG9mIGNoYXJzPSVkIC8gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgKGUudHlwZSA9PSBLZXlQcmVzcykgPyAiS2V5UHJlc3MiIDogIktleVJlbGVhc2UiLAogICAgICAgICAgICAgICAgICAgIGtleXN5bSwga3NuYW1lLCByZXQsIGRlYnVnc3RyX2FuKGxwQ2hhciwgcmV0KSk7CiAgICB9CgogICAgaWYgKHJldCA9PSAwKQogICAgewoJY2hhciBkZWFkX2NoYXI7CgojaWZkZWYgWEtfRXVyb1NpZ24KICAgICAgICAvKiBBbiB1Z2x5IGhhY2sgZm9yIEV1cm9TaWduOiBYIGNhbid0IHRyYW5zbGF0ZSBpdCB0byBhIGNoYXJhY3RlcgogICAgICAgICAgIGZvciBzb21lIGxvY2FsZXMuICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19FdXJvU2lnbikKICAgICAgICB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAweDIwQUM7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQojZW5kaWYKICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IFggdHVybnMgc2hpZnQtdGFiIGludG8gSVNPX0xlZnRfVGFiLiAqLwogICAgICAgIC8qIEhlcmUgd2UgY2hhbmdlIGl0IGJhY2suICovCiAgICAgICAgaWYgKGtleXN5bSA9PSBYS19JU09fTGVmdF9UYWIgJiYgIShlLnN0YXRlICYgQ29udHJvbE1hc2spKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MDk7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCWRlYWRfY2hhciA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCWlmIChkZWFkX2NoYXIpCiAgICAgICAgewoJICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleXN5bSA+PSAweDAxMDAwMTAwICYmIGtleXN5bSA8PSAweDAxMDBmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgLyogVW5pY29kZSBkaXJlY3QgbWFwcGluZyAqLwogICAgICAgICAgICBidWZXWzBdID0ga2V5c3ltICYgMHhmZmZmOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgkgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCVdBUk4oIm5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUpOwoJCVdBUk4oInZpcnRLZXk9JVgsIHNjYW5Db2RlPSVYLCBrZXljb2RlPSVYLCBzdGF0ZT0lWFxuIiwKICAgICAgICAgICAgICAgICAgICB2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKCQl9CgkgICAgfQoJfQogICAgZWxzZSB7ICAvKiByZXQgIT0gMCAqLwogICAgICAgIC8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIDogU2hpZnQgKyBhcnJvdywgc2hpZnQgKyBob21lLCAuLi4KICAgICAgICAgICBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndC4gTGV0J3MgZWF0IGl0LiAqLwogICAgICAgIGlmICghKGUuc3RhdGUgJiBOdW1Mb2NrTWFzaykgIC8qIE51bUxvY2sgaXMgb2ZmICovCiAgICAgICAgICAgICYmIChlLnN0YXRlICYgU2hpZnRNYXNrKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCiAgICAgICAgICAgICYmIChrZXlzeW0+PVhLX0tQXzApICYmIChrZXlzeW08PVhLX0tQXzkpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QKICAgICAgICAgICBDVFJMICsgbnVtYmVyIG9yIENUUkwgKyBzeW1ib2wgKi8KICAgICAgICBpZiAoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCgoa2V5c3ltPj0zMykgJiYgKGtleXN5bSA8ICdBJykpIHx8CiAgICAgICAgICAgICAgICAoKGtleXN5bSA+ICdaJykgJiYgKGtleXN5bSA8ICdhJykpIHx8CiAgICAgICAgICAgICAgICAoa2V5c3ltID09IFhLX1RhYikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBXZSBoYXZlIGFub3RoZXIgc3BlY2lhbCBjYXNlIGZvciBkZWxldGUga2V5IChYS19EZWxldGUpIG9uIGFuCiAgICAgICAgIGV4dGVuZGVkIGtleWJvYXJkLiBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndCAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRGVsZXRlKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgllbHNlIGlmKChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApIC8qIFNoaWZ0IGlzIHByZXNzZWQgKi8KCQkmJiAoa2V5c3ltID09IFhLX0tQX0RlY2ltYWwpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgllbHNlIGlmKChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkgLyogQ29udHJvbCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19SZXR1cm4gfHwga2V5c3ltID09IFhLX0tQX0VudGVyKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9ICdcbic7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgfQoKICAgICAgICAvKiBIYWNrIHRvIGRldGVjdCBhbiBYTG9va3VwU3RyaW5nIGhhcmQtY29kZWQgdG8gTGF0aW4xICovCiAgICAgICAgaWYgKHJldCA9PSAxICYmIGtleXN5bSA+PSAweDAwYTAgJiYga2V5c3ltIDw9IDB4MDBmZiAmJiAoQllURSlscENoYXJbMF0gPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IChCWVRFKWxwQ2hhclswXTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJLyogcGVyZm9ybSB0cmFuc2xhdGlvbiB0byB1bmljb2RlICovCglpZihyZXQpCgl7CgkgICAgVFJBQ0VfKGtleSkoIlRyYW5zbGF0aW5nIGNoYXIgMHglMDJ4IHRvIHVuaWNvZGVcbiIsICooQllURSAqKWxwQ2hhcik7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIGxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKZm91bmQ6CiAgICBpZiAoYnVmICE9IGxwQ2hhcikKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBscENoYXIpOwogICAgVFJBQ0VfKGtleSkoInJldHVybmluZyAlZCB3aXRoICVzXG4iLCByZXQsIGRlYnVnc3RyX3duKGJ1ZlcsIHJldCkpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCZWVwIChYMTFEUlYuQCkKICovCnZvaWQgQ0RFQ0wgWDExRFJWX0JlZXAodm9pZCkKewogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYQmVsbChnZGlfZGlzcGxheSwgMCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwp9Cg==