LyoKICogQ09NIHByb3h5L3N0dWIgZmFjdG9yeSAoQ1N0ZFBTRmFjdG9yeSkgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDEgT3ZlIEvldmVuLCBUcmFuc0dhbWluZyBUZWNobm9sb2dpZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lucmVnLmgiCgojaW5jbHVkZSAib2JqYmFzZS5oIgoKI2luY2x1ZGUgInJwY3Byb3h5LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKI2luY2x1ZGUgImNwc2YuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG9sZSk7CgpzdGF0aWMgQk9PTCBGaW5kUHJveHlJbmZvKGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlGaWxlTGlzdCwgUkVGSUlEIHJpaWQsIGNvbnN0IFByb3h5RmlsZUluZm8gKipwUHJveHlJbmZvLCBpbnQgKnBJbmRleCkKewogIHdoaWxlICgqcFByb3h5RmlsZUxpc3QpIHsKICAgIGlmICgoKnBQcm94eUZpbGVMaXN0KS0+cElJRExvb2t1cFJ0bihyaWlkLCBwSW5kZXgpKSB7CiAgICAgICpwUHJveHlJbmZvID0gKnBQcm94eUZpbGVMaXN0OwogICAgICBUUkFDRSgiZm91bmQ6IFByb3h5SW5mbyAlcCBJbmRleCAlZFxuIiwgKnBQcm94eUluZm8sICpwSW5kZXgpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIHBQcm94eUZpbGVMaXN0Kys7CiAgfQogIFRSQUNFKCJub3QgZm91bmRcbiIpOwogIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIENTdGRQU0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpvYmopCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBUUkFDRSgiKCVwKS0+UXVlcnlJbnRlcmZhY2UoJXMsJXApXG4iLGlmYWNlLGRlYnVnc3RyX2d1aWQocmlpZCksb2JqKTsKICBpZiAoSXNFcXVhbEdVSUQoJklJRF9JVW5rbm93bixyaWlkKSB8fAogICAgICBJc0VxdWFsR1VJRCgmSUlEX0lQU0ZhY3RvcnlCdWZmZXIscmlpZCkpIHsKICAgICpvYmogPSBUaGlzOwogICAgVGhpcy0+UmVmQ291bnQrKzsKICAgIHJldHVybiBTX09LOwogIH0KICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSSBDU3RkUFNGYWN0b3J5X0FkZFJlZihMUFBTRkFDVE9SWUJVRkZFUiBpZmFjZSkKewogIENTdGRQU0ZhY3RvcnlCdWZmZXIgKlRoaXMgPSAoQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqKWlmYWNlOwogIFRSQUNFKCIoJXApLT5BZGRSZWYoKVxuIixpZmFjZSk7CiAgcmV0dXJuICsrKFRoaXMtPlJlZkNvdW50KTsKfQoKc3RhdGljIFVMT05HIFdJTkFQSSBDU3RkUFNGYWN0b3J5X1JlbGVhc2UoTFBQU0ZBQ1RPUllCVUZGRVIgaWZhY2UpCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBUUkFDRSgiKCVwKS0+UmVsZWFzZSgpXG4iLGlmYWNlKTsKICByZXR1cm4gLS0oVGhpcy0+UmVmQ291bnQpOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgQ1N0ZFBTRmFjdG9yeV9DcmVhdGVQcm94eShMUFBTRkFDVE9SWUJVRkZFUiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFVOS05PV04gcFVua091dGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUlBDUFJPWFlCVUZGRVIgKnBwUHJveHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpwcHYpCnsKICBDU3RkUFNGYWN0b3J5QnVmZmVyICpUaGlzID0gKENTdGRQU0ZhY3RvcnlCdWZmZXIgKilpZmFjZTsKICBjb25zdCBQcm94eUZpbGVJbmZvICpQcm94eUluZm87CiAgaW50IEluZGV4OwogIFRSQUNFKCIoJXApLT5DcmVhdGVQcm94eSglcCwlcywlcCwlcClcbiIsaWZhY2UscFVua091dGVyLAogICAgICAgZGVidWdzdHJfZ3VpZChyaWlkKSxwcFByb3h5LHBwdik7CiAgaWYgKCFGaW5kUHJveHlJbmZvKFRoaXMtPnBQcm94eUZpbGVMaXN0LHJpaWQsJlByb3h5SW5mbywmSW5kZXgpKQogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiAgcmV0dXJuIFN0ZFByb3h5X0NvbnN0cnVjdChyaWlkLCBwVW5rT3V0ZXIsIFByb3h5SW5mby0+cE5hbWVzQXJyYXlbSW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlJbmZvLT5wUHJveHlWdGJsTGlzdFtJbmRleF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm94eUluZm8tPnBTdHViVnRibExpc3RbSW5kZXhdLCBpZmFjZSwgcHBQcm94eSwgcHB2KTsKfQoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIENTdGRQU0ZhY3RvcnlfQ3JlYXRlU3R1YihMUFBTRkFDVE9SWUJVRkZFUiBpZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBVTktOT1dOIHBVbmtTZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFJQQ1NUVUJCVUZGRVIgKnBwU3R1YikKewogIENTdGRQU0ZhY3RvcnlCdWZmZXIgKlRoaXMgPSAoQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqKWlmYWNlOwogIGNvbnN0IFByb3h5RmlsZUluZm8gKlByb3h5SW5mbzsKICBpbnQgSW5kZXg7CiAgVFJBQ0UoIiglcCktPkNyZWF0ZVN0dWIoJXMsJXAsJXApXG4iLGlmYWNlLGRlYnVnc3RyX2d1aWQocmlpZCksCiAgICAgICBwVW5rU2VydmVyLHBwU3R1Yik7CiAgaWYgKCFGaW5kUHJveHlJbmZvKFRoaXMtPnBQcm94eUZpbGVMaXN0LHJpaWQsJlByb3h5SW5mbywmSW5kZXgpKQogICAgcmV0dXJuIEVfTk9JTlRFUkZBQ0U7CiAgcmV0dXJuIENTdGRTdHViQnVmZmVyX0NvbnN0cnVjdChyaWlkLCBwVW5rU2VydmVyLCBQcm94eUluZm8tPnBOYW1lc0FycmF5W0luZGV4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3h5SW5mby0+cFN0dWJWdGJsTGlzdFtJbmRleF0sIGlmYWNlLCBwcFN0dWIpOwp9CgpzdGF0aWMgSVBTRmFjdG9yeUJ1ZmZlclZ0YmwgQ1N0ZFBTRmFjdG9yeV9WdGJsID0KewogIENTdGRQU0ZhY3RvcnlfUXVlcnlJbnRlcmZhY2UsCiAgQ1N0ZFBTRmFjdG9yeV9BZGRSZWYsCiAgQ1N0ZFBTRmFjdG9yeV9SZWxlYXNlLAogIENTdGRQU0ZhY3RvcnlfQ3JlYXRlUHJveHksCiAgQ1N0ZFBTRmFjdG9yeV9DcmVhdGVTdHViCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckRsbEdldENsYXNzT2JqZWN0IFtSUENSVDQuQF0KICovCkhSRVNVTFQgV0lOQVBJIE5kckRsbEdldENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJveHlGaWxlSW5mbyAqKnBQcm94eUZpbGVMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENMU0lEICpwY2xzaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1N0ZFBTRmFjdG9yeUJ1ZmZlciAqcFBTRmFjdG9yeUJ1ZmZlcikKewogICpwcHYgPSBOVUxMOwogIGlmICghcFBTRmFjdG9yeUJ1ZmZlci0+bHBWdGJsKSB7CiAgICBwUFNGYWN0b3J5QnVmZmVyLT5scFZ0YmwgPSAmQ1N0ZFBTRmFjdG9yeV9WdGJsOwogICAgcFBTRmFjdG9yeUJ1ZmZlci0+UmVmQ291bnQgPSAwOwogICAgcFBTRmFjdG9yeUJ1ZmZlci0+cFByb3h5RmlsZUxpc3QgPSBwUHJveHlGaWxlTGlzdDsKICB9CiAgaWYgKElzRXF1YWxHVUlEKHJjbHNpZCwgcGNsc2lkKSkKICAgIHJldHVybiBJUFNGYWN0b3J5QnVmZmVyX1F1ZXJ5SW50ZXJmYWNlKChMUFBTRkFDVE9SWUJVRkZFUilwUFNGYWN0b3J5QnVmZmVyLCBpaWQsIHBwdik7CiAgcmV0dXJuIENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgTmRyRGxsQ2FuVW5sb2FkTm93IFtSUENSVDQuQF0KICovCkhSRVNVTFQgV0lOQVBJIE5kckRsbENhblVubG9hZE5vdyhDU3RkUFNGYWN0b3J5QnVmZmVyICpwUFNGYWN0b3J5QnVmZmVyKQp7CiAgcmV0dXJuICEocFBTRmFjdG9yeUJ1ZmZlci0+UmVmQ291bnQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckRsbFJlZ2lzdGVyUHJveHkgW1JQQ1JUNC5AXQogKi8KSFJFU1VMVCBXSU5BUEkgTmRyRGxsUmVnaXN0ZXJQcm94eShITU9EVUxFIGhEbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm94eUZpbGVJbmZvICoqcFByb3h5RmlsZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDTFNJRCAqcGNsc2lkKQp7CiAgTFBTVFIgY2xzaWQ7CiAgY2hhciBrZXluYW1lWzEyMF0sIG1vZHVsZVtNQVhfUEFUSF07CiAgSEtFWSBrZXksIHN1YmtleTsKICBEV09SRCBsZW47CgogIFRSQUNFKCIoJXAsJXAsJXMpXG4iLCBoRGxsLCBwUHJveHlGaWxlTGlzdCwgZGVidWdzdHJfZ3VpZChwY2xzaWQpKTsKICBVdWlkVG9TdHJpbmdBKChVVUlEKilwY2xzaWQsICh1bnNpZ25lZCBjaGFyKiopJmNsc2lkKTsKCiAgLyogcmVnaXN0ZXIgaW50ZXJmYWNlcyB0byBwb2ludCB0byBjbHNpZCAqLwogIHdoaWxlICgqcFByb3h5RmlsZUxpc3QpIHsKICAgIHVuc2lnbmVkIHU7CiAgICBmb3IgKHU9MDsgdTwoKnBQcm94eUZpbGVMaXN0KS0+VGFibGVTaXplOyB1KyspIHsKICAgICAgQ0ludGVyZmFjZVN0dWJWdGJsICpwcm94eSA9ICgqcFByb3h5RmlsZUxpc3QpLT5wU3R1YlZ0YmxMaXN0W3VdOwogICAgICBQQ0ludGVyZmFjZU5hbWUgbmFtZSA9ICgqcFByb3h5RmlsZUxpc3QpLT5wTmFtZXNBcnJheVt1XTsKICAgICAgTFBTVFIgaWlkOwoKICAgICAgVFJBQ0UoInJlZ2lzdGVyaW5nICVzICVzID0+ICVzXG4iLCBuYW1lLCBkZWJ1Z3N0cl9ndWlkKHByb3h5LT5oZWFkZXIucGlpZCksIGNsc2lkKTsKCiAgICAgIFV1aWRUb1N0cmluZ0EoKFVVSUQqKXByb3h5LT5oZWFkZXIucGlpZCwgKHVuc2lnbmVkIGNoYXIqKikmaWlkKTsKICAgICAgc25wcmludGYoa2V5bmFtZSwgc2l6ZW9mKGtleW5hbWUpLCAiSW50ZXJmYWNlXFx7JXN9IiwgaWlkKTsKICAgICAgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKikmaWlkKTsKICAgICAgaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NMQVNTRVNfUk9PVCwga2V5bmFtZSwgMCwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV1JJVEUsIE5VTEwsICZrZXksIE5VTEwpID09IEVSUk9SX1NVQ0NFU1MpIHsKICAgICAgICBpZiAobmFtZSkKICAgICAgICAgIFJlZ1NldFZhbHVlRXhBKGtleSwgTlVMTCwgMCwgUkVHX1NaLCBuYW1lLCBzdHJsZW4obmFtZSkpOwogICAgICAgIGlmIChSZWdDcmVhdGVLZXlFeEEoa2V5LCAiUHJveHlTdHViQ2xzaWQzMiIsIDAsIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV1JJVEUsIE5VTEwsICZzdWJrZXksIE5VTEwpID09IEVSUk9SX1NVQ0NFU1MpIHsKICAgICAgICAgIHNucHJpbnRmKG1vZHVsZSwgc2l6ZW9mKG1vZHVsZSksICJ7JXN9IiwgY2xzaWQpOwogICAgICAgICAgUmVnU2V0VmFsdWVFeEEoc3Via2V5LCBOVUxMLCAwLCBSRUdfU1osIG1vZHVsZSwgc3RybGVuKG1vZHVsZSkpOwogICAgICAgICAgUmVnQ2xvc2VLZXkoc3Via2V5KTsKICAgICAgICB9CiAgICAgICAgUmVnQ2xvc2VLZXkoa2V5KTsKICAgICAgfQogICAgfQogICAgcFByb3h5RmlsZUxpc3QrKzsKICB9CgogIC8qIHJlZ2lzdGVyIGNsc2lkIHRvIHBvaW50IHRvIG1vZHVsZSAqLwogIHNucHJpbnRmKGtleW5hbWUsIHNpemVvZihrZXluYW1lKSwgIkNMU0lEXFx7JXN9IiwgY2xzaWQpOwogIGxlbiA9IEdldE1vZHVsZUZpbGVOYW1lQShoRGxsLCBtb2R1bGUsIHNpemVvZihtb2R1bGUpKTsKICBpZiAobGVuICYmIGxlbiA8IHNpemVvZihtb2R1bGUpKSB7CiAgICBUUkFDRSgicmVnaXN0ZXJpbmcgQ0xTSUQgJXMgPT4gJXNcbiIsIGNsc2lkLCBtb2R1bGUpOwogICAgaWYgKFJlZ0NyZWF0ZUtleUV4QShIS0VZX0NMQVNTRVNfUk9PVCwga2V5bmFtZSwgMCwgTlVMTCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dSSVRFLCBOVUxMLCAma2V5LCBOVUxMKSA9PSBFUlJPUl9TVUNDRVNTKSB7CiAgICAgIGlmIChSZWdDcmVhdGVLZXlFeEEoa2V5LCAiSW5Qcm9jU2VydmVyMzIiLCAwLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwgTlVMTCwgJnN1YmtleSwgTlVMTCkgPT0gRVJST1JfU1VDQ0VTUykgewogICAgICAgIFJlZ1NldFZhbHVlRXhBKHN1YmtleSwgTlVMTCwgMCwgUkVHX1NaLCBtb2R1bGUsIHN0cmxlbihtb2R1bGUpKTsKICAgICAgICBSZWdDbG9zZUtleShzdWJrZXkpOwogICAgICB9CiAgICAgIFJlZ0Nsb3NlS2V5KGtleSk7CiAgICB9CiAgfQoKICAvKiBkb25lICovCiAgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKikmY2xzaWQpOwogIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIE5kckRsbFVucmVnaXN0ZXJQcm94eSBbUlBDUlQ0LkBdCiAqLwpIUkVTVUxUIFdJTkFQSSBOZHJEbGxVbnJlZ2lzdGVyUHJveHkoSE1PRFVMRSBoRGxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm94eUZpbGVJbmZvICoqcFByb3h5RmlsZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENMU0lEICpwY2xzaWQpCnsKICBMUFNUUiBjbHNpZDsKICBjaGFyIGtleW5hbWVbMTIwXSwgbW9kdWxlW01BWF9QQVRIXTsKICBEV09SRCBsZW47CgogIFRSQUNFKCIoJXAsJXAsJXMpXG4iLCBoRGxsLCBwUHJveHlGaWxlTGlzdCwgZGVidWdzdHJfZ3VpZChwY2xzaWQpKTsKICBVdWlkVG9TdHJpbmdBKChVVUlEKilwY2xzaWQsICh1bnNpZ25lZCBjaGFyKiopJmNsc2lkKTsKCiAgLyogdW5yZWdpc3RlciBpbnRlcmZhY2VzICovCiAgd2hpbGUgKCpwUHJveHlGaWxlTGlzdCkgewogICAgdW5zaWduZWQgdTsKICAgIGZvciAodT0wOyB1PCgqcFByb3h5RmlsZUxpc3QpLT5UYWJsZVNpemU7IHUrKykgewogICAgICBDSW50ZXJmYWNlU3R1YlZ0YmwgKnByb3h5ID0gKCpwUHJveHlGaWxlTGlzdCktPnBTdHViVnRibExpc3RbdV07CiAgICAgIFBDSW50ZXJmYWNlTmFtZSBuYW1lID0gKCpwUHJveHlGaWxlTGlzdCktPnBOYW1lc0FycmF5W3VdOwogICAgICBMUFNUUiBpaWQ7CgogICAgICBUUkFDRSgidW5yZWdpc3RlcmluZyAlcyAlcyA8PSAlc1xuIiwgbmFtZSwgZGVidWdzdHJfZ3VpZChwcm94eS0+aGVhZGVyLnBpaWQpLCBjbHNpZCk7CgogICAgICBVdWlkVG9TdHJpbmdBKChVVUlEKilwcm94eS0+aGVhZGVyLnBpaWQsICh1bnNpZ25lZCBjaGFyKiopJmlpZCk7CiAgICAgIHNucHJpbnRmKGtleW5hbWUsIHNpemVvZihrZXluYW1lKSwgIkludGVyZmFjZVxceyVzfSIsIGlpZCk7CiAgICAgIFJwY1N0cmluZ0ZyZWVBKCh1bnNpZ25lZCBjaGFyKiopJmlpZCk7CiAgICAgIFJlZ0RlbGV0ZUtleUEoSEtFWV9DTEFTU0VTX1JPT1QsIGtleW5hbWUpOwogICAgfQogICAgcFByb3h5RmlsZUxpc3QrKzsKICB9CgogIC8qIHVucmVnaXN0ZXIgY2xzaWQgKi8KICBzbnByaW50ZihrZXluYW1lLCBzaXplb2Yoa2V5bmFtZSksICJDTFNJRFxceyVzfSIsIGNsc2lkKTsKICBsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZUEoaERsbCwgbW9kdWxlLCBzaXplb2YobW9kdWxlKSk7CiAgaWYgKGxlbiAmJiBsZW4gPCBzaXplb2YobW9kdWxlKSkgewogICAgVFJBQ0UoInVucmVnaXN0ZXJpbmcgQ0xTSUQgJXMgPD0gJXNcbiIsIGNsc2lkLCBtb2R1bGUpOwogICAgUmVnRGVsZXRlS2V5QShIS0VZX0NMQVNTRVNfUk9PVCwga2V5bmFtZSk7CiAgfQoKICAvKiBkb25lICovCiAgUnBjU3RyaW5nRnJlZUEoKHVuc2lnbmVkIGNoYXIqKikmY2xzaWQpOwogIHJldHVybiBTX09LOwp9Cg==