LyoKICogQ29weXJpZ2h0IDIwMDMgVmluY2VudCBC6XJvbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2luY2x1ZGUgImR1bXByZXMuaCIKI2luY2x1ZGUgIndyYy5oIgoKI2RlZmluZSBNQVNURVJfTEFOR1VBR0UgTEFOR19FTkdMSVNICiNkZWZpbmUgTkJfTEFORyAweDk0CgplbnVtIGxhbmdfdHlwZV9lIHsKCWxhbmdfdHlwZV9tYXN0ZXIgPSAwLAoJbGFuZ190eXBlX25ldXRyYWwsCglsYW5nX3R5cGVfbm9ybWFsCn07CgpzdGF0aWMgaW50IHByZXNlbnRfcmVzb3VyY2VzW3Jlc191c3IrMV07CnN0YXRpYyBjaGFyICpyZXNfbmFtZXNbcmVzX3VzcisxXTsKc3RhdGljIGludCBuYl9yZXNvdXJjZXNbcmVzX3VzcisxXVtsYW5nX3R5cGVfbm9ybWFsKzFdOwpzdGF0aWMgcmVzb3VyY2VfdCAqKmxpc3RfcmVzb3VyY2VzW3Jlc191c3IrMV1bbGFuZ190eXBlX25vcm1hbCsxXTsKCnN0YXRpYyBpbnQgZ2V0X2xhbmd1YWdlX2lkKHJlc291cmNlX3QgKnJlc291cmNlKSB7Cglzd2l0Y2gocmVzb3VyY2UtPnR5cGUpIHsKCQljYXNlIHJlc19hY2M6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmFjYy0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19ibXA6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmJtcC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19jdXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmN1ci0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19jdXJnOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5jdXJnLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX2RsZzoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMuZGxnLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX2RsZ2V4OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5kbGdleC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19mbnQ6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmZudC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19mbnRkaXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmZuZC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19pY286CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLmljby0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19pY29nOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5pY29nLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX21lbjoKCQkJcmV0dXJuIHJlc291cmNlLT5yZXMubWVuLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX21lbmV4OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5tZW5leC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19yZHQ6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnJkdC0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19zdHQ6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnN0dC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc191c3I6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnVzci0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19tc2c6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLm1zZy0+ZGF0YS0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc192ZXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnZlci0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19kbGdpbml0OgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5kbGdpLT5kYXRhLT5sdmMubGFuZ3VhZ2UtPmlkOwoJCWNhc2UgcmVzX3Rvb2xiYXI6CgkJCXJldHVybiByZXNvdXJjZS0+cmVzLnRidC0+bHZjLmxhbmd1YWdlLT5pZDsKCQljYXNlIHJlc19hbmljdXI6CgkJY2FzZSByZXNfYW5paWNvOgoJCQlyZXR1cm4gcmVzb3VyY2UtPnJlcy5hbmktPmRhdGEtPmx2Yy5sYW5ndWFnZS0+aWQ7CgkJZGVmYXVsdDoKCQkJLyogTm90IHN1cHBvc2VkIHRvIHJlYWNoIGhlcmUgKi8KCQkJZnByaW50ZihzdGRlcnIsICJOb3Qgc3VwcG9zZWQgdG8gcmVhY2ggaGVyZSAoZ2V0X2xhbmd1YWdlX2lkKCkpXG4iKTsKCQkJYWJvcnQoKTsKCQkJcmV0dXJuIC0xOwoJfQp9CgpzdGF0aWMgdm9pZCBhZGRfcmVzb3VyY2UocmVzb3VyY2VfdCAqcmVzb3VyY2UpIHsKCWVudW0gbGFuZ190eXBlX2UgbGFuZ190eXBlOwoJZW51bSByZXNfZSByZXNfdHlwZSA9IHJlc291cmNlLT50eXBlOwoJaW50IGxpZCA9IGdldF9sYW5ndWFnZV9pZChyZXNvdXJjZSk7CgoJaWYobGlkID09IE1BU1RFUl9MQU5HVUFHRSkgewoJCWxhbmdfdHlwZSA9IGxhbmdfdHlwZV9tYXN0ZXI7Cgl9IGVsc2UgaWYobGlkID09IExBTkdfTkVVVFJBTCkgewoJCWxhbmdfdHlwZSA9IGxhbmdfdHlwZV9uZXV0cmFsOwoJfSBlbHNlIHsKCQlsYW5nX3R5cGUgPSBsYW5nX3R5cGVfbm9ybWFsOwoJfQoJbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVdKys7CglsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSA9IHJlYWxsb2MobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0sIG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSpzaXplb2YocmVzb3VyY2VfdCAqKSk7CglsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXVtuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV0tMV0gPSByZXNvdXJjZTsKfQoKI2lmIDAKCiNkZWZpbmUgUFJFVFRZUFJJTlRMQU5HKGxhbmdpZCkgXAoJaWYoTEFOR18jI2xhbmdpZCA9PSBsaWQpIHsgXAoJCXJldHVybiAjbGFuZ2lkOyBcCgl9CgpzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2xhbmd1YWdlX25hbWUoaW50IGxpZCkgewoJUFJFVFRZUFJJTlRMQU5HKE5FVVRSQUwpCglQUkVUVFlQUklOVExBTkcoQUZSSUtBQU5TKQoJUFJFVFRZUFJJTlRMQU5HKEFMQkFOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEFSQUJJQykKCVBSRVRUWVBSSU5UTEFORyhBUk1FTklBTikKCVBSRVRUWVBSSU5UTEFORyhBU1NBTUVTRSkKCVBSRVRUWVBSSU5UTEFORyhBWkVSSSkKCVBSRVRUWVBSSU5UTEFORyhCQVNRVUUpCglQUkVUVFlQUklOVExBTkcoQkVMQVJVU0lBTikKCVBSRVRUWVBSSU5UTEFORyhCRU5HQUxJKQoJUFJFVFRZUFJJTlRMQU5HKEJVTEdBUklBTikKCVBSRVRUWVBSSU5UTEFORyhDQVRBTEFOKQoJUFJFVFRZUFJJTlRMQU5HKENISU5FU0UpCglQUkVUVFlQUklOVExBTkcoQ1JPQVRJQU4pCglQUkVUVFlQUklOVExBTkcoQ1pFQ0gpCglQUkVUVFlQUklOVExBTkcoREFOSVNIKQoJUFJFVFRZUFJJTlRMQU5HKERJVkVISSkKCVBSRVRUWVBSSU5UTEFORyhEVVRDSCkKCVBSRVRUWVBSSU5UTEFORyhFTkdMSVNIKQoJUFJFVFRZUFJJTlRMQU5HKEVTVE9OSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEZBRVJPRVNFKQoJUFJFVFRZUFJJTlRMQU5HKEZBUlNJKQoJUFJFVFRZUFJJTlRMQU5HKEZJTk5JU0gpCglQUkVUVFlQUklOVExBTkcoRlJFTkNIKQoJUFJFVFRZUFJJTlRMQU5HKEdBTElDSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEdFT1JHSUFOKQoJUFJFVFRZUFJJTlRMQU5HKEdFUk1BTikKCVBSRVRUWVBSSU5UTEFORyhHUkVFSykKCVBSRVRUWVBSSU5UTEFORyhHVUpBUkFUSSkKCVBSRVRUWVBSSU5UTEFORyhIRUJSRVcpCglQUkVUVFlQUklOVExBTkcoSElOREkpCglQUkVUVFlQUklOVExBTkcoSFVOR0FSSUFOKQoJUFJFVFRZUFJJTlRMQU5HKElDRUxBTkRJQykKCVBSRVRUWVBSSU5UTEFORyhJTkRPTkVTSUFOKQoJUFJFVFRZUFJJTlRMQU5HKElUQUxJQU4pCglQUkVUVFlQUklOVExBTkcoSkFQQU5FU0UpCglQUkVUVFlQUklOVExBTkcoS0FOTkFEQSkKCVBSRVRUWVBSSU5UTEFORyhLQVNITUlSSSkKCVBSRVRUWVBSSU5UTEFORyhLQVpBSykKCVBSRVRUWVBSSU5UTEFORyhLT05LQU5JKQoJUFJFVFRZUFJJTlRMQU5HKEtPUkVBTikKCVBSRVRUWVBSSU5UTEFORyhLWVJHWVopCglQUkVUVFlQUklOVExBTkcoTEFUVklBTikKCVBSRVRUWVBSSU5UTEFORyhMSVRIVUFOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKE1BQ0VET05JQU4pCglQUkVUVFlQUklOVExBTkcoTUFMQVkpCglQUkVUVFlQUklOVExBTkcoTUFMQVlBTEFNKQoJUFJFVFRZUFJJTlRMQU5HKE1BTklQVVJJKQoJUFJFVFRZUFJJTlRMQU5HKE1BUkFUSEkpCglQUkVUVFlQUklOVExBTkcoTU9OR09MSUFOKQoJUFJFVFRZUFJJTlRMQU5HKE5FUEFMSSkKCVBSRVRUWVBSSU5UTEFORyhOT1JXRUdJQU4pCglQUkVUVFlQUklOVExBTkcoT1JJWUEpCglQUkVUVFlQUklOVExBTkcoUE9MSVNIKQoJUFJFVFRZUFJJTlRMQU5HKFBPUlRVR1VFU0UpCglQUkVUVFlQUklOVExBTkcoUFVOSkFCSSkKCVBSRVRUWVBSSU5UTEFORyhST01BTklBTikKCVBSRVRUWVBSSU5UTEFORyhSVVNTSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFNBTlNLUklUKQoJUFJFVFRZUFJJTlRMQU5HKFNFUkJJQU4pCglQUkVUVFlQUklOVExBTkcoU0lOREhJKQoJUFJFVFRZUFJJTlRMQU5HKFNMT1ZBSykKCVBSRVRUWVBSSU5UTEFORyhTTE9WRU5JQU4pCglQUkVUVFlQUklOVExBTkcoU1BBTklTSCkKCVBSRVRUWVBSSU5UTEFORyhTV0FISUxJKQoJUFJFVFRZUFJJTlRMQU5HKFNXRURJU0gpCglQUkVUVFlQUklOVExBTkcoU1lSSUFDKQoJUFJFVFRZUFJJTlRMQU5HKFRBTUlMKQoJUFJFVFRZUFJJTlRMQU5HKFRBVEFSKQoJUFJFVFRZUFJJTlRMQU5HKFRFTFVHVSkKCVBSRVRUWVBSSU5UTEFORyhUSEFJKQoJUFJFVFRZUFJJTlRMQU5HKFRVUktJU0gpCglQUkVUVFlQUklOVExBTkcoVUtSQUlOSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFVSRFUpCglQUkVUVFlQUklOVExBTkcoVVpCRUspCglQUkVUVFlQUklOVExBTkcoVklFVE5BTUVTRSkKCVBSRVRUWVBSSU5UTEFORyhHQUVMSUMpCglQUkVUVFlQUklOVExBTkcoTUFMVEVTRSkKCVBSRVRUWVBSSU5UTEFORyhNQU9SSSkKCVBSRVRUWVBSSU5UTEFORyhSSEFFVE9fUk9NQU5DRSkKCVBSRVRUWVBSSU5UTEFORyhTQUFNSSkKCVBSRVRUWVBSSU5UTEFORyhTT1JCSUFOKQoJUFJFVFRZUFJJTlRMQU5HKFNVVFUpCglQUkVUVFlQUklOVExBTkcoVFNPTkdBKQoJUFJFVFRZUFJJTlRMQU5HKFRTV0FOQSkKCVBSRVRUWVBSSU5UTEFORyhWRU5EQSkKCVBSRVRUWVBSSU5UTEFORyhYSE9TQSkKCVBSRVRUWVBSSU5UTEFORyhaVUxVKQoJUFJFVFRZUFJJTlRMQU5HKEVTUEVSQU5UTykKCVBSRVRUWVBSSU5UTEFORyhXQUxPTikKCVBSRVRUWVBSSU5UTEFORyhDT1JOSVNIKQoJUFJFVFRZUFJJTlRMQU5HKFdFTFNIKQoJUFJFVFRZUFJJTlRMQU5HKEJSRVRPTikKCXJldHVybiAiVW5rb3duIGxhbmd1YWdlIjsKfQojZW5kaWYKCnN0YXRpYyBpbnQgY29tcGFyZV9hY2NlbGVyYXRvcihhY2NlbGVyYXRvcl90ICphY2NlbGVyYXRvcjEsIGFjY2VsZXJhdG9yX3QgKmFjY2VsZXJhdG9yMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglldmVudF90ICpldjEgPSBOVUxMLCAqZXYyID0gTlVMTDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoYWNjZWxlcmF0b3IxLT5tZW1vcHQgIT0gYWNjZWxlcmF0b3IyLT5tZW1vcHQpIHx8CgkgICAoYWNjZWxlcmF0b3IxLT5sdmMudmVyc2lvbiAhPSBhY2NlbGVyYXRvcjItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGFjY2VsZXJhdG9yMS0+bHZjLmNoYXJhY3RzICE9IGFjY2VsZXJhdG9yMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWV2MSA9IGFjY2VsZXJhdG9yMS0+ZXZlbnRzOwoJZXYyID0gYWNjZWxlcmF0b3IyLT5ldmVudHM7Cgl3aGlsZSghZGlmZmVyZW50ICYmIGV2MSAmJiBldjIpIHsKCQlpZighZGlmZmVyZW50ICYmCgkJICAgKChldjEtPmlkICE9IGV2Mi0+aWQpIHx8CgkJICAgKGV2MS0+ZmxhZ3MgIT0gZXYyLT5mbGFncykpKQoJCQlkaWZmZXJlbnQgPSAxOwoJCWV2MSA9IGV2MS0+bmV4dDsKCQlldjIgPSBldjItPm5leHQ7Cgl9CglpZighZGlmZmVyZW50ICYmCgkgICAoKGV2MSAmJiAhZXYyKSB8fCAoIWV2MSAmJiBldjIpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2JpdG1hcChiaXRtYXBfdCAqYml0bWFwMSwgYml0bWFwX3QgKmJpdG1hcDIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChiaXRtYXAxLT5tZW1vcHQgIT0gYml0bWFwMi0+bWVtb3B0KSB8fAoJICAgKGJpdG1hcDEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGJpdG1hcDItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGJpdG1hcDEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSBiaXRtYXAyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2N1cnNvcihjdXJzb3JfdCAqY3Vyc29yMSwgY3Vyc29yX3QgKmN1cnNvcjIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChjdXJzb3IxLT5pZCAhPSBjdXJzb3IyLT5pZCkgfHwKCSAgIChjdXJzb3IxLT53aWR0aCAhPSBjdXJzb3IyLT53aWR0aCkgfHwKCSAgIChjdXJzb3IxLT5oZWlnaHQgIT0gY3Vyc29yMi0+aGVpZ2h0KSB8fAoJICAgKGN1cnNvcjEtPnhob3QgIT0gY3Vyc29yMi0+eGhvdCkgfHwKCSAgIChjdXJzb3IxLT55aG90ICE9IGN1cnNvcjItPnlob3QpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChjdXJzb3IxLT5sdmMudmVyc2lvbiAhPSBjdXJzb3IyLT5sdmMudmVyc2lvbikgfHwKCSAgIChjdXJzb3IxLT5sdmMuY2hhcmFjdHMgIT0gY3Vyc29yMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9jdXJzb3JfZ3JvdXAoY3Vyc29yX2dyb3VwX3QgKmN1cnNvcl9ncm91cDEsIGN1cnNvcl9ncm91cF90ICpjdXJzb3JfZ3JvdXAyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWN1cnNvcl90ICpjdXJzb3IxID0gTlVMTCwgKmN1cnNvcjIgPSBOVUxMOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChjdXJzb3JfZ3JvdXAxLT5tZW1vcHQgIT0gY3Vyc29yX2dyb3VwMi0+bWVtb3B0KSB8fAoJICAgKGN1cnNvcl9ncm91cDEtPmx2Yy52ZXJzaW9uICE9IGN1cnNvcl9ncm91cDItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGN1cnNvcl9ncm91cDEtPmx2Yy5jaGFyYWN0cyAhPSBjdXJzb3JfZ3JvdXAyLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKGN1cnNvcl9ncm91cDEtPm5jdXJzb3IgIT0gY3Vyc29yX2dyb3VwMi0+bmN1cnNvcikpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpIHsKCQljdXJzb3IxID0gY3Vyc29yX2dyb3VwMS0+Y3Vyc29ybGlzdDsKCQljdXJzb3IyID0gY3Vyc29yX2dyb3VwMi0+Y3Vyc29ybGlzdDsKCQl3aGlsZSghZGlmZmVyZW50ICYmIGN1cnNvcjEgJiYgY3Vyc29yMikgewoJCQlkaWZmZXJlbnQgPSBjb21wYXJlX2N1cnNvcihjdXJzb3IxLCBjdXJzb3IyKTsKCQkJY3Vyc29yMSA9IGN1cnNvcjEtPm5leHQ7CgkJCWN1cnNvcjIgPSBjdXJzb3IyLT5uZXh0OwoJCX0KCQlpZighZGlmZmVyZW50ICYmCgkJICAgKChjdXJzb3IxICYmICFjdXJzb3IyKSB8fAoJCSAgICghY3Vyc29yMSAmJiBjdXJzb3IyKSkpCgkJCWRpZmZlcmVudCA9IDE7Cgl9CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfY29udHJvbChjb250cm9sX3QgKmNvbnRyb2wxLCBjb250cm9sX3QgKmNvbnRyb2wyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWNoYXIgKm5hbWVpZCA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkJKChjb250cm9sMSAmJiAhY29udHJvbDIpIHx8CgkJKCFjb250cm9sMSAmJiBjb250cm9sMikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoZGlmZmVyZW50IHx8ICFjb250cm9sMSB8fCAhY29udHJvbDIpCgkJcmV0dXJuIGRpZmZlcmVudDsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihjb250cm9sMS0+Y3RsY2xhc3MpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoY29udHJvbDItPmN0bGNsYXNzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWZyZWUobmFtZWlkKTsKCWlmKCFkaWZmZXJlbnQgJiYgCgkgICAoY29udHJvbDEtPmlkICE9IGNvbnRyb2wyLT5pZCkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgY29udHJvbDEtPmdvdHN0eWxlICYmIGNvbnRyb2wyLT5nb3RzdHlsZSkgewoJCWlmKCghY29udHJvbDEtPnN0eWxlIHx8ICFjb250cm9sMi0+c3R5bGUpIHx8CgkJICAgKGNvbnRyb2wxLT5zdHlsZS0+YW5kX21hc2sgfHwgY29udHJvbDItPnN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoY29udHJvbDEtPnN0eWxlLT5vcl9tYXNrICE9IGNvbnRyb2wyLT5zdHlsZS0+b3JfbWFzaykpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKChjb250cm9sMS0+Z290c3R5bGUgJiYgIWNvbnRyb2wyLT5nb3RzdHlsZSkgfHwKCQkgICghY29udHJvbDEtPmdvdHN0eWxlICYmIGNvbnRyb2wyLT5nb3RzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBjb250cm9sMS0+Z290ZXhzdHlsZSAmJiBjb250cm9sMi0+Z290ZXhzdHlsZSkgewoJCWlmKCghY29udHJvbDEtPmV4c3R5bGUgfHwgIWNvbnRyb2wyLT5leHN0eWxlKSB8fAoJCSAgIChjb250cm9sMS0+ZXhzdHlsZS0+YW5kX21hc2sgfHwgY29udHJvbDItPmV4c3R5bGUtPmFuZF9tYXNrKSB8fAoJCSAgIChjb250cm9sMS0+ZXhzdHlsZS0+b3JfbWFzayAhPSBjb250cm9sMi0+ZXhzdHlsZS0+b3JfbWFzaykpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKChjb250cm9sMS0+Z290ZXhzdHlsZSAmJiAhY29udHJvbDItPmdvdGV4c3R5bGUpIHx8CgkJICAoIWNvbnRyb2wxLT5nb3RleHN0eWxlICYmIGNvbnRyb2wyLT5nb3RleHN0eWxlKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGNvbnRyb2wxLT5nb3RoZWxwaWQgJiYgY29udHJvbDItPmdvdGhlbHBpZCkgewoJCWlmKGNvbnRyb2wxLT5oZWxwaWQgIT0gY29udHJvbDItPmhlbHBpZCkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKGNvbnRyb2wxLT5nb3RoZWxwaWQgJiYgIWNvbnRyb2wyLT5nb3RoZWxwaWQpIHx8CgkJICAoIWNvbnRyb2wxLT5nb3RoZWxwaWQgJiYgY29udHJvbDItPmdvdGhlbHBpZCkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2RpYWxvZyhkaWFsb2dfdCAqZGlhbG9nMSwgZGlhbG9nX3QgKmRpYWxvZzIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJY2hhciAqbmFtZWlkID0gTlVMTDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoZGlhbG9nMS0+bWVtb3B0ICE9IGRpYWxvZzItPm1lbW9wdCkgfHwKCSAgIChkaWFsb2cxLT5sdmMudmVyc2lvbiAhPSBkaWFsb2cyLT5sdmMudmVyc2lvbikgfHwKCSAgIChkaWFsb2cxLT5sdmMuY2hhcmFjdHMgIT0gZGlhbG9nMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgZGlhbG9nMS0+Z290c3R5bGUgJiYgZGlhbG9nMi0+Z290c3R5bGUpIHsKCQlpZigoIWRpYWxvZzEtPnN0eWxlIHx8ICFkaWFsb2cyLT5zdHlsZSkgfHwKCQkgICAoZGlhbG9nMS0+c3R5bGUtPmFuZF9tYXNrIHx8IGRpYWxvZzItPnN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoZGlhbG9nMS0+c3R5bGUtPm9yX21hc2sgIT0gZGlhbG9nMi0+c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nMS0+Z290c3R5bGUgJiYgIWRpYWxvZzItPmdvdHN0eWxlKSB8fAoJCSAgKCFkaWFsb2cxLT5nb3RzdHlsZSAmJiBkaWFsb2cyLT5nb3RzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBkaWFsb2cxLT5nb3RleHN0eWxlICYmIGRpYWxvZzItPmdvdGV4c3R5bGUpIHsKCQlpZigoIWRpYWxvZzEtPmV4c3R5bGUgfHwgIWRpYWxvZzItPmV4c3R5bGUpIHx8CgkJICAgKGRpYWxvZzEtPmV4c3R5bGUtPmFuZF9tYXNrIHx8IGRpYWxvZzItPmV4c3R5bGUtPmFuZF9tYXNrKSB8fAoJCSAgIChkaWFsb2cxLT5leHN0eWxlLT5vcl9tYXNrICE9IGRpYWxvZzItPmV4c3R5bGUtPm9yX21hc2spKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nMS0+Z290ZXhzdHlsZSAmJiAhZGlhbG9nMi0+Z290ZXhzdHlsZSkgfHwKCQkgICghZGlhbG9nMS0+Z290ZXhzdHlsZSAmJiBkaWFsb2cyLT5nb3RleHN0eWxlKSkpCgkJCWRpZmZlcmVudCA9IDE7CgluYW1laWQgPSBzdHJkdXAoZ2V0X25hbWVpZF9zdHIoZGlhbG9nMS0+bWVudSkpOwoJaWYoIWRpZmZlcmVudCAmJiBzdHJjbXAobmFtZWlkLCBnZXRfbmFtZWlkX3N0cihkaWFsb2cyLT5tZW51KSkpCgkJZGlmZmVyZW50ID0gMTsKCWZyZWUobmFtZWlkKTsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihkaWFsb2cxLT5kbGdjbGFzcykpOwoJaWYoIWRpZmZlcmVudCAmJiBzdHJjbXAobmFtZWlkLCBnZXRfbmFtZWlkX3N0cihkaWFsb2cyLT5kbGdjbGFzcykpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfY29udHJvbChkaWFsb2cxLT5jb250cm9scywgZGlhbG9nMi0+Y29udHJvbHMpOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2RpYWxvZ2V4KGRpYWxvZ2V4X3QgKmRpYWxvZ2V4MSwgZGlhbG9nZXhfdCAqZGlhbG9nZXgyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWNoYXIgKm5hbWVpZCA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGRpYWxvZ2V4MS0+bWVtb3B0ICE9IGRpYWxvZ2V4Mi0+bWVtb3B0KSB8fAoJICAgKGRpYWxvZ2V4MS0+bHZjLnZlcnNpb24gIT0gZGlhbG9nZXgyLT5sdmMudmVyc2lvbikgfHwKCSAgIChkaWFsb2dleDEtPmx2Yy5jaGFyYWN0cyAhPSBkaWFsb2dleDItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIGRpYWxvZ2V4MS0+Z290c3R5bGUgJiYgZGlhbG9nZXgyLT5nb3RzdHlsZSkgewoJCWlmKCghZGlhbG9nZXgxLT5zdHlsZSB8fCAhZGlhbG9nZXgyLT5zdHlsZSkgfHwKCQkgICAoZGlhbG9nZXgxLT5zdHlsZS0+YW5kX21hc2sgfHwgZGlhbG9nZXgyLT5zdHlsZS0+YW5kX21hc2spIHx8CgkJICAgKGRpYWxvZ2V4MS0+c3R5bGUtPm9yX21hc2sgIT0gZGlhbG9nZXgyLT5zdHlsZS0+b3JfbWFzaykpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKChkaWFsb2dleDEtPmdvdHN0eWxlICYmICFkaWFsb2dleDItPmdvdHN0eWxlKSB8fAoJCSAgKCFkaWFsb2dleDEtPmdvdHN0eWxlICYmIGRpYWxvZ2V4Mi0+Z290c3R5bGUpKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgZGlhbG9nZXgxLT5nb3RleHN0eWxlICYmIGRpYWxvZ2V4Mi0+Z290ZXhzdHlsZSkgewoJCWlmKCghZGlhbG9nZXgxLT5leHN0eWxlIHx8ICFkaWFsb2dleDItPmV4c3R5bGUpIHx8CgkJICAgKGRpYWxvZ2V4MS0+ZXhzdHlsZS0+YW5kX21hc2sgfHwgZGlhbG9nZXgyLT5leHN0eWxlLT5hbmRfbWFzaykgfHwKCQkgICAoZGlhbG9nZXgxLT5leHN0eWxlLT5vcl9tYXNrICE9IGRpYWxvZ2V4Mi0+ZXhzdHlsZS0+b3JfbWFzaykpCgkJCWRpZmZlcmVudCA9IDE7Cgl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCSAgKChkaWFsb2dleDEtPmdvdGV4c3R5bGUgJiYgIWRpYWxvZ2V4Mi0+Z290ZXhzdHlsZSkgfHwKCQkgICghZGlhbG9nZXgxLT5nb3RleHN0eWxlICYmIGRpYWxvZ2V4Mi0+Z290ZXhzdHlsZSkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiBkaWFsb2dleDEtPmdvdGhlbHBpZCAmJiBkaWFsb2dleDItPmdvdGhlbHBpZCkgewoJCWlmKGRpYWxvZ2V4MS0+aGVscGlkICE9IGRpYWxvZ2V4Mi0+aGVscGlkKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgoZGlhbG9nZXgxLT5nb3RoZWxwaWQgJiYgIWRpYWxvZ2V4Mi0+Z290aGVscGlkKSB8fAoJCSAgKCFkaWFsb2dleDEtPmdvdGhlbHBpZCAmJiBkaWFsb2dleDItPmdvdGhlbHBpZCkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJbmFtZWlkID0gc3RyZHVwKGdldF9uYW1laWRfc3RyKGRpYWxvZ2V4MS0+bWVudSkpOwoJaWYoIWRpZmZlcmVudCAmJiBzdHJjbXAobmFtZWlkLCBnZXRfbmFtZWlkX3N0cihkaWFsb2dleDItPm1lbnUpKSkKCQlkaWZmZXJlbnQgPSAxOwoJZnJlZShuYW1laWQpOwoJbmFtZWlkID0gc3RyZHVwKGdldF9uYW1laWRfc3RyKGRpYWxvZ2V4MS0+ZGxnY2xhc3MpKTsKCWlmKCFkaWZmZXJlbnQgJiYgc3RyY21wKG5hbWVpZCwgZ2V0X25hbWVpZF9zdHIoZGlhbG9nZXgyLT5kbGdjbGFzcykpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CglpZighZGlmZmVyZW50KQoJCWRpZmZlcmVudCA9IGNvbXBhcmVfY29udHJvbChkaWFsb2dleDEtPmNvbnRyb2xzLCBkaWFsb2dleDItPmNvbnRyb2xzKTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9mb250KGZvbnRfdCAqZm9udDEsIGZvbnRfdCAqZm9udDIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChmb250MS0+bWVtb3B0ICE9IGZvbnQyLT5tZW1vcHQpIHx8CgkgICAoZm9udDEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IGZvbnQyLT5kYXRhLT5sdmMudmVyc2lvbikgfHwKCSAgIChmb250MS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IGZvbnQyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2ZvbnRkaXIoZm9udGRpcl90ICpmb250ZGlyMSwgZm9udGRpcl90ICpmb250ZGlyMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGZvbnRkaXIxLT5tZW1vcHQgIT0gZm9udGRpcjItPm1lbW9wdCkgfHwKCSAgIChmb250ZGlyMS0+ZGF0YS0+bHZjLnZlcnNpb24gIT0gZm9udGRpcjItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGZvbnRkaXIxLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gZm9udGRpcjItPmRhdGEtPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfaWNvbihpY29uX3QgKmljb24xLCBpY29uX3QgKmljb24yKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgoaWNvbjEtPmlkICE9IGljb24yLT5pZCkgfHwKCSAgIChpY29uMS0+d2lkdGggIT0gaWNvbjItPndpZHRoKSB8fAoJICAgKGljb24xLT5oZWlnaHQgIT0gaWNvbjItPmhlaWdodCkpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGljb24xLT5sdmMudmVyc2lvbiAhPSBpY29uMi0+bHZjLnZlcnNpb24pIHx8CgkgICAoaWNvbjEtPmx2Yy5jaGFyYWN0cyAhPSBpY29uMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9pY29uX2dyb3VwKGljb25fZ3JvdXBfdCAqaWNvbl9ncm91cDEsIGljb25fZ3JvdXBfdCAqaWNvbl9ncm91cDIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWNvbl90ICppY29uMSA9IE5VTEwsICppY29uMiA9IE5VTEw7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGljb25fZ3JvdXAxLT5tZW1vcHQgIT0gaWNvbl9ncm91cDItPm1lbW9wdCkgfHwKCSAgIChpY29uX2dyb3VwMS0+bHZjLnZlcnNpb24gIT0gaWNvbl9ncm91cDItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGljb25fZ3JvdXAxLT5sdmMuY2hhcmFjdHMgIT0gaWNvbl9ncm91cDItPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmCgkgICAoaWNvbl9ncm91cDEtPm5pY29uICE9IGljb25fZ3JvdXAyLT5uaWNvbikpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpIHsKCQlpY29uMSA9IGljb25fZ3JvdXAxLT5pY29ubGlzdDsKCQlpY29uMiA9IGljb25fZ3JvdXAyLT5pY29ubGlzdDsKCQl3aGlsZSghZGlmZmVyZW50ICYmIGljb24xICYmIGljb24yKSB7CgkJCWRpZmZlcmVudCA9IGNvbXBhcmVfaWNvbihpY29uMSwgaWNvbjIpOwoJCQlpY29uMSA9IGljb24xLT5uZXh0OwoJCQlpY29uMiA9IGljb24yLT5uZXh0OwoJCX0KCQlpZighZGlmZmVyZW50ICYmCgkJICAgKChpY29uMSAmJiAhaWNvbjIpIHx8CgkJICAgKCFpY29uMSAmJiBpY29uMikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJfQoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX21lbnVfaXRlbShtZW51X2l0ZW1fdCAqbWVudV9pdGVtMSwgbWVudV9pdGVtX3QgKm1lbnVfaXRlbTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJd2hpbGUoIWRpZmZlcmVudCAmJiBtZW51X2l0ZW0xICYmIG1lbnVfaXRlbTIpIHsKCQlpZihtZW51X2l0ZW0xLT5wb3B1cCAmJiBtZW51X2l0ZW0yLT5wb3B1cCkKCQkJZGlmZmVyZW50ID0gY29tcGFyZV9tZW51X2l0ZW0obWVudV9pdGVtMS0+cG9wdXAsIG1lbnVfaXRlbTItPnBvcHVwKTsKCQllbHNlIGlmKCFtZW51X2l0ZW0xLT5wb3B1cCAmJiAhbWVudV9pdGVtMi0+cG9wdXApIHsKCQkJaWYobWVudV9pdGVtMS0+bmFtZSAmJiBtZW51X2l0ZW0yLT5uYW1lKSB7CgkJCQlpZigobWVudV9pdGVtMS0+aWQgIT0gbWVudV9pdGVtMi0+aWQpIHx8CgkJCQkgICAobWVudV9pdGVtMS0+c3RhdGUgIT0gbWVudV9pdGVtMi0+c3RhdGUpKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZigobWVudV9pdGVtMS0+bmFtZSAmJiAhbWVudV9pdGVtMi0+bmFtZSkgfHwKCQkJCSAgKCFtZW51X2l0ZW0xLT5uYW1lICYmIG1lbnVfaXRlbTItPm5hbWUpKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJfSBlbHNlCgkJCWRpZmZlcmVudCA9IDE7CgkJbWVudV9pdGVtMSA9IG1lbnVfaXRlbTEtPm5leHQ7CgkJbWVudV9pdGVtMiA9IG1lbnVfaXRlbTItPm5leHQ7Cgl9CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lbnVfaXRlbTEgJiYgIW1lbnVfaXRlbTIpIHx8CgkgICAoIW1lbnVfaXRlbTEgJiYgbWVudV9pdGVtMikpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfbWVudShtZW51X3QgKm1lbnUxLCBtZW51X3QgKm1lbnUyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgobWVudTEtPm1lbW9wdCAhPSBtZW51Mi0+bWVtb3B0KSB8fAoJICAgKG1lbnUxLT5sdmMudmVyc2lvbiAhPSBtZW51Mi0+bHZjLnZlcnNpb24pIHx8CgkgICAobWVudTEtPmx2Yy5jaGFyYWN0cyAhPSBtZW51Mi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpCgkJZGlmZmVyZW50ID0gY29tcGFyZV9tZW51X2l0ZW0obWVudTEtPml0ZW1zLCBtZW51Mi0+aXRlbXMpOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX21lbnVleF9pdGVtKG1lbnVleF9pdGVtX3QgKm1lbnVleF9pdGVtMSwgbWVudWV4X2l0ZW1fdCAqbWVudWV4X2l0ZW0yKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCXdoaWxlKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xICYmIG1lbnVleF9pdGVtMikgewoJCWlmKG1lbnVleF9pdGVtMS0+cG9wdXAgJiYgbWVudWV4X2l0ZW0yLT5wb3B1cCkgewoJCQlpZighZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMS0+Z290aWQgJiYgbWVudWV4X2l0ZW0yLT5nb3RpZCkgewoJCQkJaWYobWVudWV4X2l0ZW0xLT5pZCAhPSBtZW51ZXhfaXRlbTItPmlkKQoJCQkJCWRpZmZlcmVudCA9IDE7CgkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkgICgobWVudWV4X2l0ZW0xLT5nb3RpZCAmJiAhbWVudWV4X2l0ZW0yLT5nb3RpZCkgfHwKCQkJCSAgKCFtZW51ZXhfaXRlbTItPmdvdGlkICYmIG1lbnVleF9pdGVtMi0+Z290aWQpKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQlpZighZGlmZmVyZW50ICYmIG1lbnVleF9pdGVtMS0+Z290dHlwZSAmJiBtZW51ZXhfaXRlbTItPmdvdHR5cGUpIHsKCQkJCWlmKG1lbnVleF9pdGVtMS0+dHlwZSAhPSBtZW51ZXhfaXRlbTItPnR5cGUpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdHR5cGUgJiYgIW1lbnVleF9pdGVtMi0+Z290dHlwZSkgfHwKCQkJCSAgKCFtZW51ZXhfaXRlbTItPmdvdHR5cGUgJiYgbWVudWV4X2l0ZW0yLT5nb3R0eXBlKSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdHN0YXRlICYmIG1lbnVleF9pdGVtMi0+Z290c3RhdGUpIHsKCQkJCWlmKG1lbnVleF9pdGVtMS0+c3RhdGUgIT0gbWVudWV4X2l0ZW0yLT5zdGF0ZSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJICAoKG1lbnVleF9pdGVtMS0+Z290c3RhdGUgJiYgIW1lbnVleF9pdGVtMi0+Z290c3RhdGUpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RzdGF0ZSAmJiBtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSkpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdGhlbHBpZCAmJiBtZW51ZXhfaXRlbTItPmdvdGhlbHBpZCkgewoJCQkJaWYobWVudWV4X2l0ZW0xLT5oZWxwaWQgIT0gbWVudWV4X2l0ZW0yLT5oZWxwaWQpCgkJCQkJZGlmZmVyZW50ID0gMTsKCQkJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdGhlbHBpZCAmJiAhbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpIHx8CgkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQgJiYgbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQlpZighZGlmZmVyZW50KQoJCQkJZGlmZmVyZW50ID0gY29tcGFyZV9tZW51ZXhfaXRlbShtZW51ZXhfaXRlbTEtPnBvcHVwLCBtZW51ZXhfaXRlbTItPnBvcHVwKTsKCQl9IGVsc2UgaWYoIW1lbnVleF9pdGVtMS0+cG9wdXAgJiYgIW1lbnVleF9pdGVtMi0+cG9wdXApIHsKCQkJaWYobWVudWV4X2l0ZW0xLT5uYW1lICYmIG1lbnVleF9pdGVtMi0+bmFtZSkgewoJCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdGlkICYmIG1lbnVleF9pdGVtMi0+Z290aWQpIHsKCQkJCQlpZihtZW51ZXhfaXRlbTEtPmlkICE9IG1lbnVleF9pdGVtMi0+aWQpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdGlkICYmICFtZW51ZXhfaXRlbTItPmdvdGlkKSB8fAoJCQkJCSAgKCFtZW51ZXhfaXRlbTItPmdvdGlkICYmIG1lbnVleF9pdGVtMi0+Z290aWQpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3R0eXBlICYmIG1lbnVleF9pdGVtMi0+Z290dHlwZSkgewoJCQkJCWlmKG1lbnVleF9pdGVtMS0+dHlwZSAhPSBtZW51ZXhfaXRlbTItPnR5cGUpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdHR5cGUgJiYgIW1lbnVleF9pdGVtMi0+Z290dHlwZSkgfHwKCQkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3R0eXBlICYmIG1lbnVleF9pdGVtMi0+Z290dHlwZSkpKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJaWYoIWRpZmZlcmVudCAmJiBtZW51ZXhfaXRlbTEtPmdvdHN0YXRlICYmIG1lbnVleF9pdGVtMi0+Z290c3RhdGUpIHsKCQkJCQlpZihtZW51ZXhfaXRlbTEtPnN0YXRlICE9IG1lbnVleF9pdGVtMi0+c3RhdGUpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQl9IGVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgKChtZW51ZXhfaXRlbTEtPmdvdHN0YXRlICYmICFtZW51ZXhfaXRlbTItPmdvdHN0YXRlKSB8fAoJCQkJCSAgKCFtZW51ZXhfaXRlbTItPmdvdHN0YXRlICYmIG1lbnVleF9pdGVtMi0+Z290c3RhdGUpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWlmKCFkaWZmZXJlbnQgJiYgbWVudWV4X2l0ZW0xLT5nb3RoZWxwaWQgJiYgbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpIHsKCQkJCQlpZihtZW51ZXhfaXRlbTEtPmhlbHBpZCAhPSBtZW51ZXhfaXRlbTItPmhlbHBpZCkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkJICAoKG1lbnVleF9pdGVtMS0+Z290aGVscGlkICYmICFtZW51ZXhfaXRlbTItPmdvdGhlbHBpZCkgfHwKCQkJCQkgICghbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQgJiYgbWVudWV4X2l0ZW0yLT5nb3RoZWxwaWQpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJfSBlbHNlIGlmKChtZW51ZXhfaXRlbTEtPm5hbWUgJiYgIW1lbnVleF9pdGVtMi0+bmFtZSkgfHwKCQkJCSAgKCFtZW51ZXhfaXRlbTEtPm5hbWUgJiYgbWVudWV4X2l0ZW0yLT5uYW1lKSkKCQkJCQlkaWZmZXJlbnQgPSAxOwoJCX0gZWxzZQoJCQlkaWZmZXJlbnQgPSAxOwoJCW1lbnVleF9pdGVtMSA9IG1lbnVleF9pdGVtMS0+bmV4dDsKCQltZW51ZXhfaXRlbTIgPSBtZW51ZXhfaXRlbTItPm5leHQ7Cgl9CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lbnVleF9pdGVtMSAmJiAhbWVudWV4X2l0ZW0yKSB8fAoJICAgKCFtZW51ZXhfaXRlbTEgJiYgbWVudWV4X2l0ZW0yKSkpCgkJZGlmZmVyZW50ID0gMTsKCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV9tZW51ZXgobWVudWV4X3QgKm1lbnVleDEsIG1lbnVleF90ICptZW51ZXgyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgobWVudWV4MS0+bWVtb3B0ICE9IG1lbnVleDItPm1lbW9wdCkgfHwKCSAgIChtZW51ZXgxLT5sdmMudmVyc2lvbiAhPSBtZW51ZXgyLT5sdmMudmVyc2lvbikgfHwKCSAgIChtZW51ZXgxLT5sdmMuY2hhcmFjdHMgIT0gbWVudWV4Mi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpCgkJZGlmZmVyZW50ID0gY29tcGFyZV9tZW51ZXhfaXRlbShtZW51ZXgxLT5pdGVtcywgbWVudWV4Mi0+aXRlbXMpOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3JjZGF0YShyY2RhdGFfdCAqcmNkYXRhMSwgcmNkYXRhX3QgKnJjZGF0YTIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJaWYoIWRpZmZlcmVudCAmJgoJICAgKChyY2RhdGExLT5tZW1vcHQgIT0gcmNkYXRhMi0+bWVtb3B0KSB8fAoJICAgKHJjZGF0YTEtPmRhdGEtPmx2Yy52ZXJzaW9uICE9IHJjZGF0YTItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKHJjZGF0YTEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSByY2RhdGEyLT5kYXRhLT5sdmMuY2hhcmFjdHMpKSkKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3N0cmluZ3RhYmxlKHN0cmluZ3RhYmxlX3QgKnN0cmluZ3RhYmxlMSwgc3RyaW5ndGFibGVfdCAqc3RyaW5ndGFibGUyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWludCBpOwoJd2hpbGUoIWRpZmZlcmVudCAmJiBzdHJpbmd0YWJsZTEgJiYgc3RyaW5ndGFibGUyKSB7CgkJaWYoKHN0cmluZ3RhYmxlMS0+bWVtb3B0ICE9IHN0cmluZ3RhYmxlMi0+bWVtb3B0KSB8fAoJCSAgIChzdHJpbmd0YWJsZTEtPmx2Yy52ZXJzaW9uICE9IHN0cmluZ3RhYmxlMi0+bHZjLnZlcnNpb24pIHx8CgkJICAgKHN0cmluZ3RhYmxlMS0+bHZjLmNoYXJhY3RzICE9IHN0cmluZ3RhYmxlMi0+bHZjLmNoYXJhY3RzKSkKCQkJZGlmZmVyZW50ID0gMTsKCQlpZighZGlmZmVyZW50KSB7CgkJCWlmKChzdHJpbmd0YWJsZTEtPm5lbnRyaWVzICE9IHN0cmluZ3RhYmxlMi0+bmVudHJpZXMpIHx8CgkJCSAgIChzdHJpbmd0YWJsZTEtPmlkYmFzZSAhPSBzdHJpbmd0YWJsZTItPmlkYmFzZSkpCgkJCQlkaWZmZXJlbnQgPSAxOwoJCQllbHNlCgkJCQlmb3IoaSA9IDAgOyBpIDwgc3RyaW5ndGFibGUxLT5uZW50cmllczsgaSsrKQoJCQkJCWlmKChzdHJpbmd0YWJsZTEtPmVudHJpZXNbaV0uaWQgIT0gc3RyaW5ndGFibGUyLT5lbnRyaWVzW2ldLmlkKSB8fAoJCQkJCSAgIChzdHJpbmd0YWJsZTEtPmVudHJpZXNbaV0ubWVtb3B0ICE9IHN0cmluZ3RhYmxlMi0+ZW50cmllc1tpXS5tZW1vcHQpIHx8CgkJCQkJICAgKHN0cmluZ3RhYmxlMS0+ZW50cmllc1tpXS5zdHIgJiYgIXN0cmluZ3RhYmxlMi0+ZW50cmllc1tpXS5zdHIpIHx8CgkJCQkJICAgKCFzdHJpbmd0YWJsZTEtPmVudHJpZXNbaV0uc3RyICYmIHN0cmluZ3RhYmxlMi0+ZW50cmllc1tpXS5zdHIpKSB7CgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQl9CgkJc3RyaW5ndGFibGUxID0gc3RyaW5ndGFibGUxLT5uZXh0OwoJCXN0cmluZ3RhYmxlMiA9IHN0cmluZ3RhYmxlMi0+bmV4dDsKCX0KCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV91c2VyKHVzZXJfdCAqdXNlcjEsIHVzZXJfdCAqdXNlcjIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJY2hhciAqbmFtZWlkID0gTlVMTDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgodXNlcjEtPm1lbW9wdCAhPSB1c2VyMi0+bWVtb3B0KSB8fAoJICAgKHVzZXIxLT5kYXRhLT5sdmMudmVyc2lvbiAhPSB1c2VyMi0+ZGF0YS0+bHZjLnZlcnNpb24pIHx8CgkgICAodXNlcjEtPmRhdGEtPmx2Yy5jaGFyYWN0cyAhPSB1c2VyMi0+ZGF0YS0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cih1c2VyMS0+dHlwZSkpOwoJaWYoIWRpZmZlcmVudCAmJiBzdHJjbXAobmFtZWlkLCBnZXRfbmFtZWlkX3N0cih1c2VyMi0+dHlwZSkpKQoJCWRpZmZlcmVudCA9IDE7CglmcmVlKG5hbWVpZCk7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfbWVzc2FnZXRhYmxlKG1lc3NhZ2V0YWJsZV90ICptZXNzYWdldGFibGUxLCBtZXNzYWdldGFibGVfdCAqbWVzc2FnZXRhYmxlMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKG1lc3NhZ2V0YWJsZTEtPm1lbW9wdCAhPSBtZXNzYWdldGFibGUyLT5tZW1vcHQpIHx8CgkgICAobWVzc2FnZXRhYmxlMS0+ZGF0YS0+bHZjLnZlcnNpb24gIT0gbWVzc2FnZXRhYmxlMi0+ZGF0YS0+bHZjLnZlcnNpb24pIHx8CgkgICAobWVzc2FnZXRhYmxlMS0+ZGF0YS0+bHZjLmNoYXJhY3RzICE9IG1lc3NhZ2V0YWJsZTItPmRhdGEtPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfc3RyaW5nKHN0cmluZ190ICpzdHJpbmcxLCBzdHJpbmdfdCAqc3RyaW5nMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKHN0cmluZzEtPnNpemUgIT0gc3RyaW5nMi0+c2l6ZSkgfHwKCSAgIChzdHJpbmcxLT50eXBlICE9IHN0cmluZzItPnR5cGUpKSkKCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCkgewoJCWlmKHN0cmluZzEtPnR5cGUgPT0gc3RyX2NoYXIpCgkJCWRpZmZlcmVudCA9IG1lbWNtcChzdHJpbmcxLT5zdHIuY3N0ciwgc3RyaW5nMi0+c3RyLmNzdHIsIHN0cmluZzEtPnNpemUpOwoJCWVsc2UgaWYoc3RyaW5nMS0+dHlwZSA9PSBzdHJfdW5pY29kZSkKCQkJZGlmZmVyZW50ID0gbWVtY21wKHN0cmluZzEtPnN0ci53c3RyLCBzdHJpbmcyLT5zdHIud3N0ciwgc3RyaW5nMS0+c2l6ZSpzaXplb2YoV0NIQVIpKTsKCQllbHNlCgkJCWRpZmZlcmVudCA9IDE7Cgl9CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdmVyX2Jsb2NrKHZlcl9ibG9ja190ICp2ZXJfYmxvY2sxLCB2ZXJfYmxvY2tfdCAqdmVyX2Jsb2NrMik7CgpzdGF0aWMgaW50IGNvbXBhcmVfdmVyX3ZhbHVlKHZlcl92YWx1ZV90ICp2ZXJfdmFsdWUxLCB2ZXJfdmFsdWVfdCAqdmVyX3ZhbHVlMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpbnQgaSA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAodmVyX3ZhbHVlMS0+dHlwZSA9PSB2ZXJfdmFsdWUyLT50eXBlKSkgewoJCXN3aXRjaCh2ZXJfdmFsdWUxLT50eXBlKSB7CgkJCWNhc2UgdmFsX3N0cjoKCQkJCWlmKCFkaWZmZXJlbnQgJiYgdmVyX3ZhbHVlMS0+a2V5ICYmIHZlcl92YWx1ZTItPmtleSkKCQkJCQlkaWZmZXJlbnQgPSBjb21wYXJlX3N0cmluZyh2ZXJfdmFsdWUxLT5rZXksIHZlcl92YWx1ZTItPmtleSk7CgkJCQllbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkJCQkoKHZlcl92YWx1ZTEtPmtleSAmJiAhdmVyX3ZhbHVlMi0+a2V5KSB8fAoJCQkJCSghdmVyX3ZhbHVlMS0+a2V5ICYmIHZlcl92YWx1ZTItPmtleSkpKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJYnJlYWs7CgkJCWNhc2UgdmFsX3dvcmRzOgoJCQkJaWYoIWRpZmZlcmVudCAmJiB2ZXJfdmFsdWUxLT5rZXkgJiYgdmVyX3ZhbHVlMi0+a2V5KQoJCQkJCWRpZmZlcmVudCA9IGNvbXBhcmVfc3RyaW5nKHZlcl92YWx1ZTEtPmtleSwgdmVyX3ZhbHVlMi0+a2V5KTsKCQkJCWVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSgodmVyX3ZhbHVlMS0+a2V5ICYmICF2ZXJfdmFsdWUyLT5rZXkpIHx8CgkJCQkJKCF2ZXJfdmFsdWUxLT5rZXkgJiYgdmVyX3ZhbHVlMi0+a2V5KSkpCgkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQlpZighZGlmZmVyZW50ICYmIHZlcl92YWx1ZTEtPnZhbHVlLndvcmRzICYmIHZlcl92YWx1ZTItPnZhbHVlLndvcmRzKSB7CgkJCQkJaWYoIWRpZmZlcmVudCAmJgoJCQkJCSAgICh2ZXJfdmFsdWUxLT52YWx1ZS53b3Jkcy0+bndvcmRzICE9IHZlcl92YWx1ZTItPnZhbHVlLndvcmRzLT5ud29yZHMpKQoJCQkJCQlkaWZmZXJlbnQgPSAxOwoJCQkJCWlmKCFkaWZmZXJlbnQpCgkJCQkJCWZvcihpID0gMDsgaSA8IHZlcl92YWx1ZTEtPnZhbHVlLndvcmRzLT5ud29yZHM7IGkrKykgewoJCQkJCQkJaWYodmVyX3ZhbHVlMS0+dmFsdWUud29yZHMtPndvcmRzW2ldICE9IHZlcl92YWx1ZTItPnZhbHVlLndvcmRzLT53b3Jkc1tpXSkgewoJCQkJCQkJCWRpZmZlcmVudCA9IDE7CgkJCQkJCQkJYnJlYWs7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJCQkJICAoKHZlcl92YWx1ZTEtPnZhbHVlLndvcmRzICYmICF2ZXJfdmFsdWUyLT52YWx1ZS53b3JkcykgfHwKCQkJCQkgICghdmVyX3ZhbHVlMS0+dmFsdWUud29yZHMgJiYgdmVyX3ZhbHVlMi0+dmFsdWUud29yZHMpKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWJyZWFrOwoJCQljYXNlIHZhbF9ibG9jazoKCQkJCWlmKCFkaWZmZXJlbnQgJiYgdmVyX3ZhbHVlMS0+dmFsdWUuYmxvY2sgJiYgdmVyX3ZhbHVlMi0+dmFsdWUuYmxvY2spCgkJCQkJZGlmZmVyZW50ID0gY29tcGFyZV92ZXJfYmxvY2sodmVyX3ZhbHVlMS0+dmFsdWUuYmxvY2ssIHZlcl92YWx1ZTItPnZhbHVlLmJsb2NrKTsKCQkJCWVsc2UgaWYoIWRpZmZlcmVudCAmJgoJCQkJCSgodmVyX3ZhbHVlMS0+dmFsdWUuYmxvY2sgJiYgIXZlcl92YWx1ZTItPnZhbHVlLmJsb2NrKSB8fAoJCQkJCSghdmVyX3ZhbHVlMS0+dmFsdWUuYmxvY2sgJiYgdmVyX3ZhbHVlMi0+dmFsdWUuYmxvY2spKSkKCQkJCQkJZGlmZmVyZW50ID0gMTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZGlmZmVyZW50ID0gMTsKCQl9Cgl9IGVsc2UKCQlkaWZmZXJlbnQgPSAxOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX3Zlcl9ibG9jayh2ZXJfYmxvY2tfdCAqdmVyX2Jsb2NrMSwgdmVyX2Jsb2NrX3QgKnZlcl9ibG9jazIpIHsKCWludCBkaWZmZXJlbnQgPSAwOwoJdmVyX3ZhbHVlX3QgKnZlcl92YWx1ZTEgPSBOVUxMLCAqdmVyX3ZhbHVlMiA9IE5VTEw7CglpZighZGlmZmVyZW50KSB7CgkJdmVyX3ZhbHVlMSA9IHZlcl9ibG9jazEtPnZhbHVlczsKCQl2ZXJfdmFsdWUyID0gdmVyX2Jsb2NrMi0+dmFsdWVzOwoJCXdoaWxlKCFkaWZmZXJlbnQgJiYgdmVyX3ZhbHVlMSAmJiB2ZXJfdmFsdWUyKSB7CgkJCWRpZmZlcmVudCA9IGNvbXBhcmVfdmVyX3ZhbHVlKHZlcl92YWx1ZTEsIHZlcl92YWx1ZTIpOwoJCQl2ZXJfdmFsdWUxID0gdmVyX3ZhbHVlMS0+bmV4dDsKCQkJdmVyX3ZhbHVlMiA9IHZlcl92YWx1ZTItPm5leHQ7CgkJfQoJCWlmKCFkaWZmZXJlbnQgJiYKCQkgICAoKHZlcl92YWx1ZTEgJiYgIXZlcl92YWx1ZTIpIHx8CgkJICAgKCF2ZXJfdmFsdWUxICYmIHZlcl92YWx1ZTIpKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0KCXJldHVybiBkaWZmZXJlbnQ7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZV92ZXJzaW9uaW5mbyh2ZXJzaW9uaW5mb190ICp2ZXJzaW9uaW5mbzEsIHZlcnNpb25pbmZvX3QgKnZlcnNpb25pbmZvMikgewoJaW50IGRpZmZlcmVudCA9IDA7Cgl2ZXJfYmxvY2tfdCAqdmVyX2Jsb2NrMSA9IE5VTEwsICp2ZXJfYmxvY2syID0gTlVMTDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgodmVyc2lvbmluZm8xLT5tZW1vcHQgIT0gdmVyc2lvbmluZm8yLT5tZW1vcHQpIHx8CgkgICAodmVyc2lvbmluZm8xLT5sdmMudmVyc2lvbiAhPSB2ZXJzaW9uaW5mbzItPmx2Yy52ZXJzaW9uKSB8fAoJICAgKHZlcnNpb25pbmZvMS0+bHZjLmNoYXJhY3RzICE9IHZlcnNpb25pbmZvMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgdmVyc2lvbmluZm8xLT5nb3RpdC5mdiAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZ2KSB7CgkJaWYoKHZlcnNpb25pbmZvMS0+ZmlsZXZlcl9tYWoxICE9IHZlcnNpb25pbmZvMi0+ZmlsZXZlcl9tYWoxKSB8fAoJCSAgICh2ZXJzaW9uaW5mbzEtPmZpbGV2ZXJfbWFqMiAhPSB2ZXJzaW9uaW5mbzItPmZpbGV2ZXJfbWFqMikgfHwKCQkgICAodmVyc2lvbmluZm8xLT5maWxldmVyX21pbjEgIT0gdmVyc2lvbmluZm8yLT5maWxldmVyX21pbjEpIHx8CgkJICAgKHZlcnNpb25pbmZvMS0+ZmlsZXZlcl9taW4yICE9IHZlcnNpb25pbmZvMi0+ZmlsZXZlcl9taW4yKSkKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZnYgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZnYpIHx8CgkJICAoIXZlcnNpb25pbmZvMS0+Z290aXQuZnYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mdikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCAmJiB2ZXJzaW9uaW5mbzEtPmdvdGl0LnB2ICYmIHZlcnNpb25pbmZvMi0+Z290aXQucHYpIHsKCQlpZigodmVyc2lvbmluZm8xLT5wcm9kdmVyX21hajEgIT0gdmVyc2lvbmluZm8yLT5wcm9kdmVyX21hajEpIHx8CgkJICAgKHZlcnNpb25pbmZvMS0+cHJvZHZlcl9tYWoyICE9IHZlcnNpb25pbmZvMi0+cHJvZHZlcl9tYWoyKSB8fAoJCSAgICh2ZXJzaW9uaW5mbzEtPnByb2R2ZXJfbWluMSAhPSB2ZXJzaW9uaW5mbzItPnByb2R2ZXJfbWluMSkgfHwKCQkgICAodmVyc2lvbmluZm8xLT5wcm9kdmVyX21pbjIgIT0gdmVyc2lvbmluZm8yLT5wcm9kdmVyX21pbjIpKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgodmVyc2lvbmluZm8xLT5nb3RpdC5wdiAmJiAhdmVyc2lvbmluZm8yLT5nb3RpdC5wdikgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5wdiAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LnB2KSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZm8gJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mbykgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZW9zICE9IHZlcnNpb25pbmZvMi0+ZmlsZW9zKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgodmVyc2lvbmluZm8xLT5nb3RpdC5mbyAmJiAhdmVyc2lvbmluZm8yLT5nb3RpdC5mbykgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5mbyAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZvKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZmYgJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mZikgewoJCWlmKHZlcnNpb25pbmZvMS0+ZmlsZWZsYWdzICE9IHZlcnNpb25pbmZvMi0+ZmlsZWZsYWdzKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgodmVyc2lvbmluZm8xLT5nb3RpdC5mZiAmJiAhdmVyc2lvbmluZm8yLT5nb3RpdC5mZikgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5mZiAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZmKSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZmZtICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZmZtKSB7CgkJaWYodmVyc2lvbmluZm8xLT5maWxlZmxhZ3NtYXNrICE9IHZlcnNpb25pbmZvMi0+ZmlsZWZsYWdzbWFzaykKCQkJZGlmZmVyZW50ID0gMTsKCX0gZWxzZSBpZighZGlmZmVyZW50ICYmCgkJICAoKHZlcnNpb25pbmZvMS0+Z290aXQuZmZtICYmICF2ZXJzaW9uaW5mbzItPmdvdGl0LmZmbSkgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5mZm0gJiYgdmVyc2lvbmluZm8yLT5nb3RpdC5mZm0pKSkKCQkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQgJiYgdmVyc2lvbmluZm8xLT5nb3RpdC5mdCAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZ0KSB7CgkJaWYodmVyc2lvbmluZm8xLT5maWxldHlwZSAhPSB2ZXJzaW9uaW5mbzItPmZpbGV0eXBlKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgodmVyc2lvbmluZm8xLT5nb3RpdC5mdCAmJiAhdmVyc2lvbmluZm8yLT5nb3RpdC5mdCkgfHwKCQkgICghdmVyc2lvbmluZm8xLT5nb3RpdC5mdCAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZ0KSkpCgkJCWRpZmZlcmVudCA9IDE7CglpZighZGlmZmVyZW50ICYmIHZlcnNpb25pbmZvMS0+Z290aXQuZnN0ICYmIHZlcnNpb25pbmZvMi0+Z290aXQuZnN0KSB7CgkJaWYodmVyc2lvbmluZm8xLT5maWxlc3VidHlwZSAhPSB2ZXJzaW9uaW5mbzItPmZpbGVzdWJ0eXBlKQoJCQlkaWZmZXJlbnQgPSAxOwoJfSBlbHNlIGlmKCFkaWZmZXJlbnQgJiYKCQkgICgodmVyc2lvbmluZm8xLT5nb3RpdC5mc3QgJiYgIXZlcnNpb25pbmZvMi0+Z290aXQuZnN0KSB8fAoJCSAgKCF2ZXJzaW9uaW5mbzEtPmdvdGl0LmZzdCAmJiB2ZXJzaW9uaW5mbzItPmdvdGl0LmZzdCkpKQoJCQlkaWZmZXJlbnQgPSAxOwoJaWYoIWRpZmZlcmVudCkgewoJCXZlcl9ibG9jazEgPSB2ZXJzaW9uaW5mbzEtPmJsb2NrczsKCQl2ZXJfYmxvY2syID0gdmVyc2lvbmluZm8yLT5ibG9ja3M7CgkJd2hpbGUoIWRpZmZlcmVudCAmJiB2ZXJfYmxvY2sxICYmIHZlcl9ibG9jazIpIHsKCQkJZGlmZmVyZW50ID0gY29tcGFyZV92ZXJfYmxvY2sodmVyX2Jsb2NrMSwgdmVyX2Jsb2NrMik7CgkJCXZlcl9ibG9jazEgPSB2ZXJfYmxvY2sxLT5uZXh0OwoJCQl2ZXJfYmxvY2syID0gdmVyX2Jsb2NrMi0+bmV4dDsKCQl9CgkJaWYoIWRpZmZlcmVudCAmJgoJCSAgICgodmVyX2Jsb2NrMSAmJiAhdmVyX2Jsb2NrMikgfHwKCQkgICAodmVyX2Jsb2NrMSAmJiAhdmVyX2Jsb2NrMikpKQoJCQlkaWZmZXJlbnQgPSAxOwoJfQoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2RsZ2luaXQoZGxnaW5pdF90ICpkbGdpbml0MSwgZGxnaW5pdF90ICpkbGdpbml0MikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGRsZ2luaXQxLT5tZW1vcHQgIT0gZGxnaW5pdDItPm1lbW9wdCkgfHwKCSAgIChkbGdpbml0MS0+ZGF0YS0+bHZjLnZlcnNpb24gIT0gZGxnaW5pdDItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGRsZ2luaXQxLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gZGxnaW5pdDItPmRhdGEtPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdG9vbGJhcl9pdGVtKHRvb2xiYXJfaXRlbV90ICp0b29sYmFyX2l0ZW0xLCB0b29sYmFyX2l0ZW1fdCAqdG9vbGJhcl9pdGVtMikgewoJaW50IGRpZmZlcmVudCA9IDA7Cgl3aGlsZSghZGlmZmVyZW50ICYmIHRvb2xiYXJfaXRlbTEgJiYgdG9vbGJhcl9pdGVtMikgewoJCWlmKCh0b29sYmFyX2l0ZW0xLT5pZCAmJiAhdG9vbGJhcl9pdGVtMi0+aWQpIHx8CgkJICAgKCF0b29sYmFyX2l0ZW0xLT5pZCAmJiB0b29sYmFyX2l0ZW0yLT5pZCkpCgkJCWRpZmZlcmVudCA9IDE7CgkJdG9vbGJhcl9pdGVtMSA9IHRvb2xiYXJfaXRlbTEtPm5leHQ7CgkJdG9vbGJhcl9pdGVtMiA9IHRvb2xiYXJfaXRlbTItPm5leHQ7Cgl9CglpZighZGlmZmVyZW50ICYmCgkgICAoKHRvb2xiYXJfaXRlbTEgJiYgIXRvb2xiYXJfaXRlbTIpIHx8CgkgICAoIXRvb2xiYXJfaXRlbTEgJiYgdG9vbGJhcl9pdGVtMikpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmVfdG9vbGJhcih0b29sYmFyX3QgKnRvb2xiYXIxLCB0b29sYmFyX3QgKnRvb2xiYXIyKSB7CglpbnQgZGlmZmVyZW50ID0gMDsKCWlmKCFkaWZmZXJlbnQgJiYKCSAgICgodG9vbGJhcjEtPm1lbW9wdCAhPSB0b29sYmFyMi0+bWVtb3B0KSB8fAoJICAgKHRvb2xiYXIxLT5sdmMudmVyc2lvbiAhPSB0b29sYmFyMi0+bHZjLnZlcnNpb24pIHx8CgkgICAodG9vbGJhcjEtPmx2Yy5jaGFyYWN0cyAhPSB0b29sYmFyMi0+bHZjLmNoYXJhY3RzKSkpCgkJZGlmZmVyZW50ID0gMTsKCWlmKCFkaWZmZXJlbnQpCgkJZGlmZmVyZW50ID0gY29tcGFyZV90b29sYmFyX2l0ZW0odG9vbGJhcjEtPml0ZW1zLCB0b29sYmFyMi0+aXRlbXMpOwoJcmV0dXJuIGRpZmZlcmVudDsKfQoKc3RhdGljIGludCBjb21wYXJlX2FuaV9jdXJpY28oYW5pX2N1cmljb190ICphbmlfY3VyaWNvMSwgYW5pX2N1cmljb190ICphbmlfY3VyaWNvMikgewoJaW50IGRpZmZlcmVudCA9IDA7CglpZighZGlmZmVyZW50ICYmCgkgICAoKGFuaV9jdXJpY28xLT5tZW1vcHQgIT0gYW5pX2N1cmljbzItPm1lbW9wdCkgfHwKCSAgIChhbmlfY3VyaWNvMS0+ZGF0YS0+bHZjLnZlcnNpb24gIT0gYW5pX2N1cmljbzItPmRhdGEtPmx2Yy52ZXJzaW9uKSB8fAoJICAgKGFuaV9jdXJpY28xLT5kYXRhLT5sdmMuY2hhcmFjdHMgIT0gYW5pX2N1cmljbzItPmRhdGEtPmx2Yy5jaGFyYWN0cykpKQoJCWRpZmZlcmVudCA9IDE7CglyZXR1cm4gZGlmZmVyZW50Owp9CgpzdGF0aWMgaW50IGNvbXBhcmUocmVzb3VyY2VfdCAqcmVzb3VyY2UxLCByZXNvdXJjZV90ICpyZXNvdXJjZTIpIHsKCXN3aXRjaChyZXNvdXJjZTEtPnR5cGUpIHsKCQljYXNlIHJlc19hY2M6CgkJCXJldHVybiBjb21wYXJlX2FjY2VsZXJhdG9yKHJlc291cmNlMS0+cmVzLmFjYywgcmVzb3VyY2UyLT5yZXMuYWNjKTsKCQljYXNlIHJlc19ibXA6CgkJCXJldHVybiBjb21wYXJlX2JpdG1hcChyZXNvdXJjZTEtPnJlcy5ibXAsIHJlc291cmNlMi0+cmVzLmJtcCk7CgkJY2FzZSByZXNfY3VyOgoJCQlyZXR1cm4gY29tcGFyZV9jdXJzb3IocmVzb3VyY2UxLT5yZXMuY3VyLCByZXNvdXJjZTItPnJlcy5jdXIpOwoJCWNhc2UgcmVzX2N1cmc6CgkJCXJldHVybiBjb21wYXJlX2N1cnNvcl9ncm91cChyZXNvdXJjZTEtPnJlcy5jdXJnLCByZXNvdXJjZTItPnJlcy5jdXJnKTsKCQljYXNlIHJlc19kbGc6CgkJCXJldHVybiBjb21wYXJlX2RpYWxvZyhyZXNvdXJjZTEtPnJlcy5kbGcsIHJlc291cmNlMi0+cmVzLmRsZyk7CgkJY2FzZSByZXNfZGxnZXg6CgkJCXJldHVybiBjb21wYXJlX2RpYWxvZ2V4KHJlc291cmNlMS0+cmVzLmRsZ2V4LCByZXNvdXJjZTItPnJlcy5kbGdleCk7CgkJY2FzZSByZXNfZm50OgoJCQlyZXR1cm4gY29tcGFyZV9mb250KHJlc291cmNlMS0+cmVzLmZudCwgcmVzb3VyY2UyLT5yZXMuZm50KTsKCQljYXNlIHJlc19mbnRkaXI6CgkJCXJldHVybiBjb21wYXJlX2ZvbnRkaXIocmVzb3VyY2UxLT5yZXMuZm5kLCByZXNvdXJjZTItPnJlcy5mbmQpOwoJCWNhc2UgcmVzX2ljbzoKCQkJcmV0dXJuIGNvbXBhcmVfaWNvbihyZXNvdXJjZTEtPnJlcy5pY28sIHJlc291cmNlMi0+cmVzLmljbyk7CgkJY2FzZSByZXNfaWNvZzoKCQkJcmV0dXJuIGNvbXBhcmVfaWNvbl9ncm91cChyZXNvdXJjZTEtPnJlcy5pY29nLCByZXNvdXJjZTItPnJlcy5pY29nKTsKCQljYXNlIHJlc19tZW46CgkJCXJldHVybiBjb21wYXJlX21lbnUocmVzb3VyY2UxLT5yZXMubWVuLCByZXNvdXJjZTItPnJlcy5tZW4pOwoJCWNhc2UgcmVzX21lbmV4OgoJCQlyZXR1cm4gY29tcGFyZV9tZW51ZXgocmVzb3VyY2UxLT5yZXMubWVuZXgsIHJlc291cmNlMi0+cmVzLm1lbmV4KTsKCQljYXNlIHJlc19yZHQ6CgkJCXJldHVybiBjb21wYXJlX3JjZGF0YShyZXNvdXJjZTEtPnJlcy5yZHQsIHJlc291cmNlMi0+cmVzLnJkdCk7CgkJY2FzZSByZXNfc3R0OgoJCQlyZXR1cm4gY29tcGFyZV9zdHJpbmd0YWJsZShyZXNvdXJjZTEtPnJlcy5zdHQsIHJlc291cmNlMi0+cmVzLnN0dCk7CgkJY2FzZSByZXNfdXNyOgoJCQlyZXR1cm4gY29tcGFyZV91c2VyKHJlc291cmNlMS0+cmVzLnVzciwgcmVzb3VyY2UyLT5yZXMudXNyKTsKCQljYXNlIHJlc19tc2c6CgkJCXJldHVybiBjb21wYXJlX21lc3NhZ2V0YWJsZShyZXNvdXJjZTEtPnJlcy5tc2csIHJlc291cmNlMi0+cmVzLm1zZyk7CgkJY2FzZSByZXNfdmVyOgoJCQlyZXR1cm4gY29tcGFyZV92ZXJzaW9uaW5mbyhyZXNvdXJjZTEtPnJlcy52ZXIsIHJlc291cmNlMi0+cmVzLnZlcik7CgkJY2FzZSByZXNfZGxnaW5pdDoKCQkJcmV0dXJuIGNvbXBhcmVfZGxnaW5pdChyZXNvdXJjZTEtPnJlcy5kbGdpLCByZXNvdXJjZTItPnJlcy5kbGdpKTsKCQljYXNlIHJlc190b29sYmFyOgoJCQlyZXR1cm4gY29tcGFyZV90b29sYmFyKHJlc291cmNlMS0+cmVzLnRidCwgcmVzb3VyY2UyLT5yZXMudGJ0KTsKCQljYXNlIHJlc19hbmljdXI6CgkJY2FzZSByZXNfYW5paWNvOgoJCQlyZXR1cm4gY29tcGFyZV9hbmlfY3VyaWNvKHJlc291cmNlMS0+cmVzLmFuaSwgcmVzb3VyY2UyLT5yZXMuYW5pKTsKCQlkZWZhdWx0OgoJCQkvKiBOb3Qgc3VwcG9zZWQgdG8gcmVhY2ggaGVyZSAqLwoJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBzdXBwb3NlZCB0byByZWFjaCBoZXJlIChjb21wYXJlKCkpXG4iKTsKCQkJYWJvcnQoKTsKCQkJcmV0dXJuIC0xOwoJfQp9Cgp2b2lkIHZlcmlmeV90cmFuc2xhdGlvbnMocmVzb3VyY2VfdCAqdG9wKSB7CgllbnVtIGxhbmdfdHlwZV9lIGxhbmdfdHlwZTsKCWVudW0gcmVzX2UgcmVzX3R5cGU7CglpbnQgKipwcmVzZW5jZTsKCWludCBpLCBqOwoJY2hhciAqbmFtZWlkOwoJY2hhciAqKnByb2JsZW1zOwoJaW50IG5iX3Byb2JsZW1zLCBsYXN0X3Byb2JsZW07CglpbnQgY29tcGxldGUsIG5lZWRzX3dvcmssIHBhcnRpYWw7CglyZXNvdXJjZV90ICpuZXh0ID0gdG9wOwoKCWZvcihyZXNfdHlwZSA9IHJlc18wOyByZXNfdHlwZSA8PSByZXNfdXNyOyByZXNfdHlwZSsrKSB7CgkJcHJlc2VudF9yZXNvdXJjZXNbcmVzX3R5cGVdID0gMDsKCQlmb3IobGFuZ190eXBlID0gbGFuZ190eXBlX21hc3RlcjsgbGFuZ190eXBlIDw9IGxhbmdfdHlwZV9ub3JtYWw7IGxhbmdfdHlwZSsrKSB7CgkJCW5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlXSA9IDA7CgkJCWxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVdID0gTlVMTDsKCQl9Cgl9CgoJd2hpbGUobmV4dCkgewoJCXN3aXRjaChuZXh0LT50eXBlKSB7CgkJCWNhc2UgcmVzX2FjYzoKCQkJY2FzZSByZXNfYm1wOgoJCQljYXNlIHJlc19jdXI6CgkJCWNhc2UgcmVzX2N1cmc6CgkJCWNhc2UgcmVzX2RsZzoKCQkJY2FzZSByZXNfZGxnZXg6CgkJCWNhc2UgcmVzX2ZudDoKCQkJY2FzZSByZXNfZm50ZGlyOgoJCQljYXNlIHJlc19pY286CgkJCWNhc2UgcmVzX2ljb2c6CgkJCWNhc2UgcmVzX21lbjoKCQkJY2FzZSByZXNfbWVuZXg6CgkJCWNhc2UgcmVzX3JkdDoKCQkJY2FzZSByZXNfc3R0OgoJCQljYXNlIHJlc191c3I6CgkJCWNhc2UgcmVzX21zZzoKCQkJY2FzZSByZXNfdmVyOgoJCQljYXNlIHJlc19kbGdpbml0OgoJCQljYXNlIHJlc190b29sYmFyOgoJCQljYXNlIHJlc19hbmljdXI6CgkJCWNhc2UgcmVzX2FuaWljbzoKCQkJCWFkZF9yZXNvdXJjZShuZXh0KTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJZnByaW50ZihzdGRlcnIsICJSZXBvcnQgdGhpczogdW5rb3duIHJlc291cmNlIHR5cGUgcGFyc2VkICUwOHhcbiIsIG5leHQtPnR5cGUpOwoJCX0KCQluZXh0ID0gbmV4dC0+bmV4dDsKCX0KCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19hY2NdID0gMTsKCXJlc19uYW1lc1tyZXNfYWNjXSA9IHN0cmR1cCgiYWNjZWxlcmF0b3IiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19ibXBdID0gMTsKCXJlc19uYW1lc1tyZXNfYm1wXSA9IHN0cmR1cCgiYml0bWFwIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfY3VyXSA9IDE7CglyZXNfbmFtZXNbcmVzX2N1cl0gPSBzdHJkdXAoImN1cnNvciIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2N1cmddID0gMTsKCXJlc19uYW1lc1tyZXNfY3VyZ10gPSBzdHJkdXAoImN1cnNvcl9ncm91cCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2RsZ10gPSAxOwoJcmVzX25hbWVzW3Jlc19kbGddID0gc3RyZHVwKCJkaWFsb2ciKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19kbGdleF0gPSAxOwoJcmVzX25hbWVzW3Jlc19kbGdleF0gPSBzdHJkdXAoImRpYWxvZ2V4Iik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfZm50XSA9IDE7CglyZXNfbmFtZXNbcmVzX2ZudF0gPSBzdHJkdXAoImZvbnQiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19mbnRkaXJdID0gMTsKCXJlc19uYW1lc1tyZXNfZm50ZGlyXSA9IHN0cmR1cCgiZm9udGRpciIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2ljb10gPSAxOwoJcmVzX25hbWVzW3Jlc19pY29dID0gc3RyZHVwKCJpY29uIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfaWNvZ10gPSAxOwoJcmVzX25hbWVzW3Jlc19pY29nXSA9IHN0cmR1cCgiaWNvbl9ncm91cCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX21lbl0gPSAxOwoJcmVzX25hbWVzW3Jlc19tZW5dID0gc3RyZHVwKCJtZW51Iik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfbWVuZXhdID0gMTsKCXJlc19uYW1lc1tyZXNfbWVuZXhdID0gc3RyZHVwKCJtZW51ZXgiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19yZHRdID0gMTsKCXJlc19uYW1lc1tyZXNfcmR0XSA9IHN0cmR1cCgicmNkYXRhIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfc3R0XSA9IDE7CglyZXNfbmFtZXNbcmVzX3N0dF0gPSBzdHJkdXAoInN0cmluZ3RhYmxlIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfdXNyXSA9IDE7CglyZXNfbmFtZXNbcmVzX3Vzcl0gPSBzdHJkdXAoInVzZXIiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19tc2ddID0gMTsKCXJlc19uYW1lc1tyZXNfbXNnXSA9IHN0cmR1cCgibWVzc2FnZXRhYmxlIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfdmVyXSA9IDE7CglyZXNfbmFtZXNbcmVzX3Zlcl0gPSBzdHJkdXAoInZlcnNpb25pbmZvIik7CglwcmVzZW50X3Jlc291cmNlc1tyZXNfZGxnaW5pdF0gPSAxOwoJcmVzX25hbWVzW3Jlc19kbGdpbml0XSA9IHN0cmR1cCgiZGxnaW5pdCIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX3Rvb2xiYXJdID0gMTsKCXJlc19uYW1lc1tyZXNfdG9vbGJhcl0gPSBzdHJkdXAoInRvb2xiYXIiKTsKCXByZXNlbnRfcmVzb3VyY2VzW3Jlc19hbmljdXJdID0gMTsKCXJlc19uYW1lc1tyZXNfYW5pY3VyXSA9IHN0cmR1cCgiYW5pX2N1cnNvciIpOwoJcHJlc2VudF9yZXNvdXJjZXNbcmVzX2FuaWljb10gPSAxOwoJcmVzX25hbWVzW3Jlc19hbmlpY29dID0gc3RyZHVwKCJhbmlfaWNvbiIpOwoKCWZvcihyZXNfdHlwZSA9IHJlc18wOyByZXNfdHlwZSA8PSByZXNfdXNyOyByZXNfdHlwZSsrKSB7CgkJaWYoIXByZXNlbnRfcmVzb3VyY2VzW3Jlc190eXBlXSkgewoJCQljb250aW51ZTsKCQl9CgkJaWYobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbm9ybWFsXSA+IDApIHsKCQkJaWYobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSAmJiBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9uZXV0cmFsXSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJUeXBlICVzOlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBib3RoIGEgTkVVVFJBTCBhbmQgYSBNQVNURVIgdmVyc2lvbiBmb3IgJXMsIGFsb25nIHdpdGggYWRkaXRpb25hbCBsb2NhbGl6ZWQgdmVyc2lvbnMuIFRoZSBORVVUUkFMIHZlcnNpb25zIHdpbGwgbm90IGJlIGNoZWNrZWQgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQl9IGVsc2UgaWYobmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbmV1dHJhbF0pIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiVHlwZSAlczpcbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgbm8gTUFTVEVSIHZlcnNpb24sIGJ1dCB0aGVyZSBhcmUgc29tZSBORVVUUkFMIHZlcnNpb25zIGZvciAlcywgc28gd2lsbCB1c2UgdGhvc2UgaW5zdGVhZCBvZiBNQVNURVIgZm9yIGNvbXBhcmlzb24uXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJCWxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSA9IGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbmV1dHJhbF07CgkJCQluYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdID0gbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbmV1dHJhbF07CgkJCX0gZWxzZSBpZighbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXSkgewoJCQkJZnByaW50ZihzdGRlcnIsICJUeXBlICVzOlxuIiwgcmVzX25hbWVzW3Jlc190eXBlXSk7CgkJCQlmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBubyBORVVUUkFMIG5vciBNQVNURVIgdmVyc2lvbnMgZm9yICVzLCBidXQgdGhlcmUgYXJlIHNvbWUgb3RoZXIgbG9jYWxpemVkIHZlcnNpb25zLiBObyBjb21wYXJpc29uIHdpbGwgYmUgZG9uZSBhdCBhbGwuXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0gJiYgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbmV1dHJhbF0pIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiVHlwZSAlczpcbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgYm90aCBhIE5FVVRSQUwgYW5kIGEgTUFTVEVSIHZlcnNpb25zIGZvciAlcywgYnV0IG5vIG90aGVyIGxvY2FsaXplZCB2ZXJzaW9uLiBObyBjb21wYXJpc29uIHdpbGwgYmUgZG9uZSBhdCBhbGwuXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJfSBlbHNlIGlmKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl0pIHsKCQkJCWZwcmludGYoc3RkZXJyLCAiVHlwZSAlczpcbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOwoJCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBhcmUgb25seSBNQVNURVIgdmVyc2lvbnMgZm9yICVzLiBObyBjb21wYXJpc29uIHdpbGwgYmUgZG9uZSBhdCBhbGwuXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsKCQkJfSBlbHNlIGlmKG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25ldXRyYWxdKSB7CgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlRoZXJlIGFyZSBvbmx5IE5FVVRSQUwgdmVyc2lvbnMgZm9yICVzLiBObyBjb21wYXJpc29uIHdpbGwgYmUgZG9uZSBhdCBhbGwuXG4iLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJfSBlbHNlIHsKCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiVGhlcmUgYXJlIG5vIHZlcnNpb25zIGF0IGFsbCBmb3IgJXMuIE5vIGNvbXBhcmlzb24gd2lsbCBiZSBkb25lIGF0IGFsbC5cbiIsIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQl9CgkJfQoKCQlwcmVzZW5jZSA9IG1hbGxvYyhuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdKnNpemVvZihpbnQgKikpOwoJCWZvcihpID0gMDsgaSA8IG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl07IGkrKykgewoJCQlwcmVzZW5jZVtpXSA9IGNhbGxvYyhOQl9MQU5HLCBzaXplb2YoaW50KSk7CgkJCXByZXNlbmNlW2ldW01BU1RFUl9MQU5HVUFHRV0gPSAtMTsKCQl9CgoJCWZvcihpID0gMDsgaSA8IG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF07IGkrKykgewoJCQlmb3IoaiA9IDA7IGogPCBuYl9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9tYXN0ZXJdOyBqKyspIHsKCQkJCW5hbWVpZCA9IHN0cmR1cChnZXRfbmFtZWlkX3N0cihsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF1baV0tPm5hbWUpKTsKCQkJCWlmKCFzdHJjbXAobmFtZWlkLCBnZXRfbmFtZWlkX3N0cihsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl1bal0tPm5hbWUpKSkgewoJCQkJCWlmKGNvbXBhcmUobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdW2ldLCBsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl1bal0pKSB7CgkJCQkJCXByZXNlbmNlW2pdW2dldF9sYW5ndWFnZV9pZChsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF1baV0pXSA9IDI7CgkJCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiRGlmZmVyZW5jZXMgaW4gdHlwZSAlcywgSUQgJXMsIGZvciBsYW5ndWFnZSAlc1xuIiwgcmVzX25hbWVzW3Jlc190eXBlXSwgbmFtZWlkLCBnZXRfbGFuZ3VhZ2VfbmFtZShnZXRfbGFuZ3VhZ2VfaWQobGlzdF9yZXNvdXJjZXNbcmVzX3R5cGVdW2xhbmdfdHlwZV9ub3JtYWxdW2ldKSkpOyAqLwoJCQkJCX0gZWxzZSB7CgkJCQkJCXByZXNlbmNlW2pdW2dldF9sYW5ndWFnZV9pZChsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX25vcm1hbF1baV0pXSA9IDE7CgkJCQkJfQoJCQkJfQoJCQkJZnJlZShuYW1laWQpOwoJCQl9CgkJfQoKCQlwcm9ibGVtcyA9IG1hbGxvYyhzaXplb2YoY2hhciAqKSk7CgkJcHJvYmxlbXNbMF0gPSBzdHJkdXAoIiIpOwoJCW5iX3Byb2JsZW1zID0gMDsKCQlsYXN0X3Byb2JsZW0gPSAtMTsKCQlmb3IoaSA9IDA7IGkgPCBOQl9MQU5HOyBpKyspIHsKCQkJY29tcGxldGUgPSAxOwoJCQluZWVkc193b3JrID0gMDsKCQkJcGFydGlhbCA9IDA7CgkJCWZvcihqID0gMDsgaiA8IG5iX3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl07IGorKykgewoJCQkJaWYocHJlc2VuY2Vbal1baV0pIHsKCQkJCQlwYXJ0aWFsID0gMTsKCQkJCQlpZihwcmVzZW5jZVtqXVtpXSA9PSAyKSB7CgkJCQkJCW5lZWRzX3dvcmsgPSAxOwoJCQkJCQlwcm9ibGVtcyA9IHJlYWxsb2MocHJvYmxlbXMsICgrK25iX3Byb2JsZW1zKzEpKnNpemVvZihjaGFyICopKTsKCQkJCQkJcHJvYmxlbXNbbmJfcHJvYmxlbXNdID0gbWFsbG9jKHN0cmxlbihnZXRfbmFtZWlkX3N0cihsaXN0X3Jlc291cmNlc1tyZXNfdHlwZV1bbGFuZ190eXBlX21hc3Rlcl1bal0tPm5hbWUpKSArIDkpOwoJCQkJCQlzcHJpbnRmKHByb2JsZW1zW25iX3Byb2JsZW1zXSwgIkRJRkYgJXMgJTAyeCIsIGdldF9uYW1laWRfc3RyKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXVtqXS0+bmFtZSksIGkpOwoJCQkJCQlpZihsYXN0X3Byb2JsZW0gPT0gaSkgewoJCQkJCQkJcHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0gPSByZWFsbG9jKHByb2JsZW1zW25iX3Byb2JsZW1zLTFdLCBzdHJsZW4ocHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0pICsgMyk7CgkJCQkJCQlzdHJjYXQocHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0sICIgXFwiKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWxhc3RfcHJvYmxlbSA9IGk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCWNvbXBsZXRlID0gMDsKCQkJCQlwcm9ibGVtcyA9IHJlYWxsb2MocHJvYmxlbXMsICgrK25iX3Byb2JsZW1zKzEpKnNpemVvZihjaGFyICopKTsKCQkJCQlwcm9ibGVtc1tuYl9wcm9ibGVtc10gPSBtYWxsb2Moc3RybGVuKGdldF9uYW1laWRfc3RyKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXVtqXS0+bmFtZSkpICsgOCk7CgkJCQkJc3ByaW50Zihwcm9ibGVtc1tuYl9wcm9ibGVtc10sICJBQlMgJXMgJTAyeCIsIGdldF9uYW1laWRfc3RyKGxpc3RfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXVtqXS0+bmFtZSksIGkpOwoJCQkJCWlmKGxhc3RfcHJvYmxlbSA9PSBpKSB7CgkJCQkJCXByb2JsZW1zW25iX3Byb2JsZW1zLTFdID0gcmVhbGxvYyhwcm9ibGVtc1tuYl9wcm9ibGVtcy0xXSwgc3RybGVuKHByb2JsZW1zW25iX3Byb2JsZW1zLTFdKSArIDMpOwoJCQkJCQlzdHJjYXQocHJvYmxlbXNbbmJfcHJvYmxlbXMtMV0sICIgXFwiKTsKCQkJCQl9IGVsc2UgewoJCQkJCQlsYXN0X3Byb2JsZW0gPSBpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlpZihjb21wbGV0ZSAmJiBwYXJ0aWFsICYmICFuZWVkc193b3JrKSB7CgkJCQkvKiBTdXBwb3J0IGlzIGNvbXBsZXRlLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nICovCgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlN1cHBvcnQgZm9yIGxhbmd1YWdlICVzIGlzIGNvbXBsZXRlIGZvciAlcy5cbiIsIGdldF9sYW5ndWFnZV9uYW1lKGkpLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJCXByaW50ZigiLiIpOwoJCQl9IGVsc2UgaWYoY29tcGxldGUgJiYgcGFydGlhbCAmJiBuZWVkc193b3JrKSB7CgkJCQkvKiBTdXBwb3J0IGlzIGluY29tcGxldGUgKGRpZmZlcmluZyByZXNvdXJjZXMpLCBuZWVkcyB3b3JrICovCgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlN1cHBvcnQgZm9yIGxhbmd1YWdlICVzIGlzIGluY29tcGxldGUgKGRpZmZlcmluZyByZXNvdXJjZXMpIGZvciAlcy5cbiIsIGdldF9sYW5ndWFnZV9uYW1lKGkpLCByZXNfbmFtZXNbcmVzX3R5cGVdKTsgKi8KCQkJCXByaW50ZigieCIpOwoJCQl9IGVsc2UgaWYoIWNvbXBsZXRlICYmIHBhcnRpYWwgJiYgIW5lZWRzX3dvcmspIHsKCQkJCS8qIFN1cHBvcnQgaXMgaW5jb21wbGV0ZSAobWlzc2luZyByZXNvdXJjZXMpLCBuZWVkcyB3b3JrICovCgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlN1cHBvcnQgZm9yIGxhbmd1YWdlICVzIGlzIGluY29tcGxldGUgKG1pc3NpbmcgcmVzb3VyY2VzKSBmb3IgJXMuXG4iLCBnZXRfbGFuZ3VhZ2VfbmFtZShpKSwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCQlwcmludGYoIi0iKTsKCQkJfSBlbHNlIGlmKCFjb21wbGV0ZSAmJiBwYXJ0aWFsICYmIG5lZWRzX3dvcmspIHsKCQkJCS8qIFN1cHBvcnQgaXMgaW5jb21wbGV0ZSAobWlzc2luZyBhbmQgZGlmZmVyaW5nIHJlc291cmNlcyksIG5lZWRzIHdvcmsgKi8KCQkJCS8qIGZwcmludGYoc3RkZXJyLCAiU3VwcG9ydCBmb3IgbGFuZ3VhZ2UgJXMgaXMgaW5jb21wbGV0ZSAobWlzc2luZyBhbmQgZGlmZmVyaW5nIHJlc291cmNlcykgZm9yICVzLlxuIiwgZ2V0X2xhbmd1YWdlX25hbWUoaSksIHJlc19uYW1lc1tyZXNfdHlwZV0pOyAqLwoJCQkJcHJpbnRmKCIrIik7CgkJCX0gZWxzZSBpZighY29tcGxldGUgJiYgIXBhcnRpYWwpIHsKCQkJCS8qIFN1cHBvcnQgaXMgdG90YWxseSBhYnNlbnQsIG1pZ2h0IGJlIGludGVyZXN0aW5nIHRvIGRvICovCgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlN1cHBvcnQgZm9yIGxhbmd1YWdlICVzIGlzIGFic2VudCBmb3IgJXMuXG4iLCBnZXRfbGFuZ3VhZ2VfbmFtZShpKSwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCQlwcmludGYoIiAiKTsKCQkJfSBlbHNlIHsKCQkJCS8qIFN1cHBvcnQgaXMgbm90IHJlbGV2YW50LCBubyBuZWVkIHRvIGRvIGFueXRoaW5nICovCgkJCQkvKiBmcHJpbnRmKHN0ZGVyciwgIlN1cHBvcnQgZm9yIGxhbmd1YWdlICVzIGlzIG5vdCByZWxldmFudCBmb3IgJXMuXG4iLCBnZXRfbGFuZ3VhZ2VfbmFtZShpKSwgcmVzX25hbWVzW3Jlc190eXBlXSk7ICovCgkJCQlwcmludGYoIm4iKTsKCQkJfQoJCX0KCQlwcmludGYoIlxuIik7CgkJZm9yKGkgPSAxOyBpIDw9IG5iX3Byb2JsZW1zOyBpKyspIHsKCQkJcHJpbnRmKCIlc1xuIiwgcHJvYmxlbXNbaV0pOwoJCQlmcmVlKHByb2JsZW1zW2ldKTsKCQl9CgkJZnJlZShwcm9ibGVtc1swXSk7CgkJZnJlZShwcm9ibGVtcyk7CgkJZm9yKGkgPSAwOyBpIDwgbmJfcmVzb3VyY2VzW3Jlc190eXBlXVtsYW5nX3R5cGVfbWFzdGVyXTsgaSsrKQoJCQlmcmVlKHByZXNlbmNlW2ldKTsKCQlmcmVlKHByZXNlbmNlKTsKCX0KfQo=