LyoKICogWDExIGtleWJvYXJkIGRyaXZlcgogKgogKiBDb3B5cmlnaHQgMTk5MyBCb2IgQW1zdGFkdAogKiBDb3B5cmlnaHQgMTk5NiBBbGJyZWNodCBLbGVpbmUKICogQ29weXJpZ2h0IDE5OTcgRGF2aWQgRmF1cmUKICogQ29weXJpZ2h0IDE5OTggTW9ydGVuIFdlbGluZGVyCiAqIENvcHlyaWdodCAxOTk4IFVscmljaCBXZWlnYW5kCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCgojaW5jbHVkZSA8WDExL1hhdG9tLmg+CiNpbmNsdWRlIDxYMTEva2V5c3ltLmg+CiNpbmNsdWRlIDxYMTEvWGxpYi5oPgojaW5jbHVkZSA8WDExL1hyZXNvdXJjZS5oPgojaW5jbHVkZSA8WDExL1h1dGlsLmg+CiNpZmRlZiBIQVZFX1gxMV9YS0JMSUJfSAojaW5jbHVkZSA8WDExL1hLQmxpYi5oPgojZW5kaWYKCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCiNkZWZpbmUgTk9OQU1FTEVTU1NUUlVDVAojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAieDExZHJ2LmgiCiNpbmNsdWRlICJ3aW5lL3NlcnZlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChrZXlib2FyZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGtleSk7Cgp0eXBlZGVmIHVuaW9uCnsKICAgIHN0cnVjdAogICAgewojaWZuZGVmIEJJVEZJRUxEU19CSUdFTkRJQU4KICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50IDogMTY7CiNlbmRpZgogICAgICAgIHVuc2lnbmVkIGxvbmcgY29kZSA6IDg7CiAgICAgICAgdW5zaWduZWQgbG9uZyBleHRlbmRlZCA6IDE7CiAgICAgICAgdW5zaWduZWQgbG9uZyB1bnVzZWQgOiAyOwogICAgICAgIHVuc2lnbmVkIGxvbmcgd2luX2ludGVybmFsIDogMjsKICAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQgOiAxOwogICAgICAgIHVuc2lnbmVkIGxvbmcgcHJldmlvdXMgOiAxOwogICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNpdGlvbiA6IDE7CiNpZmRlZiBCSVRGSUVMRFNfQklHRU5ESUFOCiAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCA6IDE2OwojZW5kaWYKICAgIH0gbHAxOwogICAgdW5zaWduZWQgbG9uZyBscDI7Cn0gS0VZTFA7CgovKiBrZXkgc3RhdGUgdGFibGUgYml0czoKICAweDgwIC0+IGtleSBpcyBwcmVzc2VkCiAgMHg0MCAtPiBrZXkgZ290IHByZXNzZWQgc2luY2UgbGFzdCB0aW1lCiAgMHgwMSAtPiBrZXkgaXMgdG9nZ2xlZAoqLwpCWVRFIGtleV9zdGF0ZV90YWJsZVsyNTZdOwoKc3RhdGljIEJZVEUgVHJhY2tTeXNLZXkgPSAwOyAvKiBkZXRlcm1pbmUgd2hldGhlciBBTFQga2V5IHVwIHdpbGwgY2F1c2UgYSBXTV9TWVNLRVlVUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGEgV01fS0VZVVAgbWVzc2FnZSAqLwoKc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGUsIGtleXN5bXNfcGVyX2tleWNvZGU7CnN0YXRpYyBXT1JEIGtleWMydmtleVsyNTZdLCBrZXljMnNjYW5bMjU2XTsKCnN0YXRpYyBpbnQgTnVtTG9ja01hc2ssIEFsdEdyTWFzazsgLyogbWFzayBpbiB0aGUgWEtleUV2ZW50IHN0YXRlICovCgpzdGF0aWMgY2hhciBLRVlCT0FSRF9NYXBEZWFkS2V5c3ltKEtleVN5bSBrZXlzeW0pOwoKLyogS2V5Ym9hcmQgdHJhbnNsYXRpb24gdGFibGVzICovCiNkZWZpbmUgTUFJTl9MRU4gNDkKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9xd2VydHlbTUFJTl9MRU5dID0KewovKiB0aGlzIGlzIG15ICgxMDIta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5W01BSU5fTEVOXSA9CnsKIC8qIGAgICAgMSAgICAyICAgIDMgICAgNCAgICA1ICAgIDYgICAgNyAgICA4ICAgIDkgICAgMCAgICAtICAgID0gKi8KICAgMHgyOSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwQSwweDBCLDB4MEMsMHgwRCwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgWyAgICBdICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICAnICAgIFwgKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiBcICAgICAgeiAgICB4ICAgIGMgICAgdiAgICBiICAgIG4gICAgbSAgICAsICAgIC4gICAgLyAqLwogICAweDVlLDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYsIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfc2Nhbl9kdm9yYWtbTUFJTl9MRU5dID0KewogLyogYCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICAgIDggICAgOSAgICAwICAgIFsgICAgXSAqLwogICAweDI5LDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgxQSwweDFCLAogLyogJyAgICAsICAgIC4gICAgcCAgICB5ICAgIGYgICAgZyAgICBjICAgIHIgICAgbCAgICAvICAgID0gKi8KICAgMHgyOCwweDMzLDB4MzQsMHgxOSwweDE1LDB4MjEsMHgyMiwweDJFLDB4MTMsMHgyNiwweDM1LDB4MEQsCiAvKiBhICAgIG8gICAgZSAgICB1ICAgIGkgICAgZCAgICBoICAgIHQgICAgbiAgICBzICAgIC0gICAgXCAqLwogICAweDFFLDB4MTgsMHgxMiwweDE2LDB4MTcsMHgyMCwweDIzLDB4MTQsMHgzMSwweDFGLDB4MEMsMHgyQiwKIC8qIDsgICAgcSAgICBqICAgIGsgICAgeCAgICBiICAgIG0gICAgdyAgICB2ICAgIHogKi8KICAgMHgyNywweDEwLDB4MjQsMHgyNSwweDJELDB4MzAsMHgzMiwweDExLDB4MkYsMHgyQywKICAgMHg1NiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2W01BSU5fTEVOXSA9CnsKICAvKiB0aGlzIGlzIG15ICgxMDYta2V5KSBrZXlib2FyZCBsYXlvdXQsIHNvcnJ5IGlmIGl0IGRvZXNuJ3QgcXVpdGUgbWF0Y2ggeW91cnMgKi8KIC8qIDEgICAgMiAgICAzICAgIDQgICAgNSAgICA2ICAgIDcgICAgOCAgICA5ICAgIDAgICAgLSAgICBeICAgIFwgKi8KICAgMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgyOSwKIC8qIHEgICAgdyAgICBlICAgIHIgICAgdCAgICB5ICAgIHUgICAgaSAgICBvICAgIHAgICAgQCAgICBbICovCiAgIDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsMHgxNywweDE4LDB4MTksMHgxQSwweDFCLAogLyogYSAgICBzICAgIGQgICAgZiAgICBnICAgIGggICAgaiAgICBrICAgIGwgICAgOyAgICA6ICAgIF0gKi8KICAgMHgxRSwweDFGLDB4MjAsMHgyMSwweDIyLDB4MjMsMHgyNCwweDI1LDB4MjYsMHgyNywweDI4LDB4MkIsCiAvKiB6ICAgIHggICAgYyAgICB2ICAgIGIgICAgbiAgICBtICAgICwgICAgLiAgICAvICovCiAgIDB4MkMsMHgyRCwweDJFLDB4MkYsMHgzMCwweDMxLDB4MzIsMHgzMywweDM0LDB4MzUsCiAgIDB4NTYgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHlbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0eV9qcDEwNltNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgICcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsVktfT0VNXzMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzcsVktfT0VNXzUsCiAgICdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiAvKiB0aGUgMTAybmQga2V5IChhY3R1YWxseSB0byB0aGUgcmlnaHQgb2YgbC1zaGlmdCkgKi8KfTsKCnN0YXRpYyBjb25zdCBXT1JEIG1haW5fa2V5X3ZrZXlfcXdlcnR5X3YyW01BSU5fTEVOXSA9CnsKLyogTk9URTogdGhpcyBsYXlvdXQgbXVzdCBjb25jdXIgd2l0aCB0aGUgc2NhbiBjb2RlcyBsYXlvdXQgYWJvdmUgKi8KICAgVktfT0VNXzUsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJzAnLFZLX09FTV9QTFVTLFZLX09FTV80LAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdZJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzYsVktfT0VNXzEsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8zLFZLX09FTV83LFZLX09FTV8yLAogICAnWicsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNX01JTlVTLAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9xd2VydHpbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICAnWScsJ1gnLCdDJywnVicsJ0InLCdOJywnTScsVktfT0VNX0NPTU1BLFZLX09FTV9QRVJJT0QsVktfT0VNXzIsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X3F3ZXJ0el8xMDVbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNX01JTlVTLFZLX09FTV9QTFVTLAogICAnUScsJ1cnLCdFJywnUicsJ1QnLCdaJywnVScsJ0knLCdPJywnUCcsVktfT0VNXzQsVktfT0VNXzYsCiAgICdBJywnUycsJ0QnLCdGJywnRycsJ0gnLCdKJywnSycsJ0wnLFZLX09FTV8xLFZLX09FTV83LFZLX09FTV81LAogICBWS19PRU1fMTAyLCdZJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMgp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV8zLCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fTUlOVVMsVktfT0VNX1BMVVMsCiAgICdRJywnVycsJ0UnLCdSJywnVCcsJ1knLCdVJywnSScsJ08nLCdQJyxWS19PRU1fNCxWS19PRU1fNiwKICAgJ0EnLCdTJywnRCcsJ0YnLCdHJywnSCcsJ0onLCdLJywnTCcsVktfT0VNXzEsVktfT0VNXzgsVktfT0VNXzUsCiAgIFZLX09FTV83LCdaJywnWCcsJ0MnLCdWJywnQicsJ04nLCdNJyxWS19PRU1fQ09NTUEsVktfT0VNX1BFUklPRCxWS19PRU1fMiwKICAgVktfT0VNXzEwMiwgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBtYWluX2tleV92a2V5X2F6ZXJ0eVtNQUlOX0xFTl0gPQp7Ci8qIE5PVEU6IHRoaXMgbGF5b3V0IG11c3QgY29uY3VyIHdpdGggdGhlIHNjYW4gY29kZXMgbGF5b3V0IGFib3ZlICovCiAgIFZLX09FTV83LCcxJywnMicsJzMnLCc0JywnNScsJzYnLCc3JywnOCcsJzknLCcwJyxWS19PRU1fNCxWS19PRU1fUExVUywKICAgJ0EnLCdaJywnRScsJ1InLCdUJywnWScsJ1UnLCdJJywnTycsJ1AnLFZLX09FTV82LFZLX09FTV8xLAogICAnUScsJ1MnLCdEJywnRicsJ0cnLCdIJywnSicsJ0snLCdMJywnTScsVktfT0VNXzMsVktfT0VNXzUsCiAgICdXJywnWCcsJ0MnLCdWJywnQicsJ04nLFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELFZLX09FTV8yLFZLX09FTV84LAogICBWS19PRU1fMTAyIC8qIHRoZSAxMDJuZCBrZXkgKGFjdHVhbGx5IHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgbWFpbl9rZXlfdmtleV9kdm9yYWtbTUFJTl9MRU5dID0KewovKiBOT1RFOiB0aGlzIGxheW91dCBtdXN0IGNvbmN1ciB3aXRoIHRoZSBzY2FuIGNvZGVzIGxheW91dCBhYm92ZSAqLwogICBWS19PRU1fMywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnMCcsVktfT0VNXzQsVktfT0VNXzYsCiAgIFZLX09FTV83LFZLX09FTV9DT01NQSxWS19PRU1fUEVSSU9ELCdQJywnWScsJ0YnLCdHJywnQycsJ1InLCdMJyxWS19PRU1fMixWS19PRU1fUExVUywKICAgJ0EnLCdPJywnRScsJ1UnLCdJJywnRCcsJ0gnLCdUJywnTicsJ1MnLFZLX09FTV9NSU5VUyxWS19PRU1fNSwKICAgVktfT0VNXzEsJ1EnLCdKJywnSycsJ1gnLCdCJywnTScsJ1cnLCdWJywnWicsCiAgIFZLX09FTV8xMDIgLyogdGhlIDEwMm5kIGtleSAoYWN0dWFsbHkgdG8gdGhlIHJpZ2h0IG9mIGwtc2hpZnQpICovCn07CgovKioqIERFRklORSBZT1VSIE5FVyBMQU5HVUFHRS1TUEVDSUZJQyBNQVBQSU5HUyBCRUxPVywgU0VFIEVYSVNUSU5HIFRBQkxFUyAqLwoKLyogdGhlIFZLIG1hcHBpbmdzIGZvciB0aGUgbWFpbiBrZXlib2FyZCB3aWxsIGJlIGF1dG8tYXNzaWduZWQgYXMgYmVmb3JlLAogICBzbyB3aGF0IHdlIGhhdmUgaGVyZSBpcyBqdXN0IHRoZSBjaGFyYWN0ZXIgdGFibGVzICovCi8qIG9yZGVyOiBOb3JtYWwsIFNoaWZ0LCBBbHRHciwgU2hpZnQtQWx0R3IgKi8KLyogV2UgcmVjb21tZW5kIHlvdSB3cml0ZSBqdXN0IHdoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBjb3JyZWN0IChpLmUuIHdoYXQncwogICB3cml0dGVuIG9uIHRoZSBrZXljYXBzKSwgbm90IHRoZSBidW5jaCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmVoaW5kIEFsdEdyCiAgIGFuZCBTaGlmdC1BbHRHciBpZiBpdCBjYW4gdmFyeSBhbW9uZyBkaWZmZXJlbnQgWCBzZXJ2ZXJzICovCi8qIFJlbWVtYmVyIHRoYXQgeW91ciAxMDJuZCBrZXkgKHRvIHRoZSByaWdodCBvZiBsLXNoaWZ0KSBzaG91bGQgYmUgb24gYQogICBzZXBhcmF0ZSBsaW5lLCBzZWUgZXhpc3RpbmcgdGFibGVzICovCi8qIElmIFdpbmUgZmFpbHMgdG8gbWF0Y2ggeW91ciBuZXcgdGFibGUsIHVzZSBXSU5FREVCVUc9K2tleSB0byBmaW5kIG91dCB3aHkgKi8KLyogUmVtZW1iZXIgdG8gYWxzbyBhZGQgeW91ciBuZXcgdGFibGUgdG8gdGhlIGxheW91dCBpbmRleCB0YWJsZSBmYXIgYmVsb3chICovCgovKioqIEdlcm1hbiBMb2dpdGVjaCBEZXNrdG9wIFBybyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfREVfbG9naXRlY2hbTUFJTl9MRU5dWzRdID0KewogIl5ceGIwIiwiMSEiLCIyXCIiLCIzXHhhNyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIlx4ZGY/XFwiLCInYCIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiXHhmY1x4ZGMiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIlx4ZjZceGQ2IiwiXHhlNFx4YzQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKG1vc3RseSBjb250cmlidXRlZCBieSBVd2UgQm9ubmVzKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VU1tNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/Igp9OwoKLyoqKiBVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8KLyogKFhGcmVlODYgcmVwb3J0cyB0aGUgPD4ga2V5IGV2ZW4gaWYgaXQncyBub3QgcGh5c2ljYWxseSB0aGVyZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3siLCJdfSIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOzoiLCInXCIiLCJcXHwiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IChkdm9yYWsgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfZHZvcmFrW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiW3siLCJdfSIsCiAiJ1wiIiwiLDwiLCIuPiIsInBQIiwieVkiLCJmRiIsImdHIiwiY0MiLCJyUiIsImxMIiwiLz8iLCI9KyIsCiAiYUEiLCJvTyIsImVFIiwidVUiLCJpSSIsImREIiwiaEgiLCJ0VCIsIm5OIiwic1MiLCItXyIsIlxcfCIsCiAiOzoiLCJxUSIsImpKIiwia0siLCJ4WCIsImJCIiwibU0iLCJ3VyIsInZWIiwieloiCn07CgovKioqIEJyaXRpc2gga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1VLW01BSU5fTEVOXVs0XSA9CnsKICJgIiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJbeyIsIl19IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCI7OiIsIidAIiwiI34iLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDwiLCIuPiIsIi8/IiwKICJcXHwiCn07CgovKioqIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRlJbTUFJTl9MRU5dWzRdID0KewogIrIiLCImMSIsIukyIiwiXCIzIiwiJzQiLCIoNSIsIi02Iiwi6DciLCJfOCIsIuc5Iiwi4DAiLCIpsCIsIj0rIiwKICJhQSIsInpaIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl6oIiwiJKMiLAogInFRIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIm1NIiwi+SUiLCIqtSIsCiAid1ciLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwiLD8iLCI7LiIsIjovIiwiIaciLAogIjw+Igp9OwoKLyoqKiBJY2VsYW5kaWMga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgaXMpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0lTW01BSU5fTEVOXVs0XSA9CnsKICKwIiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9Iiwi9tYiLCItXyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLw0CIsIic/IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLmxiIsIrTEIiwiKyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIv7eIiwKICI8PiIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERVtNQUlOX0xFTl1bNF0gPQp7CiAiXrAiLCIxISIsIjJcIiIsIjOnIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCLfPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyoiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+fCIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRbTUFJTl9MRU5dWzRdID0KewogIl6wIiwiMSEiLCIyXCIiLCIzpyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCK0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvzcIiwiKyp+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiIyciLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogR2VybWFuIGtleWJvYXJkIGxheW91dCB3aXRob3V0IGRlYWQga2V5cyAxMDUgS2V5cyAoY29udHJpYnV0ZWQgYnkgTWF0dGhpYXMgRmVjaG5lcikqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9ERV9ub2RlYWRfMTA1W01BSU5fTEVOXVs0XSA9CnsKICJesCIsIjEhIiwiMlwisiIsIjOnsyIsIjQkIiwiNSUiLCI2JiIsIjcveyIsIjgoWyIsIjkpXSIsIjA9fSIsIt8/XFwiLCInYCIsCiAicVFAIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/NwiLCIrKn4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCIjJyIsCiAiPD58IiwieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAp9OwoKLyoqKiBTd2lzcyBHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgY2ggLXZhcmlhbnQgZGUpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NHW01BSU5fTEVOXVs0XSA9CnsKICKnsCIsIjErIiwiMlwiIiwiMyoiLCI05yIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiXmAiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwi/OgiLCKoISIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi9ukiLCLk4CIsIiSjIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBjaCAtdmFyaWFudCBmcikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU0ZbTUFJTl9MRU5dWzRdID0KewogIqewIiwiMSsiLCIyXCIiLCIzKiIsIjTnIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCJeYCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInpaIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo/CIsIqghIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLp9iIsIuDkIiwiJKMiLAogInlZIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogTm9yd2VnaWFuIGtleWJvYXJkIGxheW91dCAoY29udHJpYnV0ZWQgYnkgT3ZlIEvldmVuKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9OT1tNQUlOX0xFTl1bNF0gPQp7CiAifKciLCIxISIsIjJcIkAiLCIzI6MiLCI0pCQiLCI1JSIsIjYmIiwiNy97IiwiOChbIiwiOSldIiwiMD19IiwiKz8iLCJcXGC0IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF5+IiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL42CIsIubGIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRGFuaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGRrKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9EQVtNQUlOX0xFTl1bNF0gPQp7CiAivaciLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIubGIiwi+NgiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBTd2VkaXNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNlKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9TRVtNQUlOX0xFTl1bNF0gPQp7CiAip70iLCIxISIsIjJcIiIsIjMjIiwiNKQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCIrPyIsIrRgIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIuXFIiwiqF4iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIvbWIiwi5MQiLCInKiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBFc3RvbmlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBlZSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRVRbTUFJTl9MRU5dWzRdID0KewogIrd+IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCL83CIsIvXVIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNhX2VuaGFuY2VkKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DRltNQUlOX0xFTl1bNF0gPQp7CiAiI3xcXCIsIjEhsSIsIjJcIkAiLCIzL6MiLCI0JKIiLCI1JaQiLCI2P6wiLCI3JqYiLCI4KrIiLCI5KLMiLCIwKbwiLCItX70iLCI9K74iLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvT6ciLCJwULYiLCJeXlsiLCK4qF0iLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6fiIsImBgeyIsIjw+fSIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsJy0iLCIuIiwi6ckiLAogIqu7sCIKfTsKCi8qKiogQ2FuYWRpYW4gRnJlbmNoIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNhIC12YXJpYW50IGZyKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DQV9mcltNQUlOX0xFTl1bNF0gPQp7CiAiI3wiLCIxISIsIjJcIiIsIjMvIiwiNCQiLCI1JSIsIjY/IiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIl5eIiwiuKgiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6IiwiYGAiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsJyIsIi4iLCLpySIsCiAiq7siCn07CgovKioqIENhbmFkaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGNhKSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9DQVtNQUlOX0xFTl1bNF0gPQp7CiAiL1xcIiwiMSG5oSIsIjJAsiIsIjMjs6MiLCI0JLykIiwiNSW9IiwiNj++IiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0/42CIsInBQ/t4iLCJeqKgiLCLnx34iLAogImFB5sYiLCJzU9+nIiwiZETw0CIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs6tCIsIujIIiwi4MAiLAogInpaIiwieFgiLCJjQ6KpIiwidlYiLCJiQiIsIm5OIiwibU21uiIsIiwnIiwiLlwit/ciLCLpySIsCiAi+dkiCn07CgovKioqIFBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgcHQpICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1BUW01BSU5fTEVOXVs0XSA9CnsKICJcXHwiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIqu7IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIisqIiwitGAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIufHIiwiuqoiLCJ+XiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLV8iLAogIjw+Igp9OwoKLyoqKiBJdGFsaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGl0KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9JVFtNQUlOX0xFTl1bNF0gPQp7CiAiXFx8IiwiMSEiLCIyXCIiLCIzoyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCLsXiIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLo6SIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLy5yIsIuCwIiwi+aciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogRmlubmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBmaSkgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRklbTUFJTl9MRU5dWzRdID0KewogIqe9IiwiMSEiLCIyXCIiLCIzIyIsIjSkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiKz8iLCK0YCIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCLlxSIsIqheIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCL21iIsIuTEIiwiJyoiLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfQkdfYmRzW01BSU5fTEVOXVs0XSA9CnsKICJgfigpIiwiMSEiLCIyQDI/IiwiMyMzKyIsIjQkNFwiIiwiNSUiLCI2XjY9IiwiNyY3OiIsIjgqOC8iLCI5KCIsIjApIiwiLV8tSSIsIj0rLlYiLAogInFRLPsiLCJ3V/PTIiwiZUXlxSIsInJS6MgiLCJ0VPjYIiwieVn52SIsInVV6soiLCJpSfHRIiwib0/kxCIsInBQ58ciLCJbe/bWIiwiXX07IiwKICJhQfzcIiwic1P/3yIsImRE4MAiLCJmRu7OIiwiZ0fmxiIsImhI48MiLCJqSvLSIiwia0vtzSIsImxM4sIiLCI7OuzMIiwiJ1wi99ciLCJcXHwn2yIsCiAielr+3iIsInhY6ckiLCJjQ/raIiwidlb93SIsImJC9NQiLCJuTvXVIiwibU3vzyIsIiw88NAiLCIuPuvLIiwiLz/hwSIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBCdWxnYXJpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0JHX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfvfXIiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyYiLCI4KiIsIjkoIiwiMCkiLCItXyIsIj0rIiwKICJxUf/fIiwid1fiwiIsImVF5cUiLCJyUvDQIiwidFTy0iIsInlZ+toiLCJ1VfPTIiwiaUnoyCIsIm9P7s4iLCJwUO/PIiwiW3v42CIsIl19+dkiLAogImFB4MAiLCJzU/HRIiwiZETkxCIsImZG9NQiLCJnR+PDIiwiaEj11SIsImpK6ckiLCJrS+rKIiwibEzryyIsIjs6IiwiJ1wiIiwiXFx8/t4iLAogInpa58ciLCJ4WPzcIiwiY0P21iIsInZW5sYiLCJiQuHBIiwibk7tzSIsIm1N7MwiLCIsPCIsIi4+IiwiLz8iLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQmVsYXJ1c2lhbiBzdGFuZGFyZCBrZXlib2FyZCBsYXlvdXQgKGNvbnRyaWJ1dGVkIGJ5IEhsZWIgVmFsb3NrYSkgKi8KLyoqKiBJdCBtYXRjaGVzIGJlbGFydXNpYW4gbGF5b3V0IGZvciBYS0IgZnJvbSBBbGV4YW5kZXIgTWlraGFpbGlhbiAgICAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CWVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6jsyIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT66+IiwicFDa+iIsIlt7yOgiLCJdfScnIiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwvfCIsCiAielrR8SIsInhY3v4iLCJjQ9PzIiwidlbN7SIsImJCprYiLCJuTtT0IiwibU3Y+CIsIiw8wuIiLCIuPsDgIiwiLz8uLCIsICI8PnymIiwKfTsKCgovKioqIFJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChjb250cmlidXRlZCBieSBQYXZlbCBSb3NraW4pICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHK6iIsIndXw+MiLCJlRdX1IiwiclLL6yIsInRUxeUiLCJ5Wc7uIiwidVXH5yIsImlJ2/siLCJvT939IiwicFDa+iIsIlt7yOgiLCJdfd//IiwKICJhQcbmIiwic1PZ+SIsImRE1/ciLCJmRsHhIiwiZ0fQ8CIsImhI0vIiLCJqSs/vIiwia0vM7CIsImxMxOQiLCI7Otb2IiwiJ1wi3PwiLCJcXHwiLAogInpa0fEiLCJ4WN7+IiwiY0PT8yIsInZWze0iLCJiQsnpIiwibk7U9CIsIm1N2PgiLCIsPMLiIiwiLj7A4CIsIi8/Igp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfcGhhbnRvbVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX3f/yIsCiAiYUHG5iIsInNT2fkiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcItz8IiwiXFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBLT0k4LVIgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfa29pOHJbTUFJTl9MRU5dWzRdID0KewogIigpIiwiMSEiLCIyXCIiLCIzLyIsIjQkIiwiNToiLCI2LCIsIjcuIiwiODsiLCI5PyIsIjAlIiwiLV8iLCI9KyIsCiAiyuoiLCLD4yIsItX1Iiwiy+siLCLF5SIsIs7uIiwix+ciLCLb+yIsIt39Iiwi2voiLCLI6CIsIt//IiwKICLG5iIsItn5Iiwi1/ciLCLB4SIsItDwIiwi0vIiLCLP7yIsIszsIiwixOQiLCLW9iIsItz8IiwiXFx8IiwKICLR8SIsIt7+Iiwi0/MiLCLN7SIsIsnpIiwi1PQiLCLY+CIsIsLiIiwiwOAiLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBSdXNzaWFuIGtleWJvYXJkIGxheW91dCBjcDEyNTEgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfY3AxMjUxW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHpySIsIndX9tYiLCJlRfPTIiwiclLqyiIsInRU5cUiLCJ5We3NIiwidVXjwyIsImlJ+NgiLCJvT/nZIiwicFDnxyIsIlt79dUiLCJdffraIiwKICJhQfTUIiwic1P72yIsImRE4sIiLCJmRuDAIiwiZ0fvzyIsImhI8NAiLCJqSu7OIiwia0vryyIsImxM5MQiLCI7OubGIiwiJ1wi/d0iLCJcXHwiLAogInpa/98iLCJ4WPfXIiwiY0Px0SIsInZW7MwiLCJiQujIIiwibk7y0iIsIm1N/NwiLCIsPOHBIiwiLj7+3iIsIi8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFJ1c3NpYW4gcGhvbmV0aWMga2V5Ym9hcmQgbGF5b3V0ICovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1JVX3Bob25ldGljW01BSU5fTEVOXVs0XSA9CnsKICJgfiIsIjEhIiwiMkAiLCIzIyIsIjQkIiwiNSUiLCI2XiIsIjcmIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVHR8SIsIndX1/ciLCJlRcXlIiwiclLS8iIsInRU1PQiLCJ5Wdn5IiwidVXV9SIsImlJyekiLCJvT8/vIiwicFDQ8CIsIlt72/siLCJdfd39IiwKICJhQcHhIiwic1PT8yIsImRExOQiLCJmRsbmIiwiZ0fH5yIsImhIyOgiLCJqSsrqIiwia0vL6yIsImxMzOwiLCI7OiIsIidcIiIsIlxcfCIsCiAielra+iIsInhY2PgiLCJjQ8PjIiwidlbW9iIsImJCwuIiLCJuTs7uIiwibU3N7SIsIiw8IiwiLj4iLCIvPyIsCiAiPD4iIC8qIHRoZSBwaGFudG9tIGtleSAqLwp9OwoKLyoqKiBVa3JhaW5pYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtVSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9VQVtNQUlOX0xFTl1bNF0gPQp7CiAiYH6tvSIsIjEhMSEiLCIyQDJcIiIsIjMjMyciLCI0JDQqIiwiNSU1OiIsIjZeNiwiLCI3JjcuIiwiOCo4OyIsIjkoOSgiLCIwKTApIiwiLV8tXyIsIj0rPSsiLAogInFRyuoiLCJ3V8PjIiwiZUXV9SIsInJSy+siLCJ0VMXlIiwieVnO7iIsInVVx+ciLCJpSdv7Iiwib0/d/SIsInBQ2voiLCJbe8joIiwiXX2ntyIsCiAiYUHG5iIsInNTprYiLCJkRNf3IiwiZkbB4SIsImdH0PAiLCJoSNLyIiwiakrP7yIsImtLzOwiLCJsTMTkIiwiOzrW9iIsIidcIqS0IiwiXFx8XFx8IiwKICJ6WtHxIiwieFje/iIsImND0/MiLCJ2Vs3tIiwiYkLJ6SIsIm5O1PQiLCJtTdj4IiwiLDzC4iIsIi4+wOAiLCIvPy8/IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIGJ5IE8uIE55a3lmb3JjaHluICovCi8qKiogIChhcyBpdCBhcHBlYXJzIG9uIG1vc3Qgb2Yga2V5Ym9hcmRzIHNvbGQgdG9kYXkpICAgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVUFfc3RkW01BSU5fTEVOXVs0XSA9CnsKICKtvSIsIjEhIiwiMlwiIiwiMyciLCI0OyIsIjUlIiwiNjoiLCI3PyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCKntyIsCiAixuYiLCKmtiIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCKktCIsIlxcLyIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLiwiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1SIChwYWlyIHRvIHRoZSBwcmV2aW91cykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUlVfc3RkW01BSU5fTEVOXVs0XSA9CnsKICKjsyIsIjEhIiwiMlwiIiwiMyciLCI0OyIsIjUlIiwiNjoiLCI3PyIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogIsrqIiwiw+MiLCLV9SIsIsvrIiwixeUiLCLO7iIsIsfnIiwi2/siLCLd/SIsItr6IiwiyOgiLCLf/yIsCiAixuYiLCLZ+SIsItf3IiwiweEiLCLQ8CIsItLyIiwiz+8iLCLM7CIsIsTkIiwi1vYiLCLc/CIsIlxcLyIsCiAi0fEiLCLe/iIsItPzIiwize0iLCLJ6SIsItT0Iiwi2PgiLCLC4iIsIsDgIiwiLiwiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBlcykgKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfRVNbTUFJTl9MRU5dWzRdID0KewogIrqqIiwiMSEiLCIyXCIiLCIztyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCKhvyIsCiAicVEiLCJ3VyIsImVFIiwiclIiLCJ0VCIsInlZIiwidVUiLCJpSSIsIm9PIiwicFAiLCJgXiIsIisqIiwKICJhQSIsInNTIiwiZEQiLCJmRiIsImdHIiwiaEgiLCJqSiIsImtLIiwibEwiLCLx0SIsIrSoIiwi58ciLAogInpaIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIm1NIiwiLDsiLCIuOiIsIi1fIiwKICI8PiIKfTsKCi8qKiogQmVsZ2lhbiBrZXlib2FyZCBsYXlvdXQgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9CRVtNQUlOX0xFTl1bNF0gPQp7CiAiIiwiJjF8Iiwi6TJAIiwiXCIzIyIsIic0IiwiKDUiLCKnNl4iLCLoNyIsIiE4Iiwi5zl7Iiwi4DB9IiwiKbAiLCItXyIsCiAiYUEiLCJ6WiIsImVFpCIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiXqhbIiwiJCpdIiwKICJxUSIsInNT3yIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwibU0iLCL5JbQiLCK1o2AiLAogIndXIiwieFgiLCJjQyIsInZWIiwiYkIiLCJuTiIsIiw/IiwiOy4iLCI6LyIsIj0rfiIsCiAiPD5cXCIKfTsKCi8qKiogSHVuZ2FyaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIGh1KSAqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IVVtNQUlOX0xFTl1bNF0gPQp7CiAiMKciLCIxJyIsIjJcIiIsIjMrIiwiNCEiLCI1JSIsIjYvIiwiNz0iLCI4KCIsIjkpIiwi9tYiLCL83CIsIvPTIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIvXVIiwi+toiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIunJIiwi4cEiLCL72yIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsPyIsIi46IiwiLV8iLAogIu3NIgp9OwoKLyoqKiBQb2xpc2ggKHByb2dyYW1tZXIncykga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfUExbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQCIsIjMjIiwiNCQiLCI1JSIsIjZeIiwiNyanIiwiOCoiLCI5KCIsIjApIiwiLV8iLCI9KyIsCiAicVEiLCJ3VyIsImVF6soiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib0/z0yIsInBQIiwiW3siLCJdfSIsCiAiYUGxoSIsInNTtqYiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTLOjIiwiOzoiLCInXCIiLCJcXHwiLAogInpav68iLCJ4WLysIiwiY0PmxiIsInZWIiwiYkIiLCJuTvHRIiwibU0iLCIsPCIsIi4+IiwiLz8iLAogIjw+fCIKfTsKCi8qKiogU2xvdmVuaWFuIGtleWJvYXJkIGxheW91dCAoc2V0eGtibWFwIHNpKSAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X1NJW01BSU5fTEVOXVs0XSA9CnsKICK4qCIsIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3LyIsIjgoIiwiOSkiLCIwPSIsIic/IiwiKyoiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ6WiIsInVVIiwiaUkiLCJvTyIsInBQIiwiuakiLCLw0CIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwi6MgiLCLmxiIsIr6uIiwKICJ5WSIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw7IiwiLjoiLCItXyIsCiAiPD4iCn07CgovKioqIFNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgc3IpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfU1JbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcvIiwiOCgiLCI5KSIsIjA9IiwiJz8iLCIrKiIsCiAiqbkiLCKquiIsIsXlIiwi0vIiLCLU9CIsItr6Iiwi1fUiLCLJ6SIsIs/vIiwi0PAiLCLb+yIsIltdIiwKICLB4SIsItPzIiwixOQiLCLG5iIsIsfnIiwiyOgiLCKouCIsIsvrIiwizOwiLCLe/iIsIqu7IiwiLV8iLAogIqGxIiwir78iLCLD4yIsItf3IiwiwuIiLCLO7iIsIs3tIiwiLDsiLCIuOiIsItb2IiwKICI8PiIgLyogdGhlIHBoYW50b20ga2V5ICovCn07CgovKioqIFNlcmJpYW4ga2V5Ym9hcmQgbGF5b3V0IChzZXR4a2JtYXAgdXMsc3IpICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfVVNfU1JbTUFJTl9MRU5dWzRdID0KewogImB+IiwiMSEiLCIyQDJcIiIsIjMjIiwiNCQiLCI1JSIsIjZeNiYiLCI3JjcvIiwiOCo4KCIsIjkoOSkiLCIwKTA9IiwiLV8nPyIsIj0rKyoiLAogInFRqbkiLCJ3V6q6IiwiZUXF5SIsInJS0vIiLCJ0VNT0IiwieVna+iIsInVV1fUiLCJpScnpIiwib0/P7yIsInBQ0PAiLCJbe9v7IiwiXX1bXSIsCiAiYUHB4SIsInNT0/MiLCJkRMTkIiwiZkbG5iIsImdHx+ciLCJoSMjoIiwiakqouCIsImtLy+siLCJsTMzsIiwiOzre/iIsIidcIqu7IiwiXFx8LV8iLAogInpaobEiLCJ4WK+/IiwiY0PD4yIsInZW1/ciLCJiQsLiIiwibk7O7iIsIm1Nze0iLCIsPCw7IiwiLj4uOiIsIi8/1vYiLAogIjw+IiAvKiB0aGUgcGhhbnRvbSBrZXkgKi8KfTsKCi8qKiogQ3JvYXRpYW4ga2V5Ym9hcmQgbGF5b3V0IHNwZWNpZmljIGZvciBtZSA8amVsbHlAc3JrLmZlci5ocj4gKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IUl9qZWxseVtNQUlOX0xFTl1bNF0gPQp7CiAiYH4iLCIxISIsIjJAIiwiMyMiLCI0JCIsIjUlIiwiNl4iLCI3JiIsIjgqIiwiOSgiLCIwKSIsIi1fIiwiPSsiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiW3u5qSIsIl198NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIjs66MgiLCInXCLmxiIsIlxcfL6uIiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiPD58Igp9OwoKLyoqKiBDcm9hdGlhbiBrZXlib2FyZCBsYXlvdXQgKHNldHhrYm1hcCBocikgKioqLwpzdGF0aWMgY29uc3QgY2hhciBtYWluX2tleV9IUltNQUlOX0xFTl1bNF0gPQp7CiAiuKgiLCIxISIsIjJcIiIsIjMjIiwiNCQiLCI1JSIsIjYmIiwiNy8iLCI4KCIsIjkpIiwiMD0iLCInPyIsIisqIiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieloiLCJ1VSIsImlJIiwib08iLCJwUCIsIrmpIiwi8NAiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIujIIiwi5sYiLCK+riIsCiAieVkiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLz8iLAogIjw+Igp9OwoKLyoqKiBKYXBhbmVzZSAxMDYga2V5Ym9hcmQgbGF5b3V0ICoqKi8Kc3RhdGljIGNvbnN0IGNoYXIgbWFpbl9rZXlfSkFfanAxMDZbTUFJTl9MRU5dWzRdID0KewogIjEhIiwiMlwiIiwiMyMiLCI0JCIsIjUlIiwiNiYiLCI3JyIsIjgoIiwiOSkiLCIwfiIsIi09IiwiXn4iLCJcXHwiLAogInFRIiwid1ciLCJlRSIsInJSIiwidFQiLCJ5WSIsInVVIiwiaUkiLCJvTyIsInBQIiwiQGAiLCJbeyIsCiAiYUEiLCJzUyIsImREIiwiZkYiLCJnRyIsImhIIiwiakoiLCJrSyIsImxMIiwiOysiLCI6KiIsIl19IiwKICJ6WiIsInhYIiwiY0MiLCJ2ViIsImJCIiwibk4iLCJtTSIsIiw8IiwiLj4iLCIvPyIsCiAiXFxfIiwKfTsKCi8qKiogSmFwYW5lc2UgcGM5OHgxIGtleWJvYXJkIGxheW91dCAqKiovCnN0YXRpYyBjb25zdCBjaGFyIG1haW5fa2V5X0pBX3BjOTh4MVtNQUlOX0xFTl1bNF0gPQp7CiAiMSEiLCIyXCIiLCIzIyIsIjQkIiwiNSUiLCI2JiIsIjcnIiwiOCgiLCI5KSIsIjAiLCItPSIsIl5gIiwiXFx8IiwKICJxUSIsIndXIiwiZUUiLCJyUiIsInRUIiwieVkiLCJ1VSIsImlJIiwib08iLCJwUCIsIkB+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+IiwiKnwiLAogImFBIiwic1MiLCJkRCIsImZGIiwiZ0ciLCJoSCIsImpKIiwia0siLCJsTCIsIiuxIiwiJ2AiLCI8PiIsCiAieloiLCJ4WCIsImNDIiwidlYiLCJiQiIsIm5OIiwibU0iLCIsOyIsIi46IiwiLT0iLAogIltdIgp9OwoKCgovKioqIExheW91dCB0YWJsZS4gQWRkIHlvdXIga2V5Ym9hcmQgbWFwcGluZ3MgdG8gdGhpcyBsaXN0ICovCnN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgTENJRCBsY2lkOyAvKiBpbnB1dCBsb2NhbGUgaWRlbnRpZmllciwgbG9vayBmb3IgTE9DQUxFX0lMQU5HVUFHRQogICAgICAgICAgICAgICAgIGluIHRoZSBhcHByb3ByaWF0ZSBkbGxzL2tlcm5lbC9ubHMvLm5scyBmaWxlICovCiAgICBjb25zdCBjaGFyICpjb21tZW50OwogICAgY29uc3QgY2hhciAoKmtleSlbTUFJTl9MRU5dWzRdOwogICAgY29uc3QgV09SRCAoKnNjYW4pW01BSU5fTEVOXTsgLyogc2NhbiBjb2RlcyBtYXBwaW5nICovCiAgICBjb25zdCBXT1JEICgqdmtleSlbTUFJTl9MRU5dOyAvKiB2aXJ0dWFsIGtleSBjb2RlcyBtYXBwaW5nICovCn0gbWFpbl9rZXlfdGFiW109ewogezB4MDQwOSwgIlVuaXRlZCBTdGF0ZXMga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVW5pdGVkIFN0YXRlcyBrZXlib2FyZCBsYXlvdXQgKHBoYW50b20ga2V5IHZlcnNpb24pIiwgJm1haW5fa2V5X1VTX3BoYW50b20sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIGtleWJvYXJkIGxheW91dCAoZHZvcmFrKSIsICZtYWluX2tleV9VU19kdm9yYWssICZtYWluX2tleV9zY2FuX2R2b3JhaywgJm1haW5fa2V5X3ZrZXlfZHZvcmFrfSwKIHsweDA0MDksICJVbml0ZWQgU3RhdGVzIEludGVybmF0aW9uYWwga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1VTX2ludGwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MDksICJCcml0aXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9VSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfREUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDcsICJHZXJtYW4ga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X0RFX25vZGVhZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgZm9yIGxvZ2l0ZWNoIGRlc2t0b3AgcHJvIiwgJm1haW5fa2V5X0RFX2xvZ2l0ZWNoLCAgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQwNywgIkdlcm1hbiBrZXlib2FyZCBsYXlvdXQgd2l0aG91dCBkZWFkIGtleXMgMTA1IiwgJm1haW5fa2V5X0RFX25vZGVhZF8xMDUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6XzEwNX0sCiB7MHgwODA3LCAiU3dpc3MgR2VybWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MTAwYywgIlN3aXNzIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MWQsICJTd2VkaXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfdjJ9LAogezB4MDQyNSwgIkVzdG9uaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9FVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxNCwgIk5vcndlZ2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfTk8sICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDYsICJEYW5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0RBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBjLCAiRnJlbmNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9GUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MGMwYywgIkNhbmFkaWFuIEZyZW5jaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBGcmVuY2gga2V5Ym9hcmQgbGF5b3V0IChDQV9mcikiLCAmbWFpbl9rZXlfQ0FfZnIsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDBjMGMsICJDYW5hZGlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ0EsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA4MGMsICJCZWxnaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CRSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hemVydHl9LAogezB4MDgxNiwgIlBvcnR1Z3Vlc2Uga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X1BULCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUFRfYnIsICZtYWluX2tleV9zY2FuX2FibnRfcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9hYm50X3F3ZXJ0eX0sCiB7MHgwNDE2LCAiQnJhemlsaWFuIEFCTlQtMiBrZXlib2FyZCBsYXlvdXQgQUxUIEdSIiwgJm1haW5fa2V5X1BUX2JyX2FsdF9nciwmbWFpbl9rZXlfc2Nhbl9hYm50X3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfYWJudF9xd2VydHl9LAogezB4MDQwYiwgIkZpbm5pc2gga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0ZJLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIGJkcyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQkdfYmRzLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDAyLCAiQnVsZ2FyaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9CR19waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMywgIkJlbGFydXNpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0JZLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDE5LCAiUnVzc2lhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfUlUsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIGtleWJvYXJkIGxheW91dCAocGhhbnRvbSBrZXkgdmVyc2lvbikiLCAmbWFpbl9rZXlfUlVfcGhhbnRvbSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IEtPSTgtUiIsICZtYWluX2tleV9SVV9rb2k4ciwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IGNwMTI1MSIsICZtYWluX2tleV9SVV9jcDEyNTEsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTksICJSdXNzaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9SVV9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyMiwgIlVrcmFpbmlhbiBrZXlib2FyZCBsYXlvdXQgS09JOC1VIiwgJm1haW5fa2V5X1VBLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDIyLCAiVWtyYWluaWFuIGtleWJvYXJkIGxheW91dCAoc3RhbmRhcmQpIiwgJm1haW5fa2V5X1VBX3N0ZCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxOSwgIlJ1c3NpYW4ga2V5Ym9hcmQgbGF5b3V0IChzdGFuZGFyZCkiLCAmbWFpbl9rZXlfUlVfc3RkLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBhLCAiU3BhbmlzaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MTAsICJJdGFsaWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JVCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZiwgIkljZWxhbmRpYyBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSVMsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGUsICJIdW5nYXJpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0hVLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0en0sCiB7MHgwNDE1LCAiUG9saXNoIChwcm9ncmFtbWVyJ3MpIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9QTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNCwgIlNsb3ZlbmlhbiBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfU0ksICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDBjMWEsICJTZXJiaWFuIGtleWJvYXJkIGxheW91dCBzciIsICZtYWluX2tleV9TUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LCAvKiBMQU5HX1NFUkJJQU4sU1VCTEFOR19TRVJCSUFOX0NZUklMTElDICovCiB7MHgwYzFhLCAiU2VyYmlhbiBrZXlib2FyZCBsYXlvdXQgdXMsc3IiLCAmbWFpbl9rZXlfVVNfU1IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwgLyogTEFOR19TRVJCSUFOLFNVQkxBTkdfU0VSQklBTl9DWVJJTExJQyAqLwogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9IUiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHp9LAogezB4MDQxYSwgIkNyb2F0aWFuIGtleWJvYXJkIGxheW91dCAoc3BlY2lmaWMpIiwgJm1haW5fa2V5X0hSX2plbGx5LCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDExLCAiSmFwYW5lc2UgMTA2IGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9KQV9qcDEwNiwgJm1haW5fa2V5X3NjYW5fcXdlcnR5X2pwMTA2LCAmbWFpbl9rZXlfdmtleV9xd2VydHlfanAxMDZ9LAogezB4MDQxMSwgIkphcGFuZXNlIHBjOTh4MSBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfSkFfcGM5OHgxLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFiLCAiU2xvdmFrIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9TSywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxYiwgIlNsb3ZhayBhbmQgQ3plY2gga2V5Ym9hcmQgbGF5b3V0IHdpdGhvdXQgZGVhZCBrZXlzIiwgJm1haW5fa2V5X1NLX3Byb2csICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfQ1MsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3oiLCAmbWFpbl9rZXlfQ1osICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR6fSwKIHsweDA0MDUsICJDemVjaCBrZXlib2FyZCBsYXlvdXQgY3pfcXdlcnR5IiwgJm1haW5fa2V5X0NaX3F3ZXJ0eSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwYSwgIkxhdGluIEFtZXJpY2FuIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9MQSwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQyNywgIkxpdGh1YW5pYW4gKEJhbHRpYykga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0xUX0IsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWYsICJUdXJraXNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9USywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxZiwgIlR1cmtpc2gga2V5Ym9hcmQgbGF5b3V0IHRyIiwgJm1haW5fa2V5X1RSLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDFmLCAiVHVya2lzaCBrZXlib2FyZCBsYXlvdXQgdHJmIiwgJm1haW5fa2V5X1RSX0YsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MGQsICJJc3JhZWxpYW4ga2V5Ym9hcmQgbGF5b3V0IiwgJm1haW5fa2V5X0lMLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDBkLCAiSXNyYWVsaWFuIHBob25ldGljIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9waG9uZXRpYywgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQwZCwgIklzcmFlbGlhbiBTYWhhcm9uIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9JTF9zYWhhcm9uLCAmbWFpbl9rZXlfc2Nhbl9xd2VydHksICZtYWluX2tleV92a2V5X3F3ZXJ0eX0sCiB7MHgwNDA5LCAiVk5DIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV92bmMsICZtYWluX2tleV9zY2FuX3ZuYywgJm1haW5fa2V5X3ZrZXlfdm5jfSwKIHsweDA0MDgsICJHcmVlayBrZXlib2FyZCBsYXlvdXQiLCAmbWFpbl9rZXlfRUwsICZtYWluX2tleV9zY2FuX3F3ZXJ0eSwgJm1haW5fa2V5X3ZrZXlfcXdlcnR5fSwKIHsweDA0MWUsICJUaGFpIChLZWRtYW5lZSkgIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV90aCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAogezB4MDQxMywgIkR1dGNoIGtleWJvYXJkIGxheW91dCIsICZtYWluX2tleV9OTCwgJm1haW5fa2V5X3NjYW5fcXdlcnR5LCAmbWFpbl9rZXlfdmtleV9xd2VydHl9LAoKIHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwp9OwpzdGF0aWMgdW5zaWduZWQga2JkX2xheW91dD0wOyAvKiBpbmRleCBpbnRvIGFib3ZlIHRhYmxlIG9mIGxheW91dHMgKi8KCi8qIG1heWJlIG1vcmUgb2YgdGhlc2Ugc2NhbmNvZGVzIHNob3VsZCBiZSBleHRlbmRlZD8gKi8KICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIG11c3QgYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAogICAgICAgICAgICAgICAgICAgSU5TLCBERUwsIEhPTUUsIEVORCwgUEFHRV9VUCwgUEFHRV9ET1dOLCBBUlJPVyBrZXlzLAogICAgICAgICAgICAgICAgICAga2V5cGFkIC8gYW5kIGtleXBhZCBFTlRFUiAoU0RLIDMuMSBWb2wuMyBwIDEzOCkgKi8KICAgICAgICAgICAgICAgIC8qIEZJWE1FIHNob3VsZCB3ZSBzZXQgZXh0ZW5kZWQgYml0IGZvciBOdW1Mb2NrID8gTXkKICAgICAgICAgICAgICAgICAqIFdpbmRvd3MgZG9lcyAuLi4gREYgKi8KICAgICAgICAgICAgICAgIC8qIFllcywgdG8gZGlzdGluZ3Vpc2ggYmFzZWQgb24gc2NhbiBjb2RlcywgYWxzbwogICAgICAgICAgICAgICAgICAgZm9yIFBydFNjbiBrZXkgLi4uIEdBICovCgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV92a2V5WzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMDAgKi8KICAgIC8qIHNwZWNpYWwga2V5cyAqLwogICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLwogICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMCwgMCwgMCwgVktfRVNDQVBFLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkYxOCAqLwogICAgLyogdW51c2VkICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjIwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjM4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjQ4ICovCiAgICAvKiBjdXJzb3Iga2V5cyAqLwogICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY1MCAqLwogICAgVktfRE9XTiwgVktfUFJJT1IsIFZLX05FWFQsIFZLX0VORCwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNTggKi8KICAgIC8qIG1pc2Mga2V5cyAqLwogICAgVktfU0VMRUNULCBWS19TTkFQU0hPVCwgVktfRVhFQ1VURSwgVktfSU5TRVJULCAwLDAsMCwgVktfQVBQUywgLyogRkY2MCAqLwogICAgMCwgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgLyogRkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3MCAqLwogICAgLyoga2V5cGFkIGtleXMgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIFZLX0hPTUUsIFZLX0xFRlQsIFZLX1VQLCAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgVktfTkVYVCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KICAgIFZLX0VORCwgVktfQ0xFQVIsIFZLX0lOU0VSVCwgVktfREVMRVRFLAogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBOCAqLwogICAgVktfU0VQQVJBVE9SLCBWS19TVUJUUkFDVCwgVktfREVDSU1BTCwgVktfRElWSURFLAogICAgVktfTlVNUEFEMCwgVktfTlVNUEFEMSwgVktfTlVNUEFEMiwgVktfTlVNUEFEMywgICAgICAgICAgICAgLyogRkZCMCAqLwogICAgVktfTlVNUEFENCwgVktfTlVNUEFENSwgVktfTlVNUEFENiwgVktfTlVNUEFENywKICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDksIDAsIDAsIDAsIFZLX09FTV9ORUNfRVFVQUwsICAgICAgICAgIC8qIEZGQjggKi8KICAgIC8qIGZ1bmN0aW9uIGtleXMgKi8KICAgIFZLX0YxLCBWS19GMiwKICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KICAgIFZLX0YxMSwgVktfRjEyLCBWS19GMTMsIFZLX0YxNCwgVktfRjE1LCBWS19GMTYsIDAsIDAsICAgICAgIC8qIEZGQzggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRDggKi8KICAgIC8qIG1vZGlmaWVyIGtleXMgKi8KICAgIDAsIFZLX1NISUZULCBWS19TSElGVCwgVktfQ09OVFJPTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTAgKi8KICAgIFZLX0NPTlRST0wsIFZLX0NBUElUQUwsIDAsIFZLX01FTlUsCiAgICBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAvKiBGRkU4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCBWS19ERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkY4ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBub25jaGFyX2tleV9zY2FuWzI1Nl0gPQp7CiAgICAvKiB1bnVzZWQgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjAwICovCiAgICAvKiBzcGVjaWFsIGtleXMgKi8KICAgIDB4MEUsIDB4MEYsIDB4MDAsIC8qPyovIDAsIDB4MDAsIDB4MUMsIDB4MDAsIDB4MDAsICAgICAgICAgICAvKiBGRjA4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYxMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMTggKi8KICAgIC8qIHVudXNlZCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMjAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjI4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkYzMCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGMzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjQwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY0OCAqLwogICAgLyogY3Vyc29yIGtleXMgKi8KICAgIDB4MTQ3LCAweDE0QiwgMHgxNDgsIDB4MTRELCAweDE1MCwgMHgxNDksIDB4MTUxLCAweDE0RiwgICAgICAvKiBGRjUwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkY1OCAqLwogICAgLyogbWlzYyBrZXlzICovCiAgICAvKj8qLyAwLCAweDEzNywgLyo/Ki8gMCwgMHgxNTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgLyogRkY2MCAqLwogICAgLyo/Ki8gMCwgLyo/Ki8gMCwgMHgzOCwgMHgxNDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgIC8qIEZGNjggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjcwICovCiAgICAvKiBrZXlwYWQga2V5cyAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMzgsIDB4MTQ1LCAgICAgICAgICAgIC8qIEZGNzggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRjgwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExQywgMHgwMCwgMHgwMCwgICAgICAgICAgICAgLyogRkY4OCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0QiwgMHg0OCwgICAgICAgICAgICAgIC8qIEZGOTAgKi8KICAgIDB4NEQsIDB4NTAsIDB4NDksIDB4NTEsIDB4NEYsIDB4NEMsIDB4NTIsIDB4NTMsICAgICAgICAgICAgICAvKiBGRjk4ICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZBMCAqLwogICAgMHgwMCwgMHgwMCwgMHgzNywgMHg0RSwgMHg1MywgMHg0QSwgMHg1MywgMHgxMzUsICAgICAgICAgICAgIC8qIEZGQTggKi8KICAgIDB4NTIsIDB4NEYsIDB4NTAsIDB4NTEsIDB4NEIsIDB4NEMsIDB4NEQsIDB4NDcsICAgICAgICAgICAgICAvKiBGRkIwICovCiAgICAweDQ4LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCOCAqLwogICAgLyogZnVuY3Rpb24ga2V5cyAqLwogICAgMHgzQiwgMHgzQywKICAgIDB4M0QsIDB4M0UsIDB4M0YsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsICAgICAgICAgICAgICAvKiBGRkMwICovCiAgICAweDU3LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgICAgLyogRkZDOCAqLwogICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgICAgICAgICAgICAgIC8qIEZGRDAgKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkQ4ICovCiAgICAvKiBtb2RpZmllciBrZXlzICovCiAgICAweDAwLCAweDJBLCAweDM2LCAweDFELCAweDExRCwgMHgzQSwgMHgwMCwgMHgzOCwgICAgICAgICAgICAgLyogRkZFMCAqLwogICAgMHgxMzgsIDB4MzgsIDB4MTM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAgICAgICAgICAgIC8qIEZGRTggKi8KICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsICAgICAgICAgICAgICAvKiBGRkYwICovCiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE1MyAgICAgICAgICAgICAgLyogRkZGOCAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgeGZyZWU4Nl92ZW5kb3Jfa2V5X3ZrZXlbMjU2XSA9CnsKICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjAwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYwOCAqLwogICAgMCwgVktfVk9MVU1FX0RPV04sIFZLX1ZPTFVNRV9NVVRFLCBWS19WT0xVTUVfVVAsICAgICAgICAgICAgLyogMTAwOEZGMTAgKi8KICAgIFZLX01FRElBX1BMQVlfUEFVU0UsIFZLX01FRElBX1NUT1AsCiAgICBWS19NRURJQV9QUkVWX1RSQUNLLCBWS19NRURJQV9ORVhUX1RSQUNLLAogICAgMCwgVktfTEFVTkNIX01BSUwsIDAsIFZLX0JST1dTRVJfU0VBUkNILCAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGMTggKi8KICAgIDAsIDAsIDAsIFZLX0JST1dTRVJfSE9NRSwKICAgIDAsIDAsIDAsIDAsIDAsIDAsIFZLX0JST1dTRVJfQkFDSywgVktfQlJPV1NFUl9GT1JXQVJELCAgICAgIC8qIDEwMDhGRjIwICovCiAgICBWS19CUk9XU0VSX1NUT1AsIFZLX0JST1dTRVJfUkVGUkVTSCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAvKiAxMDA4RkYyOCAqLwogICAgVktfQlJPV1NFUl9GQVZPUklURVMsIDAsIFZLX0xBVU5DSF9NRURJQV9TRUxFQ1QsIDAsICAgICAgICAgLyogMTAwOEZGMzAgKi8KICAgIDAsIDAsIDAsIDAsCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkYzOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjQ4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY1MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY2OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGNzAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjc4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY4MCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGODggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRjkwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkY5OCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQTAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkE4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZCMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGQjggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkMwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZDOCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRDAgKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkQ4ICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZFMCAqLwogICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTAwOEZGRTggKi8KICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDEwMDhGRkYwICovCiAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA4RkZGOCAqLwp9OwoKLyogUmV0dXJucyB0aGUgV2luZG93cyB2aXJ0dWFsIGtleSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgWCBldmVudCA8ZT4gKi8KLyogeDExIGxvY2sgbXVzdCBiZSBoZWxkICovCnN0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhJQyB4aWMsIFhLZXlFdmVudCAqZSkKewogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBTdGF0dXMgc3RhdHVzOwogICAgY2hhciBidWZbMjRdOwoKICAgIC8qIENsaWVudHMgc2hvdWxkIHBhc3Mgb25seSBLZXlQcmVzcyBldmVudHMgdG8gWG1iTG9va3VwU3RyaW5nICovCiAgICBpZiAoeGljICYmIGUtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgICAgWG1iTG9va3VwU3RyaW5nKHhpYywgZSwgYnVmLCBzaXplb2YoYnVmKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgWExvb2t1cFN0cmluZyhlLCBidWYsIHNpemVvZihidWYpLCAma2V5c3ltLCBOVUxMKTsKCiAgICBpZiAoKGUtPnN0YXRlICYgTnVtTG9ja01hc2spICYmCiAgICAgICAgKGtleXN5bSA9PSBYS19LUF9TZXBhcmF0b3IgfHwga2V5c3ltID09IFhLX0tQX0RlY2ltYWwgfHwKICAgICAgICAgKGtleXN5bSA+PSBYS19LUF8wICYmIGtleXN5bSA8PSBYS19LUF85KSkpCiAgICAgICAgLyogT25seSB0aGUgS2V5cGFkIGtleXMgMC05IGFuZCAuIHNlbmQgZGlmZmVyZW50IGtleXN5bXMKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIE51bUxvY2sgc3RhdGUgKi8KICAgICAgICByZXR1cm4gbm9uY2hhcl9rZXlfdmtleVtrZXlzeW0gJiAweEZGXTsKCiAgICBUUkFDRV8oa2V5KSgiZS0+a2V5Y29kZSA9ICV4XG4iLCBlLT5rZXljb2RlKTsKCiAgICByZXR1cm4ga2V5YzJ2a2V5W2UtPmtleWNvZGVdOwp9CgpzdGF0aWMgQk9PTCBOdW1TdGF0ZT1GQUxTRSwgQ2Fwc1N0YXRlPUZBTFNFOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQKICovCnZvaWQgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIFdPUkQgd1ZrLCBXT1JEIHdTY2FuLCBEV09SRCBkd0ZsYWdzLCBEV09SRCB0aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0V4dHJhSW5mbywgVUlOVCBpbmplY3RlZF9mbGFncyApCnsKICAgIFVJTlQgbWVzc2FnZTsKICAgIEtFWUxQIGtleWxwOwogICAgS0JETExIT09LU1RSVUNUIGhvb2s7CiAgICBXT1JEIHdWa1N0cmlwcGVkOwoKICAgIHdWayA9IExPQllURSh3VmspOwoKICAgIC8qIHN0cmlwIGxlZnQvcmlnaHQgZm9yIG1lbnUsIGNvbnRyb2wsIHNoaWZ0ICovCiAgICBpZiAod1ZrID09IFZLX0xNRU5VIHx8IHdWayA9PSBWS19STUVOVSkKICAgICAgICB3VmtTdHJpcHBlZCA9IFZLX01FTlU7CiAgICBlbHNlIGlmICh3VmsgPT0gVktfTENPTlRST0wgfHwgd1ZrID09IFZLX1JDT05UUk9MKQogICAgICAgIHdWa1N0cmlwcGVkID0gVktfQ09OVFJPTDsKICAgIGVsc2UgaWYgKHdWayA9PSBWS19MU0hJRlQgfHwgd1ZrID09IFZLX1JTSElGVCkKICAgICAgICB3VmtTdHJpcHBlZCA9IFZLX1NISUZUOwogICAgZWxzZQogICAgICAgIHdWa1N0cmlwcGVkID0gd1ZrOwoKICAgIGtleWxwLmxwMiA9IDA7CiAgICBrZXlscC5scDEuY291bnQgPSAxOwogICAga2V5bHAubHAxLmNvZGUgPSB3U2NhbjsKICAgIGtleWxwLmxwMS5leHRlbmRlZCA9IChkd0ZsYWdzICYgS0VZRVZFTlRGX0VYVEVOREVES0VZKSAhPSAwOwogICAga2V5bHAubHAxLndpbl9pbnRlcm5hbCA9IDA7IC8qIHRoaXMgaGFzIHNvbWV0aGluZyB0byBkbyB3aXRoIGRpYWxvZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkb24ndCByZW1lbWJlciB3aGVyZSBJIHJlYWQgaXQgLSBBSyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0J3MgJzEnIHVuZGVyIHdpbmRvd3MsIHdoZW4gYSBkaWFsb2cgYm94IGFwcGVhcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgeW91IHByZXNzIG9uZSBvZiB0aGUgdW5kZXJsaW5lZCBrZXlzIC0gREYqLwoKICAgIC8qIG5vdGUgdGhhdCB0aGVyZSBpcyBhIHRlc3QgZm9yIGFsbCB0aGlzICovCiAgICBpZiAoZHdGbGFncyAmIEtFWUVWRU5URl9LRVlVUCApCiAgICB7CiAgICAgICAgbWVzc2FnZSA9IFdNX0tFWVVQOwogICAgICAgIGlmICgoa2V5X3N0YXRlX3RhYmxlW1ZLX01FTlVdICYgMHg4MCkgJiYKICAgICAgICAgICAgKCh3VmtTdHJpcHBlZCA9PSBWS19NRU5VKSB8fCAod1ZrU3RyaXBwZWQgPT0gVktfQ09OVFJPTCkKICAgICAgICAgICAgIHx8ICEoa2V5X3N0YXRlX3RhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkpKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIFRyYWNrU3lzS2V5ID09IFZLX01FTlUgfHwgLyogPEFMVD4tZG93bi88QUxUPi11cCBzZXF1ZW5jZSAqLwogICAgICAgICAgICAgICAgKHdWa1N0cmlwcGVkICE9IFZLX01FTlUpKSAvKiA8QUxUPi1kb3duLi4uPHNvbWV0aGluZyBlbHNlPi11cCAqLwogICAgICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWVVQOwogICAgICAgICAgICBUcmFja1N5c0tleSA9IDA7CiAgICAgICAgfQogICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtdICY9IH4weDgwOwogICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtTdHJpcHBlZF0gJj0gfjB4ODA7CiAgICAgICAga2V5bHAubHAxLnByZXZpb3VzID0gMTsKICAgICAgICBrZXlscC5scDEudHJhbnNpdGlvbiA9IDE7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAga2V5bHAubHAxLnByZXZpb3VzID0gKGtleV9zdGF0ZV90YWJsZVt3VmtdICYgMHg4MCkgIT0gMDsKICAgICAgICBrZXlscC5scDEudHJhbnNpdGlvbiA9IDA7CiAgICAgICAgaWYgKCEoa2V5X3N0YXRlX3RhYmxlW3dWa10gJiAweDgwKSkga2V5X3N0YXRlX3RhYmxlW3dWa10gXj0gMHgwMTsKICAgICAgICBrZXlfc3RhdGVfdGFibGVbd1ZrXSB8PSAweGMwOwogICAgICAgIGtleV9zdGF0ZV90YWJsZVt3VmtTdHJpcHBlZF0gfD0gMHhjMDsKCiAgICAgICAgbWVzc2FnZSA9IFdNX0tFWURPV047CiAgICAgICAgaWYgKChrZXlfc3RhdGVfdGFibGVbVktfTUVOVV0gJiAweDgwKSAmJiAhKGtleV9zdGF0ZV90YWJsZVtWS19DT05UUk9MXSAmIDB4ODApKQogICAgICAgIHsKICAgICAgICAgICAgbWVzc2FnZSA9IFdNX1NZU0tFWURPV047CiAgICAgICAgICAgIFRyYWNrU3lzS2V5ID0gd1ZrU3RyaXBwZWQ7CiAgICAgICAgfQogICAgfQoKICAgIGtleWxwLmxwMS5jb250ZXh0ID0gKGtleV9zdGF0ZV90YWJsZVtWS19NRU5VXSAmIDB4ODApICE9IDA7IC8qIDEgaWYgYWx0ICovCgogICAgVFJBQ0VfKGtleSkoIiB3UGFyYW09JTA0eCwgbFBhcmFtPSUwOGx4LCBJbnB1dEtleVN0YXRlPSV4XG4iLAogICAgICAgICAgICAgICAgd1ZrLCBrZXlscC5scDIsIGtleV9zdGF0ZV90YWJsZVt3VmtdICk7CgogICAgaG9vay52a0NvZGUgICAgICA9IHdWazsKICAgIGhvb2suc2NhbkNvZGUgICAgPSB3U2NhbjsKICAgIGhvb2suZmxhZ3MgICAgICAgPSAoa2V5bHAubHAyID4+IDI0KSB8IGluamVjdGVkX2ZsYWdzOwogICAgaG9vay50aW1lICAgICAgICA9IHRpbWU7CiAgICBob29rLmR3RXh0cmFJbmZvID0gZHdFeHRyYUluZm87CiAgICBpZiAoSE9PS19DYWxsSG9va3MoIFdIX0tFWUJPQVJEX0xMLCBIQ19BQ1RJT04sIG1lc3NhZ2UsIChMUEFSQU0pJmhvb2ssIFRSVUUgKSkgcmV0dXJuOwoKICAgIFNFUlZFUl9TVEFSVF9SRVEoIHNlbmRfaGFyZHdhcmVfbWVzc2FnZSApCiAgICB7CiAgICAgICAgcmVxLT5pZCAgICAgICA9IChpbmplY3RlZF9mbGFncyAmIExMS0hGX0lOSkVDVEVEKSA/IDAgOiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKICAgICAgICByZXEtPndpbiAgICAgID0gMDsKICAgICAgICByZXEtPm1zZyAgICAgID0gbWVzc2FnZTsKICAgICAgICByZXEtPndwYXJhbSAgID0gd1ZrOwogICAgICAgIHJlcS0+bHBhcmFtICAgPSBrZXlscC5scDI7CiAgICAgICAgcmVxLT54ICAgICAgICA9IGN1cnNvcl9wb3MueDsKICAgICAgICByZXEtPnkgICAgICAgID0gY3Vyc29yX3Bvcy55OwogICAgICAgIHJlcS0+dGltZSAgICAgPSB0aW1lOwogICAgICAgIHJlcS0+aW5mbyAgICAgPSBkd0V4dHJhSW5mbzsKICAgICAgICB3aW5lX3NlcnZlcl9jYWxsKCByZXEgKTsKICAgIH0KICAgIFNFUlZFUl9FTkRfUkVROwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUtFWUJPQVJEX0dlbmVyYXRlTXNnCiAqCiAqIEdlbmVyYXRlIERvd24rVXAgbWVzc2FnZXMgd2hlbiBOdW1Mb2NrIG9yIENhcHNMb2NrIGlzIHByZXNzZWQuCiAqCiAqIENvbnZlbnRpb24gOiBjYWxsZWQgd2l0aCB2a2V5IG9ubHkgVktfTlVNTE9DSyBvciBWS19DQVBJVEFMCiAqCiAqLwpzdGF0aWMgdm9pZCBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggV09SRCB2a2V5LCBXT1JEIHNjYW4sIGludCBFdnR5cGUsIERXT1JEIGV2ZW50X3RpbWUgKQp7CiAgQk9PTCAqIFN0YXRlID0gKHZrZXk9PVZLX05VTUxPQ0s/ICZOdW1TdGF0ZSA6ICZDYXBzU3RhdGUpOwogIERXT1JEIHVwLCBkb3duOwoKICBpZiAoKlN0YXRlKSB7CiAgICAvKiBUaGUgSU5URVJNRURJQVJZIHN0YXRlIG1lYW5zIDoganVzdCBhZnRlciBhICdwcmVzcycgZXZlbnQsIGlmIGEgJ3JlbGVhc2UnIGV2ZW50IGNvbWVzLAogICAgICAgZG9uJ3QgdHJlYXQgaXQuIEl0J3MgZnJvbSB0aGUgc2FtZSBrZXkgcHJlc3MuIFRoZW4gdGhlIHN0YXRlIGdvZXMgdG8gT04uCiAgICAgICBBbmQgZnJvbSB0aGVyZSwgYSAncmVsZWFzZScgZXZlbnQgd2lsbCBzd2l0Y2ggb2ZmIHRoZSB0b2dnbGUga2V5LiAqLwogICAgKlN0YXRlPUZBTFNFOwogICAgVFJBQ0UoIklOVEVSTSA6IGRvbid0IHRyZWF0IHJlbGVhc2Ugb2YgdG9nZ2xlIGtleS4ga2V5X3N0YXRlX3RhYmxlWyUjeF0gPSAlI3hcbiIsCiAgICAgICAgICB2a2V5LGtleV9zdGF0ZV90YWJsZVt2a2V5XSk7CiAgfSBlbHNlCiAgICB7CiAgICAgICAgZG93biA9ICh2a2V5PT1WS19OVU1MT0NLID8gS0VZRVZFTlRGX0VYVEVOREVES0VZIDogMCk7CiAgICAgICAgdXAgPSAodmtleT09VktfTlVNTE9DSyA/IEtFWUVWRU5URl9FWFRFTkRFREtFWSA6IDApIHwgS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCBrZXlfc3RhdGVfdGFibGVbdmtleV0gJiAweDEgKSAvKiBpdCB3YXMgT04gKi8KCSAgewoJICAgIGlmIChFdnR5cGUhPUtleVByZXNzKQoJICAgICAgewoJCVRSQUNFKCJPTiArIEtleVJlbGVhc2UgPT4gZ2VuZXJhdGluZyBET1dOIGFuZCBVUCBtZXNzYWdlcy5cbiIpOwoJICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgZG93biwgZXZlbnRfdGltZSwgMCwgMCApOwoJICAgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUsIDAsIDAgKTsKCQkqU3RhdGU9RkFMU0U7CgkJa2V5X3N0YXRlX3RhYmxlW3ZrZXldICY9IH4weDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb2ZmLiAqLwoJICAgICAgfQoJICB9CgllbHNlIC8qIGl0IHdhcyBPRkYgKi8KCSAgaWYgKEV2dHlwZT09S2V5UHJlc3MpCgkgICAgewoJICAgICAgVFJBQ0UoIk9GRiArIEtleXByZXNzID0+IGdlbmVyYXRpbmcgRE9XTiBhbmQgVVAgbWVzc2FnZXMuXG4iKTsKCSAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5LCBzY2FuLCBkb3duLCBldmVudF90aW1lLCAwLCAwICk7CgkgICAgICBYMTFEUlZfc2VuZF9rZXlib2FyZF9pbnB1dCggdmtleSwgc2NhbiwgdXAsIGV2ZW50X3RpbWUsIDAsIDAgKTsKCSAgICAgICpTdGF0ZT1UUlVFOyAvKiBHb2VzIHRvIGludGVybWVkaWFyeSBzdGF0ZSBiZWZvcmUgZ29pbmcgdG8gT04gKi8KCSAgICAgIGtleV9zdGF0ZV90YWJsZVt2a2V5XSB8PSAweDAxOyAvKiBUb2dnbGUgc3RhdGUgdG8gb24uICovCgkgICAgfQogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlCiAqCiAqIFVwZGF0ZXMgaW50ZXJuYWwgc3RhdGUgZm9yIDx2a2V5PiwgZGVwZW5kaW5nIG9uIGtleSA8c3RhdGU+IHVuZGVyIFgKICoKICovCnN0YXRpYyBpbmxpbmUgdm9pZCBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSAoIGludCB2a2V5LCBpbnQgc3RhdGUsIERXT1JEIHRpbWUgKQp7CiAgICAvKiBEbyBzb21ldGhpbmcgaWYgaW50ZXJuYWwgdGFibGUgc3RhdGUgIT0gWCBzdGF0ZSBmb3Iga2V5Y29kZSAqLwogICAgaWYgKCgoa2V5X3N0YXRlX3RhYmxlW3ZrZXldICYgMHg4MCkhPTApICE9IHN0YXRlKQogICAgewogICAgICAgIFRSQUNFKCJBZGp1c3Rpbmcgc3RhdGUgZm9yIHZrZXkgJSMuMnguIFN0YXRlIGJlZm9yZSAlIy4yeFxuIiwKICAgICAgICAgICAgICB2a2V5LCBrZXlfc3RhdGVfdGFibGVbdmtleV0pOwoKICAgICAgICAvKiBGYWtlIGtleSBiZWluZyBwcmVzc2VkIGluc2lkZSB3aW5lICovCiAgICAgICAgWDExRFJWX3NlbmRfa2V5Ym9hcmRfaW5wdXQoIHZrZXksIDAsIHN0YXRlPyAwIDogS0VZRVZFTlRGX0tFWVVQLCB0aW1lLCAwLCAwICk7CgogICAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciAlIy4yeFxuIixrZXlfc3RhdGVfdGFibGVbdmtleV0pOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9LZXltYXBOb3RpZnkKICoKICogVXBkYXRlIG1vZGlmaWVycyBzdGF0ZSAoQ3RybCwgQWx0LCBTaGlmdCkgd2hlbiB3aW5kb3cgaXMgYWN0aXZhdGVkLgogKgogKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgb25lIHVzZXMgQ3RybCsuLi4gQWx0Ky4uLiBvciBTaGlmdCsuLiB0byBzd2l0Y2gKICogZnJvbSB3aW5lIHRvIGFub3RoZXIgYXBwbGljYXRpb24gYW5kIGJhY2suCiAqIFRvZ2dsZSBrZXlzIGFyZSBoYW5kbGVkIGluIEhhbmRsZUV2ZW50LgogKi8Kdm9pZCBYMTFEUlZfS2V5bWFwTm90aWZ5KCBIV05EIGh3bmQsIFhFdmVudCAqZXZlbnQgKQp7CiAgICBpbnQgaSwgaiwgYWx0LCBjb250cm9sLCBzaGlmdDsKICAgIERXT1JEIHRpbWUgPSBHZXRDdXJyZW50VGltZSgpOwoKICAgIGFsdCA9IGNvbnRyb2wgPSBzaGlmdCA9IDA7CiAgICAvKiB0aGUgbWluaW11bSBrZXljb2RlIGlzIGFsd2F5cyBncmVhdGVyIG9yIGVxdWFsIHRvIDgsIHNvIHdlIGNhbgogICAgICogc2tpcCB0aGUgZmlyc3QgOCB2YWx1ZXMsIGhlbmNlIHN0YXJ0IGF0IDEKICAgICAqLwogICAgZm9yIChpID0gMTsgaSA8IDMyOyBpKyspCiAgICB7CiAgICAgICAgaWYgKCFldmVudC0+eGtleW1hcC5rZXlfdmVjdG9yW2ldKSBjb250aW51ZTsKICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCEoZXZlbnQtPnhrZXltYXAua2V5X3ZlY3RvcltpXSAmICgxPDxqKSkpIGNvbnRpbnVlOwogICAgICAgICAgICBzd2l0Y2goa2V5YzJ2a2V5WyhpICogOCkgKyBqXSAmIDB4ZmYpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBWS19NRU5VOiAgICBhbHQgPSAxOyBicmVhazsKICAgICAgICAgICAgY2FzZSBWS19DT05UUk9MOiBjb250cm9sID0gMTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgVktfU0hJRlQ6ICAgc2hpZnQgPSAxOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19NRU5VLCBhbHQsIHRpbWUgKTsKICAgIEtFWUJPQVJEX1VwZGF0ZU9uZVN0YXRlKCBWS19DT05UUk9MLCBjb250cm9sLCB0aW1lICk7CiAgICBLRVlCT0FSRF9VcGRhdGVPbmVTdGF0ZSggVktfU0hJRlQsIHNoaWZ0LCB0aW1lICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgWDExRFJWX0tleUV2ZW50CiAqCiAqIEhhbmRsZSBhIFgga2V5IGV2ZW50CiAqLwp2b2lkIFgxMURSVl9LZXlFdmVudCggSFdORCBod25kLCBYRXZlbnQgKnhldiApCnsKICAgIFhLZXlFdmVudCAqZXZlbnQgPSAmeGV2LT54a2V5OwogICAgY2hhciBTdHJbMjRdOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBXT1JEIHZrZXkgPSAwLCBiU2NhbjsKICAgIERXT1JEIGR3RmxhZ3M7CiAgICBpbnQgYXNjaWlfY2hhcnM7CiAgICBYSUMgeGljID0gWDExRFJWX2dldF9pYyggaHduZCApOwogICAgRFdPUkQgZXZlbnRfdGltZSA9IEVWRU5UX3gxMV90aW1lX3RvX3dpbjMyX3RpbWUoZXZlbnQtPnRpbWUpOwogICAgU3RhdHVzIHN0YXR1cyA9IDA7CgogICAgVFJBQ0VfKGtleSkoInR5cGUgJWQsIHdpbmRvdyAlbHgsIHN0YXRlIDB4JTA0eCwga2V5Y29kZSAweCUwNHhcbiIsCgkJZXZlbnQtPnR5cGUsIGV2ZW50LT53aW5kb3csIGV2ZW50LT5zdGF0ZSwgZXZlbnQtPmtleWNvZGUpOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcgKi8KICAgIGlmICh4aWMgJiYgZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYbWJMb29rdXBTdHJpbmcoeGljLCBldmVudCwgU3RyLCBzaXplb2YoU3RyKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgYXNjaWlfY2hhcnMgPSBYTG9va3VwU3RyaW5nKGV2ZW50LCBTdHIsIHNpemVvZihTdHIpLCAma2V5c3ltLCBOVUxMKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0VfKGtleSkoIm5ieXRlID0gJWQsIHN0YXR1cyAweCV4XG4iLCBhc2NpaV9jaGFycywgc3RhdHVzKTsKCiAgICBpZiAoc3RhdHVzID09IFhCdWZmZXJPdmVyZmxvdykKICAgICAgICBFUlIoIkJ1ZmZlciBPdmVyZmxvdyBuZWVkICVpIVxuIixhc2NpaV9jaGFycyk7CgogICAgaWYgKHN0YXR1cyA9PSBYTG9va3VwQ2hhcnMpCiAgICB7CiAgICAgICAgWDExRFJWX1hJTUxvb2t1cENoYXJzKCBTdHIsIGFzY2lpX2NoYXJzICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qIElmIFhLQiBleHRlbnNpb25zIGFyZSB1c2VkLCB0aGUgc3RhdGUgbWFzayBmb3IgQWx0R3Igd2lsbCB1c2UgdGhlIGdyb3VwCiAgICAgICBpbmRleCBpbnN0ZWFkIG9mIHRoZSBtb2RpZmllciBtYXNrLiBUaGUgZ3JvdXAgaW5kZXggaXMgc2V0IGluIGJpdHMKICAgICAgIDEzLTE0IG9mIHRoZSBzdGF0ZSBmaWVsZCBpbiB0aGUgWEtleUV2ZW50IHN0cnVjdHVyZS4gU28gaWYgQWx0R3IgaXMKICAgICAgIHByZXNzZWQsIGxvb2sgaWYgdGhlIGdyb3VwIGluZGV4IGlzIGRpZmZlcmVudCB0aGFuIDAuIEZyb20gWEtCCiAgICAgICBleHRlbnNpb24gZG9jdW1lbnRhdGlvbiwgdGhlIGdyb3VwIGluZGV4IGZvciBBbHRHciBzaG91bGQgYmUgMgogICAgICAgKGV2ZW50LT5zdGF0ZSA9IDB4MjAwMCkuIEl0J3MgcHJvYmFibHkgYmV0dGVyIHRvIG5vdCBhc3N1bWUgYQogICAgICAgcHJlZGVmaW5lZCBncm91cCBpbmRleCBhbmQgZmluZCBpdCBkeW5hbWljYWxseQoKICAgICAgIFJlZjogWCBLZXlib2FyZCBFeHRlbnNpb246IExpYnJhcnkgc3BlY2lmaWNhdGlvbiAoc2VjdGlvbiAxNC4xLjEgYW5kIDE3LjEuMSkgKi8KICAgIC8qIFNhdmUgYWxzbyBhbGwgcG9zc2libGUgbW9kaWZpZXIgc3RhdGVzLiAqLwogICAgQWx0R3JNYXNrID0gZXZlbnQtPnN0YXRlICYgKDB4NjAwMCB8IE1vZDFNYXNrIHwgTW9kMk1hc2sgfCBNb2QzTWFzayB8IE1vZDRNYXNrIHwgTW9kNU1hc2spOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKXsKCWNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCWlmICgha3NuYW1lKQoJICBrc25hbWUgPSAiTm8gTmFtZSI7CglUUkFDRV8oa2V5KSgiJXMgOiBrZXlzeW09JWxYICglcyksICMgb2YgY2hhcnM9JWQgLyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAoZXZlbnQtPnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgYXNjaWlfY2hhcnMsIGRlYnVnc3RyX2FuKFN0ciwgYXNjaWlfY2hhcnMpKTsKICAgIH0KCiAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KHhpYyxldmVudCk7CiAgICAvKiBYIHJldHVybnMga2V5Y29kZSAwIGZvciBjb21wb3NlZCBjaGFyYWN0ZXJzICovCiAgICBpZiAoIXZrZXkgJiYgYXNjaWlfY2hhcnMpIHZrZXkgPSBWS19OT05BTUU7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKICAgICAgICAgICAgICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKCiAgIGlmICh2a2V5KQogICB7CiAgICBzd2l0Y2ggKHZrZXkgJiAweGZmKQogICAgewogICAgY2FzZSBWS19OVU1MT0NLOgogICAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfTlVNTE9DSywgMHg0NSwgZXZlbnQtPnR5cGUsIGV2ZW50X3RpbWUgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFZLX0NBUElUQUw6CiAgICAgIFRSQUNFKCJDYXBzIExvY2sgZXZlbnQuICh0eXBlICVkKS4gU3RhdGUgYmVmb3JlIDogJSMuMnhcbiIsZXZlbnQtPnR5cGUsa2V5X3N0YXRlX3RhYmxlW3ZrZXldKTsKICAgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX0NBUElUQUwsIDB4M0EsIGV2ZW50LT50eXBlLCBldmVudF90aW1lICk7CiAgICAgIFRSQUNFKCJTdGF0ZSBhZnRlciA6ICUjLjJ4XG4iLGtleV9zdGF0ZV90YWJsZVt2a2V5XSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKiBBZGp1c3QgdGhlIE5VTUxPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKGtleV9zdGF0ZV90YWJsZVtWS19OVU1MT0NLXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTnVtTG9ja01hc2spKQoJICB7CgkgICAgVFJBQ0UoIkFkanVzdGluZyBOdW1Mb2NrIHN0YXRlLlxuIik7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVByZXNzLCBldmVudF90aW1lICk7CgkgICAgS0VZQk9BUkRfR2VuZXJhdGVNc2coIFZLX05VTUxPQ0ssIDB4NDUsIEtleVJlbGVhc2UsIGV2ZW50X3RpbWUgKTsKCSAgfQogICAgICAgIC8qIEFkanVzdCB0aGUgQ0FQU0xPQ0sgc3RhdGUgaWYgaXQgaGFzIGJlZW4gY2hhbmdlZCBvdXRzaWRlIHdpbmUgKi8KCWlmICghKGtleV9zdGF0ZV90YWJsZVtWS19DQVBJVEFMXSAmIDB4MDEpICE9ICEoZXZlbnQtPnN0YXRlICYgTG9ja01hc2spKQoJICB7CiAgICAgICAgICAgICAgVFJBQ0UoIkFkanVzdGluZyBDYXBzIExvY2sgc3RhdGUuXG4iKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UHJlc3MsIGV2ZW50X3RpbWUgKTsKCSAgICBLRVlCT0FSRF9HZW5lcmF0ZU1zZyggVktfQ0FQSVRBTCwgMHgzQSwgS2V5UmVsZWFzZSwgZXZlbnRfdGltZSApOwoJICB9CgkvKiBOb3QgTnVtIG5vciBDYXBzIDogZW5kIG9mIGludGVybWVkaWFyeSBzdGF0ZXMgZm9yIGJvdGguICovCglOdW1TdGF0ZSA9IEZBTFNFOwoJQ2Fwc1N0YXRlID0gRkFMU0U7CgoJYlNjYW4gPSBrZXljMnNjYW5bZXZlbnQtPmtleWNvZGVdICYgMHhGRjsKCVRSQUNFXyhrZXkpKCJiU2NhbiA9IDB4JTAyeC5cbiIsIGJTY2FuKTsKCglkd0ZsYWdzID0gMDsKCWlmICggZXZlbnQtPnR5cGUgPT0gS2V5UmVsZWFzZSApIGR3RmxhZ3MgfD0gS0VZRVZFTlRGX0tFWVVQOwoJaWYgKCB2a2V5ICYgMHgxMDAgKSAgICAgICAgICAgICAgZHdGbGFncyB8PSBLRVlFVkVOVEZfRVhURU5ERURLRVk7CgogICAgICAgIFgxMURSVl9zZW5kX2tleWJvYXJkX2lucHV0KCB2a2V5ICYgMHhmZiwgYlNjYW4sIGR3RmxhZ3MsIGV2ZW50X3RpbWUsIDAsIDAgKTsKICAgIH0KICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX0RldGVjdExheW91dAogKgogKiBDYWxsZWQgZnJvbSBYMTFEUlZfSW5pdEtleWJvYXJkCiAqICBUaGlzIHJvdXRpbmUgd2Fsa3MgdGhyb3VnaCB0aGUgZGVmaW5lZCBrZXlib2FyZCBsYXlvdXRzIGFuZCBzZWxlY3RzCiAqICB3aGljaGV2ZXIgbWF0Y2hlcyBtb3N0IGNsb3NlbHkuCiAqIFgxMSBsb2NrIG11c3QgYmUgaGVsZC4KICovCnN0YXRpYyB2b2lkClgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoIERpc3BsYXkgKmRpc3BsYXkgKQp7CiAgdW5zaWduZWQgY3VycmVudCwgbWF0Y2gsIG1pc21hdGNoLCBzZXEsIGksIHN5bXM7CiAgaW50IHNjb3JlLCBrZXljLCBrZXksIHBrZXksIG9rOwogIEtleVN5bSBrZXlzeW0gPSAwOwogIGNvbnN0IGNoYXIgKCpsa2V5KVtNQUlOX0xFTl1bNF07CiAgdW5zaWduZWQgbWF4X3NlcSA9IDA7CiAgaW50IG1heF9zY29yZSA9IDAsIGlzbWF0Y2ggPSAwOwogIGNoYXIgY2tleVsyNTZdWzRdOwoKICBzeW1zID0ga2V5c3ltc19wZXJfa2V5Y29kZTsKICBpZiAoc3ltcyA+IDQpIHsKICAgIFdBUk4oIiVkIGtleXN5bXMgcGVyIGtleWNvZGUgbm90IHN1cHBvcnRlZCwgc2V0IHRvIDRcbiIsIHN5bXMpOwogICAgc3ltcyA9IDQ7CiAgfQoKICBtZW1zZXQoIGNrZXksIDAsIHNpemVvZihja2V5KSApOwogIGZvciAoa2V5YyA9IG1pbl9rZXljb2RlOyBrZXljIDw9IG1heF9rZXljb2RlOyBrZXljKyspIHsKICAgICAgLyogZ2V0IGRhdGEgZm9yIGtleWNvZGUgZnJvbSBYIHNlcnZlciAqLwogICAgICBmb3IgKGkgPSAwOyBpIDwgc3ltczsgaSsrKSB7CiAgICAgICAgaWYgKCEoa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bSAoZGlzcGxheSwga2V5YywgaSkpKSBjb250aW51ZTsKCS8qIEFsbG93IGJvdGggb25lLWJ5dGUgYW5kIHR3by1ieXRlIG5hdGlvbmFsIGtleXN5bXMgKi8KCWlmICgoa2V5c3ltIDwgMHg4MDAwKSAmJiAoa2V5c3ltICE9ICcgJykpCiAgICAgICAgewojaWZkZWYgSEFWRV9YS0IKICAgICAgICAgICAgaWYgKCF1c2VfeGtiIHx8ICFYa2JUcmFuc2xhdGVLZXlTeW0oZGlzcGxheSwgJmtleXN5bSwgMCwgJmNrZXlba2V5Y11baV0sIDEsIE5VTEwpKQojZW5kaWYKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIlhLQiBjb3VsZCBub3QgdHJhbnNsYXRlIGtleXN5bSAlbGRcbiIsIGtleXN5bSk7CiAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAqIHdpdGggYXBwcm9wcmlhdGUgU2hpZnRNYXNrIGFuZCBNb2RlX3N3aXRjaCwgdXNlIFhMb29rdXBTdHJpbmcKICAgICAgICAgICAgICAgICAqIHRvIGdldCBjaGFyYWN0ZXIgaW4gdGhlIGxvY2FsIGVuY29kaW5nLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBja2V5W2tleWNdW2ldID0ga2V5c3ltICYgMHhGRjsKICAgICAgICAgICAgfQogICAgICAgIH0KCWVsc2UgewoJICBja2V5W2tleWNdW2ldID0gS0VZQk9BUkRfTWFwRGVhZEtleXN5bShrZXlzeW0pOwoJfQogICAgICB9CiAgfQoKICBmb3IgKGN1cnJlbnQgPSAwOyBtYWluX2tleV90YWJbY3VycmVudF0uY29tbWVudDsgY3VycmVudCsrKSB7CiAgICBUUkFDRSgiQXR0ZW1wdGluZyB0byBtYXRjaCBhZ2FpbnN0IFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2N1cnJlbnRdLmNvbW1lbnQpOwogICAgbWF0Y2ggPSAwOwogICAgbWlzbWF0Y2ggPSAwOwogICAgc2NvcmUgPSAwOwogICAgc2VxID0gMDsKICAgIGxrZXkgPSBtYWluX2tleV90YWJbY3VycmVudF0ua2V5OwogICAgcGtleSA9IC0xOwogICAgZm9yIChrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykgewogICAgICBpZiAoY2tleVtrZXljXVswXSkgewoJLyogc2VhcmNoIGZvciBhIG1hdGNoIGluIGxheW91dCB0YWJsZSAqLwoJLyogcmlnaHQgbm93LCB3ZSBqdXN0IGZpbmQgYW4gYWJzb2x1dGUgbWF0Y2ggZm9yIGRlZmluZWQgcG9zaXRpb25zICovCgkvKiAodW5kZWZpbmVkIHBvc2l0aW9ucyBhcmUgaWdub3JlZCwgc28gaWYgaXQncyBkZWZpbmVkIGFzICIzIyIgaW4gKi8KCS8qIHRoZSB0YWJsZSwgaXQncyBva2F5IHRoYXQgdGhlIFggc2VydmVyIGhhcyAiMyOjIiwgZm9yIGV4YW1wbGUpICovCgkvKiBob3dldmVyLCB0aGUgc2NvcmUgd2lsbCBiZSBoaWdoZXIgZm9yIGxvbmdlciBtYXRjaGVzICovCglmb3IgKGtleSA9IDA7IGtleSA8IE1BSU5fTEVOOyBrZXkrKykgewoJICBmb3IgKG9rID0gMCwgaSA9IDA7IChvayA+PSAwKSAmJiAoaSA8IHN5bXMpOyBpKyspIHsKCSAgICBpZiAoKCpsa2V5KVtrZXldW2ldICYmICgoKmxrZXkpW2tleV1baV0gPT0gY2tleVtrZXljXVtpXSkpCgkgICAgICBvaysrOwoJICAgIGlmICgoKmxrZXkpW2tleV1baV0gJiYgKCgqbGtleSlba2V5XVtpXSAhPSBja2V5W2tleWNdW2ldKSkKCSAgICAgIG9rID0gLTE7CgkgIH0KCSAgaWYgKG9rID4gMCkgewoJICAgIHNjb3JlICs9IG9rOwoJICAgIGJyZWFrOwoJICB9Cgl9CgkvKiBjb3VudCB0aGUgbWF0Y2hlcyBhbmQgbWlzbWF0Y2hlcyAqLwoJaWYgKG9rID4gMCkgewoJICBtYXRjaCsrOwoJICAvKiBhbmQgaG93IG11Y2ggdGhlIGtleWNvZGUgb3JkZXIgbWF0Y2hlcyAqLwoJICBpZiAoa2V5ID4gcGtleSkgc2VxKys7CgkgIHBrZXkgPSBrZXk7Cgl9IGVsc2UgewogICAgICAgICAgLyogcHJpbnQgc3BhY2VzIGluc3RlYWQgb2YgXDAncyAqLwogICAgICAgICAgY2hhciBzdHJbNV07CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBzdHJbaV0gPSBja2V5W2tleWNdW2ldID8gY2tleVtrZXljXVtpXSA6ICcgJzsKICAgICAgICAgIHN0cls0XSA9IDA7CiAgICAgICAgICBUUkFDRV8oa2V5KSgibWlzbWF0Y2ggZm9yIGtleXN5bSAweCUwNGxYLCBrZXljb2RlICVkLCBnb3QgJXNcbiIsIGtleXN5bSwga2V5Yywgc3RyICk7CiAgICAgICAgICBtaXNtYXRjaCsrOwogICAgICAgICAgc2NvcmUgLT0gc3ltczsKCX0KICAgICAgfQogICAgfQogICAgVFJBQ0UoIm1hdGNoZXM9JWQsIG1pc21hdGNoZXM9JWQsIHNlcT0lZCwgc2NvcmU9JWRcbiIsCgkgICBtYXRjaCwgbWlzbWF0Y2gsIHNlcSwgc2NvcmUpOwogICAgaWYgKChzY29yZSA+IG1heF9zY29yZSkgfHwKCSgoc2NvcmUgPT0gbWF4X3Njb3JlKSAmJiAoc2VxID4gbWF4X3NlcSkpKSB7CiAgICAgIC8qIGJlc3QgbWF0Y2ggc28gZmFyICovCiAgICAgIGtiZF9sYXlvdXQgPSBjdXJyZW50OwogICAgICBtYXhfc2NvcmUgPSBzY29yZTsKICAgICAgbWF4X3NlcSA9IHNlcTsKICAgICAgaXNtYXRjaCA9ICFtaXNtYXRjaDsKICAgIH0KICB9CiAgLyogd2UncmUgZG9uZSwgcmVwb3J0IHJlc3VsdHMgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCFpc21hdGNoKQogICAgV0FSTigiVXNpbmcgY2xvc2VzdCBtYXRjaCAoJXMpIGZvciBzY2FuL3ZpcnR1YWwgY29kZXMgbWFwcGluZy5cbiIsCiAgICAgICAgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwoKICBUUkFDRSgiZGV0ZWN0ZWQgbGF5b3V0IGlzIFwiJXNcIlxuIiwgbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmNvbW1lbnQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0luaXRLZXlib2FyZAogKi8Kdm9pZCBYMTFEUlZfSW5pdEtleWJvYXJkKCBEaXNwbGF5ICpkaXNwbGF5ICkKewogICAgS2V5U3ltICprc3A7CiAgICBYTW9kaWZpZXJLZXltYXAgKm1tcDsKICAgIEtleVN5bSBrZXlzeW07CiAgICBLZXlDb2RlICprY3A7CiAgICBYS2V5RXZlbnQgZTI7CiAgICBXT1JEIHNjYW4sIHZrZXksIE9FTXZrZXk7CiAgICBpbnQga2V5YywgaSwga2V5biwgc3ltczsKICAgIGNoYXIgY2tleVs0XT17MCwwLDAsMH07CiAgICBjb25zdCBjaGFyICgqbGtleSlbTUFJTl9MRU5dWzRdOwogICAgY2hhciB2a2V5X3VzZWRbMjU2XSA9IHsgMCB9OwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWERpc3BsYXlLZXljb2RlcyhkaXNwbGF5LCAmbWluX2tleWNvZGUsICZtYXhfa2V5Y29kZSk7CiAgICBrc3AgPSBYR2V0S2V5Ym9hcmRNYXBwaW5nKGRpc3BsYXksIG1pbl9rZXljb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOwogICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBrZXlzeW1zX3Blcl9rZXljb2RlLgogICAgICAgVGhlcmUgaXMgbm8gbmVlZCB0byBob2xkIGEgbG9jYWwgY29weSBvZiB0aGUga2V5c3ltcyB0YWJsZSAqLwogICAgWEZyZWUoa3NwKTsKCiAgICBtbXAgPSBYR2V0TW9kaWZpZXJNYXBwaW5nKGRpc3BsYXkpOwogICAga2NwID0gbW1wLT5tb2RpZmllcm1hcDsKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDEpIC8qIFRoZXJlIGFyZSA4IG1vZGlmaWVyIGtleXMgKi8KICAgIHsKICAgICAgICBpbnQgajsKCiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1tcC0+bWF4X2tleXBlcm1vZDsgaiArPSAxLCBrY3AgKz0gMSkKCSAgICBpZiAoKmtjcCkKICAgICAgICAgICAgewoJCWludCBrOwoKCQlmb3IgKGsgPSAwOyBrIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgayArPSAxKQogICAgICAgICAgICAgICAgICAgIGlmIChYS2V5Y29kZVRvS2V5c3ltKGRpc3BsYXksICprY3AsIGspID09IFhLX051bV9Mb2NrKQoJCSAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE51bUxvY2tNYXNrID0gMSA8PCBpOwogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oa2V5KSgiTnVtTG9ja01hc2sgaXMgJXhcbiIsIE51bUxvY2tNYXNrKTsKCQkgICAgfQogICAgICAgICAgICB9CiAgICB9CiAgICBYRnJlZU1vZGlmaWVybWFwKG1tcCk7CgogICAgLyogRGV0ZWN0IHRoZSBrZXlib2FyZCBsYXlvdXQgKi8KICAgIFgxMURSVl9LRVlCT0FSRF9EZXRlY3RMYXlvdXQoIGRpc3BsYXkgKTsKICAgIGxrZXkgPSBtYWluX2tleV90YWJba2JkX2xheW91dF0ua2V5OwogICAgc3ltcyA9IChrZXlzeW1zX3Blcl9rZXljb2RlID4gNCkgPyA0IDoga2V5c3ltc19wZXJfa2V5Y29kZTsKCiAgICAvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKICAgICAqIGtleWNvZGUgLT4gdmtleSArIHNjYW5jb2RlICsgZXh0ZW5kZWQKICAgICAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCgogICAgZTIuZGlzcGxheSA9IGRpc3BsYXk7CiAgICBlMi5zdGF0ZSA9IDA7CgogICAgT0VNdmtleSA9IFZLX09FTV84OyAvKiBuZXh0IGlzIGF2YWlsYWJsZS4gICovCiAgICBtZW1zZXQoa2V5YzJ2a2V5LCAwLCBzaXplb2Yoa2V5YzJ2a2V5KSk7CiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIGNoYXIgYnVmWzMwXTsKICAgICAgICBpbnQgaGF2ZV9jaGFyczsKCiAgICAgICAga2V5c3ltID0gMDsKICAgICAgICBlMi5rZXljb2RlID0gKEtleUNvZGUpa2V5YzsKICAgICAgICBoYXZlX2NoYXJzID0gWExvb2t1cFN0cmluZygmZTIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZrZXlzeW0sIE5VTEwpOwogICAgICAgIHZrZXkgPSAwOyBzY2FuID0gMDsKICAgICAgICBpZiAoa2V5c3ltKSAgLyogb3RoZXJ3aXNlLCBrZXljb2RlIG5vdCB1c2VkICovCiAgICAgICAgewogICAgICAgICAgICBpZiAoKGtleXN5bSA+PiA4KSA9PSAweEZGKSAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHZrZXkgPSBub25jaGFyX2tleV92a2V5W2tleXN5bSAmIDB4ZmZdOwogICAgICAgICAgICAgICAgc2NhbiA9IG5vbmNoYXJfa2V5X3NjYW5ba2V5c3ltICYgMHhmZl07CgkJLyogc2V0IGV4dGVuZGVkIGJpdCB3aGVuIG5lY2Vzc2FyeSAqLwoJCWlmIChzY2FuICYgMHgxMDApIHZrZXkgfD0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGtleXN5bSA+PiA4KSA9PSAweDEwMDhGRikgeyAvKiBYRnJlZTg2IHZlbmRvciBrZXlzICovCiAgICAgICAgICAgICAgICB2a2V5ID0geGZyZWU4Nl92ZW5kb3Jfa2V5X3ZrZXlba2V5c3ltICYgMHhmZl07CiAgICAgICAgICAgICAgICAvKiBBbGwgdmVuZG9yIGtleXMgYXJlIGV4dGVuZGVkIHdpdGggYSBzY2FuIGNvZGUgb2YgMCBwZXIgdGVzdGluZyBvbiBXaW5YUCAqLwogICAgICAgICAgICAgICAgc2NhbiA9IDB4MTAwOwoJCXZrZXkgfD0gMHgxMDA7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5c3ltID09IDB4MjApIHsgICAgICAgICAgICAgICAgIC8qIFNwYWNlYmFyICovCgkgICAgICAgIHZrZXkgPSBWS19TUEFDRTsKCQlzY2FuID0gMHgzOTsKCSAgICB9IGVsc2UgaWYgKGhhdmVfY2hhcnMpIHsKCSAgICAgIC8qIHdlIHNlZW0gdG8gbmVlZCB0byBzZWFyY2ggdGhlIGxheW91dC1kZXBlbmRlbnQgc2NhbmNvZGVzICovCgkgICAgICBpbnQgbWF4bGVuPTAsbWF4dmFsPS0xLG9rOwoJICAgICAgZm9yIChpPTA7IGk8c3ltczsgaSsrKSB7CgkJa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCBpKTsKCQlpZiAoKGtleXN5bTwweDgwMDApICYmIChrZXlzeW0hPScgJykpCiAgICAgICAgICAgICAgICB7CiNpZmRlZiBIQVZFX1hLQgogICAgICAgICAgICAgICAgICAgIGlmICghdXNlX3hrYiB8fCAhWGtiVHJhbnNsYXRlS2V5U3ltKGRpc3BsYXksICZrZXlzeW0sIDAsICZja2V5W2ldLCAxLCBOVUxMKSkKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogcXVlcnkgd2hhdCBrZXlzeW0gaXMgdXNlZCBhcyBNb2RlX3N3aXRjaCwgZmlsbCBYS2V5RXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBhcHByb3ByaWF0ZSBTaGlmdE1hc2sgYW5kIE1vZGVfc3dpdGNoLCB1c2UgWExvb2t1cFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBnZXQgY2hhcmFjdGVyIGluIHRoZSBsb2NhbCBlbmNvZGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNrZXlbaV0gPSBrZXlzeW0gJiAweEZGOwogICAgICAgICAgICAgICAgICAgIH0KCQl9IGVsc2UgewoJCSAgY2tleVtpXSA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCQl9CgkgICAgICB9CgkgICAgICAvKiBmaW5kIGtleSB3aXRoIGxvbmdlc3QgbWF0Y2ggc3RyZWFrICovCgkgICAgICBmb3IgKGtleW49MDsga2V5bjxNQUlOX0xFTjsga2V5bisrKSB7CgkJZm9yIChvaz0oKmxrZXkpW2tleW5dW2k9MF07IG9rJiYoaTw0KTsgaSsrKQoJCSAgaWYgKCgqbGtleSlba2V5bl1baV0gJiYgKCpsa2V5KVtrZXluXVtpXSE9Y2tleVtpXSkgb2s9MDsKCQlpZiAoIW9rKSBpLS07IC8qIHdlIG92ZXJzaG90ICovCgkJaWYgKG9rfHwoaT5tYXhsZW4pKSB7CgkJICBtYXhsZW49aTsgbWF4dmFsPWtleW47CgkJfQoJCWlmIChvaykgYnJlYWs7CgkgICAgICB9CgkgICAgICBpZiAobWF4dmFsPj0wKSB7CgkJLyogZ290IGl0ICovCgkJY29uc3QgV09SRCAoKmxzY2FuKVtNQUlOX0xFTl0gPSBtYWluX2tleV90YWJba2JkX2xheW91dF0uc2NhbjsKCQljb25zdCBXT1JEICgqbHZrZXkpW01BSU5fTEVOXSA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS52a2V5OwoJCXNjYW4gPSAoKmxzY2FuKVttYXh2YWxdOwoJCXZrZXkgPSAoKmx2a2V5KVttYXh2YWxdOwoJICAgICAgfQoJICAgIH0KICAgICAgICB9CiAgICAgICAgVFJBQ0UoImtleWNvZGUgJTA0eCA9PiB2a2V5ICUwNHhcbiIsIGUyLmtleWNvZGUsIHZrZXkpOwogICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAga2V5YzJzY2FuW2UyLmtleWNvZGVdID0gc2NhbjsKICAgICAgICBpZiAoKHZrZXkgJiAweGZmKSAmJiB2a2V5X3VzZWRbKHZrZXkgJiAweGZmKV0pCiAgICAgICAgICAgIFdBUk4oInZrZXkgJTA0eCBpcyBiZWluZyB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUga2V5Y29kZVxuIiwgdmtleSk7CiAgICAgICAgdmtleV91c2VkWyh2a2V5ICYgMHhmZildID0gMTsKICAgIH0gLyogZm9yICovCgojZGVmaW5lIFZLRVlfSUZfTk9UX1VTRUQodmtleSkgKHZrZXlfdXNlZFsodmtleSldID8gMCA6ICh2a2V5X3VzZWRbKHZrZXkpXSA9IDEsICh2a2V5KSkpCiAgICBmb3IgKGtleWMgPSBtaW5fa2V5Y29kZTsga2V5YyA8PSBtYXhfa2V5Y29kZTsga2V5YysrKQogICAgewogICAgICAgIHZrZXkgPSBrZXljMnZrZXlba2V5Y10gJiAweGZmOwogICAgICAgIGlmICh2a2V5KQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZTIua2V5Y29kZSA9IChLZXlDb2RlKWtleWM7CiAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIDApOwogICAgICAgIGlmICgha2V5c3ltKQogICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAvKiBmaW5kIGEgc3VpdGFibGUgbGF5b3V0LWRlcGVuZGVudCBWSyBjb2RlICovCiAgICAgICAgLyogKG1vc3QgV2luZWxpYiBhcHBzIG91Z2h0IHRvIGJlIGFibGUgdG8gd29yayB3aXRob3V0IGxheW91dCB0YWJsZXMhKSAqLwogICAgICAgIGZvciAoaSA9IDA7IChpIDwga2V5c3ltc19wZXJfa2V5Y29kZSkgJiYgKCF2a2V5KTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAga2V5c3ltID0gWExvb2t1cEtleXN5bSgmZTIsIGkpOwogICAgICAgICAgICBpZiAoKGtleXN5bSA+PSBYS18wICYmIGtleXN5bSA8PSBYS185KQogICAgICAgICAgICAgICAgfHwgKGtleXN5bSA+PSBYS19BICYmIGtleXN5bSA8PSBYS19aKSkgewogICAgICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoa2V5c3ltKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMDsgKGkgPCBrZXlzeW1zX3Blcl9rZXljb2RlKSAmJiAoIXZrZXkpOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CiAgICAgICAgICAgIHN3aXRjaCAoa2V5c3ltKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJzsnOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fMSk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcvJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzIpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnYCc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV8zKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1snOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNCk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICdcXCc6ICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNXzUpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnXSc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV82KTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1wnJzogICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fNyk7IGJyZWFrOwogICAgICAgICAgICBjYXNlICcsJzogICAgICAgICAgICAgdmtleSA9IFZLRVlfSUZfTk9UX1VTRUQoVktfT0VNX0NPTU1BKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy4nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fUEVSSU9EKTsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJy0nOiAgICAgICAgICAgICB2a2V5ID0gVktFWV9JRl9OT1RfVVNFRChWS19PRU1fTUlOVVMpOyBicmVhazsKICAgICAgICAgICAgY2FzZSAnKyc6ICAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKFZLX09FTV9QTFVTKTsgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghdmtleSkKICAgICAgICB7CiAgICAgICAgICAgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAogICAgICAgICAgICAgKiB0aGF0IGlzIChbMHhiYSwweGMwXSwgWzB4ZGIsMHhlNF0sIDB4ZTYgKGdpdmVuIHVwKSBldCBbMHhlOSwweGY1XSkgKi8KICAgICAgICAgICAgZG8KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3dpdGNoICgrK09FTXZrZXkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIDB4YzEgOiBPRU12a2V5PTB4ZGI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAweGU1IDogT0VNdmtleT0weGU5OyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMHhmNiA6IE9FTXZrZXk9MHhmNTsgV0FSTigiTm8gbW9yZSBPRU0gdmtleSBhdmFpbGFibGUhXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoT0VNdmtleSA8IDB4ZjUgJiYgdmtleV91c2VkW09FTXZrZXldKTsKCiAgICAgICAgICAgIHZrZXkgPSBWS0VZX0lGX05PVF9VU0VEKE9FTXZrZXkpOwoKICAgICAgICAgICAgaWYgKFRSQUNFX09OKGtleWJvYXJkKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgVFJBQ0UoIk9FTSBzcGVjaWZpYyB2aXJ0dWFsIGtleSAlWCBhc3NpZ25lZCB0byBrZXljb2RlICVYOlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0VNdmtleSwgZTIua2V5Y29kZSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiKCIpOwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGkgKz0gMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprc25hbWU7CgogICAgICAgICAgICAgICAgICAgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKICAgICAgICAgICAgICAgICAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWtzbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lID0gIk5vU3ltYm9sIjsKICAgICAgICAgICAgICAgICAgICBUUkFDRSggIiVsWCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFRSQUNFKCIpXG4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHZrZXkpCiAgICAgICAgewogICAgICAgICAgICBUUkFDRSgia2V5Y29kZSAlMDR4ID0+IHZrZXkgJTA0eFxuIiwgZTIua2V5Y29kZSwgdmtleSk7CiAgICAgICAgICAgIGtleWMydmtleVtlMi5rZXljb2RlXSA9IHZrZXk7CiAgICAgICAgfQogICAgfSAvKiBmb3IgKi8KI3VuZGVmIFZLRVlfSUZfTk9UX1VTRUQKCiAgICAvKiBJZiBzb21lIGtleXMgc3RpbGwgbGFjayBzY2FuY29kZXMsIGFzc2lnbiBzb21lIGFyYml0cmFyeSBvbmVzIHRvIHRoZW0gbm93ICovCiAgICBmb3IgKHNjYW4gPSAweDYwLCBrZXljID0gbWluX2tleWNvZGU7IGtleWMgPD0gbWF4X2tleWNvZGU7IGtleWMrKykKICAgICAgaWYgKGtleWMydmtleVtrZXljXSYmIWtleWMyc2NhbltrZXljXSkgewoJY29uc3QgY2hhciAqa3NuYW1lOwoJa2V5c3ltID0gWEtleWNvZGVUb0tleXN5bShkaXNwbGF5LCBrZXljLCAwKTsKCWtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOwoJaWYgKCFrc25hbWUpIGtzbmFtZSA9ICJOb1N5bWJvbCI7CgoJLyogc2hvdWxkIG1ha2Ugc3VyZSB0aGUgc2NhbmNvZGUgaXMgdW5hc3NpZ25lZCBoZXJlLCBidXQgPj0weDYwIGN1cnJlbnRseSBhbHdheXMgaXMgKi8KCglUUkFDRV8oa2V5KSgiYXNzaWduaW5nIHNjYW5jb2RlICUwMnggdG8gdW5pZGVudGlmaWVkIGtleWNvZGUgJTAyeCAoJXMpXG4iLHNjYW4sa2V5Yyxrc25hbWUpOwoJa2V5YzJzY2FuW2tleWNdPXNjYW4rKzsKICAgICAgfQoKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0QXN5bmNLZXlTdGF0ZSAoWDExRFJWLkApCiAqLwpTSE9SVCBYMTFEUlZfR2V0QXN5bmNLZXlTdGF0ZShJTlQga2V5KQp7CiAgICBTSE9SVCByZXR2YWw7CgogICAgLyogUGhvdG9zaG9wIGxpdmVsb2NrcyB1bmxlc3MgbW91c2UgZXZlbnRzIGFyZSBpbmNsdWRlZCBoZXJlICovCiAgICBYMTFEUlZfTXNnV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4KCAwLCBOVUxMLCAwLCBRU19LRVkgfCBRU19NT1VTRSwgMCApOwoKICAgIHJldHZhbCA9ICgoa2V5X3N0YXRlX3RhYmxlW2tleV0gJiAweDQwKSA/IDB4MDAwMSA6IDApIHwKICAgICAgICAgICAgICgoa2V5X3N0YXRlX3RhYmxlW2tleV0gJiAweDgwKSA/IDB4ODAwMCA6IDApOwogICAga2V5X3N0YXRlX3RhYmxlW2tleV0gJj0gfjB4NDA7CiAgICBUUkFDRV8oa2V5KSgiKCV4KSAtPiAleFxuIiwga2V5LCByZXR2YWwpOwogICAgcmV0dXJuIHJldHZhbDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXRMaXN0IChYMTFEUlYuQCkKICovClVJTlQgWDExRFJWX0dldEtleWJvYXJkTGF5b3V0TGlzdChJTlQgc2l6ZSwgSEtMICpoa2wpCnsKICAgIElOVCBpOwoKICAgIFRSQUNFKCIlZCwgJXBcbiIsIHNpemUsIGhrbCk7CgogICAgaWYgKCFzaXplKQogICAgewogICAgICAgIHNpemUgPSA0MDk2OyAvKiBob3BlIHdlIHdpbGwgbmV2ZXIgaGF2ZSB0aGF0IG1hbnkgKi8KICAgICAgICBoa2wgPSBOVUxMOwogICAgfQoKICAgIGZvciAoaSA9IDA7IG1haW5fa2V5X3RhYltpXS5jb21tZW50ICYmIChpIDwgc2l6ZSk7IGkrKykKICAgIHsKICAgICAgICBpZiAoaGtsKQogICAgICAgIHsKICAgICAgICAgICAgVUxPTkdfUFRSIGxheW91dCA9IG1haW5fa2V5X3RhYltpXS5sY2lkOwogICAgICAgICAgICBMQU5HSUQgbGFuZ2lkOwoKICAgICAgICAgICAgLyogc2VlIGNvbW1lbnQgZm9yIEdldEtleWJvYXJkTGF5b3V0ICovCiAgICAgICAgICAgIGxhbmdpZCA9IFBSSU1BUllMQU5HSUQoTEFOR0lERlJPTUxDSUQobGF5b3V0KSk7CiAgICAgICAgICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICAgICAgICAgIGxheW91dCB8PSAweGUwMDEgPDwgMTY7IC8qIEZJWE1FICovCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgICAgICAgICBoa2xbaV0gPSAoSEtMKWxheW91dDsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5Ym9hcmRMYXlvdXQgKFgxMURSVi5AKQogKi8KSEtMIFgxMURSVl9HZXRLZXlib2FyZExheW91dChEV09SRCBkd1RocmVhZGlkKQp7CiAgICBVTE9OR19QVFIgbGF5b3V0OwogICAgTEFOR0lEIGxhbmdpZDsKCiAgICBpZiAoZHdUaHJlYWRpZCAmJiBkd1RocmVhZGlkICE9IEdldEN1cnJlbnRUaHJlYWRJZCgpKQogICAgICAgIEZJWE1FKCJjb3VsZG4ndCByZXR1cm4ga2V5Ym9hcmQgbGF5b3V0IGZvciB0aHJlYWQgJTA0eFxuIiwgZHdUaHJlYWRpZCk7CgojaWYgMAogICAgbGF5b3V0ID0gbWFpbl9rZXlfdGFiW2tiZF9sYXlvdXRdLmxjaWQ7CiNlbHNlCiAgICAvKiBGSVhNRToKICAgICAqIFdpbndvcmQgdXNlcyByZXR1cm4gdmFsdWUgb2YgR2V0S2V5Ym9hcmRMYXlvdXQgYXMgYSBjb2RlcGFnZQogICAgICogdG8gdHJhbnNsYXRlIEFOU0kga2V5Ym9hcmQgbWVzc2FnZXMgdG8gdW5pY29kZS4gQnV0IHdlIGhhdmUKICAgICAqIGEgcHJvYmxlbSB3aXRoIGl0OiBmb3IgaW5zdGFuY2UgUG9saXNoIGtleWJvYXJkIGxheW91dCBpcwogICAgICogaWRlbnRpY2FsIHRvIHRoZSBVUyBvbmUsIGFuZCB0aGVyZWZvcmUgaW5zdGVhZCBvZiB0aGUgUG9saXNoCiAgICAgKiBsb2NhbGUgaWQgd2UgcmV0dXJuIHRoZSBVUyBvbmUuCiAgICAgKi8KICAgIGxheW91dCA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwojZW5kaWYKICAgIC8qIAogICAgICogTWljcm9zb2Z0IE9mZmljZSBleHBlY3RzIHRoaXMgdmFsdWUgdG8gYmUgc29tZXRoaW5nIHNwZWNpZmljCiAgICAgKiBmb3IgSmFwYW5lc2UgYW5kIEtvcmVhbiBXaW5kb3dzIHdpdGggYW4gSU1FIHRoZSB2YWx1ZSBpcyAweGUwMDEKICAgICAqIFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0byBzZWUgaWYgYW4gSU1FIGV4aXN0cyBhbmQgaWYgc28gdGhlbgogICAgICogc2V0IHRoaXMgd29yZCBwcm9wZXJseS4KICAgICAqLwogICAgbGFuZ2lkID0gUFJJTUFSWUxBTkdJRChMQU5HSURGUk9NTENJRChsYXlvdXQpKTsKICAgIGlmIChsYW5naWQgPT0gTEFOR19DSElORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0pBUEFORVNFIHx8IGxhbmdpZCA9PSBMQU5HX0tPUkVBTikKICAgICAgICBsYXlvdXQgfD0gMHhlMDAxIDw8IDE2OyAvKiBGSVhNRSAqLwogICAgZWxzZQogICAgICAgIGxheW91dCB8PSBsYXlvdXQgPDwgMTY7CgogICAgcmV0dXJuIChIS0wpbGF5b3V0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRLZXlib2FyZExheW91dE5hbWUgKFgxMURSVi5AKQogKi8KQk9PTCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXROYW1lKExQV1NUUiBuYW1lKQp7CiAgICBzdGF0aWMgY29uc3QgV0NIQVIgZm9ybWF0V1tdID0geyclJywnMCcsJzgnLCdsJywneCcsMH07CiAgICBEV09SRCBsYXlvdXQ7CiAgICBMQU5HSUQgbGFuZ2lkOwoKICAgIGxheW91dCA9IG1haW5fa2V5X3RhYltrYmRfbGF5b3V0XS5sY2lkOwogICAgLyogc2VlIGNvbW1lbnQgZm9yIEdldEtleWJvYXJkTGF5b3V0ICovCiAgICBsYW5naWQgPSBQUklNQVJZTEFOR0lEKExBTkdJREZST01MQ0lEKGxheW91dCkpOwogICAgaWYgKGxhbmdpZCA9PSBMQU5HX0NISU5FU0UgfHwgbGFuZ2lkID09IExBTkdfSkFQQU5FU0UgfHwgbGFuZ2lkID09IExBTkdfS09SRUFOKQogICAgICAgIGxheW91dCB8PSAweGUwMDEgPDwgMTY7IC8qIEZJWE1FICovCiAgICBlbHNlCiAgICAgICAgbGF5b3V0IHw9IGxheW91dCA8PCAxNjsKCiAgICBzcHJpbnRmVyhuYW1lLCBmb3JtYXRXLCBsYXlvdXQpOwogICAgVFJBQ0UoInJldHVybmluZyAlc1xuIiwgZGVidWdzdHJfdyhuYW1lKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTG9hZEtleWJvYXJkTGF5b3V0IChYMTFEUlYuQCkKICovCkhLTCBYMTFEUlZfTG9hZEtleWJvYXJkTGF5b3V0KExQQ1dTVFIgbmFtZSwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVzLCAlMDR4OiBzdHViIVxuIiwgZGVidWdzdHJfdyhuYW1lKSwgZmxhZ3MpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlVbmxvYWRLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpCT09MIFgxMURSVl9VbmxvYWRLZXlib2FyZExheW91dChIS0wgaGtsKQp7CiAgICBGSVhNRSgiJXA6IHN0dWIhXG4iLCBoa2wpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICAgIHJldHVybiBGQUxTRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQWN0aXZhdGVLZXlib2FyZExheW91dCAoWDExRFJWLkApCiAqLwpIS0wgWDExRFJWX0FjdGl2YXRlS2V5Ym9hcmRMYXlvdXQoSEtMIGhrbCwgVUlOVCBmbGFncykKewogICAgRklYTUUoIiVwLCAlMDR4OiBzdHViIVxuIiwgaGtsLCBmbGFncyk7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogICAgcmV0dXJuIDA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFgxMURSVl9NYXBwaW5nTm90aWZ5CiAqLwp2b2lkIFgxMURSVl9NYXBwaW5nTm90aWZ5KCBIV05EIGR1bW15LCBYRXZlbnQgKmV2ZW50ICkKewogICAgSFdORCBod25kOwoKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgWFJlZnJlc2hLZXlib2FyZE1hcHBpbmcoJmV2ZW50LT54bWFwcGluZyk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgWDExRFJWX0luaXRLZXlib2FyZCggdGhyZWFkX2Rpc3BsYXkoKSApOwoKICAgIGh3bmQgPSBHZXRGb2N1cygpOwogICAgaWYgKCFod25kKSBod25kID0gR2V0QWN0aXZlV2luZG93KCk7CiAgICBQb3N0TWVzc2FnZVcoaHduZCwgV01fSU5QVVRMQU5HQ0hBTkdFUkVRVUVTVCwKICAgICAgICAgICAgICAgICAwIC8qRklYTUUqLywgKExQQVJBTSlYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlWa0tleVNjYW5FeCAoWDExRFJWLkApCiAqCiAqIE5vdGU6IFdpbmRvd3MgaWdub3JlcyBIS0wgcGFyYW1ldGVyIGFuZCB1c2VzIGN1cnJlbnQgYWN0aXZlIGxheW91dCBpbnN0ZWFkCiAqLwpTSE9SVCBYMTFEUlZfVmtLZXlTY2FuRXgoV0NIQVIgd0NoYXIsIEhLTCBoa2wpCnsKICAgIERpc3BsYXkgKmRpc3BsYXkgPSB0aHJlYWRfZGlzcGxheSgpOwogICAgS2V5Q29kZSBrZXljb2RlOwogICAgS2V5U3ltIGtleXN5bTsKICAgIGludCBpLCBpbmRleDsKICAgIENIQVIgY0NoYXI7CiAgICBTSE9SVCByZXQ7CgogICAgLyogRklYTUU6IHdoYXQgaGFwcGVucyBpZiB3Q2hhciBpcyBub3QgYSBMYXRpbjEgY2hhcmFjdGVyIGFuZCBDUF9VTklYQ1AKICAgICAqIGlzIFVURi04IChtdWx0aWJ5dGUgZW5jb2RpbmcpPwogICAgICovCiAgICBpZiAoIVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVU5JWENQLCAwLCAmd0NoYXIsIDEsICZjQ2hhciwgMSwgTlVMTCwgTlVMTCkpCiAgICB7CiAgICAgICAgV0FSTigibm8gdHJhbnNsYXRpb24gZnJvbSB1bmljb2RlIHRvIENQX1VOSVhDUCBmb3IgMHglMDJ4XG4iLCB3Q2hhcik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIFRSQUNFKCJ3Q2hhciAweCUwMnggLT4gY0NoYXIgJyVjJ1xuIiwgd0NoYXIsIGNDaGFyKTsKCiAgICAvKiBjaGFyLT5rZXlzeW0gKHNhbWUgZm9yIEFOU0kgY2hhcnMpICovCiAgICBrZXlzeW0gPSAodW5zaWduZWQgY2hhciljQ2hhcjsgLyogKCEpIGNDaGFyIGlzIHNpZ25lZCAqLwogICAgaWYgKGtleXN5bSA8PSAyNykga2V5c3ltICs9IDB4RkYwMDsgLyogc3BlY2lhbCBjaGFycyA6IHJldHVybiwgYmFja3NwYWNlLi4uICovCgogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBrZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShkaXNwbGF5LCBrZXlzeW0pOyAgLyoga2V5c3ltIC0+IGtleWNvZGUgKi8KICAgIGlmICgha2V5Y29kZSkKICAgIHsKICAgICAgICBpZiAoa2V5c3ltID49IDB4RkYwMCkgLyogV2luZG93cyByZXR1cm5zIDB4MDI0MCArIGNDaGFyIGluIHRoaXMgY2FzZSAqLwogICAgICAgIHsKICAgICAgICAgICAgcmV0ID0gMHgwMjQwICsgY0NoYXI7IC8qIDB4MDIwMCBpbmRpY2F0ZXMgYSBjb250cm9sIGNoYXJhY3RlciAqLwogICAgICAgICAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgY3RybCBjaGFyICUjLjJ4XG4iLCByZXQpOwogICAgICAgICAgICB3aW5lX3RzeDExX3VubG9jaygpOwogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KICAgICAgICAvKiBJdCBkaWRuJ3Qgd29yayAuLi4gbGV0J3MgdHJ5IHdpdGggZGVhZGNoYXIgY29kZS4gKi8KICAgICAgICBUUkFDRSgicmV0cnlpbmcgd2l0aCB8IDB4RkUwMFxuIik7CiAgICAgICAga2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZGlzcGxheSwga2V5c3ltIHwgMHhGRTAwKTsKICAgIH0KICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgogICAgVFJBQ0UoIiclYycoJSNseCwgJWx1KTogZ290IGtleWNvZGUgJSMuMnggKCVkKVxuIiwKICAgICAgICAgICAgY0NoYXIsIGtleXN5bSwga2V5c3ltLCBrZXljb2RlLCBrZXljb2RlKTsKCiAgICAvKiBrZXljb2RlIC0+IChrZXljMnZrZXkpIHZrZXkgKi8KICAgIHJldCA9IGtleWMydmtleVtrZXljb2RlXTsKCiAgICBpZiAoIWtleWNvZGUgfHwgIXJldCkKICAgIHsKICAgICAgICBUUkFDRSgia2V5Y29kZSBmb3IgJyVjJyBub3QgZm91bmQsIHJldHVybmluZyAtMVxuIiwgY0NoYXIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpbmRleCA9IC0xOwogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAvKiBmaW5kIHNoaWZ0IHN0YXRlICovCiAgICB7CiAgICAgICAgaWYgKFhLZXljb2RlVG9LZXlzeW0oZGlzcGxheSwga2V5Y29kZSwgaSkgPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIHN3aXRjaCAoaW5kZXgpCiAgICB7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICBXQVJOKCJLZXlzeW0gJWx4IG5vdCBmb3VuZCB3aGlsZSBwYXJzaW5nIHRoZSBrZXljb2RlIHRhYmxlXG4iLCBrZXlzeW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CgogICAgICAgIGNhc2UgMDogYnJlYWs7CiAgICAgICAgY2FzZSAxOiByZXQgKz0gMHgwMTAwOyBicmVhazsKICAgICAgICBjYXNlIDI6IHJldCArPSAweDA2MDA7IGJyZWFrOwogICAgICAgIGNhc2UgMzogcmV0ICs9IDB4MDcwMDsgYnJlYWs7CiAgICB9CiAgICAvKgogICAgICBpbmRleCA6IDAgICAgIGFkZHMgMHgwMDAwCiAgICAgIGluZGV4IDogMSAgICAgYWRkcyAweDAxMDAgKHNoaWZ0KQogICAgICBpbmRleCA6ID8gICAgIGFkZHMgMHgwMjAwIChjdHJsKQogICAgICBpbmRleCA6IDIgICAgIGFkZHMgMHgwNjAwIChjdHJsK2FsdCkKICAgICAgaW5kZXggOiAzICAgICBhZGRzIDB4MDcwMCAoY3RybCthbHQrc2hpZnQpCiAgICAgKi8KCiAgICBUUkFDRSgiIC4uLiByZXR1cm5pbmcgJSMuMnhcbiIsIHJldCk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1hcFZpcnR1YWxLZXlFeCAoWDExRFJWLkApCiAqLwpVSU5UIFgxMURSVl9NYXBWaXJ0dWFsS2V5RXgoVUlOVCB3Q29kZSwgVUlOVCB3TWFwVHlwZSwgSEtMIGhrbCkKewogICAgRGlzcGxheSAqZGlzcGxheSA9IHRocmVhZF9kaXNwbGF5KCk7CgojZGVmaW5lIHJldHVybk1WSyh2YWx1ZSkgeyBUUkFDRSgicmV0dXJuaW5nIDB4JXguXG4iLHZhbHVlKTsgcmV0dXJuIHZhbHVlOyB9CgogICAgVFJBQ0UoIndDb2RlPTB4JXgsIHdNYXBUeXBlPSVkLCBoa2wgJXBcbiIsIHdDb2RlLCB3TWFwVHlwZSwgaGtsKTsKICAgIGlmIChoa2wgIT0gWDExRFJWX0dldEtleWJvYXJkTGF5b3V0KDApKQogICAgICAgIEZJWE1FKCJrZXlib2FyZCBsYXlvdXQgJXAgaXMgbm90IHN1cHBvcnRlZFxuIiwgaGtsKTsKCglzd2l0Y2god01hcFR5cGUpIHsKCQljYXNlIE1BUFZLX1ZLX1RPX1ZTQzogLyogdmtleS1jb2RlIHRvIHNjYW4tY29kZSAqLwoJCWNhc2UgTUFQVktfVktfVE9fVlNDX0VYOiAvKiBGSVhNRTogc2hvdWxkIGRpZmZlcmVudGlhdGUgYmV0d2VlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0IGtleXMgKi8KCQl7CgkJCS8qIGxldCdzIGRvIHZrZXkgLT4ga2V5Y29kZSAtPiBzY2FuICovCgkJCWludCBrZXljOwoJCQlmb3IgKGtleWM9bWluX2tleWNvZGU7IGtleWM8PW1heF9rZXljb2RlOyBrZXljKyspCgkJCQlpZiAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHdDb2RlKQoJCQkJCXJldHVybk1WSyAoa2V5YzJzY2FuW2tleWNdICYgMHhGRik7CgkJCVRSQUNFKCJyZXR1cm5pbmcgbm8gc2Nhbi1jb2RlLlxuIik7CgkJICAgICAgICByZXR1cm4gMDsKCQl9CgkJY2FzZSBNQVBWS19WU0NfVE9fVks6IC8qIHNjYW4tY29kZSB0byB2a2V5LWNvZGUgKi8KCQljYXNlIE1BUFZLX1ZTQ19UT19WS19FWDogLyogRklYTUU6IHNob3VsZCBkaWZmZXJlbnRpYXRlIGJldHdlZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCBrZXlzICovCgkJewoJCQkvKiBsZXQncyBkbyBzY2FuIC0+IGtleWNvZGUgLT4gdmtleSAqLwoJCQlpbnQga2V5YzsKCQkJZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQoJCQkJaWYgKChrZXljMnNjYW5ba2V5Y10gJiAweEZGKSA9PSAod0NvZGUgJiAweEZGKSkKCQkJCQlyZXR1cm5NVksgKGtleWMydmtleVtrZXljXSAmIDB4RkYpOwoJCQlUUkFDRSgicmV0dXJuaW5nIG5vIHZrZXktY29kZS5cbiIpOwoJCSAgICAgICAgcmV0dXJuIDA7CgkJfQoJCWNhc2UgTUFQVktfVktfVE9fQ0hBUjogLyogdmtleS1jb2RlIHRvIHVuc2hpZnRlZCBBTlNJIGNvZGUgKi8KCQl7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHN0aWxsIGRvbid0IGtub3cgd2hhdCAidW5zaGlmdGVkIiBtZWFucy4gaW4gd2luZG93cyBWS19XICgweDU3KQogICAgICAgICAgICAgICAgICAgICAgICAgKiByZXR1cm5zIDB4NTcsIHdoaWNoIGlzIHVwZXJjYXNlICdXJy4gU28gd2UgaGF2ZSB0byByZXR1cm4gdGhlIHVwcGVyY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBrZXkuLiBMb29rcyBsaWtlIHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBNUyBkb2NzPwogICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdHJ1ZSBmb3IgbGV0dGVycywgZm9yIGV4YW1wbGUgVktfMCByZXR1cm5zICcwJyBub3QgJyknLgogICAgICAgICAgICAgICAgICAgICAgICAgKiAtIGhlbmNlIHdlIHVzZSB0aGUgbG9jayBtYXNrIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCQkvKiBsZXQncyBkbyB2a2V5IC0+IGtleWNvZGUgLT4gKFhMb29rdXBTdHJpbmcpIGFuc2kgY2hhciAqLwoJCQlYS2V5RXZlbnQgZTsKCQkJS2V5U3ltIGtleXN5bTsKCQkJaW50IGtleWMsIGxlbjsKCQkJY2hhciBzWzEwXTsKCgkJCWUuZGlzcGxheSA9IGRpc3BsYXk7CgkJCWUuc3RhdGUgPSAwOwoJCQllLmtleWNvZGUgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgoJCQkvKiBXZSBleGl0IG9uIHRoZSBmaXJzdCBrZXljb2RlIGZvdW5kLCB0byBzcGVlZCB1cCB0aGUgdGhpbmcuICovCgkJCWZvciAoa2V5Yz1taW5fa2V5Y29kZTsgKGtleWM8PW1heF9rZXljb2RlKSAmJiAoIWUua2V5Y29kZSkgOyBrZXljKyspCgkJCXsgLyogRmluZCBhIGtleWNvZGUgdGhhdCBjb3VsZCBoYXZlIGdlbmVyYXRlZCB0aGlzIHZpcnR1YWwga2V5ICovCgkJCSAgICBpZiAgKChrZXljMnZrZXlba2V5Y10gJiAweEZGKSA9PSB3Q29kZSkKCQkJICAgIHsgLyogV2UgZmlsdGVyIHRoZSBleHRlbmRlZCBiaXQsIHdlIGRvbid0IGtub3cgaXQgKi8KCQkJICAgICAgICBlLmtleWNvZGUgPSBrZXljOyAvKiBTdG9yZSBpdCB0ZW1wb3JhcmlseSAqLwoJCQkJaWYgKChFVkVOVF9ldmVudF90b192a2V5KDAsJmUpICYgMHhGRikgIT0gd0NvZGUpIHsKCQkJCSAgICBlLmtleWNvZGUgPSAwOyAvKiBXcm9uZyBvbmUgKGV4OiBiZWNhdXNlIG9mIHRoZSBOdW1Mb2NrCgkJCQkJIHN0YXRlKSwgc28gc2V0IGl0IHRvIDAsIHdlJ2xsIGZpbmQgYW5vdGhlciBvbmUgKi8KCQkJCX0KCQkJICAgIH0KCQkJfQoKCQkJaWYgKCh3Q29kZT49VktfTlVNUEFEMCkgJiYgKHdDb2RlPD1WS19OVU1QQUQ5KSkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgd0NvZGUtVktfTlVNUEFEMCtYS19LUF8wKTsKCgkJCWlmICh3Q29kZT09VktfREVDSU1BTCkKCQkJICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgoJCQlpZiAoIWUua2V5Y29kZSkKCQkJewoJCQkgIFdBUk4oIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhXG4iLCB3Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCQkJICByZXR1cm4gMDsgLyogd2hhdGV2ZXIgKi8KCQkJfQoJCQlUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gWExvb2t1cFN0cmluZygmZSwgcywgc2l6ZW9mKHMpLCAma2V5c3ltLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdDSEFSIHdjaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VOSVhDUCwgMCwgcywgbGVuLCAmd2NoLCAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5NVksodG91cHBlclcod2NoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJVFJBQ0UoInJldHVybmluZyBubyBBTlNJLlxuIik7CgkJCXJldHVybiAwOwoJCX0KCQlkZWZhdWx0OiAvKiByZXNlcnZlZCAqLwoJCQlGSVhNRSgiVW5rbm93biB3TWFwVHlwZSAlZCAhXG4iLCB3TWFwVHlwZSk7CgkJCXJldHVybiAwOwoJfQoJcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0S2V5TmFtZVRleHQgKFgxMURSVi5AKQogKi8KSU5UIFgxMURSVl9HZXRLZXlOYW1lVGV4dChMT05HIGxQYXJhbSwgTFBXU1RSIGxwQnVmZmVyLCBJTlQgblNpemUpCnsKICBpbnQgdmtleSwgYW5zaSwgc2NhbkNvZGU7CiAgS2V5Q29kZSBrZXljOwogIGludCBrZXlpOwogIEtleVN5bSBrZXlzOwogIGNoYXIgKm5hbWU7CgogIHNjYW5Db2RlID0gbFBhcmFtID4+IDE2OwogIHNjYW5Db2RlICY9IDB4MWZmOyAgLyoga2VlcCAiZXh0ZW5kZWQta2V5IiBmbGFnIHdpdGggY29kZSAqLwoKICAvKiBGSVhNRTogc2hvdWxkIHVzZSBNVksgdHlwZSAzIChOVCB2ZXJzaW9uIHRoYXQgZGlzdGluZ3Vpc2hlcyByaWdodCBhbmQgbGVmdCAqLwogIHZrZXkgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHNjYW5Db2RlLCAxLCBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpOwoKICAvKiAgaGFuZGxlICJkb24ndCBjYXJlIiBiaXQgKDB4MDIwMDAwMDApICovCiAgaWYgKCEobFBhcmFtICYgMHgwMjAwMDAwMCkpIHsKICAgIHN3aXRjaCAodmtleSkgewogICAgICAgICBjYXNlIFZLX0xTSElGVDoKICAgICAgICAgY2FzZSBWS19SU0hJRlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX1NISUZUOwogICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBWS19MQ09OVFJPTDoKICAgICAgIGNhc2UgVktfUkNPTlRST0w6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmtleSA9IFZLX0NPTlRST0w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIFZLX0xNRU5VOgogICAgICAgICAgY2FzZSBWS19STUVOVToKICAgICAgICAgICAgICAgICAgICAgICAgICB2a2V5ID0gVktfTUVOVTsKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgIH0KICB9CgogIGFuc2kgPSBYMTFEUlZfTWFwVmlydHVhbEtleUV4KHZrZXksIDIsIFgxMURSVl9HZXRLZXlib2FyZExheW91dCgwKSk7CiAgVFJBQ0UoInNjYW4gMHglMDR4LCB2a2V5IDB4JTA0eCwgQU5TSSAweCUwNHhcbiIsIHNjYW5Db2RlLCB2a2V5LCBhbnNpKTsKCiAgLyogZmlyc3QgZ2V0IHRoZSBuYW1lIG9mIHRoZSAicmVndWxhciIga2V5cyB3aGljaCBpcyB0aGUgVXBwZXIgY2FzZQogICAgIHZhbHVlIG9mIHRoZSBrZXljYXAgaW1wcmludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBpZiAoICgoYW5zaSA+PSAweDIxKSAmJiAoYW5zaSA8PSAweDdlKSkgJiYKICAgICAgIChzY2FuQ29kZSAhPSAweDEzNykgJiYgICAvKiBQcnRTY24gICAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4MTM1KSAmJiAgIC8qIG51bXBhZCAvICovCiAgICAgICAoc2NhbkNvZGUgIT0gMHgzNyApICYmICAgLyogbnVtcGFkICogKi8KICAgICAgIChzY2FuQ29kZSAhPSAweDRhICkgJiYgICAvKiBudW1wYWQgLSAqLwogICAgICAgKHNjYW5Db2RlICE9IDB4NGUgKSApICAgIC8qIG51bXBhZCArICovCiAgICAgIHsKICAgICAgICBpZiAoKG5TaXplID49IDIpICYmIGxwQnVmZmVyKQoJewogICAgICAgICAgKmxwQnVmZmVyID0gdG91cHBlclcoKFdDSEFSKWFuc2kpOwogICAgICAgICAgKihscEJ1ZmZlcisxKSA9IDA7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgZWxzZQogICAgICAgIHJldHVybiAwOwogIH0KCiAgLyogRklYTUU6IGhvcnJpYmxlIGhhY2sgdG8gZml4IGZ1bmN0aW9uIGtleXMuIFdpbmRvd3MgcmVwb3J0cyBzY2FuY29kZQogICAgICAgICAgICB3aXRob3V0ICJleHRlbmRlZC1rZXkiIGZsYWcuIEhvd2V2ZXIgV2luZSBnZW5lcmF0ZXMgc2NhbmNvZGUKICAgICAgICAgICAgKndpdGgqICJleHRlbmRlZC1rZXkiIGZsYWcuIFNlZW1zIHRvIG9jY3VyICpvbmx5KiBmb3IgdGhlCiAgICAgICAgICAgIGZ1bmN0aW9uIGtleXMuIFNvb29vLi4gV2Ugd2lsbCBsZWF2ZSB0aGUgdGFibGUgYWxvbmUgYW5kCiAgICAgICAgICAgIGZ1ZGdlIHRoZSBsb29rdXAgaGVyZSB0aWxsIHRoZSBvdGhlciBwYXJ0IGlzIGZvdW5kIGFuZCBmaXhlZCEhISAqLwoKICBpZiAoICgoc2NhbkNvZGUgPj0gMHgxM2IpICYmIChzY2FuQ29kZSA8PSAweDE0NCkpIHx8CiAgICAgICAoc2NhbkNvZGUgPT0gMHgxNTcpIHx8IChzY2FuQ29kZSA9PSAweDE1OCkpCiAgICBzY2FuQ29kZSAmPSAweGZmOyAgIC8qIHJlbW92ZSAiZXh0ZW5kZWQta2V5IiBmbGFnIGZvciBGeCBrZXlzICovCgogIC8qIGxldCdzIGRvIHNjYW5jb2RlIC0+IGtleWNvZGUgLT4ga2V5c3ltIC0+IFN0cmluZyAqLwoKICBmb3IgKGtleWk9bWluX2tleWNvZGU7IGtleWk8PW1heF9rZXljb2RlOyBrZXlpKyspCiAgICAgIGlmICgoa2V5YzJzY2FuW2tleWldKSA9PSBzY2FuQ29kZSkKICAgICAgICAgYnJlYWs7CiAgaWYgKGtleWkgPD0gbWF4X2tleWNvZGUpCiAgewogICAgICB3aW5lX3RzeDExX2xvY2soKTsKICAgICAga2V5YyA9IChLZXlDb2RlKSBrZXlpOwogICAgICBrZXlzID0gWEtleWNvZGVUb0tleXN5bSh0aHJlYWRfZGlzcGxheSgpLCBrZXljLCAwKTsKICAgICAgbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzKTsKICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgVFJBQ0UoImZvdW5kIHNjYW49JTA0eCBrZXljPSUwNHgga2V5c3ltPSUwNHggc3RyaW5nPSVzXG4iLAogICAgICAgICAgICBzY2FuQ29kZSwga2V5YywgKGludClrZXlzLCBuYW1lKTsKICAgICAgaWYgKGxwQnVmZmVyICYmIG5TaXplICYmIG5hbWUpCiAgICAgIHsKICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCBuYW1lLCAtMSwgbHBCdWZmZXIsIG5TaXplKTsKICAgICAgICAgIGxwQnVmZmVyW25TaXplIC0gMV0gPSAwOwogICAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICB9CgogIC8qIEZpbmFsbHkgaXNzdWUgV0FSTiBmb3IgdW5rbm93biBrZXlzICAgKi8KCiAgV0FSTigiKCUwOHgsJXAsJWQpOiB1bnN1cHBvcnRlZCBrZXksIHZrZXk9JTA0eCwgYW5zaT0lMDR4XG4iLGxQYXJhbSxscEJ1ZmZlcixuU2l6ZSx2a2V5LGFuc2kpOwogIGlmIChscEJ1ZmZlciAmJiBuU2l6ZSkKICAgICpscEJ1ZmZlciA9IDA7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJWDExRFJWX0tFWUJPQVJEX01hcERlYWRLZXlzeW0KICovCnN0YXRpYyBjaGFyIEtFWUJPQVJEX01hcERlYWRLZXlzeW0oS2V5U3ltIGtleXN5bSkKewoJc3dpdGNoIChrZXlzeW0pCgkgICAgewoJLyogc3ltYm9saWMgQVNDSUkgaXMgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiByZmMxMzQ1ICovCiNpZmRlZiBYS19kZWFkX3RpbGRlCgkgICAgY2FzZSBYS19kZWFkX3RpbGRlIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTdFIDogLyogWGZyZWUncyBYS19EdGlsZGUgKi8KCQlyZXR1cm4gJ34nOwkvKiAnPyAqLwojaWZkZWYgWEtfZGVhZF9hY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLwoJCXJldHVybiAweGI0OwkvKiAnJyAqLwojaWZkZWYgWEtfZGVhZF9jaXJjdW1mbGV4CgkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXg6CiNlbmRpZgoJICAgIGNhc2UgMHgxMDAwRkU1RSA6IC8qIFhmcmVlJ3MgWEtfRGNpcmN1bWZsZXhfYWNjZW50ICovCgkJcmV0dXJuICdeJzsJLyogJz4gKi8KI2lmZGVmIFhLX2RlYWRfZ3JhdmUKCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgojZW5kaWYKCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KCQlyZXR1cm4gJ2AnOwkvKiAnISAqLwojaWZkZWYgWEtfZGVhZF9kaWFlcmVzaXMKCSAgICBjYXNlIFhLX2RlYWRfZGlhZXJlc2lzIDoKI2VuZGlmCgkgICAgY2FzZSAweDEwMDBGRTIyIDogLyogWGZyZWUncyBYS19EZGlhZXJlc2lzICovCgkJcmV0dXJuIDB4YTg7CS8qICc6ICovCiNpZmRlZiBYS19kZWFkX2NlZGlsbGEKCSAgICBjYXNlIFhLX2RlYWRfY2VkaWxsYSA6CgkgICAgICAgIHJldHVybiAweGI4OwkvKiAnLCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfbWFjcm9uCgkgICAgY2FzZSBYS19kZWFkX21hY3JvbiA6CgkgICAgICAgIHJldHVybiAnLSc7CS8qICdtIGlzbid0IGRlZmluZWQgb24gaXNvLTg4NTkteCAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfYnJldmUKCSAgICBjYXNlIFhLX2RlYWRfYnJldmUgOgoJICAgICAgICByZXR1cm4gMHhhMjsJLyogJyggKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX2Fib3ZlZG90CgkgICAgY2FzZSBYS19kZWFkX2Fib3ZlZG90IDoKCSAgICAgICAgcmV0dXJuIDB4ZmY7CS8qICcuICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9hYm92ZXJpbmcKCSAgICBjYXNlIFhLX2RlYWRfYWJvdmVyaW5nIDoKCSAgICAgICAgcmV0dXJuICcwJzsJLyogJzAgaXNuJ3QgZGVmaW5lZCBvbiBpc28tODg1OS14ICovCiNlbmRpZgojaWZkZWYgWEtfZGVhZF9kb3VibGVhY3V0ZQoJICAgIGNhc2UgWEtfZGVhZF9kb3VibGVhY3V0ZSA6CgkgICAgICAgIHJldHVybiAweGJkOwkvKiAnIiAqLwojZW5kaWYKI2lmZGVmIFhLX2RlYWRfY2Fyb24KCSAgICBjYXNlIFhLX2RlYWRfY2Fyb24gOgoJICAgICAgICByZXR1cm4gMHhiNzsJLyogJzwgKi8KI2VuZGlmCiNpZmRlZiBYS19kZWFkX29nb25lawoJICAgIGNhc2UgWEtfZGVhZF9vZ29uZWsgOgoJICAgICAgICByZXR1cm4gMHhiMjsJLyogJzsgKi8KI2VuZGlmCi8qIEZJWE1FOiBJIGRvbid0IGtub3cgdGhpcyB0aHJlZS4KCSAgICBjYXNlIFhLX2RlYWRfaW90YSA6CgkgICAgICAgIHJldHVybiAnaSc7CgkgICAgY2FzZSBYS19kZWFkX3ZvaWNlZF9zb3VuZCA6CgkgICAgICAgIHJldHVybiAndic7CgkgICAgY2FzZSBYS19kZWFkX3NlbWl2b2ljZWRfc291bmQgOgoJICAgICAgICByZXR1cm4gJ3MnOwoqLwoJICAgIH0KCVRSQUNFKCJubyBjaGFyYWN0ZXIgZm9yIGRlYWQga2V5c3ltIDB4JTA4bHhcbiIsa2V5c3ltKTsKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVRvVW5pY29kZUV4IChYMTFEUlYuQCkKICoKICogVGhlIFRvVW5pY29kZSBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBzcGVjaWZpZWQgdmlydHVhbC1rZXkgY29kZSBhbmQga2V5Ym9hcmQKICogc3RhdGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgV2luZG93cyBjaGFyYWN0ZXIgb3IgY2hhcmFjdGVycy4KICoKICogSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgYSBkZWFkIGtleSwgdGhlIHJldHVybiB2YWx1ZSBpcyBuZWdhdGl2ZS4gT3RoZXJ3aXNlLAogKiBpdCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAqIFZhbHVlCU1lYW5pbmcKICogMAlUaGUgc3BlY2lmaWVkIHZpcnR1YWwga2V5IGhhcyBubyB0cmFuc2xhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGtleWJvYXJkLgogKiAxCU9uZSBXaW5kb3dzIGNoYXJhY3RlciB3YXMgY29waWVkIHRvIHRoZSBidWZmZXIuCiAqIDIJVHdvIGNoYXJhY3RlcnMgd2VyZSBjb3BpZWQgdG8gdGhlIGJ1ZmZlci4gVGhpcyB1c3VhbGx5IGhhcHBlbnMgd2hlbiBhCiAqICAgICAgZGVhZC1rZXkgY2hhcmFjdGVyIChhY2NlbnQgb3IgZGlhY3JpdGljKSBzdG9yZWQgaW4gdGhlIGtleWJvYXJkIGxheW91dCBjYW5ub3QKICogICAgICBiZSBjb21wb3NlZCB3aXRoIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBrZXkgdG8gZm9ybSBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAqCiAqIEZJWE1FIDogc2hvdWxkIGRvIHRoZSBhYm92ZSAocmV0dXJuIDIgZm9yIG5vbiBtYXRjaGluZyBkZWFkY2hhcitjaGFyIGNvbWJpbmF0aW9ucykKICoKICovCklOVCBYMTFEUlZfVG9Vbmljb2RlRXgoVUlOVCB2aXJ0S2V5LCBVSU5UIHNjYW5Db2RlLCBMUEJZVEUgbHBLZXlTdGF0ZSwKCQkgICAgIExQV1NUUiBidWZXLCBpbnQgYnVmV19zaXplLCBVSU5UIGZsYWdzLCBIS0wgaGtsKQp7CiAgICBEaXNwbGF5ICpkaXNwbGF5ID0gdGhyZWFkX2Rpc3BsYXkoKTsKICAgIFhLZXlFdmVudCBlOwogICAgS2V5U3ltIGtleXN5bSA9IDA7CiAgICBJTlQgcmV0OwogICAgaW50IGtleWM7CiAgICBjaGFyIGxwQ2hhclsxMF07CiAgICBIV05EIGZvY3VzOwogICAgWElDIHhpYzsKICAgIFN0YXR1cyBzdGF0dXMgPSAwOwoKICAgIGlmIChzY2FuQ29kZSAmIDB4ODAwMCkKICAgIHsKICAgICAgICBUUkFDRSgiS2V5IFVQLCBkb2luZyBub3RoaW5nXG4iICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKGhrbCAhPSBYMTFEUlZfR2V0S2V5Ym9hcmRMYXlvdXQoMCkpCiAgICAgICAgRklYTUUoImtleWJvYXJkIGxheW91dCAlcCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBoa2wpOwoKICAgIGlmICgobHBLZXlTdGF0ZVtWS19NRU5VXSAmIDB4ODApICYmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkpCiAgICB7CiAgICAgICAgVFJBQ0UoIkN0cmwrQWx0K1trZXldIHdvbid0IGdlbmVyYXRlIGEgY2hhcmFjdGVyXG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OwogICAgZS5rZXljb2RlID0gMDsKICAgIGUuc3RhdGUgPSAwOwogICAgZS50eXBlID0gS2V5UHJlc3M7CgogICAgZm9jdXMgPSBHZXRGb2N1cygpOwogICAgaWYgKGZvY3VzKSBmb2N1cyA9IEdldEFuY2VzdG9yKCBmb2N1cywgR0FfUk9PVCApOwogICAgaWYgKCFmb2N1cykgZm9jdXMgPSBHZXRBY3RpdmVXaW5kb3coKTsKICAgIGUud2luZG93ID0gWDExRFJWX2dldF93aG9sZV93aW5kb3coIGZvY3VzICk7CiAgICB4aWMgPSBYMTFEUlZfZ2V0X2ljKCBmb2N1cyApOwoKICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCiAgICB7CglUUkFDRSgiU2hpZnRNYXNrID0gJTA0eFxuIiwgU2hpZnRNYXNrKTsKCWUuc3RhdGUgfD0gU2hpZnRNYXNrOwogICAgfQogICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDAxKQogICAgewoJVFJBQ0UoIkxvY2tNYXNrID0gJTA0eFxuIiwgTG9ja01hc2spOwoJZS5zdGF0ZSB8PSBMb2NrTWFzazsKICAgIH0KICAgIGlmIChscEtleVN0YXRlW1ZLX0NPTlRST0xdICYgMHg4MCkKICAgIHsKCVRSQUNFKCJDb250cm9sTWFzayA9ICUwNHhcbiIsIENvbnRyb2xNYXNrKTsKCWUuc3RhdGUgfD0gQ29udHJvbE1hc2s7CiAgICB9CiAgICBpZiAobHBLZXlTdGF0ZVtWS19OVU1MT0NLXSAmIDB4MDEpCiAgICB7CglUUkFDRSgiTnVtTG9ja01hc2sgPSAlMDR4XG4iLCBOdW1Mb2NrTWFzayk7CgllLnN0YXRlIHw9IE51bUxvY2tNYXNrOwogICAgfQoKICAgIC8qIFJlc3RvcmUgc2F2ZWQgQWx0R3Igc3RhdGUgKi8KICAgIFRSQUNFKCJBbHRHck1hc2sgPSAlMDR4XG4iLCBBbHRHck1hc2spOwogICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CgogICAgVFJBQ0VfKGtleSkoIiglMDRYLCAlMDRYKSA6IGZha2VkIHN0YXRlID0gMHglMDR4XG4iLAoJCXZpcnRLZXksIHNjYW5Db2RlLCBlLnN0YXRlKTsKICAgIHdpbmVfdHN4MTFfbG9jaygpOwogICAgLyogV2UgZXhpdCBvbiB0aGUgZmlyc3Qga2V5Y29kZSBmb3VuZCwgdG8gc3BlZWQgdXAgdGhlIHRoaW5nLiAqLwogICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyAoa2V5Yzw9bWF4X2tleWNvZGUpICYmICghZS5rZXljb2RlKSA7IGtleWMrKykKICAgICAgeyAvKiBGaW5kIGEga2V5Y29kZSB0aGF0IGNvdWxkIGhhdmUgZ2VuZXJhdGVkIHRoaXMgdmlydHVhbCBrZXkgKi8KICAgICAgICAgIGlmICAoKGtleWMydmtleVtrZXljXSAmIDB4RkYpID09IHZpcnRLZXkpCiAgICAgICAgICB7IC8qIFdlIGZpbHRlciB0aGUgZXh0ZW5kZWQgYml0LCB3ZSBkb24ndCBrbm93IGl0ICovCiAgICAgICAgICAgICAgZS5rZXljb2RlID0ga2V5YzsgLyogU3RvcmUgaXQgdGVtcG9yYXJpbHkgKi8KICAgICAgICAgICAgICBpZiAoKEVWRU5UX2V2ZW50X3RvX3ZrZXkoeGljLCZlKSAmIDB4RkYpICE9IHZpcnRLZXkpIHsKICAgICAgICAgICAgICAgICAgZS5rZXljb2RlID0gMDsgLyogV3Jvbmcgb25lIChleDogYmVjYXVzZSBvZiB0aGUgTnVtTG9jawogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpLCBzbyBzZXQgaXQgdG8gMCwgd2UnbGwgZmluZCBhbm90aGVyIG9uZSAqLwogICAgICAgICAgICAgIH0KCSAgfQogICAgICB9CgogICAgaWYgKHZpcnRLZXkgPj0gVktfTEVGVCAmJiB2aXJ0S2V5IDw9IFZLX0RPV04pCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXkgLSBWS19MRUZUICsgWEtfTGVmdCk7CgogICAgaWYgKCh2aXJ0S2V5Pj1WS19OVU1QQUQwKSAmJiAodmlydEtleTw9VktfTlVNUEFEOSkpCiAgICAgICAgZS5rZXljb2RlID0gWEtleXN5bVRvS2V5Y29kZShlLmRpc3BsYXksIHZpcnRLZXktVktfTlVNUEFEMCtYS19LUF8wKTsKCiAgICBpZiAodmlydEtleT09VktfREVDSU1BTCkKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfRGVjaW1hbCk7CgogICAgaWYgKHZpcnRLZXk9PVZLX1NFUEFSQVRPUikKICAgICAgICBlLmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGUuZGlzcGxheSwgWEtfS1BfU2VwYXJhdG9yKTsKCiAgICBpZiAoIWUua2V5Y29kZSAmJiB2aXJ0S2V5ICE9IFZLX05PTkFNRSkKICAgICAgewoJV0FSTigiVW5rbm93biB2aXJ0dWFsIGtleSAlWCAhISFcbiIsIHZpcnRLZXkpOwogICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CglyZXR1cm4gMDsKICAgICAgfQogICAgZWxzZSBUUkFDRSgiRm91bmQga2V5Y29kZSAlZCAoMHglMlgpXG4iLGUua2V5Y29kZSxlLmtleWNvZGUpOwoKICAgIFRSQUNFXyhrZXkpKCJ0eXBlICVkLCB3aW5kb3cgJWx4LCBzdGF0ZSAweCUwNHgsIGtleWNvZGUgMHglMDR4XG4iLAoJCWUudHlwZSwgZS53aW5kb3csIGUuc3RhdGUsIGUua2V5Y29kZSk7CgogICAgLyogQ2xpZW50cyBzaG91bGQgcGFzcyBvbmx5IEtleVByZXNzIGV2ZW50cyB0byBYbWJMb29rdXBTdHJpbmcsCiAgICAgKiBlLnR5cGUgd2FzIHNldCB0byBLZXlQcmVzcyBhYm92ZS4KICAgICAqLwogICAgaWYgKHhpYykKICAgICAgICByZXQgPSBYbWJMb29rdXBTdHJpbmcoeGljLCAmZSwgbHBDaGFyLCBzaXplb2YobHBDaGFyKSwgJmtleXN5bSwgJnN0YXR1cyk7CiAgICBlbHNlCiAgICAgICAgcmV0ID0gWExvb2t1cFN0cmluZygmZSwgbHBDaGFyLCBzaXplb2YobHBDaGFyKSwgJmtleXN5bSwgTlVMTCk7CiAgICB3aW5lX3RzeDExX3VubG9jaygpOwoKICAgIFRSQUNFXyhrZXkpKCJuYnl0ZSA9ICVkLCBzdGF0dXMgMHgleFxuIiwgcmV0LCBzdGF0dXMpOwoKICAgIGlmIChzdGF0dXMgPT0gWEJ1ZmZlck92ZXJmbG93KQogICAgICAgIEVSUigiQnVmZmVyIE92ZXJmbG93IG5lZWQgJWQhXG4iLCByZXQpOwoKICAgIGlmIChUUkFDRV9PTihrZXkpKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKmtzbmFtZTsKCiAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICAgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgd2luZV90c3gxMV91bmxvY2soKTsKICAgICAgICBpZiAoIWtzbmFtZSkga3NuYW1lID0gIk5vIE5hbWUiOwogICAgICAgIFRSQUNFXyhrZXkpKCIlcyA6IGtleXN5bT0lbFggKCVzKSwgIyBvZiBjaGFycz0lZCAvICVzXG4iLAogICAgICAgICAgICAgICAgICAgIChlLnR5cGUgPT0gS2V5UHJlc3MpID8gIktleVByZXNzIiA6ICJLZXlSZWxlYXNlIiwKICAgICAgICAgICAgICAgICAgICBrZXlzeW0sIGtzbmFtZSwgcmV0LCBkZWJ1Z3N0cl9hbihscENoYXIsIHJldCkpOwogICAgfQoKICAgIGlmIChyZXQgPT0gMCkKICAgIHsKCWNoYXIgZGVhZF9jaGFyOwoKI2lmZGVmIFhLX0V1cm9TaWduCiAgICAgICAgLyogQW4gdWdseSBoYWNrIGZvciBFdXJvU2lnbjogWCBjYW4ndCB0cmFuc2xhdGUgaXQgdG8gYSBjaGFyYWN0ZXIKICAgICAgICAgICBmb3Igc29tZSBsb2NhbGVzLiAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfRXVyb1NpZ24pCiAgICAgICAgewogICAgICAgICAgICBidWZXWzBdID0gMHgyMEFDOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgLyogU3BlY2lhbCBjYXNlOiBYIHR1cm5zIHNoaWZ0LXRhYiBpbnRvIElTT19MZWZ0X1RhYi4gKi8KICAgICAgICAvKiBIZXJlIHdlIGNoYW5nZSBpdCBiYWNrLiAqLwogICAgICAgIGlmIChrZXlzeW0gPT0gWEtfSVNPX0xlZnRfVGFiKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IDB4MDk7CiAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgIGdvdG8gZm91bmQ7CiAgICAgICAgfQoKCWRlYWRfY2hhciA9IEtFWUJPQVJEX01hcERlYWRLZXlzeW0oa2V5c3ltKTsKCWlmIChkZWFkX2NoYXIpCiAgICAgICAgewoJICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfVU5JWENQLCAwLCAmZGVhZF9jaGFyLCAxLCBidWZXLCBidWZXX3NpemUpOwoJICAgIHJldCA9IC0xOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleXN5bSA+PSAweDAxMDAwMTAwICYmIGtleXN5bSA8PSAweDAxMDBmZmZmKQogICAgICAgIHsKICAgICAgICAgICAgLyogVW5pY29kZSBkaXJlY3QgbWFwcGluZyAqLwogICAgICAgICAgICBidWZXWzBdID0ga2V5c3ltICYgMHhmZmZmOwogICAgICAgICAgICByZXQgPSAxOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgoa2V5c3ltID4+IDgpID09IDB4MTAwOEZGKSB7CiAgICAgICAgICAgIGJ1ZldbMF0gPSAwOwogICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgIH0KCWVsc2UKCSAgICB7CgkgICAgY29uc3QgY2hhciAqa3NuYW1lOwoKICAgICAgICAgICAgd2luZV90c3gxMV9sb2NrKCk7CgkgICAga3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAgICAgICAgICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7CgkgICAgaWYgKCFrc25hbWUpCgkJa3NuYW1lID0gIk5vIE5hbWUiOwoJICAgIGlmICgoa2V5c3ltID4+IDgpICE9IDB4ZmYpCgkJewoJCVdBUk4oIm5vIGNoYXIgZm9yIGtleXN5bSAlMDRsWCAoJXMpIDpcbiIsCiAgICAgICAgICAgICAgICAgICAga2V5c3ltLCBrc25hbWUpOwoJCVdBUk4oInZpcnRLZXk9JVgsIHNjYW5Db2RlPSVYLCBrZXljb2RlPSVYLCBzdGF0ZT0lWFxuIiwKICAgICAgICAgICAgICAgICAgICB2aXJ0S2V5LCBzY2FuQ29kZSwgZS5rZXljb2RlLCBlLnN0YXRlKTsKCQl9CgkgICAgfQoJfQogICAgZWxzZSB7ICAvKiByZXQgIT0gMCAqLwogICAgICAgIC8qIFdlIGhhdmUgYSBzcGVjaWFsIGNhc2UgdG8gaGFuZGxlIDogU2hpZnQgKyBhcnJvdywgc2hpZnQgKyBob21lLCAuLi4KICAgICAgICAgICBYIHJldHVybnMgYSBjaGFyIGZvciBpdCwgYnV0IFdpbmRvd3MgZG9lc24ndC4gTGV0J3MgZWF0IGl0LiAqLwogICAgICAgIGlmICghKGUuc3RhdGUgJiBOdW1Mb2NrTWFzaykgIC8qIE51bUxvY2sgaXMgb2ZmICovCiAgICAgICAgICAgICYmIChlLnN0YXRlICYgU2hpZnRNYXNrKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCiAgICAgICAgICAgICYmIChrZXlzeW0+PVhLX0tQXzApICYmIChrZXlzeW08PVhLX0tQXzkpKQogICAgICAgIHsKICAgICAgICAgICAgbHBDaGFyWzBdID0gMDsKICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICB9CgogICAgICAgIC8qIG1vcmUgYXJlYXMgd2hlcmUgWCByZXR1cm5zIGNoYXJhY3RlcnMgYnV0IFdpbmRvd3MgZG9lcyBub3QKICAgICAgICAgICBDVFJMICsgbnVtYmVyIG9yIENUUkwgKyBzeW1ib2wgKi8KICAgICAgICBpZiAoZS5zdGF0ZSAmIENvbnRyb2xNYXNrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCgoa2V5c3ltPj0zMykgJiYgKGtleXN5bSA8ICdBJykpIHx8CiAgICAgICAgICAgICAgICAoKGtleXN5bSA+ICdaJykgJiYgKGtleXN5bSA8ICdhJykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBscENoYXJbMF0gPSAwOwogICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogV2UgaGF2ZSBhbm90aGVyIHNwZWNpYWwgY2FzZSBmb3IgZGVsZXRlIGtleSAoWEtfRGVsZXRlKSBvbiBhbgogICAgICAgICBleHRlbmRlZCBrZXlib2FyZC4gWCByZXR1cm5zIGEgY2hhciBmb3IgaXQsIGJ1dCBXaW5kb3dzIGRvZXNuJ3QgKi8KICAgICAgICBpZiAoa2V5c3ltID09IFhLX0RlbGV0ZSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoJZWxzZSBpZigobHBLZXlTdGF0ZVtWS19TSElGVF0gJiAweDgwKSAvKiBTaGlmdCBpcyBwcmVzc2VkICovCgkJJiYgKGtleXN5bSA9PSBYS19LUF9EZWNpbWFsKSkKICAgICAgICB7CiAgICAgICAgICAgIGxwQ2hhclswXSA9IDA7CiAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKiBIYWNrIHRvIGRldGVjdCBhbiBYTG9va3VwU3RyaW5nIGhhcmQtY29kZWQgdG8gTGF0aW4xICovCiAgICAgICAgaWYgKHJldCA9PSAxICYmIGtleXN5bSA+PSAweDAwYTAgJiYga2V5c3ltIDw9IDB4MDBmZiAmJiAoQllURSlscENoYXJbMF0gPT0ga2V5c3ltKQogICAgICAgIHsKICAgICAgICAgICAgYnVmV1swXSA9IChCWVRFKWxwQ2hhclswXTsKICAgICAgICAgICAgZ290byBmb3VuZDsKICAgICAgICB9CgoJLyogcGVyZm9ybSB0cmFuc2xhdGlvbiB0byB1bmljb2RlICovCglpZihyZXQpCgl7CgkgICAgVFJBQ0VfKGtleSkoIlRyYW5zbGF0aW5nIGNoYXIgMHglMDJ4IHRvIHVuaWNvZGVcbiIsICooQllURSAqKWxwQ2hhcik7CgkgICAgcmV0ID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VTklYQ1AsIDAsIGxwQ2hhciwgcmV0LCBidWZXLCBidWZXX3NpemUpOwoJfQogICAgfQoKZm91bmQ6CiAgICBUUkFDRV8oa2V5KSgiVG9Vbmljb2RlIGFib3V0IHRvIHJldHVybiAlZCB3aXRoIGNoYXIgJXggJXNcbiIsCgkJcmV0LCAocmV0ICYmIGJ1ZlcpID8gYnVmV1swXSA6IDAsIGJ1ZlcgPyAiIiA6ICIobm8gYnVmZmVyKSIpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlCZWVwIChYMTFEUlYuQCkKICovCnZvaWQgWDExRFJWX0JlZXAodm9pZCkKewogICAgd2luZV90c3gxMV9sb2NrKCk7CiAgICBYQmVsbCh0aHJlYWRfZGlzcGxheSgpLCAwKTsKICAgIHdpbmVfdHN4MTFfdW5sb2NrKCk7Cn0K