LyoKICogQ29weXJpZ2h0IChDKSAyMDAzIE1pY2hhZWwgR/xubmV3aWcKICogQ29weXJpZ2h0IChDKSAyMDAzIENvZGVXZWF2ZXJzIEluYy4gKFVscmljaCBDemVrYWxsYSkKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAib2JqYmFzZS5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCiNpbmNsdWRlICJpbml0Z3VpZC5oIgojaW5jbHVkZSAiZG1vLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChtc2Rtbyk7CgoKc3RhdGljIGNvbnN0IFdDSEFSIHN6RE1PUm9vdEtleVtdID0gCnsKICAgICdEJywnaScsJ3InLCdlJywnYycsJ3QnLCdTJywnaCcsJ28nLCd3JywnXFwnLAogICAgJ00nLCdlJywnZCcsJ2knLCdhJywnTycsJ2InLCdqJywnZScsJ2MnLCd0JywncycsMAp9OyAKCnN0YXRpYyBjb25zdCBXQ0hBUiBzekRNT0lucHV0VHlwZVtdID0KewogICAgJ0knLCduJywncCcsJ3UnLCd0JywnVCcsJ3knLCdwJywnZScsJ3MnLDAKfTsKCnN0YXRpYyBjb25zdCBXQ0hBUiBzekRNT091dHB1dFR5cGVbXSA9CnsKICAgICdPJywndScsJ3QnLCdwJywndScsJ3QnLCdUJywneScsJ3AnLCdlJywncycsMAp9OwoKc3RhdGljIGNvbnN0IFdDSEFSIHN6RE1PS2V5ZWRbXSA9CnsKICAgICdLJywnZScsJ3knLCdlJywnZCcsMAp9OwoKc3RhdGljIGNvbnN0IFdDSEFSIHN6RE1PQ2F0ZWdvcmllc1tdID0KewogICAgJ0MnLCdhJywndCcsJ2UnLCdnJywnbycsJ3InLCdpJywnZScsJ3MnLDAKfTsKCnN0YXRpYyBjb25zdCBXQ0hBUiBzekdVSURGbXRbXSA9CnsKICAgICclJywnMCcsJzgnLCdYJywnLScsJyUnLCcwJywnNCcsJ1gnLCctJywnJScsJzAnLCc0JywnWCcsJy0nLCclJywnMCcsCiAgICAnMicsJ1gnLCclJywnMCcsJzInLCdYJywnLScsJyUnLCcwJywnMicsJ1gnLCclJywnMCcsJzInLCdYJywnJScsJzAnLCcyJywKICAgICdYJywnJScsJzAnLCcyJywnWCcsJyUnLCcwJywnMicsJ1gnLCclJywnMCcsJzInLCdYJywwCn07CgpzdGF0aWMgY29uc3QgV0NIQVIgc3pDYXQzRm10W10gPQp7CiAgICAnJScsJ3MnLCdcXCcsJyUnLCdzJywnXFwnLCclJywncycsMAp9OwoKc3RhdGljIGNvbnN0IFdDSEFSIHN6Q2F0MkZtdFtdID0KewogICAgJyUnLCdzJywnXFwnLCclJywncycsMAp9OwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgY29uc3QgSUVudW1ETU9WdGJsICAgICAgICAgKmxwVnRibDsKICAgIExPTkcJCQlyZWY7CiAgICBEV09SRAkJCWluZGV4OwogICAgY29uc3QgR1VJRCogICAgICAgICAgICAgICAgIGd1aWRDYXRlZ29yeTsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzOwogICAgRFdPUkQgICAgICAgICAgICAgICAgICAgICAgIGNJblR5cGVzOwogICAgRE1PX1BBUlRJQUxfTUVESUFUWVBFICAgICAgICpwSW5UeXBlczsKICAgIERXT1JEICAgICAgICAgICAgICAgICAgICAgICBjT3V0VHlwZXM7CiAgICBETU9fUEFSVElBTF9NRURJQVRZUEUgICAgICAgKnBPdXRUeXBlczsKICAgIEhLRVkgICAgICAgICAgICAgICAgICAgICAgICBoa2V5Owp9IElFbnVtRE1PSW1wbDsKCnN0YXRpYyBjb25zdCBJRW51bURNT1Z0YmwgZWRtb3Z0OwoKc3RhdGljIExQV1NUUiBHVUlEVG9TdHJpbmcoTFBXU1RSIGxwd3N0ciwgUkVGR1VJRCBscGNndWlkKQp7CiAgICB3c3ByaW50ZlcobHB3c3RyLCBzekdVSURGbXQsIGxwY2d1aWQtPkRhdGExLCBscGNndWlkLT5EYXRhMiwKICAgICAgICBscGNndWlkLT5EYXRhMywgbHBjZ3VpZC0+RGF0YTRbMF0sIGxwY2d1aWQtPkRhdGE0WzFdLAogICAgICAgIGxwY2d1aWQtPkRhdGE0WzJdLCBscGNndWlkLT5EYXRhNFszXSwgbHBjZ3VpZC0+RGF0YTRbNF0sCiAgICAgICAgbHBjZ3VpZC0+RGF0YTRbNV0sIGxwY2d1aWQtPkRhdGE0WzZdLCBscGNndWlkLT5EYXRhNFs3XSk7CgogICAgcmV0dXJuIGxwd3N0cjsKfQoKc3RhdGljIEJPT0wgSXNNZWRpYVR5cGVFcXVhbChjb25zdCBETU9fUEFSVElBTF9NRURJQVRZUEUqIG10MSwgY29uc3QgRE1PX1BBUlRJQUxfTUVESUFUWVBFKiBtdDIpCnsKCiAgICByZXR1cm4gKElzRXF1YWxDTFNJRCgmbXQxLT50eXBlLCAmbXQyLT50eXBlKSB8fAogICAgICAgICAgICBJc0VxdWFsQ0xTSUQoJm10Mi0+dHlwZSwgJkdVSURfTlVMTCkgfHwKICAgICAgICAgICAgSXNFcXVhbENMU0lEKCZtdDEtPnR5cGUsICZHVUlEX05VTEwpKSAmJgogICAgICAgICAgICAoSXNFcXVhbENMU0lEKCZtdDEtPnN1YnR5cGUsICZtdDItPnN1YnR5cGUpIHx8CiAgICAgICAgICAgIElzRXF1YWxDTFNJRCgmbXQyLT5zdWJ0eXBlLCAmR1VJRF9OVUxMKSB8fAogICAgICAgICAgICBJc0VxdWFsQ0xTSUQoJm10MS0+c3VidHlwZSwgJkdVSURfTlVMTCkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERNT1JlZ2lzdGVyCiAqCiAqIFJlZ2lzdGVyIGEgRGlyZWN0WCBNZWRpYSBPYmplY3QuCiAqLwpIUkVTVUxUIFdJTkFQSSBETU9SZWdpc3RlcigKICAgTFBDV1NUUiBzek5hbWUsCiAgIFJFRkNMU0lEIGNsc2lkRE1PLAogICBSRUZHVUlEIGd1aWRDYXRlZ29yeSwKICAgRFdPUkQgZHdGbGFncywKICAgRFdPUkQgY0luVHlwZXMsCiAgIGNvbnN0IERNT19QQVJUSUFMX01FRElBVFlQRSAqcEluVHlwZXMsCiAgIERXT1JEIGNPdXRUeXBlcywKICAgY29uc3QgRE1PX1BBUlRJQUxfTUVESUFUWVBFICpwT3V0VHlwZXMKKQp7CiAgICBXQ0hBUiBzemd1aWRbNjRdOwogICAgSFJFU1VMVCBocmVzOwogICAgSEtFWSBocmtleSA9IDA7CiAgICBIS0VZIGhrZXkgPSAwOwogICAgSEtFWSBoY2tleSA9IDA7CiAgICBIS0VZIGhjbHNrZXkgPSAwOwoKICAgIFRSQUNFKCIlc1xuIiwgZGVidWdzdHJfdyhzek5hbWUpKTsKCiAgICBocmVzID0gUmVnT3BlbktleUV4VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pETU9Sb290S2V5LCAwLCBLRVlfV1JJVEUsICZocmtleSk7CiAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgIGdvdG8gbGVuZDsKCiAgICAvKiBDcmVhdGUgY2xzaWRETU8ga2V5IHVuZGVyIE1lZGlhT2JqZWN0cyAqLyAKICAgIGhyZXMgPSBSZWdDcmVhdGVLZXlFeFcoaHJrZXksIEdVSURUb1N0cmluZyhzemd1aWQsIGNsc2lkRE1PKSwgMCwgTlVMTCwKICAgICAgICBSRUdfT1BUSU9OX05PTl9WT0xBVElMRSwgS0VZX1dSSVRFLCBOVUxMLCAmaGtleSwgTlVMTCk7CiAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgIGdvdG8gbGVuZDsKCiAgICAvKiBTZXQgZGVmYXVsdCBOYW1lIHZhbHVlICovCiAgICBocmVzID0gUmVnU2V0VmFsdWVFeFcoaGtleSwgTlVMTCwgMCwgUkVHX1NaLCAoY29uc3QgQllURSopIHN6TmFtZSwgCiAgICAgICAgKHN0cmxlblcoc3pOYW1lKSArIDEpKSAqIHNpemVvZihXQ0hBUik7CiAgICAvKiBTZXQgSW5wdXRUeXBlcyAqLwogICAgaHJlcyA9IFJlZ1NldFZhbHVlRXhXKGhrZXksIHN6RE1PSW5wdXRUeXBlLCAwLCBSRUdfQklOQVJZLCAKICAgICAgICAoY29uc3QgQllURSopIHBJblR5cGVzLCBjSW5UeXBlcyAqIHNpemVvZihETU9fUEFSVElBTF9NRURJQVRZUEUpKTsKICAgIC8qIFNldCBPdXRwdXRUeXBlcyAqLwogICAgaHJlcyA9IFJlZ1NldFZhbHVlRXhXKGhrZXksIHN6RE1PT3V0cHV0VHlwZSwgMCwgUkVHX0JJTkFSWSwgCiAgICAgICAgKGNvbnN0IEJZVEUqKSBwT3V0VHlwZXMsIGNPdXRUeXBlcyAqIHNpemVvZihETU9fUEFSVElBTF9NRURJQVRZUEUpKTsKCiAgICBpZiAoZHdGbGFncyAmIERNT19SRUdJU1RFUkZfSVNfS0VZRUQpCiAgICB7CiAgICAgICAgLyogQ3JlYXRlIEtleWVkIGtleSAqLyAKICAgICAgICBocmVzID0gUmVnQ3JlYXRlS2V5RXhXKGhrZXksIHN6RE1PS2V5ZWQsIDAsIE5VTEwsCiAgICAgICAgICAgIFJFR19PUFRJT05fTk9OX1ZPTEFUSUxFLCBLRVlfV1JJVEUsIE5VTEwsICZoY2tleSwgTlVMTCk7CiAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gaHJlcykKICAgICAgICAgICAgZ290byBsZW5kOwogICAgICAgIFJlZ0Nsb3NlS2V5KGhja2V5KTsKICAgIH0KCiAgICAvKiBSZWdpc3RlciB0aGUgY2F0ZWdvcnkgKi8KICAgIGhyZXMgPSBSZWdPcGVuS2V5RXhXKGhya2V5LCBzekRNT0NhdGVnb3JpZXMsIDAsIEtFWV9XUklURSwgJmhja2V5KTsKICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IGhyZXMpCiAgICAgICAgZ290byBsZW5kOwoKICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwoKICAgIGhyZXMgPSBSZWdPcGVuS2V5RXhXKGhja2V5LCBHVUlEVG9TdHJpbmcoc3pndWlkLCBndWlkQ2F0ZWdvcnkpLCAwLCBLRVlfV1JJVEUsICZoa2V5KTsKICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IGhyZXMpCiAgICAgICAgZ290byBsZW5kOwogICAgaHJlcyA9IFJlZ0NyZWF0ZUtleUV4Vyhoa2V5LCBHVUlEVG9TdHJpbmcoc3pndWlkLCBjbHNpZERNTyksIDAsIE5VTEwsCiAgICAgICAgUkVHX09QVElPTl9OT05fVk9MQVRJTEUsIEtFWV9XUklURSwgTlVMTCwgJmhjbHNrZXksIE5VTEwpOwogICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gaHJlcykKICAgICAgICBnb3RvIGxlbmQ7CgpsZW5kOgogICAgaWYgKGhrZXkpCiAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7CiAgICBpZiAoaGNrZXkpCiAgICAgICAgUmVnQ2xvc2VLZXkoaGNrZXkpOwogICAgaWYgKGhjbHNrZXkpCiAgICAgICAgUmVnQ2xvc2VLZXkoaGNsc2tleSk7CiAgICBpZiAoaHJrZXkpCiAgICAgICAgUmVnQ2xvc2VLZXkoaHJrZXkpOwoKICAgIFRSQUNFKCIgaHJlc3VsdD0weCUwOHhcbiIsIGhyZXMpOwogICAgcmV0dXJuIGhyZXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERNT1VucmVnaXN0ZXIKICoKICogVW5yZWdpc3RlciBhIERpcmVjdFggTWVkaWEgT2JqZWN0LgogKi8KSFJFU1VMVCBXSU5BUEkgRE1PVW5yZWdpc3RlcihSRUZDTFNJRCBjbHNpZERNTywgUkVGR1VJRCBndWlkQ2F0ZWdvcnkpCnsKICAgIEhSRVNVTFQgaHJlczsKICAgIFdDSEFSIHN6Z3VpZFs2NF07CiAgICBIS0VZIGhya2V5ID0gMDsKICAgIEhLRVkgaGNrZXkgPSAwOwoKICAgIEdVSURUb1N0cmluZyhzemd1aWQsIGNsc2lkRE1PKTsKCiAgICBUUkFDRSgiJXMgJXBcbiIsIGRlYnVnc3RyX3coc3pndWlkKSwgZ3VpZENhdGVnb3J5KTsKCiAgICBocmVzID0gUmVnT3BlbktleUV4VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pETU9Sb290S2V5LCAwLCBLRVlfV1JJVEUsICZocmtleSk7CiAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgIGdvdG8gbGVuZDsKCiAgICBocmVzID0gUmVnRGVsZXRlS2V5VyhocmtleSwgc3pndWlkKTsKICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IGhyZXMpCiAgICAgICAgZ290byBsZW5kOwoKICAgIGhyZXMgPSBSZWdPcGVuS2V5RXhXKGhya2V5LCBzekRNT0NhdGVnb3JpZXMsIDAsIEtFWV9XUklURSwgJmhja2V5KTsKICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IGhyZXMpCiAgICAgICAgZ290byBsZW5kOwoKICAgIGhyZXMgPSBSZWdEZWxldGVLZXlXKGhja2V5LCBzemd1aWQpOwogICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gaHJlcykKICAgICAgICBnb3RvIGxlbmQ7CgpsZW5kOgogICAgaWYgKGhja2V5KQogICAgICAgIFJlZ0Nsb3NlS2V5KGhja2V5KTsKICAgIGlmIChocmtleSkKICAgICAgICBSZWdDbG9zZUtleShocmtleSk7CgogICAgcmV0dXJuIGhyZXM7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERNT0dldE5hbWUKICoKICogR2V0IERNUCBOYW1lIGZyb20gdGhlIHJlZ2lzdHJ5CiAqLwpIUkVTVUxUIFdJTkFQSSBETU9HZXROYW1lKFJFRkNMU0lEIGNsc2lkRE1PLCBXQ0hBUiogc3pOYW1lKQp7CiAgICBXQ0hBUiBzemd1aWRbNjRdOwogICAgSFJFU1VMVCBocmVzOwogICAgSEtFWSBocmtleSA9IDA7CiAgICBIS0VZIGhrZXkgPSAwOwogICAgRFdPUkQgY291bnQ7CgogICAgVFJBQ0UoIiVzXG4iLCBkZWJ1Z3N0cl9ndWlkKGNsc2lkRE1PKSk7CgogICAgaHJlcyA9IFJlZ09wZW5LZXlFeFcoSEtFWV9DTEFTU0VTX1JPT1QsIHN6RE1PUm9vdEtleSwgCiAgICAgICAgMCwgS0VZX1JFQUQsICZocmtleSk7CiAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgIGdvdG8gbGVuZDsKCiAgICBocmVzID0gUmVnT3BlbktleUV4VyhocmtleSwgR1VJRFRvU3RyaW5nKHN6Z3VpZCwgY2xzaWRETU8pLAogICAgICAgIDAsIEtFWV9SRUFELCAmaGtleSk7CiAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgIGdvdG8gbGVuZDsKCiAgICBjb3VudCA9IDgwICogc2l6ZW9mKFdDSEFSKTsgLyogODAgYnkgQVBJIGRlZmluaXRpb24gKi8KICAgIGhyZXMgPSBSZWdRdWVyeVZhbHVlRXhXKGhrZXksIE5VTEwsIE5VTEwsIE5VTEwsIAogICAgICAgIChMUEJZVEUpIHN6TmFtZSwgJmNvdW50KTsgCgogICAgVFJBQ0UoIiBzek5hbWU9JXNcbiIsIGRlYnVnc3RyX3coc3pOYW1lKSk7CmxlbmQ6CiAgICBpZiAoaGtleSkKICAgICAgICBSZWdDbG9zZUtleShocmtleSk7CiAgICBpZiAoaGtleSkKICAgICAgICBSZWdDbG9zZUtleShoa2V5KTsKCiAgICByZXR1cm4gaHJlczsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgSUVudW1ETU9fRGVzdHJ1Y3RvcgoqLwpzdGF0aWMgQk9PTCBJRW51bURNT19EZXN0cnVjdG9yKElFbnVtRE1PKiBpZmFjZSkKewogICAgSUVudW1ETU9JbXBsICpUaGlzID0gKElFbnVtRE1PSW1wbCAqKWlmYWNlOwoKICAgIFRSQUNFKCIlcFxuIiwgVGhpcyk7CgogICAgaWYgKFRoaXMtPmhrZXkpCiAgICAgICAgUmVnQ2xvc2VLZXkoVGhpcy0+aGtleSk7CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cEluVHlwZXMpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgVGhpcy0+cE91dFR5cGVzKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgSUVudW1ETU9fQ29uc3RydWN0b3IKICovCnN0YXRpYyBJRW51bURNTyAqIElFbnVtRE1PX0NvbnN0cnVjdG9yKAogICAgUkVGR1VJRCBndWlkQ2F0ZWdvcnksCiAgICBEV09SRCBkd0ZsYWdzLAogICAgRFdPUkQgY0luVHlwZXMsCiAgICBjb25zdCBETU9fUEFSVElBTF9NRURJQVRZUEUgKnBJblR5cGVzLAogICAgRFdPUkQgY091dFR5cGVzLAogICAgY29uc3QgRE1PX1BBUlRJQUxfTUVESUFUWVBFICpwT3V0VHlwZXMpCnsKICAgIFVJTlQgc2l6ZTsKICAgIElFbnVtRE1PSW1wbCogbHBlZG1vOwogICAgQk9PTCByZXQgPSBGQUxTRTsKCiAgICBscGVkbW8gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKElFbnVtRE1PSW1wbCkpOwoKICAgIGlmIChscGVkbW8pCiAgICB7CiAgICAgICAgbHBlZG1vLT5yZWYgPSAxOwogICAgICAgIGxwZWRtby0+bHBWdGJsID0gJmVkbW92dDsKICAgICAgICBscGVkbW8tPmluZGV4ID0gLTE7CglscGVkbW8tPmd1aWRDYXRlZ29yeSA9IGd1aWRDYXRlZ29yeTsKCWxwZWRtby0+ZHdGbGFncyA9IGR3RmxhZ3M7CgoJc2l6ZSA9IGNJblR5cGVzICogc2l6ZW9mKERNT19QQVJUSUFMX01FRElBVFlQRSk7CiAgICAgICAgbHBlZG1vLT5wSW5UeXBlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplKTsKICAgICAgICBpZiAoIWxwZWRtby0+cEluVHlwZXMpCiAgICAgICAgICAgIGdvdG8gbGVycjsKCW1lbWNweShscGVkbW8tPnBJblR5cGVzLCBwSW5UeXBlcywgc2l6ZSk7CiAgICAgICAgbHBlZG1vLT5jSW5UeXBlcyA9IGNJblR5cGVzOwoKCXNpemUgPSBjT3V0VHlwZXMgKiBzaXplb2YoRE1PX1BBUlRJQUxfTUVESUFUWVBFKTsKICAgICAgICBscGVkbW8tPnBPdXRUeXBlcyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplKTsKICAgICAgICBpZiAoIWxwZWRtby0+cE91dFR5cGVzKQogICAgICAgICAgICBnb3RvIGxlcnI7CgltZW1jcHkobHBlZG1vLT5wT3V0VHlwZXMsIHBPdXRUeXBlcywgc2l6ZSk7CiAgICAgICAgbHBlZG1vLT5jT3V0VHlwZXMgPSBjT3V0VHlwZXM7CgogICAgICAgIC8qIElmIG5vdCBmaWx0ZXJpbmcgYnkgY2F0ZWdvcnkgZW51bSBmcm9tIG1lZGlhIG9iamVjdHMgcm9vdCAqLwogICAgICAgIGlmIChJc0VxdWFsR1VJRChndWlkQ2F0ZWdvcnksICZHVUlEX05VTEwpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnT3BlbktleUV4VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pETU9Sb290S2V5LCAKICAgICAgICAgICAgICAgIDAsIEtFWV9SRUFELCAmbHBlZG1vLT5oa2V5KSkKICAgICAgICAgICAgICAgIHJldCA9IFRSVUU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFdDSEFSIHN6Z3VpZFs2NF07CiAgICAgICAgICAgIFdDSEFSIHN6S2V5W01BWF9QQVRIXTsKCiAgICAgICAgICAgIHdzcHJpbnRmVyhzektleSwgc3pDYXQzRm10LCBzekRNT1Jvb3RLZXksIHN6RE1PQ2F0ZWdvcmllcywgCiAgICAgICAgICAgICAgICBHVUlEVG9TdHJpbmcoc3pndWlkLCBndWlkQ2F0ZWdvcnkpKTsKICAgICAgICAgICAgaWYgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnT3BlbktleUV4VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pLZXksIAogICAgICAgICAgICAgICAgMCwgS0VZX1JFQUQsICZscGVkbW8tPmhrZXkpKQogICAgICAgICAgICAgICAgcmV0ID0gVFJVRTsKICAgICAgICB9CgpsZXJyOgogICAgICAgIGlmKCFyZXQpCiAgICAgICAgewogICAgICAgICAgICBJRW51bURNT19EZXN0cnVjdG9yKChJRW51bURNTyopbHBlZG1vKTsKICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGxwZWRtbyk7CiAgICAgICAgICAgIGxwZWRtbyA9IE5VTEw7CiAgICAgICAgfQogICAgfQoKICAgIFRSQUNFKCJyZXR1cm5pbmcgJXBcbiIsIGxwZWRtbyk7CgogICAgcmV0dXJuIChJRW51bURNTyopbHBlZG1vOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRW51bURNT19mbkFkZFJlZgogKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJRW51bURNT19mbkFkZFJlZihJRW51bURNTyAqIGlmYWNlKQp7CiAgICBJRW51bURNT0ltcGwgKlRoaXMgPSAoSUVudW1ETU9JbXBsICopaWZhY2U7CiAgICByZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJlRoaXMtPnJlZik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIEVudW1ETU9fUXVlcnlJbnRlcmZhY2UKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bURNT19mblF1ZXJ5SW50ZXJmYWNlKAogICAgSUVudW1ETU8qIGlmYWNlLAogICAgUkVGSUlEIHJpaWQsCiAgICBMUFZPSUQgKnBwdk9iaikKewogICAgSUVudW1ETU9JbXBsICpUaGlzID0gKElFbnVtRE1PSW1wbCAqKWlmYWNlOwoKICAgICpwcHZPYmogPSBOVUxMOwoKICAgIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JVW5rbm93bikpCiAgICAgICAgKnBwdk9iaiA9IFRoaXM7CiAgICBlbHNlIGlmKElzRXF1YWxJSUQocmlpZCwgJklJRF9JRW51bURNTykpCiAgICAgICAgKnBwdk9iaiA9IChJRW51bURNTyopVGhpczsKCiAgICBpZigqcHB2T2JqKQogICAgewogICAgICAgIElFbnVtRE1PX2ZuQWRkUmVmKChJRW51bURNTyopKnBwdk9iaik7CiAgICAgICAgcmV0dXJuIFNfT0s7CiAgICB9CgogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElFbnVtRE1PX2ZuUmVsZWFzZQogKi8Kc3RhdGljIFVMT05HIFdJTkFQSSBJRW51bURNT19mblJlbGVhc2UoSUVudW1ETU8gKiBpZmFjZSkKewogICAgSUVudW1ETU9JbXBsICpUaGlzID0gKElFbnVtRE1PSW1wbCAqKWlmYWNlOwogICAgVUxPTkcgcmVmQ291bnQgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBpZiAoIXJlZkNvdW50KQogICAgewogICAgICAgIElFbnVtRE1PX0Rlc3RydWN0b3IoKElFbnVtRE1PKilUaGlzKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcyk7CiAgICB9CiAgICByZXR1cm4gcmVmQ291bnQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElFbnVtRE1PX2ZuTmV4dAogKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElFbnVtRE1PX2ZuTmV4dCgKICAgIElFbnVtRE1PICogaWZhY2UsIAogICAgRFdPUkQgY0l0ZW1zVG9GZXRjaCwKICAgIENMU0lEICogcENMU0lELAogICAgV0NIQVIgKiogTmFtZXMsCiAgICBEV09SRCAqIHBjSXRlbXNGZXRjaGVkKQp7CiAgICBGSUxFVElNRSBmdDsKICAgIEhLRVkgaGtleTsKICAgIFdDSEFSIHN6TmV4dEtleVtNQVhfUEFUSF07CiAgICBXQ0hBUiBzektleVtNQVhfUEFUSF07CiAgICBXQ0hBUiBzelZhbHVlW01BWF9QQVRIXTsKICAgIERXT1JEIGxlbjsKICAgIFVJTlQgY291bnQgPSAwOwogICAgSFJFU1VMVCBocmVzID0gU19PSzsKCiAgICBJRW51bURNT0ltcGwgKlRoaXMgPSAoSUVudW1ETU9JbXBsICopaWZhY2U7CgogICAgVFJBQ0UoIiVkXG4iLCBjSXRlbXNUb0ZldGNoKTsKCiAgICBpZiAoIXBDTFNJRCB8fCAhTmFtZXMgfHwgIXBjSXRlbXNGZXRjaGVkKQogICAgICAgIHJldHVybiBFX1BPSU5URVI7CgogICAgd2hpbGUgKGNvdW50IDwgY0l0ZW1zVG9GZXRjaCkKICAgIHsKICAgICAgICBUaGlzLT5pbmRleCsrOwoKICAgICAgICBocmVzID0gUmVnRW51bUtleUV4VyhUaGlzLT5oa2V5LCBUaGlzLT5pbmRleCwgc3pOZXh0S2V5LCAmbGVuLCBOVUxMLCBOVUxMLCBOVUxMLCAmZnQpOwogICAgICAgIGlmIChocmVzICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBUUkFDRSgiZm91bmQgJXNcbiIsIGRlYnVnc3RyX3coc3pOZXh0S2V5KSk7CgoJaWYgKFRoaXMtPmR3RmxhZ3MgJiBETU9fUkVHSVNURVJGX0lTX0tFWUVEKQogICAgICAgIHsKICAgICAgICAgICAgd3NwcmludGZXKHN6S2V5LCBzekNhdDNGbXQsIHN6RE1PUm9vdEtleSwgc3pOZXh0S2V5LCBzekRNT0tleWVkKTsKICAgICAgICAgICAgaHJlcyA9IFJlZ09wZW5LZXlFeFcoSEtFWV9DTEFTU0VTX1JPT1QsIHN6S2V5LCAwLCBLRVlfUkVBRCwgJmhrZXkpOwogICAgICAgICAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwogICAgICAgIH0KCiAgICAgICAgd3NwcmludGZXKHN6S2V5LCBzekNhdDJGbXQsIHN6RE1PUm9vdEtleSwgc3pOZXh0S2V5KTsKICAgICAgICBocmVzID0gUmVnT3BlbktleUV4VyhIS0VZX0NMQVNTRVNfUk9PVCwgc3pLZXksIDAsIEtFWV9SRUFELCAmaGtleSk7CgogICAgICAgIGlmIChUaGlzLT5wSW5UeXBlcykKICAgICAgICB7CiAgICAgICAgICAgIFVJTlQgaSwgajsKICAgICAgICAgICAgRFdPUkQgY0luVHlwZXM7CiAgICAgICAgICAgIERNT19QQVJUSUFMX01FRElBVFlQRSogcEluVHlwZXM7CgoJICAgIGxlbiA9IE1BWF9QQVRIICogc2l6ZW9mKFdDSEFSKTsKICAgICAgICAgICAgaHJlcyA9IFJlZ1F1ZXJ5VmFsdWVFeFcoaGtleSwgc3pETU9JbnB1dFR5cGUsIE5VTEwsIE5VTEwsIChMUEJZVEUpIHN6VmFsdWUsICZsZW4pOwoJICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IGhyZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCgkgICAgY0luVHlwZXMgPSBsZW4gLyBzaXplb2YoRE1PX1BBUlRJQUxfTUVESUFUWVBFKTsKCSAgICBwSW5UeXBlcyA9IChETU9fUEFSVElBTF9NRURJQVRZUEUqKSBzelZhbHVlOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPmNJblR5cGVzOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjSW5UeXBlczsgaisrKSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoSXNNZWRpYVR5cGVFcXVhbCgmcEluVHlwZXNbal0sICZUaGlzLT5wSW5UeXBlc1tpXSkpCgkJICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCgkJaWYgKGogPj0gY0luVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpIDwgVGhpcy0+Y0luVHlwZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChUaGlzLT5wT3V0VHlwZXMpCiAgICAgICAgewogICAgICAgICAgICBVSU5UIGksIGo7CiAgICAgICAgICAgIERXT1JEIGNPdXRUeXBlczsKICAgICAgICAgICAgRE1PX1BBUlRJQUxfTUVESUFUWVBFKiBwT3V0VHlwZXM7CgoJICAgIGxlbiA9IE1BWF9QQVRIICogc2l6ZW9mKFdDSEFSKTsKICAgICAgICAgICAgaHJlcyA9IFJlZ1F1ZXJ5VmFsdWVFeFcoaGtleSwgc3pETU9PdXRwdXRUeXBlLCBOVUxMLCBOVUxMLCAoTFBCWVRFKSBzelZhbHVlLCAmbGVuKTsKCSAgICBpZiAoRVJST1JfU1VDQ0VTUyAhPSBocmVzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBSZWdDbG9zZUtleShoa2V5KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgoJICAgIGNPdXRUeXBlcyA9IGxlbiAvIHNpemVvZihETU9fUEFSVElBTF9NRURJQVRZUEUpOwoJICAgIHBPdXRUeXBlcyA9IChETU9fUEFSVElBTF9NRURJQVRZUEUqKSBzelZhbHVlOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFRoaXMtPmNPdXRUeXBlczsgaSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY091dFR5cGVzOyBqKyspIAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChJc01lZGlhVHlwZUVxdWFsKCZwT3V0VHlwZXNbal0sICZUaGlzLT5wT3V0VHlwZXNbaV0pKQoJCSAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgoJCWlmIChqID49IGNPdXRUeXBlcykKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGkgPCBUaGlzLT5jT3V0VHlwZXMpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhrZXkpOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoJLyogTWVkaWEgb2JqZWN0IHdhc24ndCBmaWx0ZXJlZCBzbyBhZGQgaXQgdG8gcmV0dXJuIGxpc3QgKi8KICAgICAgICBOYW1lc1tjb3VudF0gPSBOVUxMOwoJbGVuID0gTUFYX1BBVEggKiBzaXplb2YoV0NIQVIpOwogICAgICAgIGhyZXMgPSBSZWdRdWVyeVZhbHVlRXhXKGhrZXksIE5VTEwsIE5VTEwsIE5VTEwsIChMUEJZVEUpIHN6VmFsdWUsICZsZW4pOyAKICAgICAgICBpZiAoRVJST1JfU1VDQ0VTUyA9PSBocmVzKQoJewogICAgICAgICAgICBOYW1lc1tjb3VudF0gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3RybGVuVyhzelZhbHVlKSArIDEpOwoJICAgIGlmIChOYW1lc1tjb3VudF0pCiAgICAgICAgICAgICAgICBzdHJjbXBXKE5hbWVzW2NvdW50XSwgc3pWYWx1ZSk7Cgl9CiAgICAgICAgQ0xTSURGcm9tU3RyaW5nKHN6TmV4dEtleSwgJnBDTFNJRFtjb3VudF0pOwoKICAgICAgICBUUkFDRSgiZm91bmQgbWF0Y2ggJXMgJXNcbiIsIGRlYnVnc3RyX3coc3pWYWx1ZSksIGRlYnVnc3RyX3coc3pOZXh0S2V5KSk7CiAgICAgICAgUmVnQ2xvc2VLZXkoaGtleSk7Cgljb3VudCsrOwogICAgfQoKICAgICpwY0l0ZW1zRmV0Y2hlZCA9IGNvdW50OwogICAgaWYgKCpwY0l0ZW1zRmV0Y2hlZCA8IGNJdGVtc1RvRmV0Y2gpCiAgICAgICAgaHJlcyA9IFNfRkFMU0U7CgogICAgcmV0dXJuIGhyZXM7Cn0KIAoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRW51bURNT19mblNraXAKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bURNT19mblNraXAoSUVudW1ETU8gKiBpZmFjZSwgRFdPUkQgY0l0ZW1zVG9Ta2lwKQp7CiAgICBJRW51bURNT0ltcGwgKlRoaXMgPSAoSUVudW1ETU9JbXBsICopaWZhY2U7CgogICAgVGhpcy0+aW5kZXggKz0gY0l0ZW1zVG9Ta2lwOwoKICAgIHJldHVybiBTX09LOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRW51bURNT19mblJlc2V0CiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSUVudW1ETU9fZm5SZXNldChJRW51bURNTyAqIGlmYWNlKQp7CiAgICBJRW51bURNT0ltcGwgKlRoaXMgPSAoSUVudW1ETU9JbXBsICopaWZhY2U7CgogICAgVGhpcy0+aW5kZXggPSAtMTsKCiAgICByZXR1cm4gU19PSzsKfQogCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElFbnVtRE1PX2ZuQ2xvbmUKICovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJRW51bURNT19mbkNsb25lKElFbnVtRE1PICogaWZhY2UsIElFbnVtRE1PICoqcHBFbnVtKQp7CiAgICBJRW51bURNT0ltcGwgKlRoaXMgPSAoSUVudW1ETU9JbXBsICopaWZhY2U7CgogICAgRklYTUUoIiglcCktPigpIHRvICglcCktPigpIEVfTk9USU1QTFxuIiwgVGhpcywgcHBFbnVtKTsKCiAgcmV0dXJuIEVfTk9USU1QTDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRE1PRW51bQogKgogKiBFbnVtZXJhdGUgRGlyZWN0WCBNZWRpYSBPYmplY3RzIGluIHRoZSByZWdpc3RyeS4KICovCkhSRVNVTFQgV0lOQVBJIERNT0VudW0oCiAgICBSRUZHVUlEIGd1aWRDYXRlZ29yeSwKICAgIERXT1JEIGR3RmxhZ3MsCiAgICBEV09SRCBjSW5UeXBlcywKICAgIGNvbnN0IERNT19QQVJUSUFMX01FRElBVFlQRSAqcEluVHlwZXMsCiAgICBEV09SRCBjT3V0VHlwZXMsCiAgICBjb25zdCBETU9fUEFSVElBTF9NRURJQVRZUEUgKnBPdXRUeXBlcywKICAgIElFbnVtRE1PICoqcHBFbnVtKQp7CiAgICBIUkVTVUxUIGhyZXMgPSBFX0ZBSUw7CgogICAgVFJBQ0UoImd1aWRDYXRlZ29yeT0lcCBkd0ZsYWdzPTB4JTA4eCBjSW5UeXBlcz0lZCBjT3V0VHlwZXM9JWRcbiIsCiAgICAgICAgZ3VpZENhdGVnb3J5LCBkd0ZsYWdzLCBjSW5UeXBlcywgY091dFR5cGVzKTsKCiAgICAqcHBFbnVtID0gSUVudW1ETU9fQ29uc3RydWN0b3IoZ3VpZENhdGVnb3J5LCBkd0ZsYWdzLCBjSW5UeXBlcywKICAgICAgICBwSW5UeXBlcywgY091dFR5cGVzLCBwT3V0VHlwZXMpOwogICAgaWYgKCpwcEVudW0pCiAgICAgICAgaHJlcyA9IFNfT0s7CgogICAgcmV0dXJuIGhyZXM7Cn0KCgpzdGF0aWMgY29uc3QgSUVudW1ETU9WdGJsIGVkbW92dCA9CnsKCUlFbnVtRE1PX2ZuUXVlcnlJbnRlcmZhY2UsCglJRW51bURNT19mbkFkZFJlZiwKCUlFbnVtRE1PX2ZuUmVsZWFzZSwKCUlFbnVtRE1PX2ZuTmV4dCwKCUlFbnVtRE1PX2ZuU2tpcCwKCUlFbnVtRE1PX2ZuUmVzZXQsCglJRW51bURNT19mbkNsb25lLAp9OwoKCkhSRVNVTFQgV0lOQVBJIERNT0dldFR5cGVzKFJFRkNMU0lEIGEsIFVMT05HIGIsIFVMT05HKiBjLAoJCQkgICBETU9fUEFSVElBTF9NRURJQVRZUEUqIGQsIFVMT05HIGUsCgkJCSAgIFVMT05HKiBmLCBETU9fUEFSVElBTF9NRURJQVRZUEUqIGcpCnsKICBGSVhNRSgiKCVwLCV1LCVwLCVwLCV1LCVwLCVwKSxzdHViIVxuIixhLGIsYyxkLGUsZixnKTsKCiAgcmV0dXJuIEVfTk9USU1QTDsKfQo=